<<widget "checkIntrusiveThought">>
<<if $arousal.player.daysAtHigh >= 3 && random(1, 100) <= 30>>
<<goto "Event_IntrusiveThought">>
<</if>>
<</widget>><div class="intrusive-thought">
Mid-conversation, your mind wanders.
<<if $flags.seenKiraNaked>>
<p class="thought">You flash back to Kira naked. The curve of her hips. The way she—</p>
<<else>>
<<if $flags.kiraFirstTitsExposure>>
<p class="thought">You remember her tits. Bouncing as she moved. You want to—</p>
<<else>>
<p class="thought">You imagine what she looks like under those clothes. What sounds she'd make if you—</p>
<</if>>
<</if>>
<<say "Kira" "Hey. You listening?">>
You snap back to reality. Your pants feel tighter.
<p class="blueballs-warning">The pressure builds. Days of tension catching up with you.</p>
<<clampStat "player.lust" 5>>
</div>
<div class="choice-container">
<<link "Continue" `$lastLocation || "Vault_Hub"`>>
<<set $lastLocation to null>>
<</link>>
</div><div class="blueballs-morning">
<<set $flags.blueBallsTriggered to true>>
<<if $arousal.player.daysAtHigh >= 5>>
<p class="blueballs-warning critical">You wake up achingly hard. Again.</p>
<p>Every movement is uncomfortable. Your entire body feels like it's vibrating with need. The sheets are stuck to you with sweat and... other things.</p>
<p>You NEED release. Not want. NEED. Your body is screaming for it. Even just standing up is agony, your cock straining so hard you think it might hurt.</p>
<p class="consequence">This is unbearable. This is unsustainable. Something has to give, and soon.</p>
<<elseif $arousal.player.daysAtHigh >= 4>>
<p class="blueballs-warning">You wake up achingly hard. Again.</p>
<p>Every movement is uncomfortable. You NEED release. The pressure is becoming painful, a constant ache that follows you into consciousness.</p>
<p>Your body is demanding what it hasn't gotten. You can barely think about anything else.</p>
<p>This has to end soon, or you're going to do something desperate.</p>
<<elseif $arousal.player.daysAtHigh >= 3>>
<p class="blueballs-warning">You wake up achingly hard. Again.</p>
<p>This is getting ridiculous. You can barely think straight. Every shadow, every movement seems to trigger your mind into places it shouldn't go.</p>
<p>The pressure builds with each passing hour. How much longer can you keep this up?</p>
<<elseif $arousal.player.daysAtHigh >= 2>>
<p class="blueballs-warning">You wake up achingly hard. Again.</p>
<p>Cold shower? Training? Something has to give.</p>
<p class="thought">At least the distraction of the day might help.</p>
<</if>>
</div>
<<if passage() === "Morning_BlueBalls">>
<div class="choice-container">
<<link "Get up and face the day" "Vault_Hub">>
<</link>>
</div>
<</if>><<widget "clothingStateArousal">>
<<if $companions && $companions[0]>>
<<set _cfg to setup.arousalConfig ? setup.arousalConfig.clothingArousal : null>>
<<set _wornVal to _cfg ? _cfg.worn : 2>>
<<set _rippedVal to _cfg ? _cfg.ripped : 5>>
<<set _ruinedVal to _cfg ? _cfg.ruined : 10>>
<<set _playerRippedLust to Math.floor(_rippedVal * 0.6)>>
<<set _playerRuinedLust to Math.floor(_ruinedVal * 0.5)>>
<<if !$arousalLastClothingState>><<set $arousalLastClothingState to { kiraTop: "good", playerBottom: "good" }>><</if>>
<<set _kiraTopState to "good">>
<<if $clothing && $clothing.kira>>
<<if $clothing.kira.top >= 1 && $clothing.kira.top <= 25>>
<<set _kiraTopState to "ruined">>
<<elseif $clothing.kira.top >= 26 && $clothing.kira.top <= 50>>
<<set _kiraTopState to "ripped">>
<<elseif $clothing.kira.top >= 51 && $clothing.kira.top <= 75>>
<<set _kiraTopState to "worn">>
<</if>>
<</if>>
<<if _kiraTopState !== $arousalLastClothingState.kiraTop && _kiraTopState !== "good">>
<<switch _kiraTopState>>
<<case "worn">>
<<addTension "kira" _wornVal>>
<<case "ripped">>
<<addTension "kira" _rippedVal>>
<<case "ruined">>
<<addTension "kira" _ruinedVal>>
<</switch>>
<</if>>
<<set $arousalLastClothingState.kiraTop to _kiraTopState>>
<<set _playerBottomState to "good">>
<<if $clothing && $clothing.player>>
<<if $clothing.player.bottom >= 1 && $clothing.player.bottom <= 25>>
<<set _playerBottomState to "ruined">>
<<elseif $clothing.player.bottom >= 26 && $clothing.player.bottom <= 50>>
<<set _playerBottomState to "ripped">>
<<elseif $clothing.player.bottom >= 51 && $clothing.player.bottom <= 75>>
<<set _playerBottomState to "worn">>
<</if>>
<</if>>
<<if _playerBottomState !== $arousalLastClothingState.playerBottom && _playerBottomState !== "good">>
<<switch _playerBottomState>>
<<case "worn">>
<<addTension "kira" _wornVal>>
<<case "ripped">>
<<clampStat "player.lust" _playerRippedLust>>
<<addTension "kira" _rippedVal>>
<<case "ruined">>
<<clampStat "player.lust" _playerRuinedLust>>
<<addTension "kira" _ruinedVal>>
<</switch>>
<</if>>
<<set $arousalLastClothingState.playerBottom to _playerBottomState>>
<</if>>
<</widget>>
<<widget "exposureArousal">>
<<if $companions && $companions[0] && $clothing>>
<<set _expCfg to setup.arousalConfig ? setup.arousalConfig.exposureArousal : null>>
<<set _kiraCfg to _expCfg ? _expCfg.kira : null>>
<<set _playerCfg to _expCfg ? _expCfg.player : null>>
<<if !$arousalLastExposureState>><<set $arousalLastExposureState to { kiraTits: false, kiraPussy: false, kiraAss: false, playerDick: false, playerAss: false }>><</if>>
<<if $clothing.kira && $clothing.kira.titsExposed>>
<<if !$arousalLastExposureState.kiraTits>>
<<set _val to _kiraCfg && _kiraCfg.titsExposed ? _kiraCfg.titsExposed : { tension: 15, playerLust: 10 }>>
<<addTension "kira" _val.tension>>
<<if _val.playerLust>><<clampStat "player.lust" _val.playerLust>><</if>>
<<set $arousalLastExposureState.kiraTits to true>>
<</if>>
<<else>>
<<set $arousalLastExposureState.kiraTits to false>>
<</if>>
<<if $clothing.kira && $clothing.kira.pussyExposed>>
<<if !$arousalLastExposureState.kiraPussy>>
<<set _val to _kiraCfg && _kiraCfg.pussyExposed ? _kiraCfg.pussyExposed : { tension: 20 }>>
<<addTension "kira" _val.tension>>
<<set $arousalLastExposureState.kiraPussy to true>>
<</if>>
<<else>>
<<set $arousalLastExposureState.kiraPussy to false>>
<</if>>
<<if $clothing.kira && $clothing.kira.assExposed>>
<<if !$arousalLastExposureState.kiraAss>>
<<set _val to _kiraCfg && _kiraCfg.assExposed ? _kiraCfg.assExposed : { tension: 5 }>>
<<addTension "kira" _val.tension>>
<<set $arousalLastExposureState.kiraAss to true>>
<</if>>
<<else>>
<<set $arousalLastExposureState.kiraAss to false>>
<</if>>
<<if $clothing.player && $clothing.player.dickExposed>>
<<if !$arousalLastExposureState.playerDick>>
<<set _val to _playerCfg && _playerCfg.dickExposed ? _playerCfg.dickExposed : { tension: 10, playerLust: 10 }>>
<<if _val.playerLust>><<clampStat "player.lust" _val.playerLust>><</if>>
<<addTension "kira" _val.tension>>
<<set $arousalLastExposureState.playerDick to true>>
<</if>>
<<else>>
<<set $arousalLastExposureState.playerDick to false>>
<</if>>
<<if $clothing.player && $clothing.player.assExposed>>
<<if !$arousalLastExposureState.playerAss>>
<<set _val to _playerCfg && _playerCfg.assExposed ? _playerCfg.assExposed : { playerLust: 3 }>>
<<if _val.playerLust>><<clampStat "player.lust" _val.playerLust>><</if>>
<<set $arousalLastExposureState.playerAss to true>>
<</if>>
<<else>>
<<set $arousalLastExposureState.playerAss to false>>
<</if>>
<</if>>
<</widget>><<set _frAtCamp to tags().includes("travel")>>
<<if _frAtCamp>><<setBackground "prelude/caravan-camp-night">><<elseif setup.kiraNightMorning()>><<setBackground "kira_room">><<else>><<setBackground "quarters">><</if>>
<h2>The Breaking Point</h2>
<<if _frAtCamp>>
<p class="narrator">The fire burns down to embers. You lie on your bedroll, trying to sleep, but your body won't let you rest.</p>
<<else>>
<p class="narrator">The night settles around the vault. You lie in your bed, trying to sleep, but your body won't let you rest.</p>
<</if>>
<<if $player.lust >= 80>>
<p class="explicit">Five days. Five days of walking the razor's edge, holding yourself back, denying the release your body screams for. Your cock is constantly hard, aching, dripping. Every breath sends electricity through your nerves.</p>
<p class="explicit">Sleep claims you despite your body's protest. But there's no peace in dreams.</p>
<<else>>
<p class="explicit">Your body finally breaks under the strain of prolonged arousal. Sleep pulls you under, but your mind doesn't rest.</p>
<</if>>
<p class="dream-sequence"><em>You're in a hazy space between reality and fantasy...</em></p>
<<if $companions.length > 0 && $companions[0].name>>
<<storyVideo "story/forced_release/dream_1_tease">><<set _w26a to _storyClip>>
<p class="explicit"><<if _storyClip is "3ed6a296477c" or _storyClip is "5f49559d5de1" or _storyClip is "66a86632f22e">><<print setup.textPools.wet_dream.kira_appears[3]>><<else>><<randomLine "wet_dream" "kira_appears" true>><</if>></p>
<p class="explicit">"Look at you," she whispers, low and filthy. "Hard as a rifle barrel and leaking for me. Pathetic." She sounds delighted about it.</p>
<p class="explicit"><<randomLine "wet_dream" "intense" true>></p>
<p class="explicit">You're inside her—or is she riding you? Reality blurs. All you know is the overwhelming sensation of heat and wetness and pleasure that's been denied for so long.</p>
<<storyVideo "events/solo/wet_dream">>
<p class="explicit"><<randomLine "wet_dream" "buildup" true>></p>
<<else>>
<p class="explicit">In the dream, hands touch you everywhere. Soft lips find yours. A body presses against you, and the sensation is almost unbearably intense after days of denial.</p>
<p class="explicit"><<randomLine "wet_dream" "solo" true>></p>
<p class="explicit">You're lost in pleasure, in need, in the desperate hunger of your own body.</p>
<</if>>
<<if $companions.length > 0 && $companions[0].name>><<storyVideo "story/forced_release/dream_3_climax">><<set _w26b to _storyClip>><</if>>
<p class="explicit">The pressure builds and builds—days and days of tension concentrated into a single moment.</p>
<p class="explicit"><<randomLine "wet_dream" "climax" true>></p>
<p class="explicit">Your hips thrust involuntarily, pleasure crashes through you in waves, overwhelming your senses. You cry out, unable to hold back the sounds.</p>
<p class="consequence">You wake gasping, your body damp with sweat—and other fluids. <<if _frAtCamp>>Your bedroll is soaked<<else>>The sheets are soaked<</if>>. Your heart pounds as reality slowly reasserts itself.</p>
<<set $player.lust to 30>><<run setup.playerReleased()>>
<<run setup.stopEdging()>>
<<set $arousal.player.daysAtHigh to 0>>
<<set $arousal.player.lastRelease to $time.day>>
<<set $arousal.player.releaseQuality to "forced_wet_dream">>
<<set $flags.forcedWetDream to true>>
<<clampStat "player.energy" -15 0 $player.maxEnergy>>
<<set $player.shame = ($player.shame || 0) + 5>>
<p class="narrator">It takes several minutes for your breathing to return to normal. The shame and embarrassment start to creep in, but there's also... relief. Your body finally got what it needed.</p>
<<if _frAtCamp>>
<p class="narrator">You lie in the mess, too exhausted to do anything but think about rinsing your bedroll out<<if setup.kiraWithYou()>> before Kira wakes up and sees this<<else>> before you move on<</if>>.</p>
<div class="choice-container">
<<vchoice "Deal with the aftermath" "Journey_Camp_Morning" "action" "map">>
</div>
<<else>>
<p class="narrator">You lie in the mess, too exhausted to do anything but think about finding clean sheets before anyone else sees this.</p>
<div class="choice-container">
<<vchoice "Deal with the aftermath" "Morning_Hub" "action" "map">>
</div>
<</if>><<run setup.stopEdging = function () {
var V = State.variables;
if (V.arousal && V.arousal.player) V.arousal.player.edging = false;
if (V.flags) V.flags.forcedReleasePending = false;
}>>
<<run setup.playerReleased = function () {
var V = State.variables;
if (V.arousal && V.arousal.player) V.arousal.player.releases = (Number(V.arousal.player.releases) || 0) + 1;
}>>
<<run setup.storeForcedRelease = function () {
var V = State.variables;
if (!V.flags) return;
var n = (V.arousal && V.arousal.player && Number(V.arousal.player.releases)) || 0;
if (!V.flags.forcedReleasePending || V.flags.forcedReleasePendingAt === undefined || n > V.flags.forcedReleasePendingAt) V.flags.forcedReleasePendingAt = n;
V.flags.forcedReleasePending = true;
}>>
<<run setup.forcedReleaseDue = function () {
var V = State.variables, a = V.arousal && V.arousal.player;
if (!a || !a.edging) return false;
if (V.flags && V.flags.forcedReleasePending && (Number(a.releases) || 0) > (Number(V.flags.forcedReleasePendingAt) || 0)) {
V.flags.forcedReleasePending = false;
}
return !!((V.flags && V.flags.forcedReleasePending) || (a.daysAtHigh >= 5 && V.player.lust >= 80));
}>><<set $flags.kiraSnappedToday to true>>
<<if !$arousal.kira.snapAttempts>><<set $arousal.kira.snapAttempts to 0>><</if>>
<<set $arousal.kira.snapAttempts += 1>>
<<set $arousal.kira.lastSnapDay to $time.day>>
<<if $currentLocation === "kira_room" || $currentLocation === "quarters">>
<<setBackground "kira_room">>
<<elseif $currentLocation === "training_yard">>
<<setBackground "training_yard">>
<<elseif $currentLocation === "bathroom">>
<<setBackground "bathroom">>
<<else>>
<<setBackground "hallway">>
<</if>>
<<showCharacter "kira" "center" "desperate">>
<<storyVideo "story/kira_snap_tension/tension_snap">>
<<if _storyFamily is "sf_cg_kira_snap_tension_04">>Kira comes to you in almost nothing - black lace, stockings - and stands too close, laughing a little too brightly. Her eyes are wild.<<else>>Kira corners you. Her eyes are wild.<</if>>
<<say "Kira" "I can't do this anymore.">>
She steps closer. Close enough to feel her breath.
<<say "Kira" "I've tried to ignore it. Tried to be professional. But every time I close my eyes, I see—">>
<<if _storyFamily is "sf_cg_kira_snap_tension_04">>She breaks off. Her hand grips your shoulder. Yours finds her hip.<<else>>She breaks off. Her hand fists in your shirt.<</if>>
<<say "Kira" "Tell me I'm not crazy. Tell me you feel it too.">>
<div class="choice-container">
<<if $companions[0].trust >= 40>>
<<vchoice "Pull her close" "Kira_Snap_Accept" "intimate" "rapid-strikes">>
<<else>>
<p class="choice-locked"><<icon "locked">> Pull her close (Trust too low)</p>
<</if>>
<<vchoice "\"Kira, wait—\"" "Kira_Snap_Refuse" "action" "hand">>
</div><<showCharacter "kira" "center" "passionate">>
You pull her against you. She gasps.
<<storyVideo "story/kira_snap_tension/snap_accept">>
<<say "Kira" "Finally—">>
She kisses you like she's drowning and you're air.
<<if _storyClip is "c47f935d88c4">>Her hands are on your face, your jaw, your chest. Desperate. Demanding.<<else>>Her hands are everywhere. Desperate. Demanding.<</if>>
<<say "Kira" "Now. Right now.">>
<<if $currentLocation === "kira_room" || $currentLocation === "quarters">>
<<set _snapNext to "Kira_Sex_TensionRelease_Bedroom">>
<<else>>
<<set _snapNext to "Kira_Sex_TensionRelease_Wherever">>
<</if>>
<div class="choice-container">
<<vchoice "Continue" _snapNext "action" "forward">>
</div><<showCharacter "kira" "center" "hurt">>
<<say $player.name "Kira, wait—">>
She freezes. Then pulls back like you burned her.
<<say "Kira" "Right. Yeah. Of course.">>
Her face shuts down. Walls slamming up.
<<say "Kira" "Forget it. Forget I said anything.">>
<<storyVideo "story/kira_snap_tension/sex_wherever_aftermath">>
<<if _storyFamily is "sf_cg_kira_snap_tension_04">>She turns and walks away. Fast. Doesn't look back. You do.<<else>>She turns and walks away. Fast. Doesn't look back.<</if>>
<<set $companions[0].trust -= 1>>
<<set $companions[0].tension to 100>>
<p class="consequence">She'll try again. She can't help it.</p>
<div class="choice-container">
<<if $currentLocation === "training_yard">>
<<vchoice "Continue" "Training_Yard_Hub" "action" "forward">>
<<elseif $currentLocation === "bathroom">>
<<vchoice "Continue" "Bathroom_Hub" "action" "forward">>
<<else>>
<<vchoice "Continue" "Kira_Room" "action" "forward">>
<</if>>
</div><<set $flags.kiraSnappedToday to true>>
<<set $arousal.kira.snapAttempts += 1>>
<<set $arousal.kira.lastSnapDay to $time.day>>
<<if $currentLocation === "kira_room" || $currentLocation === "quarters">>
<<setBackground "kira_room">>
<<elseif $currentLocation === "training_yard">>
<<setBackground "training_yard">>
<<elseif $currentLocation === "bathroom">>
<<setBackground "bathroom">>
<<else>>
<<setBackground "hallway">>
<</if>>
<<showCharacter "kira" "center" "vulnerable">>
Kira finds you again. She looks like she hasn't slept.
<<say "Kira" "I know what I said. I know you said no. But I can't—">>
Her voice breaks.
<<say "Kira" "Please.">>
<div class="choice-container">
<<vchoice "\"Come here.\"" "Kira_Snap_Accept" "intimate" "rapid-strikes">>
<<vchoice "Refuse again" "Kira_Snap_Refuse_Again" "action" "hand">>
</div><<showCharacter "kira" "center" "devastated">>
<<say "Kira" "">>
She doesn't say anything. Just nods once, sharp, and leaves.
<<storyVideo "story/kira_snap_tension/snap_refuse_again">>
<<if _storyFamily is "sf_cg_kira_snap_tension_04">>You sit there after she's gone, hand over your mouth, staring at nothing.<</if>>
<<set $companions[0].trust -= 2>>
<<set $companions[0].affection -= 1>>
<<if $arousal.kira.snapAttempts >= 3>>
<p class="consequence">Something breaks in her. She stops trying. The tension remains, but now there's distance too.</p>
<<set $companions[0].tension to 70>>
<<set $flags.kiraGaveUp to true>>
<<else>>
<p class="consequence">Her eyes are hollow. She'll try again. But each refusal damages something between you.</p>
<</if>>
<div class="choice-container">
<<if $currentLocation === "training_yard">>
<<vchoice "Continue" "Training_Yard_Hub" "action" "forward">>
<<elseif $currentLocation === "bathroom">>
<<vchoice "Continue" "Bathroom_Hub" "action" "forward">>
<<else>>
<<vchoice "Continue" "Kira_Room" "action" "forward">>
<</if>>
</div><<setBackground "kira_room">>
<<showCharacter "kira" "center" "desperate">>
<<run document.body.classList.add("scene-mode-intimate")>>
<<advanceTime 0 45>>
<<if !$flags.sleptWithKira>>
<<sexScene "kira" "desperate" "intense" "kira-room">>
<<else>>
<<sexScene "kira" "familiar" "intense" "kira-room">>
<</if>>
You barely make it to the bed.
<<storyVideo "story/kira_snap_tension/sex_tension_release_bedroom__sex_tension_release_bedroom" "" "characters/kira/room_sex">>
<<say "Kira" "Don't be gentle. I don't need gentle right now.">>
<<if !$flags.sleptWithKira>>
Clothes tear. You're not being careful. Neither is she.
<<performSexAct "undress_rough">>
<<if _storyFamily is "sf_cg_kira_snap_tension_04">>She shoves you down onto the narrow mattress, grabs your cock and climbs on, her back to you.<<else>>She pulls you down onto the narrow mattress, legs wrapping around you immediately.<</if>>
<<say "Kira" "I've needed this. Needed YOU.">>
<<performSexAct "penetration_hard">>
<<if _storyFamily is "sf_cg_kira_snap_tension_04">>She drops onto your cock in one hard stroke. She cries out, back arching.<<else>>You enter her in one hard thrust. She cries out, back arching.<</if>>
<<say "Kira" "Yes— fuck— don't stop—">>
There's no buildup. No teasing. Just raw need finally getting satisfied.
<<performSexAct "sex_hard">>
<<if _storyFamily is "sf_cg_kira_snap_tension_04">>The bed creaks violently under you. She rides you hard, looking back over her shoulder, your hands full of her ass.<<else>>The bed creaks violently under you. Her nails rake down your back. You fuck her hard into the mattress.<</if>>
<<say "Kira" "Harder— I'm— fuck, I'm—">>
<<if _storyFamily is "sf_cg_kira_snap_tension_04">>She comes apart on top of you, convulsing around your cock.<<else>>She comes apart under you, convulsing around your cock.<</if>> The sound she makes is almost a sob of relief.
<<performSexAct "climax_mutual">>
You follow her over the edge seconds later, spilling inside her with a groan.
<<else>>
You know each other's bodies now. Know exactly how to take each other apart.
<<performSexAct "undress_rough">>
<<say "Kira" "Fuck me. Hard. Now.">>
No romance. Just need.
<<performSexAct "penetration_hard">>
<<if _storyFamily is "sf_cg_kira_snap_tension_04">>She slams down onto you, riding you, eager, grinding on every stroke.<<else>>You slam into her. She takes it eagerly, meeting each thrust.<</if>>
<<say "Kira" "More— harder—">>
<<performSexAct "sex_hard">>
It's intense. Desperate. Months of tension burning away between you.
<<say "Kira" "I'm close— don't stop—">>
<<performSexAct "climax_mutual">>
You both come hard, gasping against each other.
<</if>>
<<sexPhase "aftermath">>
<<showCharacter "kira" "center" "post_sex">>
You collapse together, breathing hard. Sweat-slicked. Satisfied.
<<say "Kira" "Fuck. That was—">>
She can't finish. Just curls against you.
<<say "Kira" "Thank you.">>
It's soft. Vulnerable.
<<set $player.lust to Math.max(0, $player.lust - 60)>><<run setup.playerReleased()>>
<<set $companions[0].tension to Math.max(20, $companions[0].tension - 55)>>
<<addAffection "kira" 2>>
<<addTrust "kira" 5>>
<<set $flags.sleptWithKira to true>>
<<set $flags.seenKiraNaked to true>>
<<set $arousal.player.lastRelease to $time.day>>
<<set $arousal.kira.lastRelease to $time.day>>
<<set $arousal.player.daysAtHigh to 0>>
<<set $arousal.kira.daysAtHigh to 0>>
<<set $arousal.player.blueBallsActive to false>>
<<set $arousal.kira.blueBallsActive to false>>
<<run setup.stopEdging()>>
<<if !$companions[0].tensionFloor || $companions[0].tensionFloor === 0>>
<<set $companions[0].tensionFloor to 20>>
<</if>>
<<run document.body.classList.remove("scene-mode-intimate")>>
<p class="consequence">The desperate tension has eased. But it's not gone entirely. It never will be now.</p>
<div class="choice-container">
<<vchoice "Rest together" "Kira_Room" "action" "night">>
</div><<if $currentLocation === "training_yard">>
<<setBackground "training_yard">>
<<elseif $currentLocation === "bathroom">>
<<setBackground "bathroom">>
<<elseif $currentLocation === "vault_storage">>
<<setBackground "storage">>
<<else>>
<<setBackground "hallway">>
<</if>>
<<showCharacter "kira" "center" "desperate">>
<<run document.body.classList.add("scene-mode-intimate")>>
<<advanceTime 0 30>>
<<if !$flags.sleptWithKira>>
<<sexScene "kira" "desperate" "public" "current">>
<<else>>
<<sexScene "kira" "familiar" "risky" "current">>
<</if>>
You don't make it somewhere private.
<<say "Kira" "Here. Now. I don't care.">>
<<if !$flags.sleptWithKira>>
<<if $currentLocation === "training_yard">>
Against the wall of the training yard. Anyone could walk by.
<<elseif $currentLocation === "bathroom">>
She pushes you into a shower stall. The water's still running.
<<else>>
In the corridor. Empty for now. But not private.
<</if>>
<<performSexAct "undress_partial">>
You yank her pants down just enough. Yours too. This is happening.
<<say "Kira" "Hurry—">>
<<performSexAct "penetration_standing">>
<<storyVideo "story/kira_snap_tension/sex_tension_release_bedroom__sex_tension_release_wherever">>
<<if _storyFamily is "sf_cg_kira_snap_tension_04">>You pin her back against the wall and hook one of her legs up high over your arm. You enter her standing.<<else>>You lift her. She wraps her legs around you. You enter her against the wall.<</if>>
<<say "Kira" "Oh fuck— yes—">>
<<performSexAct "sex_standing">>
It's rough. Fast. The risk of discovery makes it more intense.
<<say "Kira" "Don't stop— I'm— I'm—">>
<<performSexAct "climax_mutual">>
<<if _storyFamily is "sf_cg_kira_snap_tension_04">>She rubs her clit while you pound her, and when she comes she gushes down both your legs, biting back a scream.<<else>>She buries her face in your shoulder to muffle her scream as she comes.<</if>>
You follow, emptying into her with a groan you barely suppress.
<<else>>
<<say "Kira" "Can't wait. Need you now.">>
<<if $currentLocation === "training_yard">>
She pulls you behind the equipment racks. Not hidden. Just... less visible.
<<elseif $currentLocation === "bathroom">>
Into a stall. Lock the door. The sounds will echo.
<<else>>
She just drops to her knees right there.
<<say "Kira" "I'll make this quick.">>
<<performSexAct "oral_fast">>
Her mouth is hot and eager. No teasing. She takes you deep.
You bite back a groan as she works you with practiced intensity.
<<performSexAct "climax_player">>
You come in her mouth. She swallows without hesitation.
<<performSexAct "fingering_fast">>
Your turn. You push her against the wall, hand down her pants.
Two fingers inside. Thumb on her clit. You know what she needs.
<<say "Kira" "Fuck— yes— right there—">>
<<performSexAct "climax_kira">>
She comes on your fingers, biting her lip to stay quiet.
<</if>>
<<if $currentLocation === "training_yard" || $currentLocation === "bathroom">>
<<performSexAct "undress_partial">>
<<performSexAct "penetration_fast">>
You fuck her quickly. Hard. Getting the tension out.
<<say "Kira" "Yes— harder—">>
<<performSexAct "sex_hard">>
<<performSexAct "climax_mutual">>
You both come fast and intense.
<</if>>
<</if>>
<<sexPhase "aftermath">>
<div class="choice-container">
<<vchoice "Continue" "Kira_Sex_Wherever_Aftermath" "action" "forward">>
</div><<showCharacter "kira" "center" "satisfied">>
You both straighten your clothes quickly. Hearts pounding.
<<say "Kira" "That was stupid.">>
But she's smiling.
<<say "Kira" "We should—">>
Footsteps echo nearby. You both freeze.
<<say "Kira" "—probably get somewhere else.">>
<<set $player.lust to Math.max(0, $player.lust - 50)>><<run setup.playerReleased()>>
<<set $companions[0].tension to Math.max(20, $companions[0].tension - 45)>>
<<addAffection "kira" 2>>
<<addTrust "kira" 3>>
<<set $flags.sleptWithKira to true>>
<<set $flags.seenKiraNaked to true>>
<<set $flags.publicSexWithKira to true>>
<<set $arousal.player.lastRelease to $time.day>>
<<set $arousal.kira.lastRelease to $time.day>>
<<set $arousal.player.daysAtHigh to 0>>
<<set $arousal.kira.daysAtHigh to 0>>
<<set $arousal.player.blueBallsActive to false>>
<<set $arousal.kira.blueBallsActive to false>>
<<run setup.stopEdging()>>
<<if !$companions[0].tensionFloor || $companions[0].tensionFloor === 0>>
<<set $companions[0].tensionFloor to 20>>
<</if>>
<<run document.body.classList.remove("scene-mode-intimate")>>
<p class="consequence">The desperate edge has dulled. But the thrill of the risk lingers.</p>
<div class="choice-container">
<<if $currentLocation === "training_yard">>
<<vchoice "Continue" "Training_Yard_Hub" "action" "forward">>
<<elseif $currentLocation === "bathroom">>
<<vchoice "Continue" "Bathroom_Hub" "action" "forward">>
<<else>>
<<vchoice "Continue" "Kira_Room" "action" "forward">>
<</if>>
</div>SECTION 6: LUST & TENSION COMBAT WIDGETS
============================================================= */
<<widget "applyLustPenalties">>
<<if $player.lust >= 100>>
<<set $player.lustPenalty to 30>>
<<set $player.lustState to "climax">>
<<elseif $player.lust >= 90>>
<<set $player.lustPenalty to 20>>
<<set $player.lustState to "desperate">>
<<elseif $player.lust >= 70>>
<<set $player.lustPenalty to 15>>
<<set $player.lustState to "highly_aroused">>
<<elseif $player.lust >= 50>>
<<set $player.lustPenalty to 10>>
<<set $player.lustState to "aroused">>
<<else>>
<<set $player.lustPenalty to 0>>
<<set $player.lustState to "normal">>
<</if>>
<</widget>>
<<widget "checkTensionPenalty">>
<<set $player.tensionPenalty to 0>>
<<if $combat.companionInCombat>>
<<getCompanion $combat.companionInCombat>>
<<if $tempCompanion && $tempCompanion.tension >= 50>>
<<set $player.tensionPenalty to 2>>
<</if>>
<<if $tempCompanion && $tempCompanion.tension >= 70>>
<<set $player.tensionPenalty to 5>>
<</if>>
<</if>>
<</widget>>
<<widget "checkLustEvent">>
<<if $player.lust >= 90 && random(1,100) <= 15>>
<<set $flags.accidentalOrgasm to true>>
<</if>>
<<if $player.lust >= 60 && random(1,100) <= 30>>
<<set $flags.visibleArousal to true>>
<</if>>
<<if $combat.companionInCombat>>
<<getCompanion $combat.companionInCombat>>
<<if $tempCompanion && $tempCompanion.lust >= 90 && random(1,100) <= 20>>
<<set $flags.companionOrgasm to true>>
<</if>>
<</if>>
<<if $combat.enemies.length > 0>>
<<for _i, _enemy range $combat.enemies>>
<<if _enemy.lust >= _enemy.lustBreak>>
<<set $flags.enemyLustBreak to _i>>
<</if>>
<</for>>
<</if>>
<</widget>>
<<widget "handleLustEvents">>
<<if $flags.accidentalOrgasm>>
<<handleAccidentalOrgasm>>
<<set $flags.accidentalOrgasm to false>>
<</if>>
<<if $flags.visibleArousal>>
<<handleVisibleArousal>>
<<set $flags.visibleArousal to false>>
<</if>>
<<if $flags.companionOrgasm>>
<<handleCompanionOrgasm>>
<<set $flags.companionOrgasm to false>>
<</if>>
<<if $flags.enemyLustBreak !== undefined && $flags.enemyLustBreak !== false>>
<<handleEnemyLustBreak $flags.enemyLustBreak>>
<<set $flags.enemyLustBreak to false>>
<</if>>
<</widget>>
<<widget "handleAccidentalOrgasm">>
<<set _inCombat to $combat && $combat.active>>
<<set _pool to _inCombat ? setup.textPools.player_accidental_orgasm.combat : setup.textPools.player_accidental_orgasm.standalone>>
<div class="lust-event accidental-orgasm">
<p class="narrator-explicit"><<print setup.randomLine(_pool)>></p>
<<if setup.kiraWithYou()>>
<p class="narrator-subtle"><<print setup.randomLine(setup.textPools.player_accidental_orgasm.kira_reaction)>></p>
<<set _kiraTensionGain to random(5, 10)>>
<<clampStat "companions[0].tension" _kiraTensionGain>>
<</if>>
<p class="narrator-subtle"><<print setup.randomLine(setup.textPools.player_accidental_orgasm.aftermath)>></p>
</div>
<<set $player.lust to Math.max(0, $player.lust - 40)>><<run setup.playerReleased()>>
<<if _inCombat>>
<<set $combat.playerDazed to true>>
<<set $combat.playerDazedTurns to 1>>
<<set $combat.playerDazedCause to "orgasm">>
<<logCombat "Player loses control and orgasms!" "critical">>
<</if>>
<</widget>>
<<widget "handleVisibleArousal">>
<<set _isExposed to $clothing && $clothing.player && $clothing.player.dickExposed>>
<div class="lust-event visible-arousal">
<<if _isExposed>>
<p class="narrator-explicit"><<print setup.randomLine("arousal_narrative", "player_cock_exposed")>></p>
<<else>>
<p class="narrator-subtle"><<print setup.randomLine("arousal_narrative", "player_cock_strain")>></p>
<</if>>
</div>
<<if setup.kiraWithYou() && !$flags.kiraNoticedArousal>>
<<set _kiraNoticeTension to random(2, 5)>>
<<clampStat "companions[0].tension" _kiraNoticeTension>>
<<set $flags.kiraNoticedArousal to true>>
<</if>>
<</widget>>
<<widget "handleCompanionOrgasm">>
<<getCompanion $combat.companionInCombat>>
<<if $tempCompanion>>
<<set _position to $tempCompanion.position || "standing">>
<<set _isExposed to ($clothing && $clothing.kira && ($clothing.kira.titsExposed || $clothing.kira.pussyExposed))>>
<<set _clothingState to _isExposed ? "exposed" : "clothed">>
<<set _poolKey to _position + "_" + _clothingState>>
<<set _pool to setup.kiraOrgasm[_poolKey] || setup.kiraOrgasm.standing_clothed>>
<div class="lust-event companion-orgasm">
<p class="narrator-explicit"><<print setup.randomLine(_pool)>></p>
</div>
<<set $tempCompanion.lust to Math.max(0, $tempCompanion.lust - 30)>>
<<set $tempCompanion.tension to Math.clamp((Number($tempCompanion.tension) || 0) + random(10, 20), 0, 100)>>
<<if $combat && $combat.active>>
<<set $combat.kiraInRefractory to true>>
<<set $combat.kiraRefractoryTurns to 2>>
<<logCombat "Kira orgasms involuntarily!" "critical">>
<</if>>
<</if>>
<</widget>>
<<widget "tensionToLust">>
<<for _i, _comp range $companions>>
<<if _comp.tension >= 50>>
<<set _lustGain to Math.floor((_comp.tension - 40) / 10)>>
<<set $companions[_i].lust += _lustGain>>
<<set $companions[_i].lust to Math.min($companions[_i].lust, 100)>>
<</if>>
<</for>>
<</widget>>
<<widget "checkDenialEffects">>
<<if $denial.active>>
<<if $denial.daysDenied >= 3>>
<<set $player.lustGainMultiplier to 1 + ($denial.daysDenied * 0.1)>>
<</if>>
<<if $denial.daysDenied >= 7>>
<<set $player.willMod to -3>>
<</if>>
<<if $denial.daysDenied >= $denial.breakingPoint>>
<<set $flags.denialBreak to true>>
<</if>>
<<set $denial.intensityMultiplier to 1 + ($denial.daysDenied * 0.2)>>
<</if>>
<</widget>><<run VaultUI.setBackground("kira_room")>>
<<showCharacter "kira" "center" "tense">>
<h2>The Tension is Obvious</h2>
<p class="narrator">Neither of you says it outright, but the air is thick. Heavy with unspoken need.</p>
<<if $companions[0].tension >= 60>>
<p class="tension-hint">Kira shifts uncomfortably. Her breathing is unsteady. She won't quite meet your eyes.</p>
<<elseif $player.lust >= 60>>
<p class="tension-hint">Your body is screaming for relief. Every nerve feels raw. You can't think straight.</p>
<</if>>
<<if $companions[0].tension >= 70 && $player.lust >= 70>>
<p class="tension-hint desperate">Both of you are barely holding it together. Something has to give.</p>
<</if>>
<div class="choice-container">
<<if $companions[0].trust >= 25 && $companions[0].tension >= 60>>
<<vchoice "Just... hold each other close" "Kira_Grinding" "intimate" "broken-heart">>
<</if>>
<<if $companions[0].trust >= 35 && $companions[0].tension >= 50>>
<<vchoice "\"Let me help you relax.\" (finger her)" "Kira_Fingering" "intimate" "hand">>
<</if>>
<<if $companions[0].trust >= 30 && $player.lust >= 60>>
<<vchoice "\"I could use some help...\" (handjob)" "Kira_Handjob" "intimate" "hand">>
<</if>>
<<if $companions[0].trust >= 40 && $companions[0].tension >= 55>>
<<vchoice "Go down on her" "Kira_OralGive" "intimate" "lips">>
<</if>>
<<if $companions[0].trust >= 40 && $player.lust >= 60>>
<<vchoice "Ask her to use her mouth" "Kira_OralReceive" "intimate" "lips">>
<</if>>
<<if $companions[0].trust >= 45 && $companions[0].tension >= 65>>
<<vchoice "\"Just the tip?\" (risky)" "Kira_JustTheTip" "intimate" "alert">>
<</if>>
<<vchoice "Not now" "Kira_Room" "action" "return">>
</div><<run VaultUI.setBackground("kira_room")>>
<<showCharacter "kira" "center" "aroused">>
<h2>Close</h2>
<<say $player.name "Come here.">>
She doesn't hesitate. She closes the distance between you in two steps.
You pull her against you—chest to chest, hip to hip. She fits perfectly against your body. Her breath catches.
<<say "Kira" "What are we doing?">>
<<say $player.name "Just this. Nothing more.">>
<<say "Kira" "Nothing more?">>
Her hips roll against yours. Slowly. Testing.
<p class="explicit">Even through the fabric, you can feel everything. The pressure. The heat. Your cock hardens instantly, trapped between your bodies.</p>
<<say "Kira" "Fuck. You're already—">>
<<say $player.name "Yeah.">>
She grinds down harder. A small sound escapes her throat.
<p class="explicit">You grip her hips, guiding her rhythm. Slow rolls that build friction. Her clit must be rubbing against you through her pants because her breathing gets ragged fast.</p>
<<say "Kira" "This is—this is good. This is enough.">>
It's not enough. You both know it. But it takes the edge off.
<p class="explicit">She moves faster. Grinding down with purpose now. Her hands fist in your shirt. You rock up to meet her, creating more pressure, more friction.</p>
<<say "Kira" "Oh fuck—I'm gonna—">>
<p class="explicit">She comes against you. Trembling. Her forehead drops to your shoulder as she rides it out, still grinding in small desperate circles.</p>
You're achingly hard but the relief of watching her fall apart is almost enough.
Almost.
<<say "Kira" "Sorry. I just—">>
<<say $player.name "Don't apologize.">>
She looks up at you. Flushed. Eyes dark.
<<say "Kira" "You didn't—">>
<<say $player.name "I'm fine.">>
<<say "Kira" "Liar.">>
But she doesn't push. She steps back, adjusting her clothes, still breathing hard.
<<say "Kira" "We should... do that again sometime.">>
<<advanceTime 0 30>>
<<applyRelease "grinding">>
<<addAffection "kira" 1>>
<<addTrust "kira" 2>>
<p class="consequence">Partial relief. The edge remains, but it's manageable now.</p>
<<link "Catch your breath" "Kira_Room">><</link>><<run VaultUI.setBackground("kira_room")>>
<<showCharacter "kira" "center" "aroused">>
<<advanceTime 0 30>>
<h2>Just a Little</h2>
<<say $player.name "Just the tip?">>
She bites her lip. Nods.
<<say "Kira" "Just the tip. That's it. We're not—we're just taking the edge off.">>
<<say $player.name "Right. Just the edge.">>
She strips off her pants quickly. No hesitation. You do the same.
<p class="explicit">Your cock stands hard and ready. She's already wet—you can see it glistening on her thighs.</p>
<<say "Kira" "Lie back.">>
You do. She straddles you, positioning herself carefully.
<p class="explicit">The head of your cock brushes against her pussy. She's so wet. So warm. It takes everything not to grab her hips and pull her down.</p>
<<say "Kira" "Okay. Just—just a little.">>
<<storyVideo "story/kira_mg_just_tip/kira_just_the_tip">>
<p class="explicit"><<if _storyFamily is "sf_cg_kira_mg_just_tip_04">>She slides along your cock first, slick, grinding her pussy down the shaft while you grip her ass - then the head of your cock catches between her pussy lips and she sinks down slowly. Just the tip. Just the first inch. Her pussy grips you like a vice.<<else>>She sinks down slowly. Just the tip. Just the first inch. Her pussy grips you like a vice.<</if>></p>
<<say $player.name "Fuck—">>
<<say "Kira" "Don't move. Don't you fucking move.">>
<p class="explicit">You both hold still. Trembling. Every nerve screaming to push deeper. To take more.</p>
<<say "Kira" "Okay. Okay this is—fuck, this is good. Just—don't move.">>
You're both breathing hard. Shaking with restraint.
<<set _escalate to random(1, 100) <= 40>>
<<if _escalate>>
<div class="choice-container">
<<vchoice "Continue" "Kira_JustTheTip_Escalates" "action" "forward">>
</div>
<<else>>
<div class="choice-container">
<<vchoice "Continue" "Kira_JustTheTip_Holds" "action" "forward">>
</div>
<</if>><<showCharacter "kira" "center" "strained">>
<<advanceTime 0 30>>
<<storyVideo "story/kira_mg_just_tip/holds__holds">>
<p class="narrator"><<if _storyFamily is "sf_cg_kira_mg_just_tip_04">>She can't hold still. She rocks on you upright, both hands clamped over her own tits, head tipping back, thighs shaking with the effort of not sinking all the way down.<<else>>You both hold still. Trembling. Every nerve screaming to move.<</if>></p>
The seconds stretch. Your cock pulses inside her—just the tip—and she whimpers.
<<say "Kira" "We should—we should stop now.">>
<<say $player.name "Yeah.">>
<<if _storyFamily is "sf_cg_kira_mg_just_tip_04">>She doesn't stop. She keeps rocking on you, head thrown back.<<else>>Neither of you moves.<</if>>
<<say "Kira" "I mean it. Pull out. Slowly.">>
<p class="explicit">You do. Slowly. Agonizingly. The head of your cock slides free with a wet sound. You're both shaking.</p>
<<say "Kira" "That was... fuck.">>
<<if _storyFamily is "sf_cg_kira_mg_just_tip_04">>She leans down, kisses you hard, then lifts herself off you and slides down beside you, chest heaving.<<else>>She rolls off you, lying on her back, chest heaving.<</if>>
<<say "Kira" "We didn't—">>
<<say $player.name "We didn't.">>
<<say "Kira" "Good. That's—that's good.">>
But the way she's looking at you says she's not sure if it's good or torture.
<p class="explicit">Your cock is still rock hard, glistening with her wetness. The ache of denial is almost worse than the tension before.</p>
<<say "Kira" "Next time—">>
She cuts herself off.
<<say "Kira" "If there's a next time. We might not be so disciplined.">>
<<say $player.name "Probably not.">>
<<say "Kira" "Yeah.">>
<<applyRelease "just_tip">>
<<addAffection "kira" 1>>
<<addTrust "kira" 3>>
<p class="consequence">Partial relief. The edge remains sharp. You both held back... this time.</p>
<<link "Catch your breath" "Kira_Room">><</link>><<showCharacter "kira" "center" "desperate">>
<<advanceTime 1 0>>
<<storyVideo "story/kira_mg_just_tip/holds__escalates">>
<p class="narrator">You both try to hold still.</p>
It lasts about three seconds.
<<say "Kira" "Fuck it—">>
<p class="explicit">She grabs your hips and pulls you deep. All the way in. One thrust.</p>
<<say $player.name "Kira—">>
<<say "Kira" "Shut up. Don't you dare stop now—">>
<p class="explicit">The "just the tip" plan dies instantly. You're fucking her properly within seconds. Hard. Desperate. All pretense of restraint gone.</p>
<<say "Kira" "Yes—fuck yes—that's what I needed—">>
<p class="explicit">She rides you like she's starving for it. Fast. Rough. Her cunt squeezes you with every stroke.</p>
<p class="explicit">You grab her hips, helping her bounce on your cock. The wet slap of flesh fills the room. She's vocal—moans, curses, your name.</p>
<<say "Kira" "I'm gonna come—already—fuck—">>
<p class="explicit">She clamps down on you as she peaks, her whole body shaking. You're right behind her. Can't hold back. You bury yourself deep and let go.</p>
<<say "Kira" "Yes—come inside me—fill me up—">>
<p class="explicit">You come hard, pulsing inside her, and she grinds down through it, milking every drop.</p>
Finally, she collapses against your chest. Both of you breathing ragged.
<<say "Kira" "So much for 'just the tip.'">>
<<say $player.name "Yeah.">>
<<say "Kira" "Not complaining.">>
<<say $player.name "Me neither.">>
<<applyRelease "sex_quick">>
<<addAffection "kira" 2>>
<<addTrust "kira" 5>>
<<set $flags.justTheTipEscalated to true>>
<<set $flags.sleptWithKira to true>>
<p class="consequence">Well. That escalated. Full release for both of you.</p>
<<link "Eventually get up" "Kira_Room">><</link>><<run VaultUI.setBackground("kira_room")>>
<<run VaultUI.setTimeOfDay("intimate")>>
<<showCharacter "kira" "center" "aroused">>
<<advanceTime 0 30>>
<<say $player.name "Let me help you relax.">>
She hesitates for just a moment, then nods.
<<say "Kira" "Okay. Yeah. I need this.">>
<<storyVideo "story/kira_mg_fingering/kira_fingering">>
<<if _storyClip is "60d8210cb118">>You guide her to lie back on the bed. Your hands work her pants off slowly, until she's bare except for the black leather straps buckled high around her thighs. She spreads her knees for you without being asked.<<else>>You guide her to lie back on the bed. Your hands work her pants off slowly.<</if>>
<p class="explicit">She's already wet. You can see it glistening on her thighs. Her breath catches as your fingers trace up her inner leg.</p>
<<say "Kira" "Don't tease. Please.">>
<<say $player.name "I won't.">>
<p class="explicit">You slide two fingers into her. She gasps, arching up against your hand. You work her slowly at first, finding the rhythm she likes.</p>
<<say "Kira" "Fuck—yes—like that—">>
<p class="explicit">Her hips rock against your hand. You curl your fingers, pressing against that spot inside her that makes her whole body tense.</p>
<<if $companions[0].tension >= 70>>
She's close already. All that built-up tension finally getting release.
<<say "Kira" "Don't stop—I'm so close—">>
<<else>>
She's enjoying this, surrendering to the pleasure.
<<say "Kira" "That feels so good...">>
<</if>>
<p class="explicit"><<if _storyClip is "60d8210cb118">>You keep the pressure steady, your thumb finding her clit. She cries out, her pussy clenching around your fingers as she comes—squirting hard over your wrist, eyes locked on yours the whole time.<<else>>You keep the pressure steady, your thumb finding her clit. She cries out, her pussy clenching around your fingers as she comes.<</if>></p>
<<say "Kira" "Oh god—yes—">>
You work her through it gently, until she's trembling and oversensitive.
When you finally withdraw, she looks up at you with flushed cheeks, pupils still blown wide.
<<say "Kira" "Thank you. I really needed that.">>
<<addTension "kira" -30>>
<<set $companions[0].lust to Math.max(0, $companions[0].lust - 40)>>
<<addAffection "kira" 1>>
<div class="choice-container">
<<vchoice "\"Anytime.\"" "Kira_Room" "talk" "broken-heart">>
<<vchoice "Kiss her softly" "Kira_Room" "intimate" "lips">>
</div><<run VaultUI.setBackground("kira_room")>>
<<run VaultUI.setTimeOfDay("intimate")>>
<<showCharacter "kira" "center" "slight-smile">>
<<advanceTime 0 30>>
<<say $player.name "I could use some help...">>
She glances down at your hard cock, shoving at the front of your pants, and smirks.
<<say "Kira" "I can see that. Come here.">>
<<storyVideo "story/kira_mg_handjob/kira_handjob">>
<<if _storyClip is "6253c132c091">>You move to the bed. She pushes you to sit on the edge, then drops to her knees on the rug between your legs.<<else>>You move to the bed. She pushes you to sit, then kneels between your legs.<</if>>
<<say "Kira" "Let's take care of this.">>
<p class="explicit">She works your pants open, freeing your cock. It's already hard, straining. She wraps her hand around you and you groan.</p>
<<say "Kira" "Been a while since you got relief, huh?">>
<<say $player.name "You could say that.">>
<p class="explicit"><<if _storyClip is "6253c132c091">>She starts stroking. Slow at first, then faster. She sticks her tongue out flat under the head and works you against it, grinning up at you between strokes. She knows exactly what she's doing.<<else>>She starts stroking. Slow at first, then faster. Her grip is firm, her technique practiced. She knows exactly what she's doing.<</if>></p>
<<if $player.lust >= 80>>
You're so worked up it won't take long.
<<say $player.name "Fuck—Kira—I'm close—">>
<<say "Kira" "Go ahead. Let it out.">>
<<else>>
She takes her time, working you up gradually.
<<say "Kira" "Just relax. I've got you.">>
<</if>>
<p class="explicit">Her hand moves faster. You feel the pressure building, that familiar tightness. Then it breaks—you come hard, spilling over her hand.</p>
<<say $player.name "Shit—">>
She keeps stroking through it, milking every last drop until you're spent and sensitive.
<<say "Kira" "Feel better?">>
<<say $player.name "Much. Thank you.">>
She grabs a cloth, wipes her hand clean, then sits beside you.
<<say "Kira" "We should probably do this more often. Before things get too tense.">>
<<set $player.lust to Math.max(0, $player.lust - 45)>><<run setup.playerReleased()>>
<<set $arousal.player.current to Math.max(0, $arousal.player.current - 45)>>
<<addAffection "kira" 1>>
<<addTension "kira" -5>>
<div class="choice-container">
<<vchoice "\"Agreed.\"" "Kira_Room" "talk" "broken-heart">>
<<vchoice "\"I owe you one.\"" "Kira_Room" "intimate" "lips">>
</div><<run VaultUI.setBackground("kira_room")>>
<<run VaultUI.setTimeOfDay("intimate")>>
<<showCharacter "kira" "center" "aroused">>
<<advanceTime 0 30>>
<<say $player.name "Lie back.">>
<<storyVideo "story/kira_mg_cunnilingus/kira_oral_receive">>
She drops onto her back without arguing, for once. You drag her pants down her legs and fling them somewhere you'll have to hunt for later.
<p class="explicit">She's already wet. You can see it, smell it. She spreads her legs for you without hesitation.</p>
<<say "Kira" "Please...">>
<p class="explicit">You settle between her thighs and lean in, your tongue tracing along her slit. She gasps, her hips jerking.</p>
<<say "Kira" "Oh fuck—">>
<p class="explicit">You work her slowly at first, exploring with your tongue. Finding what makes her moan, what makes her tremble. Then you focus on her clit, circling it, sucking gently.</p>
Her breathing quickens. Hands tangling in your hair.
<<say "Kira" "Fuck... don't stop...">>
<<if $companions[0].affection >= 40>>
She's not holding back. Letting you see her vulnerable. Trusting you completely.
<<addAffection "kira" 1>>
<<else>>
She's trying to stay composed, but failing. You can feel her trembling.
<</if>>
<p class="explicit"><<if _storyFamily is "sf_cg_kira_mg_cunnilingus_04">>You suck her clit into your mouth and flatten your tongue against her, over and over. She cries out, her whole body tensing.<<else>>You slide two fingers into her while your tongue continues its work. She cries out, her whole body tensing.<</if>></p>
<<say "Kira" "Yes—right there—I'm gonna—">>
<p class="explicit"><<if _storyFamily is "sf_cg_kira_mg_cunnilingus_04">>She comes against your mouth, one hand fisted in your hair, grinding her pussy on your tongue. You work her through it until she pushes you away, oversensitive.<<else>>She comes against your mouth, her thighs clamping around your head, her pussy pulsing around your fingers. You work her through it until she pushes you away, oversensitive.<</if>></p>
When she finally comes down, she's breathless and flushed.
<<say "Kira" "I needed that. Thank you.">>
<<addTension "kira" -30>>
<<set $companions[0].lust to Math.max(0, $companions[0].lust - 40)>>
<div class="choice-container">
<<vchoice "\"Anytime.\"" "Kira_Room" "talk" "broken-heart">>
<<vchoice "Kiss her gently" "Kira_Room" "intimate" "lips">>
</div><<run VaultUI.setBackground("kira_room")>>
<<run VaultUI.setTimeOfDay("intimate")>>
<<showCharacter "kira" "center" "flushed">>
<<advanceTime 0 30>>
<<say "Kira" "Let me take care of you.">>
<<storyVideo "story/kira_mg_blowjob/kira_oral_give" "" "characters/kira/room_blowjob">>
<<if _storyFamily is "sf_cg_kira_mg_blowjob_04">>She stands you at the edge of the bed and drops to her knees on the floor in front of you. Her hands work your pants open.<<else>>She guides you to sit on the edge of the bed. Her hands work your pants open.<</if>>
<p class="explicit">Your cock springs free, already hard. She looks at it for a moment, then meets your eyes with a heated gaze.</p>
<<say $player.name "You don't have to—">>
<<say "Kira" "I want to.">>
<p class="explicit">She leans forward, her tongue tracing along your cock. You groan. Then she takes you into her mouth—warm, wet, perfect.</p>
<<say $player.name "Kira... fuck...">>
Her technique is deliberate. Teasing. She knows exactly what she's doing.
<p class="explicit">She takes you deeper, her lips wrapped tight around you, her tongue working against the underside of your cock. The wet sounds fill the room.</p>
<<if $companions[0].tension >= 60>>
There's heat in her eyes as she looks up at you. She's enjoying this as much as you are.
<<addTension "kira" -20>>
<<else>>
She's focused, methodical. Taking care of you.
<<addTension "kira" -10>>
<</if>>
<p class="explicit"><<if _storyFamily is "sf_cg_kira_mg_blowjob_04">>She picks up the pace, bobbing her head faster. You feel the pressure building. She pulls off, tongue out, eyes up, and lets you finish it with your own fist an inch from her open mouth.<<else>>She picks up the pace, bobbing her head faster. You feel the pressure building. Your hands tangle in her hair.<</if>></p>
<<say $player.name "I'm going to—">>
<p class="explicit"><<if _storyFamily is "sf_cg_kira_mg_blowjob_04">>You come across her tongue in thick ropes. She swallows, then wraps both hands around your cock and sucks you clean, grinning up at you with cum on her chin.<<else>>She doesn't pull away. She takes you all the way through it as you come, swallowing everything.<</if>></p>
When it's over, she wipes her mouth with a satisfied smirk.
<<say "Kira" "Feel better?">>
<<set $player.lust to Math.max(0, $player.lust - 40)>><<run setup.playerReleased()>>
<<set $arousal.player.current to Math.max(0, $arousal.player.current - 40)>>
<<addAffection "kira" 2>>
<div class="choice-container">
<<vchoice "\"Much better. Thank you.\"" "Kira_Room" "talk" "broken-heart">>
<<vchoice "\"We should do that more often.\"" "Kira_Room" "intimate" "lips">>
</div><<set _kira to $companions[0]>>
<<setBackground "current_location">>
<<showCharacter "kira" "center" "desperate">>
<<run $("body").addClass("scene-mode-intense")>>
<h2>Critical Mass</h2>
Something snaps.
You're not sure who moves first. Maybe both of you. Maybe neither—maybe the tension itself finally reaches critical mass and reality just... gives.
One moment you're across the room from each other, pretending to focus on mundane tasks. The vault systems. Inventory checks. Anything but acknowledging the unbearable weight between you.
The next, you're crashing together like colliding stars.
<<storyVideo "story/kira_mutual_snap/scene">>
<<say "Kira" "Fuck—">>
<<say $player.name "Kira—">>
Neither of you finishes. Words dissolve into something more urgent—hands, mouths, desperate sounds that aren't quite language.
Her hands are everywhere. Yours are everywhere. Clothes become obstacles to be destroyed, not removed. You hear fabric tear. Don't care whose.
<<say "Kira" "I can't—we need to—<em>now</em>—">>
Her fingers dig into your shoulders hard enough to bruise. <<if _storyFamily is "sf_cg_kira_mutual_snap_04">>Your hand tangles in her hair. She sinks down and takes your cock in her mouth, greedy, and you fist her hair and drive her onto you.<<else>>Your hand tangles in her hair, pulling her head back so you can bite the column of her throat. She gasps, arching into you.<</if>>
This isn't like the cautious exploration of first times or the slow burn of a planned seduction. This is weeks of denial finally demanding payment, and it's going to take everything you have.
[[Continue|Mutual_Snap_Sex]]<<advanceTime 1 30>>
<h2>Devastation</h2>
<<storyVideo "story/kira_mutual_snap/sex">>
There's no tenderness in this. No patience. Just raw, overwhelming <em>need</em>.
You barely make it to the bed.
Your back hits the wall—or maybe it's hers—and then she's pulling you down onto the mattress. The frame groans under you. You don't care. Nothing matters except getting inside her <em>right fucking now</em>.
<<say "Kira" "Don't you dare be gentle. I'll kill you if you're gentle—">>
You answer by shoving into her in one brutal thrust.
She screams. Not pain—pure, desperate relief. Her legs wrap around your hips, heels digging into your ass, forcing you deeper.
"<em>Yes</em>—fuck—<em>finally</em>—"
The angle is wrong. The position is awkward. Neither of you cares. You fuck her like you're trying to crawl inside her skin, and she meets every thrust with grinding hips and nails raking down your back.
"Harder—<em>harder</em>—I need—"
You grab her hips and slam into her with everything you have. The wet sounds of flesh on flesh echo off the metal walls. Her cunt clenches around you like a fist, so tight it's almost painful.
"I'm gonna—already—<em>fuck I'm gonna come—</em>"
She does. Her whole body goes rigid, back arching off the mattress, a sound tearing from her throat that's more sob than scream. You feel her cunt spasm around your cock, pulsing, milking.
And you follow her over—too much buildup, too much need. Your orgasm crashes through you like a freight train. You bury yourself deep and empty yourself inside her with her name on your lips.
For about three seconds, you think it's over.
Then she's moving again.
<<say "Kira" "Not enough. Not nearly fucking enough.">>
<<set _w26clip to _storyClip>><<set _w26fam to _storyFamily>><<storyVideo "story/kira_mutual_snap/sex_2_rides">><<set _w26a to _storyClip>><<set _storyClip to _w26clip>><<set _storyFamily to _w26fam>>
She shoves you onto your back—your cock still inside her, still hard despite just coming—and starts riding you before you can catch your breath.
"<em>More</em>. I need more. Give me <em>more</em>—"
She's frantic, chasing something beyond reason. Her hands brace on your chest, nails digging in. Her tits bounce with every desperate movement. Her hair is wild around her face, and her eyes—her eyes are almost feral.
You grab her hips and help her drive down onto you, matching her rhythm. The oversensitivity after orgasm makes everything sharper—almost too much—but you don't stop.
Can't stop.
<<set _w26fam to _storyFamily>><<storyVideo "story/kira_mutual_snap/sex_3_from_behind">><<set _w26b to _storyClip>><<set _storyFamily to _w26fam>>
You flip her over—still inside her—and take her from behind. <<if _storyClip is "b90148f5d9c3">>She looks back at you over her shoulder and spreads her legs wider.<<else>>She presses her cheek into the sheets and spreads her legs wider.<</if>>
"<em>There</em>—right there—don't stop—don't you fucking stop—"
You don't. You fuck her through a second orgasm, then a third. Or maybe it's all one continuous wave—impossible to tell anymore. Time stops meaning anything.
Your muscles burn. Sweat drips from your face onto her back. But every time you think you might collapse, she looks back at you with those desperate eyes and you find something more.
"Fill me up again. I want—I need to feel it—"
You come inside her a second time. Then, somehow, a third. Each one less intense but lasting longer, wringing everything out of you until there's nothing left.
<<if _storyFamily is "sf_cg_kira_mutual_snap_04">><<set _ocClip to _storyClip>><<set _ocFam to _storyFamily>><<storyVideo "story/kira_mutual_snap/sex_mouths">><<set _ocMouths to _storyClip>><<set _storyClip to _ocClip>><<set _storyFamily to _ocFam>>
<</if>><<if _storyFamily is "sf_cg_kira_mutual_snap_04">>You lose track of positions. Her mouth on your cock while your tongue is buried in her cunt. Her face shoved down into the sheets while you pound her from behind. Your hand locked around her throat, one of her legs thrown over your shoulder, while she begs for more.<<else>>You lose track of positions.<</if>> Lose track of whose orgasm is whose. Everything blurs together into sensation and need and the slap of flesh and her voice—broken, desperate, perfect—moaning your name like a prayer.
Finally—<em>finally</em>—you both just... stop, sliding off the edge of the bed in a tangle onto the floor.
[[Collapse together|Mutual_Snap_Aftermath]]<<showCharacter "kira" "center" "post_sex">>
<<run $("body").removeClass("scene-mode-intense")>>
<h2>Aftermath</h2>
<<storyVideo "story/kira_mutual_snap/aftermath">>
<<if _storyFamily is "sf_cg_kira_mutual_snap_04">>Somewhere in there she took one on her knees, across her face and tongue. She licks her lips clean now, grinning.
<</if>>Eventually, you both just collapse.
The floor is hard and cold beneath you. Your muscles are screaming. Every part of you is covered in sweat and cum and other fluids. You can't remember ever being this exhausted.
And yet... you feel <em>good</em>.
Clear. Like a fever finally breaking.
Kira is pressed against your chest, breathing hard. Neither of you has the energy to move. For a long moment, the only sound is your combined breathing slowly returning to normal.
<<say "Kira" "">>
<<say "Kira" "What the fuck was that.">>
It's not really a question. More like acknowledging that something just happened that neither of you has words for.
<<say $player.name "I don't know.">>
<<say "Kira" "We should... we should probably talk about—">>
<<say $player.name "Later.">>
<<say "Kira" "Yeah. Later.">>
She shifts, curling against you more comfortably. Her hand rests on your chest, over your heart. You can feel it still racing.
<<say "Kira" "For what it's worth...">>
She trails off. You wait.
<<say "Kira" "That was... I mean, I've had sex before, obviously. But that was...">>
<<say $player.name "Devastating?">>
<<say "Kira" "Yeah. Devastating.">>
She laughs quietly, a little breathless.
<<say "Kira" "We're definitely doing that again. Eventually. When I can walk.">>
<<say $player.name "Fair.">>
You lie there together for a while longer. Neither of you rushes to get up. Despite the hard floor and the uncomfortable position, there's something perfect about just... being here. In this moment.
Eventually, though, reality reasserts itself. You're both naked on the floor. Covered in evidence. In a vault where privacy is a luxury.
<<say "Kira" "We should probably...">>
<<say $player.name "Yeah.">>
But it takes another few minutes before either of you moves.
When you finally stand—legs shaky, muscles protesting—Kira catches your hand. You look at her.
Her expression is soft. Vulnerable. Different from the desperation that drove you together.
<<say "Kira" "Hey.">>
<<say $player.name "Hey.">>
<<say "Kira" "We're... okay, right? This doesn't make things weird?">>
[[Pull her close—"We're more than okay"|Mutual_Snap_Affirm]]
[["As long as we both wanted it, we're fine"|Mutual_Snap_Casual]]<<set _kira to $companions[0]>>
<<showCharacter "kira" "center" "tender">>
<<storyVideo "story/kira_mutual_snap/affirm">>
You pull her close. She comes willingly, pressing against you despite the mess.
<<say $player.name "We're more than okay.">>
<<say "Kira" "You sure? Because I kind of jumped you like a starving animal.">>
<<say $player.name "And I jumped you right back. We needed that. Both of us.">>
She's quiet for a moment, her forehead resting against your chest.
<<say "Kira" "I don't regret it. Just so you know. I don't regret any of it.">>
<<say $player.name "Neither do I.">>
She looks up at you, and there's something in her eyes—warmth, trust, maybe the beginning of something deeper.
<<say "Kira" "Good. Because that changes things, you know? Between us.">>
<<say $player.name "I know.">>
<<say "Kira" "And I'm... I'm okay with that. With things changing.">>
You kiss her. Gentle this time. Tender. A promise that not everything between you has to be desperate and rough.
When you pull back, she's smiling.
<<say "Kira" "Alright. Now let's clean up before someone comes looking for us and finds... <em>this</em>.">>
She gestures at the evidence of your mutual devastation. You both laugh—a little breathless, a little giddy with release and relief.
<<set _kira.trust += 3>>
<<set _kira.affection += 3>>
[[Clean up and return to normal|Mutual_Snap_Complete]]<<set _kira to $companions[0]>>
<<showCharacter "kira" "center" "neutral">>
<<say $player.name "As long as we both wanted it, we're fine.">>
<<say "Kira" "Right. Yeah. Of course.">>
There's a flicker of something in her expression—disappointment? Uncertainty?—but she covers it quickly with a smile.
<<say "Kira" "Just needed to clear the air. Make sure we're on the same page.">>
<<say $player.name "We are. That was... what it was. Needed release.">>
<<say "Kira" "Yeah. Needed release.">>
She pulls back, putting a little distance between you. Her walls come up—not hostile, just... careful.
<<say "Kira" "Alright. Let's get cleaned up.">>
You get the sense that you could have said something different. Something more. But the moment passes.
<<set _kira.trust += 1>>
<<set _kira.affection += 2>>
[[Clean up and return to normal|Mutual_Snap_Complete]]<<set _kira to $companions[0]>>
<<set $player.lust to 0>><<run setup.playerReleased()>>
<<set _kira.tension to 20>>
<<set _kira.lust to 0>>
<<set $arousal.player.daysAtHigh to 0>>
<<set $arousal.kira.daysAtHigh to 0>>
<<set $arousal.mutual.daysAtHigh to 0>>
<<set $arousal.player.blueBallsActive to false>>
<<set $arousal.kira.blueBallsActive to false>>
<<set _kira.trust += 2>>
<<set _kira.affection += 3>>
<<set $flags.mutualSnapOccurred to true>>
<<set $flags.sleptWithKira to true>>
<<set $flags.seenKiraNaked to true>>
<<set _kira.tensionFloor to 20>>
<<clampStat "player.energy" -30 0 $player.maxEnergy>>
<<storyVideo "story/kira_mutual_snap/complete">>
<<if _storyFamily is "sf_cg_kira_mutual_snap_04">>You help each other clean up. She finds her things one by one, pulling them back on while you watch, snapping straps into place.<<else>>You help each other clean up—finding scattered clothes, wiping away evidence.<</if>> There's an intimacy to it that's different from the raw desperation of moments ago.
Eventually, you're both presentable. Exhausted, but presentable.
<<say "Kira" "I'm going to sleep for about twelve hours.">>
<<say $player.name "Same.">>
She pauses at the door, looking back at you.
<<say "Kira" "Thanks. For... you know.">>
<<say $player.name "Right back at you.">>
She grins—that familiar cocky smile—and slips out.
You're alone again. The room feels different now. Everything feels different.
<<notify "success">>
<strong>Mutual Release Achieved</strong><br>
• Player lust fully released<br>
• Kira tension reduced significantly<br>
• Relationship deepened<br>
• Blue ball effects cleared<br>
• <em>Things have changed between you</em>
<</notify>>
<<notify "info">>
<strong>Status Note: Tension Floor</strong><br>
After intense intimacy, Kira's baseline tension will never drop below 20. The connection between you has fundamentally shifted.
<</notify>>
<<link "Continue" "Kira_Room">><</link>><<widget "checkTransformation">>
<<set _newStage to Math.floor($player.corruption / 20)>>
<<if _newStage > $player.transformationStage>>
<<set $player.transformationStage to _newStage>>
<<set $flags.newTransformationStage to true>>
<<switch _newStage>>
<<case 1>>
<<run $player.transformationTraits.push("faint_glow", "night_vision_hint")>>
<<case 2>>
<<run $player.transformationTraits.push("glowing_eyes", "sharp_teeth")>>
<<case 3>>
<<run $player.transformationTraits.push("partial_form", "supernatural_aura")>>
<<case 4>>
<<run $player.transformationTraits.push("hybrid_form", "shifting_anatomy")>>
<<case 5>>
<<run $player.transformationTraits.push("transcended")>>
<</switch>>
<</if>>
<</widget>>
<<widget "checkForDream">>
<<if random(1,100) <= 30>>
<<set $dream.active to true>>
<<set $dream.dreamCount += 1>>
<<if $player.lust >= 50>>
<<set $dream.type to "erotic">>
<<elseif $dream.convergenceContact >= 50>>
<<set $dream.type to "nightmare">>
<<elseif $player.marks.includes("succubus-touched") && random(1,100) <= 40>>
<<set $dream.type to "visitation">>
<<elseif $player.pastRevealed < 100 && $player.pastFragments.length < 5>>
<<set $dream.type to "memory">>
<<else>>
<<set $dream.type to "prophetic">>
<</if>>
<<set $dream.lastDream to $dream.type>>
<<else>>
<<set $dream.active to false>>
<</if>>
<</widget>>
/* =============================================================<<widget "morningDecay">>
<<if !$arousal>><<set $arousal to {}>><</if>>
<<if $arousal.lastMorningDay !== $time.day>>
<<set $arousal.lastMorningDay to $time.day>>
<<if $flags>><<set $flags.kiraSnappedToday to false>><</if>>
<<if $player && $player.lust >= 10>>
<<set _decay to random(5, 12)>>
<<set _negDecay to -_decay>>
<<clampStat "player.lust" _negDecay>>
<</if>>
<<if $companions && $companions.length > 0 && $companions[0]>>
<<if $companions[0].trust >= 50>>
<<set _tensionDecay to random(7, 12)>>
<<elseif $companions[0].trust >= 30>>
<<set _tensionDecay to random(5, 9)>>
<<else>>
<<set _tensionDecay to random(3, 6)>>
<</if>>
<<if !$companions[0].present || ($journey && $journey.active && $expeditionCompanion !== "kira")>>
<<set _tensionDecay += random(3, 6)>>
<</if>>
<<set _negTensionDecay to -_tensionDecay>>
<<clampStat "companions[0].tension" _negTensionDecay>>
<</if>>
<<updateBlueballCounters>>
<</if>>
<</widget>>
<<widget "updateBlueballCounters">>
<<if $player && $player.lust >= 80>>
<<set $arousal.player.daysAtHigh += 1>>
<<if $flags && $arousal.player.edging && $arousal.player.daysAtHigh >= 5>><<run setup.storeForcedRelease()>><</if>>
<<else>>
<<if $arousal && $arousal.player>>
<<set $arousal.player.daysAtHigh to 0>>
<<set $arousal.player.blueBallsActive to false>>
<</if>>
<</if>>
<<if $companions && $companions.length > 0 && $companions[0]>>
<<if $companions[0].tension >= 80>>
<<set $arousal.kira.daysAtHigh += 1>>
<<else>>
<<set $arousal.kira.daysAtHigh to 0>>
<<set $arousal.kira.blueBallsActive to false>>
<</if>>
<<if $player.lust >= 80 && $companions[0].tension >= 80>>
<<set $arousal.mutual.daysAtHigh += 1>>
<<else>>
<<set $arousal.mutual.daysAtHigh to 0>>
<</if>>
<</if>>
<<checkBlueballPenalties>>
<<checkKiraSnap>>
<<checkMutualSnap>>
<</widget>>
<<widget "checkBlueballPenalties">>
<<if $arousal && $arousal.player && $arousal.player.daysAtHigh >= 2 && !$arousal.player.edging>>
<<set $arousal.player.blueBallsActive to true>>
<</if>>
<</widget>>
<<widget "checkKiraSnap">>
<<if $arousal && $arousal.kira && $arousal.kira.daysAtHigh >= 5 && $flags && !$flags.kiraSnappedToday && !$flags.kiraGaveUp && !setup.kiraStaysInMedical()>>
<<set $flags.kiraSnapPending to true>>
<</if>>
<</widget>>
<<widget "checkMutualSnap">>
<<if $arousal && $arousal.mutual && $arousal.mutual.daysAtHigh >= 3 && !$arousal.mutual.snapTriggered && !setup.kiraStaysInMedical()>>
<<set $arousal.mutual.snapTriggered to true>>
<<if $flags>>
<<set $flags.mutualSnapPending to true>>
<</if>>
<</if>>
<</widget>>
<<widget "applyRelease">>
<<set _type to _args[0]>>
<<switch _type>>
<<case "quick_jerk">>
<<clampStat "player.lust" -30>>
<<set $arousal.player.releaseQuality to "low">>
<<case "proper_masturbation">>
<<clampStat "player.lust" -50>>
<<set $arousal.player.releaseQuality to "medium">>
<<case "wet_dream">>
<<clampStat "player.lust" -40>>
<<set $arousal.player.releaseQuality to "involuntary">>
<<case "handjob_quick">>
<<clampStat "player.lust" -35>>
<<clampStat "companions[0].tension" -15>>
<<set $arousal.player.releaseQuality to "low">>
<<case "handjob_proper">>
<<clampStat "player.lust" -50>>
<<clampStat "companions[0].tension" -25>>
<<set $arousal.player.releaseQuality to "medium">>
<<case "fingering_give">>
<<clampStat "player.lust" -10>>
<<clampStat "companions[0].tension" -30>>
<<clampStat "companions[0].lust" -40>>
<<case "oral_receive">>
<<clampStat "player.lust" -60>>
<<clampStat "companions[0].tension" -20>>
<<set $arousal.player.releaseQuality to "high">>
<<case "oral_give">>
<<clampStat "player.lust" -15>>
<<clampStat "companions[0].tension" -40>>
<<clampStat "companions[0].lust" -50>>
<<case "grinding">>
<<clampStat "player.lust" -25>>
<<clampStat "companions[0].tension" -20>>
<<set $arousal.player.releaseQuality to "low">>
<<case "just_tip">>
<<clampStat "player.lust" -20>>
<<clampStat "companions[0].tension" -15>>
<<case "sex_quick">>
<<clampStat "player.lust" -50>>
<<clampStat "companions[0].tension" -35>>
<<clampStat "companions[0].lust" -40>>
<<set $arousal.player.releaseQuality to "medium">>
<<case "sex_extended">>
<<clampStat "player.lust" -80>>
<<clampStat "companions[0].tension" -55>>
<<clampStat "companions[0].lust" -60>>
<<set $arousal.player.releaseQuality to "high">>
<<case "mutual_snap">>
<<set $player.lust to 0>>
<<clampStat "companions[0].tension" -80 20 100>>
<<set $companions[0].lust to 0>>
<<set $arousal.player.releaseQuality to "devastating">>
<</switch>>
<<set $flags.reliefUsed to true>>
<<set $arousal.player.daysAtHigh to 0>>
<<set $arousal.player.lastRelease to $time.day>>
<<run setup.stopEdging()>>
<<run setup.playerReleased()>>
<<set $arousal.player.blueBallsActive to false>>
<</widget>><<set $combat._tensionGained to 0>>
<<set $media.recentClips to []>>
<<silently>><<include "WeaponDatabase">><</silently>>
<<set $combat.terrain to setup.currentTerrain()>>
<<run (function() {
var folder = setup.combatTerrainFolder(State.variables.combat.terrain);
var count = setup.combatTerrainImageCount(folder);
var num = Math.floor(Math.random() * count) + 1;
State.variables.combat.backgroundImage = setup.combatTerrainImage(folder, num);
VaultUI.setBackgroundDirect(State.variables.combat.backgroundImage);
})()>>
<<if ndef $settings>><<set $settings to {}>><</if>>
<<if $settings.useCardUI === undefined>>
<<set $settings.useCardUI to true>>
<</if>>
<<if $settings.usePlayerCards === undefined>>
<<set $settings.usePlayerCards to true>>
<</if>>
<<if $settings.showPlayerCardPreviews === undefined>>
<<set $settings.showPlayerCardPreviews to false>>
<</if>>
<<if $settings.playerCardAsPopup === undefined>>
<<set $settings.playerCardAsPopup to true>>
<</if>>
<<if !$combat>>
<<set $combat to {}>>
<</if>>
<<run setup.resetFightEnding()>>
<<set $combat.active to true>>
<<set $combat.victoryCounted to false>>
<<set $combat.turn to 1>>
<<set $combat.phase to "player">>
<<set $combat.defending to false>>
<<set $combat.blocking to false>>
<<set $combat.parrying to false>>
<<set $combat.parrySuccess to false>>
<<set $combat.riposteActive to false>>
<<set $combat.playerVulnerable to false>>
<<set $combat.resting to false>>
<<set $combat.dodging to false>>
<<set $combat.kiraAid to setup.kiraAidFresh()>>
<<set $combat.combo to {
count: 0,
lastAction: "",
target: -1,
bonus: 0
}>>
<<set $combat.playerBleeding to false>>
<<set $combat.playerDazed to false>>
<<set $combat.playerDazedTurns to 0>>
<<set $combat.playerDazedCause to "">>
<<set $combat.playerVulnerable to false>>
<<set $combat.playerWristsBound to false>>
<<set $combat.playerAnklesBound to false>>
<<set $combat.playerEffects to {}>>
<<set $combat.kiraBleeding to false>>
<<set $combat.kiraStunned to 0>>
<<set $combat.kiraIncapacitated to false>>
<<set $combat.kiraInRefractory to false>>
<<set $combat.kiraRefractoryTurns to 0>>
<<set $combat.kiraDefenseDebuff to 0>>
<<set $combat.kiraDefenseModifier to 0>>
<<set $combat.kiraBeingGroped to false>>
<<set $combat.kiraBeingFingered to false>>
<<set $combat.kiraOrgasmTriggered to false>>
<<set $combat.kiraEffects to {}>>
<<set $combat.log to []>>
<<if $combat.cardUIActive === undefined>>
<<set $combat.cardUIActive to true>>
<</if>>
<<if $combat.canFlee === undefined>>
<<set $combat.canFlee to true>>
<</if>>
<<if $combat.canSeduce === undefined>>
<<set $combat.canSeduce to ($flags && $flags.seductionUnlocked) || false>>
<</if>>
<<if $combat.allEnemies === undefined && $combat.enemies>>
<<set $combat.allEnemies to clone($combat.enemies)>>
<</if>>
<<if $combat.defeatedEnemies === undefined>>
<<set $combat.defeatedEnemies to []>>
<</if>>
<<run setup.stampFightSlots($combat)>>
<<if $combat.combo === undefined>>
<<set $combat.combo to {count: 0, lastAction: "", target: -1, bonus: 0}>>
<</if>>
<<if $combat.lastAttackWasWhip === undefined>>
<<set $combat.lastAttackWasWhip to false>>
<</if>>
<<if $combat.lastAttackWasGrab === undefined>>
<<set $combat.lastAttackWasGrab to false>>
<</if>>
<<if $combat.defending === undefined>>
<<set $combat.defending to false>>
<</if>>
<<if $combat.blocking === undefined>>
<<set $combat.blocking to false>>
<</if>>
<<if $combat.parrying === undefined>>
<<set $combat.parrying to false>>
<</if>>
<<if $combat.parrySuccess === undefined>>
<<set $combat.parrySuccess to false>>
<</if>>
<<if $combat.riposteActive === undefined>>
<<set $combat.riposteActive to false>>
<</if>>
<<if $combat.playerVulnerable === undefined>>
<<set $combat.playerVulnerable to false>>
<</if>>
<<if $combat.resting === undefined>>
<<set $combat.resting to false>>
<</if>>
<<if $combat.dodging === undefined>>
<<set $combat.dodging to false>>
<</if>>
<<if $combat.playerDazed === undefined>>
<<set $combat.playerDazed to false>>
<</if>>
<<if $combat.playerDazedTurns === undefined>>
<<set $combat.playerDazedTurns to 0>>
<</if>>
<<if $combat.playerEffects === undefined>>
<<set $combat.playerEffects to {}>>
<</if>>
<<if $combat.kiraEffects === undefined>>
<<set $combat.kiraEffects to {}>>
<</if>>
<<if $combat.kiraWristsBound === undefined>>
<<set $combat.kiraWristsBound to false>>
<</if>>
<<if $combat.kiraAnklesBound === undefined>>
<<set $combat.kiraAnklesBound to false>>
<</if>>
<<if $combat.kiraLeashed === undefined>>
<<set $combat.kiraLeashed to false>>
<</if>>
<<if $combat.kiraInRefractory === undefined>>
<<set $combat.kiraInRefractory to false>>
<</if>>
<<if $combat.kiraRefractoryTurns === undefined>>
<<set $combat.kiraRefractoryTurns to 0>>
<</if>>
<<if $combat.pendingKiraOrgasm === undefined>>
<<set $combat.pendingKiraOrgasm to null>>
<</if>>
<<run setup.guardKira()>>
<<if $combat.kiraIncapacitated === undefined>>
<<if $combat.companionInCombat === "kira" && $companions && $companions[0]>>
<<if $companions[0].health <= 1>>
<<set $combat.kiraIncapacitated to true>>
<<else>>
<<set $combat.kiraIncapacitated to false>>
<</if>>
<<else>>
<<set $combat.kiraIncapacitated to false>>
<</if>>
<</if>>
<<if $combat.positions === undefined>>
<<set $combat.positions to {player: "standing", kira: "standing"}>>
<</if>>
<<if $combat.currentTarget === undefined>>
<<set $combat.currentTarget to 0>>
<</if>>
<<if $combat.enemyActions === undefined>>
<<set $combat.enemyActions to []>>
<</if>>
<<if $combat.sex === undefined>>
<<set $combat.sex to {active: false, target: null, attacker: null, type: null}>>
<</if>>
<<if $combat.pendingSexAction === undefined>>
<<set $combat.pendingSexAction to null>>
<</if>>
<<if $combat.playerJustFucked === undefined>>
<<set $combat.playerJustFucked to null>>
<</if>>
<<if $combat.playerWristsBound === undefined>>
<<set $combat.playerWristsBound to false>>
<</if>>
<<if $combat.playerAnklesBound === undefined>>
<<set $combat.playerAnklesBound to false>>
<</if>>
<<if $combat.blockPenalty === undefined>>
<<set $combat.blockPenalty to 0>>
<</if>>
<<if $combat.parryPenalty === undefined>>
<<set $combat.parryPenalty to 0>>
<</if>>
<<if $combat.kiraStunned === undefined>>
<<set $combat.kiraStunned to 0>>
<</if>>
<<if $combat.kiraDazed === undefined>>
<<set $combat.kiraDazed to false>>
<</if>>
<<if $combat.kiraDazedTurns === undefined>>
<<set $combat.kiraDazedTurns to 0>>
<</if>>
<<if $combat.kiraChoked === undefined>>
<<set $combat.kiraChoked to false>>
<</if>>
<<if $combat.kiraDefenseDebuff === undefined>>
<<set $combat.kiraDefenseDebuff to 0>>
<</if>>
<<if $combat.kiraPostOrgasmAttacks === undefined>>
<<set $combat.kiraPostOrgasmAttacks to 0>>
<</if>>
<<if $combat.kiraFirsts === undefined>>
<<set $combat.kiraFirsts to {}>>
<</if>>
<<if $combat.exploitSuccess === undefined>>
<<set $combat.exploitSuccess to false>>
<</if>>
<<if $combat.playerActionPreview === undefined>>
<<set $combat.playerActionPreview to null>>
<</if>>
<<run $combat.log = []>>
<<logCombat "Combat begins!" "critical">>
<<applyArmorEffects>>
<<if !$combat.enemies || !Array.isArray($combat.enemies)>>
<<set $combat.enemies to []>>
<</if>>
<<set $combat.enemies to $combat.enemies.filter(function(e) { return e !== undefined && e !== null; })>>
<<if $combat.enemies.length === 0>>
<<createEnemy "grunt">>
<<if _return>>
<<run $combat.enemies.push(clone(_return))>>
<<else>>
<<run $combat.enemies.push({
id: "fallback_enemy",
name: "Raider",
health: 30,
maxHealth: 30,
damage: 5,
dodge: 10,
armor: 0,
lust: 0,
maxLust: 100,
gender: "male",
tier: "standard",
visualGroup: "grunt"
})>>
<</if>>
<</if>>
<<for _initIdx, _initEnemy range $combat.enemies>>
<<if _initEnemy>>
<<run setup.scaleEnemyAtSpawn($combat.enemies[_initIdx])>>
<<if !_initEnemy.visualGroup && setup.defaultEnemyVisualGroup($combat.enemies[_initIdx])>>
<<set $combat.enemies[_initIdx].visualGroup to setup.defaultEnemyVisualGroup($combat.enemies[_initIdx])>>
<</if>>
<<initHumiliation _initIdx>>
<<initArousalState _initIdx>>
<<initEnemyPosition _initIdx>>
<<initResistance _initIdx>>
<<initPainPleasure _initIdx>>
<<initClothingTactics _initIdx>>
<<initEnemyAbilityState _initEnemy>>
<</if>>
<</for>>
<<if !$combat.returnPassage>>
<<set $combat.returnPassage to setup.fightReturnPassage()>>
<</if>>
<<if $companions[0] && (typeof $companions[0].health !== "number" || isNaN($companions[0].health))>>
<<set $companions[0].health to $companions[0].maxHealth || 100>>
<</if>>
<<run document.body.classList.add("scene-mode-combat")>>
<h2>Combat!</h2>
<<if $combat.enemies.length === 1>><<print $combat.enemies[0].name>> moves to attack.<<else>>The enemies move to attack.<</if>> You ready yourself for battle.
<<if $combat.companionInCombat === "kira">>
<<run VaultUI.showCharacter("kira", "left", "combat")>>
<<say "Kira" "Here we go. Watch my back!">>
<</if>>
<div class="choice-container">
<<vchoice "Begin Combat" "Combat_Actions" "action" "attack">>
</div><<set $player.energy to Math.min($player.maxEnergy || 100, $player.energy + 3)>>
<<validateKiraHealth>>
<<applyLustPenalties>>
<<checkTensionPenalty>>
<<checkLustEvent>>
<<handleLustEvents>>
<<if $combat.playerDazedTurns === undefined || isNaN($combat.playerDazedTurns)>>
<<set $combat.playerDazedTurns to 0>>
<</if>>
<<if $combat.playerDazed && $combat.playerDazedTurns <= 0>>
<<set $combat.playerDazed to false>>
<</if>>
<<run setup.playerCharmRoll()>>
<<set _combatLostTurn to !!$combat.playerDazed>>
<<kiraAidTurnStart _combatLostTurn>>
<<set $flags.kiraNoticedArousal to false>>
<<if $clothing && $clothing.player>><<updateExposure "player">><</if>>
<<if $clothing && $clothing.kira>><<updateExposure "kira">><</if>>
<<processEnemyPassiveLust>>
<<run document.body.classList.add("scene-mode-combat")>>
<<run $("#right-sidebar").remove()>>
<div id="combat-sidebar-container">
<div id="combat-sidebar" class="right-sidebar collapsible">
<!-- Header -->
<div class="sidebar-header">
<h2><<icon "crossed-swords" "small">> COMBAT</h2>
<span class="round-counter">Round <<print $combat.turn>></span>
<button class="collapse-btn" onclick="toggleSidebarSection('combat-sidebar')">−</button>
</div>
<!-- Kira Section -->
<<if $combat.companionInCombat === "kira" && $companions && $companions.length > 0 && $companions[0]>>
<<if $combat.kiraIncapacitated>>
<!-- Kira is unconscious -->
<div class="sidebar-section companion-combat incapacitated">
<div class="portrait-container">
<img class="combat-portrait unconscious" src="media/characters/kira/base/unconscious.webp" alt="Kira Unconscious"> <!-- the still is in base/ (characters/kira/unconscious.webp never existed: 404, state fuzzer 2026-09-29) -->
</div>
<div class="name-position-row">
<span class="combatant-name unconscious">KIRA</span>
<span class="position-tag critical">UNCONSCIOUS</span>
</div>
<div class="stat-row">
<span class="stat-icon" data-tooltip="Health"><<icon "health" "small">></span>
<div class="stat-bar health-bar">
<div class="stat-fill critical" style="width: 1%"></div>
</div>
<span class="stat-value critical">1/<<print $companions[0].maxHealth>></span>
</div>
<p class="incapacitated-text">Unable to fight</p>
</div>
<<else>>
<!-- Kira active in combat -->
<div class="sidebar-section companion-combat">
<div class="portrait-container">
<<combatPortrait "kira">>
</div>
<div class="name-position-row">
<span class="combatant-name">KIRA</span>
<<displayPosition "kira">>
</div>
<<if isNaN($companions[0].health) || typeof $companions[0].health !== "number">><<set $companions[0].health to $companions[0].maxHealth || 100>><</if>>
<<if isNaN($companions[0].tension) || typeof $companions[0].tension !== "number">><<set $companions[0].tension to 0>><</if>>
<<if isNaN($companions[0].lust) || typeof $companions[0].lust !== "number">><<set $companions[0].lust to 0>><</if>>
<div class="stat-row">
<span class="stat-icon" data-tooltip="Health"><<icon "health" "small">></span>
<div class="stat-bar health-bar">
<div class="stat-fill" @style="'width: ' + Math.floor($companions[0].health / $companions[0].maxHealth * 100) + '%'"></div>
</div>
<span class="stat-value"><<print $companions[0].health>>/<<print $companions[0].maxHealth>></span>
</div>
<div class="stat-row">
<span class="stat-icon" data-tooltip="Tension"><<icon "lightning" "small">></span>
<div class="stat-bar tension-bar">
<div @class="'stat-fill' + ($companions[0].tension >= 70 ? ' critical' : '')" @style="'width: ' + $companions[0].tension + '%'"></div>
</div>
<span class="stat-value"><<print $companions[0].tension>>%</span>
</div>
<<set _kiraLust to Math.min(100, $companions[0].lust || 0)>>
<div class="stat-row">
<span class="stat-icon" data-tooltip="Lust"><<icon "lust" "small">></span>
<div class="stat-bar lust-bar">
<div @class="'stat-fill' + (_kiraLust >= 80 ? ' critical' : '')" @style="'width: ' + _kiraLust + '%'"></div>
</div>
<span class="stat-value"><<print _kiraLust>>%</span>
</div>
<<displayClothingStatus "kira">>
<<displayBuffDebuffs "kira">>
</div>
<</if>>
<</if>>
<!-- Player Section -->
<div class="sidebar-section player-combat">
<div class="portrait-container">
<<combatPortrait "player">>
</div>
<div class="name-position-row">
<span class="combatant-name">YOU</span>
<<displayPosition "player">>
</div>
<<if isNaN($player.health) || typeof $player.health !== "number">><<set $player.health to $player.maxHealth || 100>><</if>>
<<if isNaN($player.energy) || typeof $player.energy !== "number">><<set $player.energy to $player.maxEnergy || 50>><</if>>
<<if isNaN($player.lust) || typeof $player.lust !== "number">><<set $player.lust to 0>><</if>>
<div class="stat-row">
<span class="stat-icon" data-tooltip="Health"><<icon "health" "small">></span>
<div class="stat-bar health-bar">
<div class="stat-fill" @style="'width: ' + Math.floor($player.health / $player.maxHealth * 100) + '%'"></div>
</div>
<span class="stat-value"><<print $player.health>>/<<print $player.maxHealth>></span>
</div>
<div class="stat-row">
<span class="stat-icon" data-tooltip="Energy"><<icon "lightning" "small">></span>
<div class="stat-bar energy-bar">
<div class="stat-fill" @style="'width: ' + Math.floor($player.energy / $player.maxEnergy * 100) + '%'"></div>
</div>
<span class="stat-value"><<print $player.energy>>/<<print $player.maxEnergy>></span>
</div>
<<if $uiVisible.lustMeter>>
<<set _playerLust to Math.min(100, $player.lust || 0)>>
<div class="stat-row">
<span class="stat-icon" data-tooltip="Lust"><<icon "lust" "small">></span>
<div class="stat-bar lust-bar">
<div @class="'stat-fill' + (_playerLust >= 80 ? ' critical' : '')" @style="'width: ' + _playerLust + '%'"></div>
</div>
<span class="stat-value"><<print _playerLust>>%</span>
</div>
<</if>>
<<displayClothingStatus "player">>
<<displayBuffDebuffs "player">>
<<displayComboStatus>>
</div>
<!-- Combat Log -->
<div id="combat-log" class="sidebar-section combat-log collapsible-section">
<div class="section-header">
<span><<icon "scroll" "small">> Combat Log</span>
<button class="collapse-btn" onclick="toggleSidebarSection('combat-log')">−</button>
</div>
<div class="log-content">
<<for _i, _entry range $combat.log>>
<div @class="'log-entry ' + _entry.type">
• <<print _entry.text>>
</div>
<</for>>
</div>
</div>
</div>
</div>
<<set _bestTarget to 0>>
<<set _foundActiveEnemy to false>>
<<for _i, _enemy range $combat.enemies>>
<<if _enemy.sexIntent && !_enemy.stunned>>
<<set _bestTarget to _i>>
<<set _foundActiveEnemy to true>>
<<elseif !_enemy.stunned && !_foundActiveEnemy>>
<<set _bestTarget to _i>>
<<set _foundActiveEnemy to true>>
<</if>>
<</for>>
<<if $combat.currentTarget !== undefined && $combat.enemies[$combat.currentTarget] && $combat.enemies[$combat.currentTarget].stunned && _foundActiveEnemy && !($combat.enemies[$combat.currentTarget].beenUsed && $combat.enemies[$combat.currentTarget].keepTargeted)>>
<<set $combat.currentTarget to _bestTarget>>
<</if>>
<<if $combat.currentTarget === undefined || $combat.currentTarget >= $combat.enemies.length>>
<<set $combat.currentTarget to _bestTarget>>
<</if>>
<div class="combat-enemy-display">
<<for _i, _enemy range $combat.enemies>>
<<capture _enemy, _i>>
<div @class="'combat-enemy' + (_i === $combat.currentTarget ? ' targeted' : '')" @onclick="'selectCombatTarget(' + _i + ')'">
<<if _i === $combat.currentTarget>>
<div class="target-indicator"><<icon "crossed-swords" "small">> TARGET</div>
<</if>>
<<if _enemy.beenUsed>>
<div class="stunned-indicator used-indicator"><<print _enemy.gender === "male" ? "SPENT" : setup.enemySheIsYours(_enemy) ? "USED" : "BEATEN">>: OUT OF THE FIGHT</div>
<<elseif _enemy.stunned>>
<div class="stunned-indicator">STUNNED (<<print _enemy.stunnedTurns>>)</div>
<</if>>
<<if _enemy.flauntDistracted>>
<div class="distracted-indicator"><<icon "accuracy-down" "small">> DISTRACTED (-10% acc)</div>
<</if>>
<<if _enemy.visualGroup>>
<<getCombatEnemyMedia _enemy.visualGroup _enemy>>
<<else>>
<<set _combatEnemyMedia to null>>
<</if>>
<<if setup.combatMediaIsClip(_combatEnemyMedia)>>
<<if $settings.staticEnemyPortraits || _combatEnemyMedia.format === "webp" || _combatEnemyMedia.format === "jpg" || _combatEnemyMedia.format === "png">>
<img class="combat-enemy-portrait" @src="_combatEnemyMedia.file" @alt="_enemy.name">
<<else>>
<video class="combat-enemy-portrait" autoplay loop muted playsinline>
<source @src="_combatEnemyMedia.file" @type="'video/' + (_combatEnemyMedia.format || setup.videoExt())">
</video>
<</if>>
<<else>>
<<set _cardFb to setup.enemyCardFallback(_enemy)>>
<<if _cardFb.format === "webp" || _cardFb.format === "jpg" || _cardFb.format === "png">>
<img class="combat-enemy-portrait" @src="_cardFb.file" @alt="_enemy.name">
<<else>>
<video class="combat-enemy-portrait" autoplay loop muted playsinline>
<source @src="_cardFb.file" @type="'video/' + _cardFb.format">
</video>
<</if>>
<</if>>
<div class="enemy-info">
<div class="enemy-name"><<print _enemy.name>> #<<print _i + 1>></div>
<<set _enemyCurrentHealth to _enemy.health>>
<<set _enemyMaxHealth to _enemy.maxHealth>>
<<statbar _enemyCurrentHealth _enemyMaxHealth "#e74c3c">><<if _enemy.clothing>><<if _enemy.clothing.titsExposed && _enemy.clothing.pussyExposed>><div class="enemy-exposure severe" title="Exposed: her accuracy -5, +5 to hit her"><<icon "hazard-sign" "small">> Fully Exposed</div><<elseif _enemy.clothing.titsExposed>><div class="enemy-exposure" title="Exposed: her accuracy -5, +5 to hit her"><<icon "female" "small">> Tits Exposed</div><<elseif _enemy.clothing.pussyExposed>><div class="enemy-exposure severe" title="Exposed: her accuracy -5, +5 to hit her"><<icon "hazard-sign" "small">> Pussy Exposed</div><</if>><</if>><<set _hasLust to (_enemy.seduceThreshold && _enemy.seduceThreshold lt 999)>><<set _hasStats to (_hasLust || _enemy.humiliation > 0 || _enemy.arousal > 0 || _enemy.resistance !== undefined)>><<if _hasStats>><details class="enemy-details-panel">
<summary class="enemy-details-toggle">
<<icon "stats" "small">> Details
</summary>
<div class="enemy-details-content">
<<if _hasLust>>
<<set _enemyLust to (_enemy.lust || 0)>>
<<set _enemyMaxLust to setup.enemyMaxLust(_enemy)>>
<<set _lustPct to Math.min(100, Math.floor(_enemyLust / _enemyMaxLust * 100))>>
<div class="enemy-stat-row lust-row">
<span class="stat-label" title="Lust level"><<icon "lust" "small">> Lust</span>
<div class="mini-stat-bar lust-bar">
<div class="mini-stat-fill" @style="'width: ' + _lustPct + '%'"></div>
</div>
<span class="stat-val"><<print Math.floor(_enemyLust)>><<if _enemyMaxLust !== 100>>/<<print _enemyMaxLust>><</if>></span>
</div>
<</if>>
<<if _enemy.humiliation !== undefined && _enemy.humiliation > 0>>
<div class="enemy-stat-row humiliation-row">
<span class="stat-label" title="Humiliation: Higher = more debuffs, can break at 100"><<icon "flushed" "small">> Humil</span>
<<set _humilPct to Math.min(100, _enemy.humiliation)>>
<div class="mini-stat-bar humiliation-bar">
<div class="mini-stat-fill" @style="'width: ' + _humilPct + '%'"></div>
</div>
<span class="stat-val"><<print Math.floor(_enemy.humiliation)>></span>
</div>
<</if>>
<<if _enemy.resistance !== undefined>>
<div class="enemy-stat-row resistance-row">
<span class="stat-label" title="Resistance: Lower = easier to break will"><<icon "shield" "small">> Resist</span>
<<set _resistPct to Math.max(0, Math.min(100, _enemy.resistance))>>
<div class="mini-stat-bar resistance-bar">
<div class="mini-stat-fill" @style="'width: ' + _resistPct + '%'"></div>
</div>
<span class="stat-val"><<print Math.floor(_enemy.resistance)>></span>
</div>
<</if>>
<<if _enemy.isCovering>>
<div class="enemy-covering-status">
<<icon "block" "small">> Covering (-<<print _enemy.coveringAccPenalty || 15>> accuracy, no heavy attacks)
</div>
<</if>>
</div>
</details>
<</if>>
<<if _enemy.humiliationState === "embarrassed">>
<div class="enemy-humiliation embarrassed" @title="setup.HUMILIATION_TEXT.embarrassed"><<icon "flushed" "small">> Embarrassed</div>
<<elseif _enemy.humiliationState === "degraded">>
<div class="enemy-humiliation degraded" @title="setup.HUMILIATION_TEXT.degraded"><<icon "submission" "small">> Degraded</div>
<<elseif _enemy.humiliationState === "broken">>
<div class="enemy-humiliation broken" @title="setup.HUMILIATION_TEXT.broken"><<icon "broken-heart" "small">> BROKEN</div>
<</if>>
<<if _enemy.position && _enemy.position !== "standing">>
<<set _posClass to (_enemy.position === "pinned") ? "position-pinned" : "position-vulnerable">>
<<set _posTip to (setup.enemyPositionConfigs && setup.enemyPositionConfigs[_enemy.position] && setup.enemyPositionConfigs[_enemy.position].tooltip) || "">>
<div @class="'enemy-position ' + (_posClass)" @title="_posTip">
<<switch _enemy.position>>
<<case "kneeling">><<icon "kneeling" "small">> Kneeling
<<case "prone_front">><<icon "prone" "small">> Face Down
<<case "prone_back">><<icon "prone" "small">> On Back
<<case "bent_over">><<icon "bent-over" "small">> Bent Over
<<case "pinned">><<icon "pinned" "small">> PINNED
<</switch>>
</div>
<</if>>
<<set _enemyLustVal to (_enemy.lust || 0)>>
<<set _maleAroused to (_enemy.gender === "male" && _enemyLustVal >= 30 && _enemyLustVal < 60)>>
<<set _maleIntent to (_enemy.gender === "male" && _enemyLustVal >= 60 && _enemyLustVal < 90)>>
<<set _maleDesperate to (_enemy.gender === "male" && _enemyLustVal >= 90)>>
<<set _maleDickOut to (_enemy.gender === "male" && _enemy.clothing && _enemy.clothing.dickExposed)>>
<<set _hasHighLust to (_enemy.gender === "female" && _enemy.seduceThreshold && _enemy.seduceThreshold lt 999 && _enemyLustVal gte _enemy.seduceThreshold * 0.7)>>
<<set _hasWarnings to (_enemy.gender === "female" && (_enemy.humiliation >= 60 || _enemyLustVal >= 60 || (_enemy.resistance !== undefined && _enemy.resistance <= 30) || _enemy.isCovering))>>
<<set _hasTraits to (_enemy.abilities && _enemy.abilities.length gt 0)>>
<<set _hasMaleIndicators to (_maleAroused || _maleIntent || _maleDesperate || _maleDickOut)>>
<<if _hasHighLust || _hasMaleIndicators || _hasWarnings || _hasTraits>>
<div class="enemy-buff-icons">
<<set _maleIcon to setup.maleArousalIcon(_enemy)>>
<<if _maleIcon && _maleIcon.icon>>
<span @class="'buff-icon ' + (_maleIcon.cssClass || '')" @title="_maleIcon.tooltip"><<icon _maleIcon.icon "medium">></span>
<</if>>
<<if _hasHighLust>><span class="buff-icon lust-warning" title="Aroused - vulnerable to seduction"><<icon "hot" "medium">></span><</if>>
<<if _enemy.gender === "female" && _enemy.humiliation >= 60>><<set _humilVal to Math.floor(_enemy.humiliation)>><span class="buff-icon warn-icon humil" @title="'High Humiliation (' + _humilVal + ')'"><<icon "flushed" "medium">></span><</if>>
<<if _enemy.gender === "female" && _enemyLustVal >= 60>><<set _lustVal to Math.floor(_enemyLustVal)>><span class="buff-icon warn-icon arousal" @title="'High Arousal (' + _lustVal + ')'"><<icon "high-arousal" "medium">></span><</if>>
<<if _enemy.gender === "female" && _enemy.resistance !== undefined && _enemy.resistance <= 30>><<set _resistVal to Math.floor(_enemy.resistance)>><span class="buff-icon warn-icon resist" @title="'Low Resistance (' + _resistVal + ')'"><<icon "broken-heart" "medium">></span><</if>>
<<if _enemy.gender === "female" && _enemy.isCovering>><span class="buff-icon warn-icon cover" @title="'Covering herself (-' + (_enemy.coveringAccPenalty || 15) + ' accuracy, no heavy attacks)'"><<icon "block" "medium">></span><</if>>
<<if _hasTraits>>
<<for _ability range _enemy.abilities>>
<<switch _ability>>
<<case "dirty_fighting">>
<span class="buff-icon enemy-trait dirty" title="Dirty Fighting: May cause bleeding"><<icon "hazard-sign" "medium">></span>
<<case "quick_strike">>
<span class="buff-icon enemy-trait quick" title="Quick Strike: Fast attacks"><<icon "rapid-strikes" "medium">></span>
<<case "heavy_strike">>
<span class="buff-icon enemy-trait heavy" title="Heavy Strike: Powerful blows"><<icon "heavy-strike" "medium">></span>
<<case "seductive_taunt">>
<span class="buff-icon enemy-trait seductive" title="Seductive: May raise your lust"><<icon "lust" "medium">></span>
<<case "intimidate">>
<span class="buff-icon enemy-trait intimidate" title="Intimidate: May cause fear"><<icon "afraid" "medium">></span>
<<case "rally_troops">>
<span class="buff-icon enemy-trait rally" title="Rally: Boosts allies"><<icon "people" "medium">></span>
<<case "pack_tactics">>
<span class="buff-icon enemy-trait pack" title="Pack Tactics: Stronger with allies"><<icon "people" "medium">></span>
<<case "regenerate_weak">>
<span class="buff-icon enemy-trait regen" title="Regeneration: Heals over time"><<icon "health" "medium">></span>
<<case "lust_touch">>
<span class="buff-icon enemy-trait lusttouch" title="Lust Touch: Inflicts arousal"><<icon "high-arousal" "medium">></span>
<<case "poison_bite" "poison_sting">>
<span class="buff-icon enemy-trait poison" title="Poison: Venomous attacks"><<icon "hazard-sign" "medium">></span>
<</switch>>
<</for>>
<</if>>
</div>
<</if>>
<<displayStatusEffects _enemy>>
</div>
</div>
<</capture>>
<</for>>
</div>
<<displayStatusEffects $player>>
<<if _combatLostTurn>>
<div class="player-dazed-notice">
<<if $combat.playerDazedCause is "orgasm">><p class="dazed-text">You're still recovering from your orgasm... (<<print $combat.playerDazedTurns>> turn<<if $combat.playerDazedTurns gt 1>>s<</if>> remaining)</p><<elseif $combat.playerDazedCause is "charmed">><p class="dazed-text">Her eyes are still in your head. You hesitate, and the moment to act slips away. (Charmed: you lose this turn)</p><<else>><p class="dazed-text">Your head's still ringing from that hit. The ground won't hold still... (<<print $combat.playerDazedTurns>> turn<<if $combat.playerDazedTurns gt 1>>s<</if>> remaining)</p><</if>>
<<set $combat.playerDazedTurns -= 1>>
<<if $combat.playerDazedTurns lte 0>>
<<set $combat.playerDazed to false>>
<<if $combat.playerDazedCause is "orgasm">><p class="recover-text">You shake off the post-nut haze and ready yourself.</p><<elseif $combat.playerDazedCause is "charmed">><p class="recover-text">You blink hard and the pull of her gaze lets go.</p><<else>><p class="recover-text">You spit, blink the blur away and get your guard back up.</p><</if>>
<<set $combat.playerDazedCause to "">>
<</if>>
<<vchoice "End Turn" "Combat_Companion_Turn" "action" "clock">>
</div>
<<else>>
<<if $combat.kiraAid && $combat.kiraAid.calloutTurn === $combat.turn && !$combat.kiraAid.calloutResolved>>
<div class="kira-aid-callout-notice"><<say "Kira" $combat.kiraAid.calloutLine>></div>
<</if>>
<div class="combat-actions">
<<include "Combat_Actions_Buttons">>
</div>
<</if>><<initCombatTarget>>
<<set _targetClothing to (_target && _target.clothing) || {}>>
<<set _targetPos to (_target && _target.position) || "standing">>
<<set _hasKnife to ($equipped && $equipped.weapon && ($equipped.weapon.id === "combat knife" || $equipped.weapon.id === "basic_knife"))>>
<<set _targetTitsExposed to _targetClothing.titsExposed>>
<<set _targetPussyExposed to _targetClothing.pussyExposed>>
<<set _targetAssExposed to _targetClothing.assExposed>>
<<set _targetDown to (_targetPos === "kneeling" || _targetPos === "prone_front" || _targetPos === "prone_back" || _targetPos === "bent_over" || _targetPos === "pinned")>>
<<set _targetKneeling to (_targetPos === "kneeling")>>
<<set _targetProne to (_targetPos === "prone_front" || _targetPos === "prone_back" || _targetPos === "bent_over")>>
<<set _playerDickOut to ($clothing && $clothing.player && $clothing.player.dickExposed)>>
<<set _isFemaleTarget to (_target && _target.gender === "female")>>
<<set _playerBound to ($combat.playerEffects && $combat.playerEffects.bound > 0)>>
<<set _playerStunned to ($combat.playerEffects && $combat.playerEffects.stunned > 0)>>
<<if _playerBound>>
<div class="player-bound-notice">
<span class="bound-icon"><<icon "bound" "small">></span>
<span class="bound-text">You're BOUND! (<<print $combat.playerEffects.bound>> turn<<if $combat.playerEffects.bound gt 1>>s<</if>> remaining) - Movement and grappling restricted: no Flee, Evade, standing up, takedowns or strips</span>
</div>
<</if>>
<<if _playerStunned>>
<div class="player-stunned-notice">
<span class="stunned-icon"><<icon "stunned" "small">></span>
<span class="stunned-text">You're STUNNED! (<<print $combat.playerEffects.stunned>> turn<<if $combat.playerEffects.stunned gt 1>>s<</if>> remaining) - Can only defend</span>
</div>
<</if>>
<div id="combat-action-notice" class="combat-action-notice"><<if $combat.actionNotice>><div class="combat-error"><<print $combat.actionNotice>></div><<run delete State.variables.combat.actionNotice>><</if>></div>
<div class="action-grid">
<div class="action-category">
<span class="category-label">Attack</span>
<<combatAction "Light Strike" "Combat_Player_Light_Strike" "action" "light-strike" true>>
<<combatAction "Heavy Strike" "Combat_Player_Heavy_Strike" "action" "heavy-strike" true>>
<<canFinisher>>
<<if _canFinisher>>
<<combatAction "FINISHER!" "Combat_Player_Finisher" "finisher" "finisher" true>>
<</if>>
</div>
<div class="action-category">
<span class="category-label">Defend</span>
<<canBlock>>
<<if _canBlock>>
<<defenseActionButton "Block" "Combat_Player_Block" "block" "block">>
<</if>>
<<if $flags.parryRiposteUnlocked>>
<<canParry>>
<<if _canParry>>
<<defenseActionButton "Parry" "Combat_Player_Parry" "parry" "parry">>
<</if>>
<<canRiposte>>
<<if _canRiposte>>
<<defenseActionButton "Riposte" "Combat_Player_Riposte" "riposte" "riposte">>
<</if>>
<</if>>
<<canDodge>>
<<if _canDodge>>
<<defenseActionButton "Evade" "Combat_Player_Dodge" "run" "dodge">>
<</if>>
<<canRest>>
<<if _canRest>>
<<combatAction "Rest" "Combat_Player_Rest" "action" "rest" true>>
<</if>>
</div>
<<kiraAidMenu>>
<<if _hasKnife>>
<div class="action-category">
<span class="category-label">Knife</span>
<<combatAction "Slash Upper" "Combat_Slash_Upper" "weapon" "attack" true>>
<<combatAction "Slash Lower" "Combat_Slash_Lower" "weapon" "attack" true>>
<<if $player.energy gte 8>>
<<combatAction "Brutal Stab" "Combat_Brutal_Stab" "weapon" "damage-boost" true>>
<</if>>
</div>
<</if>>
<<if _isFemaleTarget && (!_targetTitsExposed || !_targetPussyExposed)>>
<div class="action-category">
<span class="category-label">Strip</span>
<<if !_targetTitsExposed>>
<<combatAction "Rip Top" "Combat_Rip_Top" "strip" "shirt" true>>
<</if>>
<<if !_targetPussyExposed>>
<<combatAction "Tear Bottom" "Combat_Tear_Bottom" "strip" "pants" true>>
<</if>>
</div>
<</if>>
<<if _isFemaleTarget && (_targetTitsExposed || _targetPussyExposed || _targetAssExposed || _targetDown)>>
<div class="action-category">
<span class="category-label">Exploit</span>
<<if _targetTitsExposed>>
<<combatAction "Slap Tits" "Combat_Slap_Tits" "exploit" "slap" true>>
<<combatAction "Grope Tits" "Combat_Grope_Tits" "exploit" "grab" true>>
<<if $player.lust gte 40>>
<<combatAction "Twist Nipples" "Combat_Twist_Nipples" "exploit" "hand" true>>
<</if>>
<<if $player.lust gte 50>>
<<combatAction "Suck Tits" "Combat_Suck_Tits" "exploit" "lips" true>>
<</if>>
<</if>>
<<if _targetProne || _targetAssExposed || _targetPussyExposed>>
<<combatAction "Slap Ass" "Combat_Slap_Ass" "exploit" "slap" true>>
<</if>>
<<set _assAccessible to (_targetAssExposed || _targetPussyExposed || (_targetProne && _targetClothing.bottom lte 25))>>
<<if _assAccessible && $player.lust gte 45>>
<<combatAction "Spread Cheeks" "Combat_Spread_Cheeks" "exploit" "grab" true>>
<</if>>
<<if _targetPussyExposed>>
<<combatAction "Slap Pussy" "Combat_Slap_Pussy" "exploit" "slap" true>>
<<combatAction "Grope Pussy" "Combat_Grope_Pussy" "exploit" "grab" true>>
<<if $player.lust gte 45>>
<<combatAction "Finger Her" "Combat_Finger_Pussy" "exploit" "hand" true>>
<</if>>
<<if $player.lust gte 60>>
<<combatAction "Eat Her Out" "Combat_Eat_Pussy" "exploit" "lips" true>>
<</if>>
<</if>>
</div>
<</if>>
<<if _isFemaleTarget && !_playerBound>>
<div class="action-category takedown-category">
<span class="category-label">Takedown</span>
<<if _targetPos === "standing">>
<<combatAction "Trip to Knees" "Combat_Takedown_Kneel" "grapple" "leg-sweep" true>>
<<combatAction "Tackle to Back" "Combat_Takedown_Back" "grapple" "knockdown" true>>
<<combatAction "Shove Face Down" "Combat_Takedown_Prone" "grapple" "prone" true>>
<<combatAction "Grab & Bend Over" "Combat_Takedown_Bent" "grapple" "bent-over" true>>
<<elseif _targetPos === "kneeling">>
<<combatAction "Shove Face Down" "Combat_Takedown_Prone" "grapple" "prone" true>>
<<combatAction "Pull Onto Back" "Combat_Takedown_Back" "grapple" "knockdown" true>>
<<elseif _targetPos === "prone_front">>
<<combatAction "Pin Her Down" "Combat_Takedown_Pin" "dominate" "lock" true>>
<<combatAction "Roll Her Over" "Combat_Takedown_Back" "grapple" "knockdown" true>>
<<elseif _targetPos === "prone_back">>
<<combatAction "Pin Her Down" "Combat_Takedown_Pin" "dominate" "lock" true>>
<<combatAction "Flip Face Down" "Combat_Takedown_Prone" "grapple" "prone" true>>
<<elseif _targetPos === "bent_over">>
<<combatAction "Pin Her" "Combat_Takedown_Pin" "dominate" "lock" true>>
<<combatAction "Push Down" "Combat_Takedown_Prone" "grapple" "prone" true>>
<</if>>
</div>
<</if>>
<<if _isFemaleTarget>>
<<canVerbalDegrade $combat.currentTarget>>
<<canCaptureVictory $combat.currentTarget>>
<<if _canVerbalDegrade || _canCapture>>
<div class="action-category humiliate-category">
<span class="category-label">Humiliate</span>
<<if _canVerbalDegrade>>
<<combatAction "Degrade Her" "Combat_Verbal_Degrade" "humiliate" "speech" true>>
<</if>>
<<if _canCapture>>
<<if $flags.dungeonUnlocked>>
<<combatAction "CAPTURE" "Combat_Capture_Victory" "humiliate" "lock" true>>
<<else>>
<<combatAction "Use Her" "Combat_Use_Her" "intimate" "corruption" true>>
<<combatAction "Choke Fuck" "Combat_Choke_Fuck" "dominate" "choking" true>>
<</if>>
<</if>>
</div>
<</if>>
<</if>>
<<canDenyOrgasm $combat.currentTarget>>
<<canForceOrgasm $combat.currentTarget>>
<<if _isFemaleTarget && (_canDeny || _canForceOrg)>>
<div class="action-category arousal-category">
<span class="category-label">Arousal</span>
<<if _canDeny>>
<<combatAction "Allow Release" "Combat_Allow_Orgasm" "intimate" "heart" true>>
<<combatAction "Deny Release" "Combat_Deny_Orgasm" "dominate" "broken-heart" true>>
<</if>>
<<if _canForceOrg>>
<<combatAction "FORCE ORGASM" "Combat_Force_Orgasm" "dominate" "high-arousal" true>>
<</if>>
</div>
<</if>>
<<canWorsenPosition $combat.currentTarget>>
<<canHoldPosition $combat.currentTarget>>
<<if (_canWorsen || _canHold) && !_playerBound>>
<div class="action-category position-category">
<span class="category-label">Position</span>
<<if _canWorsen>>
<<getPositionActionLabel _nextWorsePosition>>
<<combatAction _posActionLabel "Combat_Worsen_Position" "grapple" "prone" true>>
<</if>>
<<if _canHold>>
<<combatAction "Hold Position" "Combat_Hold_Position" "grapple" "grapple" true>>
<</if>>
</div>
<</if>>
<<if _isFemaleTarget>>
<<canBreakWill $combat.currentTarget>>
<<if _canBreakWill>>
<div class="action-category resistance-category">
<span class="category-label">Dominate</span>
<<combatAction "Break Will" "Combat_Break_Will" "dominate" "submission" true>>
</div>
<</if>>
<</if>>
<<if _isFemaleTarget>>
<<canUsePainPleasure $combat.currentTarget>>
<<if _canPainPleasure>>
<div class="action-category pain-pleasure-category">
<span class="category-label">Pain/Pleasure</span>
<<set _titsAccessible to (_targetTitsExposed && _targetPos !== "prone_front")>>
<<if _titsAccessible>>
<<combatAction "Slap & Grope Tits" "Combat_Slap_Grope_Tits" "exploit" "slap" true>>
<<combatAction "Pinch & Tease Nipples" "Combat_Pinch_Tease_Nipples" "exploit" "hand" true>>
<<if _targetPos !== "standing">>
<<combatAction "Bite & Lick Nipples" "Combat_Bite_Lick_Nipples" "exploit" "lips" true>>
<</if>>
<</if>>
<<set _pussyFrontAccess to (_targetPussyExposed && (_targetPos === "prone_back" || _targetPos === "pinned" || _targetPos === "kneeling"))>>
<<if _pussyFrontAccess>>
<<combatAction "Pinch & Tease Clit" "Combat_Pinch_Tease_Clit" "exploit" "hand" true>>
<</if>>
<<set _canSpankFinger to (_targetPussyExposed && (_targetPos === "prone_front" || _targetPos === "bent_over" || _targetPos === "prone_back" || _targetPos === "pinned"))>>
<<if _canSpankFinger>>
<<combatAction "Spank & Finger" "Combat_Spank_Finger" "exploit" "slap" true>>
<</if>>
<<set _canChokeFuck to (_targetPussyExposed && _playerDickOut && (_targetPos === "prone_back" || _targetPos === "pinned"))>>
<<if _canChokeFuck>>
<<combatAction "Choke & Fuck" "Combat_Choke_And_Fuck" "exploit" "choking" true>>
<</if>>
<<set _assAccessible to ((_targetAssExposed || _targetPussyExposed) && (_targetPos === "prone_front" || _targetPos === "bent_over" || _targetPos === "kneeling"))>>
<<if _assAccessible>>
<<combatAction "Slap & Grope Ass" "Combat_Slap_Grope_Ass" "exploit" "slap" true>>
<</if>>
<<set _neckAccessible to (_targetPos === "kneeling" || _targetPos === "prone_back" || _targetPos === "pinned")>>
<<if _neckAccessible>>
<<combatAction "Bite & Lick Neck" "Combat_Bite_Lick_Neck" "exploit" "lips" true>>
<</if>>
<<set _thighsAccessible to (_targetPos === "prone_back" || _targetPos === "pinned")>>
<<if _thighsAccessible>>
<<combatAction "Bite Inner Thighs" "Combat_Bite_Lick_Thighs" "exploit" "lips" true>>
<</if>>
<<set _hairAccessible to (_targetPos === "kneeling" || _targetPos === "prone_front" || _targetPos === "bent_over" || _targetPos === "pinned")>>
<<if _hairAccessible>>
<<combatAction "Hair Pull & Grind" "Combat_Hair_Pull_Grind" "exploit" "grab" true>>
<</if>>
</div>
<</if>>
<</if>>
<<if _isFemaleTarget>>
<<canForceBeg $combat.currentTarget>>
<<if _canForceBeg>>
<div class="action-category resistance-category">
<span class="category-label">Dominate</span>
<<combatAction "Force Her to Beg" "Combat_Force_Beg" "dominate" "submission" true>>
</div>
<</if>>
<</if>>
<<canPlayerExpose>>
<<canPlayerFlaunt>>
<<if (_canExpose || _canFlaunt) && _isFemaleTarget>>
<div class="action-category clothing-tactics-category">
<span class="category-label">Expose</span>
<<if _canExpose>>
<<combatAction "Pull Out Dick" "Combat_Player_Expose" "tease" "lust" true>>
<</if>>
<<if _canFlaunt>>
<<combatAction "Flaunt It" "Combat_Player_Flaunt" "tease" "charm" true>>
<</if>>
</div>
<</if>>
<<if _isFemaleTarget && (_targetTitsExposed || _targetPussyExposed || _target.lust gte 40 || _target.humiliation gte 40 || _targetPos !== "standing")>>
<<displayTacticalAdvice $combat.currentTarget>>
<</if>>
<<set _targetPinned to (_targetPos === "pinned")>>
<<set _pinnedThroatShown to false>>
<<set _pinnedFuckShown to false>>
<<if _isFemaleTarget && _targetPinned && !_playerBound>>
<div class="action-category pinned-category">
<span class="category-label">Pinned</span>
<<combatAction "Grind On Her" "Combat_Grind_Pinned" "pinned" "high-arousal" true>>
<<combatAction "Choke Her" "Combat_Choke_Pinned" "pinned" "grab" true>>
<<if !_targetTitsExposed>>
<<combatAction "Rip Top Off" "Combat_Rip_Top_Pinned" "pinned" "shirt" true>>
<<else>>
<<combatAction "Abuse Tits" "Combat_Abuse_Tits_Pinned" "pinned" "slap" true>>
<</if>>
<<if !_targetPussyExposed>>
<<combatAction "Tear Pants Off" "Combat_Tear_Bottom_Pinned" "pinned" "pants" true>>
<<else>>
<<combatAction "Finger Roughly" "Combat_Finger_Pinned" "pinned" "hand" true>>
<</if>>
<<if $player.lust gte 60 && _playerDickOut>>
<<set _pinnedThroatShown to true>>
<<combatAction "Throat Fuck" "Combat_Deepthroat_Pinned" "pinned" "lips" true>>
<</if>>
<<if _targetTitsExposed && _targetPussyExposed && $player.lust gte 65>>
<<if _playerDickOut>>
<<set _pinnedFuckShown to true>>
<<combatAction "Fuck Her" "Combat_Fuck_Pinned" "pinned" "corruption" true>>
<<else>>
<<combatAction "Whip It Out" "Combat_Dick_Out_Pinned" "pinned" "corruption" true>>
<</if>>
<</if>>
</div>
<</if>>
<<set _targetBeenUsed to setup.enemySheIsYours(_target)>>
<<if _isFemaleTarget && _targetBeenUsed && !_playerBound>>
<div class="action-category used-category">
<span class="category-label">She's Yours</span>
<<if _playerDickOut && _pinnedThroatShown>>
<<elseif _playerDickOut>>
<<combatAction "Throat Fuck" "Combat_Used_Throat" "used" "lips" true>>
<<else>>
<<combatAction "Make Her Suck" "Combat_Used_Oral" "used" "lips" true>>
<</if>>
<<if _playerDickOut && _pinnedFuckShown>>
<<elseif _playerDickOut>>
<<combatAction "Fuck Her" "Combat_Used_Fuck" "used" "corruption" true>>
<<else>>
<<combatAction "Whip It Out & Fuck" "Combat_Used_Fuck_Start" "used" "corruption" true>>
<</if>>
<<if _playerDickOut>>
<<combatAction "Take Her Ass" "Combat_Used_Anal" "used" "corruption" true>>
<</if>>
<<if _targetPos === "prone_back" || _targetPos === "pinned">>
<<combatAction "Missionary" "Combat_Used_Missionary" "used" "heart" true>>
<</if>>
<<if _targetPos === "prone_front" || _targetPos === "bent_over">>
<<combatAction "From Behind" "Combat_Used_Doggy" "used" "corruption" true>>
<</if>>
<<if _targetPos === "kneeling">>
<<combatAction "Face Fuck" "Combat_Used_Facefuck" "used" "lips" true>>
<</if>>
</div>
<</if>>
<<if _isFemaleTarget && _playerDickOut && !_targetBeenUsed && !_playerBound>>
<div class="action-category tease-category">
<span class="category-label">Dominate</span>
<<if _targetKneeling>>
<<combatAction "Cock Slap" "Combat_Cock_Slap" "tease" "slap" true>>
<<combatAction "Rub On Face" "Combat_Rub_Face" "tease" "lust" true>>
<<if $player.lust gte 30>>
<<combatAction "Press Against Lips" "Combat_Press_Lips" "tease" "lips" true>>
<</if>>
<<if $player.lust gte 45>>
<<combatAction "Slap Lips With Cock" "Combat_Slap_Lips" "tease" "lips" true>>
<</if>>
<<if $player.lust gte 50>>
<<combatAction "Make Her Suck" "Combat_Make_Suck" "dominate" "lips" true>>
<</if>>
<<if $player.lust gte 60>>
<<combatAction "Use Her Throat" "Combat_Use_Throat" "dominate" "lips" true>>
<</if>>
<</if>>
<<if _targetPos === "standing">>
<<combatAction "Grind From Behind" "Combat_Grind_Behind_Standing" "tease" "lust" true>>
<<combatAction "Hotdog Her Ass" "Combat_Hotdog_Ass" "tease" "lust" true>>
<</if>>
<<if _targetPos === "bent_over" || _targetPos === "prone_front">>
<<combatAction "Rub Against Ass" "Combat_Rub_Ass" "tease" "lust" true>>
<<if $player.lust gte 40>>
<<combatAction "Hotdog Her" "Combat_Hotdog_Prone" "tease" "lust" true>>
<</if>>
<<if $player.lust gte 50 && (_targetPussyExposed || _targetAssExposed)>>
<<combatAction "Tease Entrance" "Combat_Tease_Entrance" "dominate" "lust" true>>
<</if>>
<</if>>
<<if _targetPos === "prone_back">>
<<combatAction "Grind On Her" "Combat_Grind_Back" "tease" "lust" true>>
<<if $player.lust gte 40>>
<<combatAction "Rub Between Thighs" "Combat_Rub_Thighs" "tease" "lust" true>>
<</if>>
<<if $player.lust gte 50 && _targetPussyExposed>>
<<combatAction "Tease Her Pussy" "Combat_Tease_Pussy" "dominate" "lust" true>>
<</if>>
<</if>>
</div>
<</if>>
<<set _claimMouth to (_targetKneeling && _playerDickOut && $player.lust gte 40)>>
<<if _isFemaleTarget && ($player.lust gte 70 || _claimMouth) && !_targetBeenUsed && !_playerBound>>
<div class="action-category ultra-category">
<span class="category-label">Claim</span>
<<if _targetKneeling>>
<<if _playerDickOut>>
<<combatAction "Deep Throat" "Combat_Deep_Throat" "ultra" "lips" true>>
<<elseif $player.lust gte 70>>
<<combatAction "Unzip & Throat" "Combat_Unzip_Throat" "ultra" "lips" true>>
<</if>>
<</if>>
<<if $player.lust gte 70>>
<<if _targetProne && _targetPussyExposed>>
<<if _playerDickOut>>
<<combatAction "Claim Her" "Combat_Claim_Her" "ultra" "corruption" true>>
<<else>>
<<combatAction "Mount & Claim" "Combat_Mount_Claim" "ultra" "corruption" true>>
<</if>>
<</if>>
<<if _targetProne>>
<<if _targetPos === "prone_front" || _targetPos === "bent_over">>
<<if !_targetPussyExposed>>
<<combatAction "Grind Against Her" "Combat_Grind_Clothed" "ultra" "lust" true>>
<<if _targetClothing.bottom lte 25>>
<<combatAction "Tear & Take" "Combat_Tear_And_Take" "ultra" "corruption" true>>
<</if>>
<</if>>
<<if _targetAssExposed || _targetPussyExposed>>
<<if _playerDickOut>>
<<combatAction "Take Her Ass" "Combat_Anal" "ultra" "corruption" true>>
<</if>>
<</if>>
<</if>>
<<if _targetPos === "prone_back">>
<<if !_targetPussyExposed>>
<<combatAction "Mount & Grind" "Combat_Mount_Grind" "ultra" "lust" true>>
<<if _targetClothing.bottom lte 25>>
<<combatAction "Rip & Enter" "Combat_Rip_And_Enter" "ultra" "corruption" true>>
<</if>>
<</if>>
<</if>>
<</if>>
<<if _targetPos === "standing">>
<<combatAction "Grab & Grind" "Combat_Grab_Grind" "ultra" "grab" true>>
<</if>>
<</if>>
<<if _targetKneeling && _playerDickOut>>
<<combatAction "Use Her Mouth" "Combat_Use_Mouth" "ultra" "lips" true>>
<</if>>
</div>
<</if>>
<<if $flags.seductionUnlocked && $combat.enemies.length gt 0>>
<<set _canSeduce to (_isFemaleTarget && _target.seduceThreshold lt 999)>>
<<set _seduceAny to $flags.sultryGazeUnlocked || ($player.allure gte 20 && $player.energy gte 12) || ($player.allure gte 30 && $player.corruption gte 20 && $player.energy gte 20)>>
<<if _canSeduce && _seduceAny>>
<div class="action-category">
<span class="category-label">Seduce</span>
<<if $flags.sultryGazeUnlocked>>
<<combatAction "Sultry Gaze" "Combat_Sultry_Gaze" "seduction" "eye" true>>
<</if>>
<<if $player.allure gte 20 && $player.energy gte 12>>
<<combatAction "Strip Tease" "Combat_Strip_Tease" "seduction" "armor" true>>
<</if>>
<<if $player.allure gte 30 && $player.corruption gte 20 && $player.energy gte 20>>
<<combatAction "Kiss of Submission" "Combat_Kiss_Of_Submission" "seduction" "corruption" true>>
<</if>>
</div>
<</if>>
<</if>>
<<if $combat.enemies.length gt 0 && $combat.enemies[0].canNegotiate>>
<<combatAction "Negotiate" "Combat_Negotiate" "talk" "handshake" true>>
<</if>>
<<if ((($stats.combat || {}).combat_victories || 0) gte 10 && $player.energy gte 10) || ($player.agility gte 15 && $player.energy gte 15) || ($player.dominance gte 15 && $player.energy gte 8)>>
<div class="action-category">
<span class="category-label">Skills</span>
<<if (($stats.combat || {}).combat_victories || 0) gte 10 && $player.energy gte 10>>
<<combatAction "Power Strike" "Combat_Power_Strike" "ability" "power-strike" true>>
<</if>>
<<if $player.agility gte 15 && $player.energy gte 15>>
<<combatAction "Rapid Strikes" "Combat_Rapid_Strikes" "ability" "rapid-strikes" true>>
<</if>>
<<if $player.dominance gte 15 && $player.energy gte 8>>
<<combatAction "Intimidate" "Combat_Intimidate" "ability" "angry" true>>
<</if>>
</div>
<</if>>
<<if $flags.darkPowersUnlocked && $player.corruption gte 20>>
<div class="action-category">
<span class="category-label">Dark</span>
<<if $player.corruption gte 20 && $player.energy gte 15>>
<<combatAction "Dark Pulse" "Combat_Dark_Pulse" "supernatural" "corruption" true>>
<</if>>
<<if $player.corruption gte 35 && $player.energy gte 20>>
<<combatAction "Drain Essence" "Combat_Drain_Essence" "supernatural" "ghost" true>>
<</if>>
<<if $player.corruption gte 50 && $player.energy gte 25>>
<<combatAction "Succubus Kiss" "Combat_Succubus_Kiss" "supernatural" "lips" true>>
<</if>>
</div>
<</if>>
<<if $combat.canFlee>>
<<combatAction "Flee" "Combat_Flee" "action" "run" true>>
<</if>>
<<if $combat.positions.player !== "standing">>
<div class="action-category position-recovery-section">
<span class="category-label"><<icon "hazard-sign" "small">> You're <<displayPosition "player">>!</span>
<<combatAction "Try to Stand Up" "Combat_Standup_Attempt" "action">>
</div>
<</if>>
</div><<if !setup.weapons>>
<<set setup.weapons to {
rusty_pipe: {
name: "Rusty Pipe",
damage: {base: 12, variance: 4},
clothingDamage: {top: 15, bottom: 12},
speed: "medium",
effects: {knockdown: 0.25, bleed: 0.15},
lustImpact: {attacker: 5, target: 8},
special: "Can target top or bottom, tier 3 uses pipe sexually",
sexualUse: true,
videoFolder: "combat/heavy_strike_hit",
videoFolderMiss: "combat/heavy_strike_miss"
},
leather_belt: {
name: "Leather Belt",
damage: {base: 7, variance: 3},
clothingDamage: {top: 20, bottom: 25},
speed: "fast",
effects: {welt: 0.80, humiliation: 12},
lustImpact: {attacker: 8, target: 15},
special: "Whipping attacks, targets exposed skin preferentially",
sexualUse: true,
videoFolder: "combat/slash_upper_hit",
videoFolderMiss: "combat/slash_upper_miss"
},
combat_knife: {
name: "Combat Knife",
damage: {base: 11, variance: 5},
clothingDamage: {top: 30, bottom: 30},
clothingDamageChance: 40,
speed: "fast",
effects: {bleed: 0.40},
lustImpact: {attacker: 6, target: 10},
special: "Can cut clothes without damage (intimidation)",
videoFolder: "combat/brutal_stab_hit",
videoFolderMiss: "combat/brutal_stab_miss"
},
baseball_bat: {
name: "Baseball Bat",
damage: {base: 15, variance: 5},
clothingDamage: {top: 10, bottom: 15},
speed: "medium",
effects: {knockdown: 0.40, stun: 0.20},
lustImpact: {attacker: 4, target: 6},
special: "High knockdown chance, can stun on head hits",
videoFolder: "combat/heavy_strike_hit",
videoFolderMiss: "combat/heavy_strike_miss"
},
chain: {
name: "Chain",
damage: {base: 10, variance: 4},
clothingDamage: {top: 15, bottom: 10},
speed: "medium",
effects: {bind: 0.30, choke: 0.20, knockdown: 0.15},
lustImpact: {attacker: 10, target: 12},
special: "Can wrap around limbs/neck for control, binding attacks",
sexualUse: true,
videoFolder: "combat/heavy_strike_hit",
videoFolderMiss: "combat/heavy_strike_miss"
},
machete: {
name: "Machete",
damage: {base: 18, variance: 6},
clothingDamage: {top: 40, bottom: 40},
clothingDamageChance: 60,
speed: "slow",
effects: {bleed: 0.50, intimidate: 0.60},
lustImpact: {attacker: 5, target: 8},
special: "Heavy slashing, excellent clothing destruction, intimidation",
videoFolder: "combat/machete_hit",
videoFolderMiss: "combat/machete_miss"
},
riding_crop: {
name: "Riding Crop",
damage: {base: 5, variance: 2},
clothingDamage: {top: 5, bottom: 5},
speed: "fast",
effects: {welt: 0.90, humiliation: 20, sting: 0.95},
lustImpact: {attacker: 15, target: 20},
special: "Sexual humiliation weapon, targets sensitive areas",
sexualUse: true,
videoFolder: "combat/slash_upper_hit",
videoFolderMiss: "combat/slash_upper_miss"
},
rope: {
name: "Rope",
damage: {base: 4, variance: 2},
clothingDamage: {top: 5, bottom: 5},
speed: "slow",
effects: {bind: 0.60, choke: 0.25, restrain: 0.70},
lustImpact: {attacker: 12, target: 15},
special: "Binding weapon, can tie wrists/ankles, enables helpless state",
sexualUse: true,
videoFolder: "combat/light_strike_hit",
videoFolderMiss: "combat/light_strike_miss"
},
dual_knives: {
name: "Dual Knives",
damage: {base: 9, variance: 4},
clothingDamage: {top: 25, bottom: 25},
speed: "fast",
effects: {bleed: 0.35, flurry: true},
lustImpact: {attacker: 5, target: 8},
special: "Fast slashing attacks, can attack twice with flurry ability",
videoFolder: "combat/rapid_strikes_hit",
videoFolderMiss: "combat/rapid_strikes_miss"
},
fists: {
name: "Fists",
damage: {base: 9, variance: 3},
clothingDamage: {top: 8, bottom: 5},
speed: "fast",
effects: {stun: 0.15},
lustImpact: {attacker: 3, target: 5},
videoFolder: "combat/light_strike_hit",
videoFolderMiss: "combat/light_strike_miss"
}
}>>
<</if>><<widget "initBasicAttackConfigs">>
<<run setup.basicAttackConfigs = {
light_strike: {
name: "Light Strike",
icon: "sword",
attackType: "light_strike",
energyCost: 0,
damageMultiplier: 0.6,
damageVariance: [-1, 2],
useWeaponBonus: true,
accuracyModifier: 15,
autoHit: false,
imagePath: "combat/player-light-strike.png",
narrativeKey: "light_strike_hit",
narrativeFallback: "You land a quick jab!",
missNarrativeKey: "light_strike_miss",
missFallback: "You miss!",
videoFolder: "combat/light_strike_hit",
videoFolderMiss: "combat/light_strike_miss",
secondaryVideoFolder: null,
clothingDamage: {
chance: 10,
amount: [5, 12],
targetSlot: "random",
critBonus: false
},
knockdownChance: 0,
consumeCombo: false,
playerVulnerable: false,
critThreshold: 0,
hitLogKey: "light_strike_hit_log",
hitLogFallback: "Quick strike— {damage} damage!",
missLogKey: "light_strike_miss_log",
missLogFallback: "You miss!",
killLogKey: "light_strike_kill_log",
killLogFallback: "{enemy} defeated!",
killNarrativeKey: "light_strike_kill",
killNarrativeFallback: "The {enemy} crumples to the ground."
},
heavy_strike: {
name: "Heavy Strike",
icon: "heavy-strike",
attackType: "heavy_strike",
energyCost: 6,
damageMultiplier: 1.5,
damageVariance: [-2, 5],
useWeaponBonus: true,
accuracyModifier: -10,
autoHit: false,
imagePath: "combat/player-heavy-strike.png",
narrativeKey: "heavy_strike_hit",
narrativeFallback: "You land a devastating blow!",
missNarrativeKey: "heavy_strike_miss",
missFallback: "Your heavy swing misses!",
videoFolder: "combat/heavy_strike_hit",
videoFolderMiss: "combat/heavy_strike_miss",
secondaryVideoFolder: null,
clothingDamage: {
chance: 40,
amount: [15, 35],
targetSlot: "random",
critBonus: true
},
knockdownChance: 25,
consumeCombo: false,
playerVulnerable: true,
critThreshold: 3,
hitLogKey: "heavy_strike_hit_log",
hitLogFallback: "HEAVY BLOW— {damage} damage!",
missLogKey: "heavy_strike_miss_log",
missLogFallback: "Your heavy swing misses!",
killLogKey: "heavy_strike_kill_log",
killLogFallback: "{enemy} CRUSHED!",
killNarrativeKey: "heavy_strike_kill",
killNarrativeFallback: "{enemy} is CRUSHED by your devastating blow!"
},
power_strike: {
name: "Power Strike",
icon: "power-strike",
attackType: "power_strike",
energyCost: 10,
damageMultiplier: 1.5,
damageVariance: [-2, 3],
useWeaponBonus: true,
accuracyModifier: -10,
autoHit: false,
imagePath: "combat/power-strike.png",
narrativeKey: "power_strike_hit",
narrativeFallback: "You unleash a powerful strike!",
missNarrativeKey: "power_strike_miss",
missFallback: "Your power strike misses!",
videoFolder: "combat/power_strike_hit",
videoFolderMiss: "combat/power_strike_miss",
secondaryVideoFolder: null,
clothingDamage: {
chance: 15,
amount: [10, 20],
critBonus: false
},
knockdownChance: 10,
consumeCombo: false,
playerVulnerable: false,
critThreshold: 2,
hitLogKey: "power_strike_hit_log",
hitLogFallback: "POWER STRIKE— {damage} damage!",
missLogKey: "power_strike_miss_log",
missLogFallback: "Your power strike misses!",
killLogKey: "power_strike_kill_log",
killLogFallback: "{enemy} ANNIHILATED!",
killNarrativeKey: "power_strike_kill",
killNarrativeFallback: "The {enemy} is DESTROYED by your power strike!"
},
brutal_stab: {
name: "Brutal Stab",
icon: "attack",
attackType: "brutal_stab",
energyCost: 8,
damageMultiplier: 2.0,
damageVariance: [0, 5],
useWeaponBonus: true,
accuracyModifier: -10,
autoHit: false,
imagePath: "combat/player-heavy-strike.png",
narrativeKey: "brutal_stab_hit",
narrativeFallback: "You stab brutally!",
missNarrativeKey: "brutal_stab_miss",
missFallback: "Your stab misses!",
videoFolder: "combat/brutal_stab_hit",
videoFolderMiss: "combat/brutal_stab_miss",
secondaryVideoFolder: null,
clothingDamage: {
chance: 40,
amount: [10, 20],
critBonus: false
},
knockdownChance: 0,
consumeCombo: false,
playerVulnerable: true,
critThreshold: 4,
hitLogKey: "brutal_stab_hit_log",
hitLogFallback: "STABBED— {damage} damage!",
missLogKey: "brutal_stab_miss_log",
missLogFallback: "Your stab misses!",
killLogKey: "brutal_stab_kill_log",
killLogFallback: "{enemy} IMPALED!",
killNarrativeKey: "brutal_stab_kill",
killNarrativeFallback: "{enemy} is IMPALED by your brutal stab!"
},
slash_upper: {
name: "Slash Upper",
icon: "light-strike",
attackType: "slash_upper",
energyCost: 5,
damageMultiplier: 0.4,
damageVariance: [-1, 2],
useWeaponBonus: false,
accuracyModifier: 20,
autoHit: false,
imagePath: "combat/player-light-strike.png",
narrativeKey: "slash_upper_hit",
narrativeFallback: "You slash upward, cutting fabric!",
missNarrativeKey: "slash_upper_miss",
missFallback: "Your slash misses!",
videoFolder: "combat/slash_upper_hit",
videoFolderMiss: "combat/slash_upper_miss",
secondaryVideoFolder: null,
clothingDamage: {
chance: 100,
amount: [10, 30],
critBonus: false,
targetSlot: "top"
},
knockdownChance: 0,
consumeCombo: false,
playerVulnerable: false,
critThreshold: 0,
exposureBonus: {
lustGain: 5,
exposureType: "titsExposed"
},
hitLogKey: "slash_upper_hit_log",
hitLogFallback: "Slash tears top— {damage}!",
missLogKey: "slash_upper_miss_log",
missLogFallback: "Your slash misses!",
killLogKey: "slash_upper_kill_log",
killLogFallback: "{enemy} slashed down!",
killNarrativeKey: "slash_upper_kill",
killNarrativeFallback: "The {enemy} falls, top torn!"
},
slash_lower: {
name: "Slash Lower",
icon: "light-strike",
attackType: "slash_lower",
energyCost: 5,
damageMultiplier: 0.4,
damageVariance: [-1, 2],
useWeaponBonus: false,
accuracyModifier: 20,
autoHit: false,
imagePath: "combat/player-light-strike.png",
narrativeKey: "slash_lower_hit",
narrativeFallback: "You slash downward, tearing fabric!",
missNarrativeKey: "slash_lower_miss",
missFallback: "Your slash misses!",
videoFolder: "combat/slash_lower_hit",
videoFolderMiss: "combat/slash_lower_miss",
secondaryVideoFolder: null,
clothingDamage: {
chance: 100,
amount: [10, 30],
critBonus: false,
targetSlot: "bottom"
},
knockdownChance: 0,
consumeCombo: false,
playerVulnerable: false,
critThreshold: 0,
exposureBonus: {
lustGain: 8,
exposureType: "pussyExposed"
},
hitLogKey: "slash_lower_hit_log",
hitLogFallback: "Slash tears pants— {damage}!",
missLogKey: "slash_lower_miss_log",
missLogFallback: "Your slash misses!",
killLogKey: "slash_lower_kill_log",
killLogFallback: "{enemy} slashed down!",
killNarrativeKey: "slash_lower_kill",
killNarrativeFallback: "The {enemy} falls, bottom torn!"
}
}>>
<</widget>><<set setup.combatNarrative to setup.combatNarrative || {}>>
<<set setup.combatNarrative.light_strike_hit_female to [
"You snap off a quick jab— she grunts as it connects!",
"A fast strike catches her off-guard, her tits bouncing from the impact!",
"Your quick blow lands solidly— she stumbles back!",
"Swift and accurate— you tag her right in the face!",
"Your jab slips through her defense and snaps her head back!"
]>>
<<set setup.combatNarrative.light_strike_hit_male to [
"You snap off a quick jab— he grunts as it connects!",
"A fast strike catches him off-guard, snapping his head to the side!",
"Your quick blow lands solidly— he stumbles back!",
"Swift and accurate— you tag him right in the face!",
"Your jab slips through his defense and rocks him!"
]>>
<<set setup.combatNarrative.light_strike_miss_female to [
"You miss— she's faster than you thought!",
"Your quick jab finds only air as she twists away!",
"She dodges your strike with irritating ease!",
"Too slow— she sees it coming and sidesteps!",
"She slips past your jab, smirking!"
]>>
<<set setup.combatNarrative.light_strike_miss_male to [
"You miss— he's faster than you thought!",
"Your quick jab finds only air as he twists away!",
"He dodges your strike with irritating ease!",
"Too slow— he sees it coming and sidesteps!",
"He slips past your jab, sneering!"
]>>
<<set setup.combatNarrative.heavy_strike_hit_female to [
"You put your full weight behind the blow— she STAGGERS from the impact!",
"Your heavy strike CRASHES into her, her whole body shuddering!",
"All your strength behind one brutal blow— she nearly collapses!",
"Your powerful strike lands with bone-shaking force— she cries out!",
"A crushing blow sends her reeling, tits jiggling from the impact!"
]>>
<<set setup.combatNarrative.heavy_strike_hit_male to [
"You put your full weight behind the blow— he STAGGERS from the impact!",
"Your heavy strike CRASHES into him, his whole body shuddering!",
"All your strength behind one brutal blow— he nearly collapses!",
"Your powerful strike lands with bone-shaking force— he cries out!",
"A crushing blow sends him reeling, knocked nearly off his feet!"
]>>
<<set setup.combatNarrative.heavy_strike_miss_female to [
"Your powerful but slow attack goes wide— she dodges easily!",
"You overextend and miss— she slips away!",
"She sees your telegraphed strike coming and evades!",
"You commit too hard— she's already moving out of the way!",
"Your crushing blow misses by inches as she twists aside!"
]>>
<<set setup.combatNarrative.heavy_strike_miss_male to [
"Your powerful but slow attack goes wide— he dodges easily!",
"You overextend and miss— he slips away!",
"He sees your telegraphed strike coming and evades!",
"You commit too hard— he's already moving out of the way!",
"Your crushing blow misses by inches as he twists aside!"
]>>
<<set setup.combatNarrative.power_strike_hit_female to [
"You channel all your strength into one devastating blow— she takes it HARD!",
"POWER STRIKE— your attack hits her like a freight train!",
"You unleash maximum force— she's nearly knocked off her feet!",
"Pure power— your blow connects and she CRUMPLES!",
"Maximum effort, maximum damage— she's fucking ROCKED!"
]>>
<<set setup.combatNarrative.power_strike_hit_male to [
"You channel all your strength into one devastating blow— he takes it HARD!",
"POWER STRIKE— your attack hits him like a freight train!",
"You unleash maximum force— he's nearly knocked off his feet!",
"Pure power— your blow connects and he CRUMPLES!",
"Maximum effort, maximum damage— he's fucking ROCKED!"
]>>
<<set setup.combatNarrative.power_strike_miss_female to [
"You overextend and miss— she evades your all-in attack!",
"Your power strike finds nothing— she sidesteps at the last second!",
"Too much windup— she sees it coming a mile away!",
"You swing with everything— and she's already gone!",
"Your devastating strike whiffs as she dances out of range!"
]>>
<<set setup.combatNarrative.power_strike_miss_male to [
"You overextend and miss— he evades your all-in attack!",
"Your power strike finds nothing— he sidesteps at the last second!",
"Too much windup— he sees it coming a mile away!",
"You swing with everything— and he's already gone!",
"Your devastating strike whiffs as he dances out of range!"
]>>
<<set setup.combatNarrative.brutal_stab_hit_female to [
"You drive your blade deep into her! A brutal, vicious stab!",
"Your weapon PLUNGES into her— she screams!",
"You thrust with brutal force— she gasps as metal bites deep!",
"A vicious stab finds its mark— she shrieks in agony!",
"Your brutal stab penetrates deep— she doubles over in pain!"
]>>
<<set setup.combatNarrative.brutal_stab_hit_male to [
"You drive your blade deep into him! A brutal, vicious stab!",
"Your weapon PLUNGES into him— he screams!",
"You thrust with brutal force— he gasps as metal bites deep!",
"A vicious stab finds its mark— he roars in agony!",
"Your brutal stab penetrates deep— he doubles over in pain!"
]>>
<<set setup.combatNarrative.brutal_stab_miss_female to [
"She dodges your stab— you're off-balance!",
"Your vicious thrust misses— she twisted away at the last second!",
"She parries your brutal stab!",
"She sidesteps your lethal thrust!",
"Your brutal stab goes wide— she's quicker than you expected!"
]>>
<<set setup.combatNarrative.brutal_stab_miss_male to [
"He dodges your stab— you're off-balance!",
"Your vicious thrust misses— he twisted away at the last second!",
"He parries your brutal stab!",
"He sidesteps your lethal thrust!",
"Your brutal stab goes wide— he's quicker than you expected!"
]>>
<<set setup.combatNarrative.brutal_stab_critical_female to [
"Your blade TEARS through her flesh— CRITICAL HIT!",
"You drive your weapon to the hilt in her— DEVASTATING!",
"A PERFECT thrust— she's GUTTED!",
"Your stab finds a vital spot— she screams as blood sprays!",
"You twist the blade inside her— MERCILESS!"
]>>
<<set setup.combatNarrative.brutal_stab_critical_male to [
"Your blade TEARS through his flesh— CRITICAL HIT!",
"You drive your weapon to the hilt in him— DEVASTATING!",
"A PERFECT thrust— he's GUTTED!",
"Your stab finds a vital spot— he screams as blood sprays!",
"You twist the blade inside him— MERCILESS!"
]>>
<<set setup.combatNarrative.slash_upper_hit_female to [
"Your blade slices through her top— fabric parts!",
"You slash upward— her shirt TEARS!",
"Your knife cuts through her clothing!",
"A quick slash shreds her top— more skin showing!",
"Your slash tears fabric away from her chest!"
]>>
<<set setup.combatNarrative.slash_upper_hit_male to [
"Your blade slices through his shirt— fabric parts!",
"You slash upward— his top TEARS!",
"Your knife cuts through his clothing!",
"A quick slash shreds his shirt— more skin showing!",
"Your slash tears fabric away from his chest!"
]>>
<<set setup.combatNarrative.slash_upper_exposed_female to [
"Your blade slices through her top— her tits spill free!",
"RIIIP! The fabric tears away completely— her breasts EXPOSED!",
"Your slash cuts her top to ribbons— tits fully visible!",
"You tear her shirt open— her bare breasts bounce free!",
"Your blade tears through— her tits are completely out!"
]>>
<<set setup.combatNarrative.slash_upper_exposed_male to [
"Your blade slices through his shirt— his chest fully exposed!",
"RIIIP! The fabric tears away completely— bare torso revealed!",
"Your slash cuts his top to ribbons— nothing left to cover him!",
"You tear his shirt open— his chest on full display!",
"Your blade tears through— he's stripped to the waist!"
]>>
<<set setup.combatNarrative.slash_upper_miss_female to [
"Your slash misses— she twists away!",
"She jumps back from your slashing blade!",
"She dodges your slash!",
"Your knife whiffs past her!",
"She sidesteps your blade!"
]>>
<<set setup.combatNarrative.slash_upper_miss_male to [
"Your slash misses— he twists away!",
"He jumps back from your slashing blade!",
"He dodges your slash!",
"Your knife whiffs past him!",
"He sidesteps your blade!"
]>>
<<set setup.combatNarrative.slash_lower_hit_female to [
"Your blade cuts through her pants— fabric tears!",
"You slash downward— her bottoms RIP!",
"Your knife tears through her lower clothing!",
"A quick slash shreds her pants— more leg showing!",
"Your slash rips fabric from her hips!"
]>>
<<set setup.combatNarrative.slash_lower_hit_male to [
"Your blade cuts through his pants— fabric tears!",
"You slash downward— his bottoms RIP!",
"Your knife tears through his lower clothing!",
"A quick slash shreds his pants— more leg showing!",
"Your slash rips fabric from his hips!"
]>>
<<set setup.combatNarrative.slash_lower_exposed_female to [
"Your blade tears her pants away— her pussy completely exposed!",
"RIIIP! The fabric shreds— her cunt on full display!",
"Your slash destroys her bottoms— pussy and ass fully visible!",
"You tear her pants to shreds— she's bare below the waist!",
"Your blade rips through— her holes are completely exposed!"
]>>
<<set setup.combatNarrative.slash_lower_exposed_male to [
"Your blade tears his pants away— his cock and balls completely exposed!",
"RIIIP! The fabric shreds— his dick flopping free!",
"Your slash destroys his bottoms— everything on display!",
"You tear his pants to shreds— he's naked below the waist!",
"Your blade rips through— his pathetic cock is hanging out!"
]>>
<<set setup.combatNarrative.slash_lower_miss_female to [
"Your slash misses— she jumps back!",
"She evades your cutting blade!",
"She dodges your slash!",
"Your knife whiffs past her legs!",
"She sidesteps your blade!"
]>>
<<set setup.combatNarrative.slash_lower_miss_male to [
"Your slash misses— he jumps back!",
"He evades your cutting blade!",
"He dodges your slash!",
"Your knife whiffs past his legs!",
"He sidesteps your blade!"
]>>
<<set setup.combatNarrative.light_strike_hit_log_female to [
"Quick jab— {damage} damage!",
"Fast strike lands— {damage}!",
"Tagged her— {damage}!",
"She takes it— {damage} damage!",
"Quick blow connects— {damage}!"
]>>
<<set setup.combatNarrative.light_strike_hit_log_male to [
"Quick jab— {damage} damage!",
"Fast strike lands— {damage}!",
"Tagged him— {damage}!",
"He takes it— {damage} damage!",
"Quick blow connects— {damage}!"
]>>
<<set setup.combatNarrative.heavy_strike_hit_log_female to [
"HEAVY BLOW— {damage} damage!",
"Crushing hit— {damage}!",
"She staggers— {damage}!",
"SMASHED her— {damage}!",
"Brutal strike— {damage} damage!"
]>>
<<set setup.combatNarrative.heavy_strike_hit_log_male to [
"HEAVY BLOW— {damage} damage!",
"Crushing hit— {damage}!",
"He staggers— {damage}!",
"SMASHED him— {damage}!",
"Brutal strike— {damage} damage!"
]>>
<<set setup.combatNarrative.power_strike_hit_log_female to [
"POWER STRIKE— {damage}!",
"Maximum force— {damage}!",
"She's ROCKED— {damage}!",
"DEVASTATING— {damage}!",
"Full power— {damage} damage!"
]>>
<<set setup.combatNarrative.power_strike_hit_log_male to [
"POWER STRIKE— {damage}!",
"Maximum force— {damage}!",
"He's ROCKED— {damage}!",
"DEVASTATING— {damage}!",
"Full power— {damage} damage!"
]>>
<<set setup.combatNarrative.brutal_stab_hit_log_female to [
"STABBED her— {damage}!",
"Blade sinks deep— {damage}!",
"She's IMPALED— {damage}!",
"Vicious thrust— {damage}!",
"Brutal penetration— {damage}!"
]>>
<<set setup.combatNarrative.brutal_stab_hit_log_male to [
"STABBED him— {damage}!",
"Blade sinks deep— {damage}!",
"He's IMPALED— {damage}!",
"Vicious thrust— {damage}!",
"Brutal penetration— {damage}!"
]>>
<<set setup.combatNarrative.slash_upper_hit_log_female to [
"Slash tears her top— {damage}!",
"Upper cut lands— {damage}!",
"Her shirt shreds— {damage}!",
"Top ripped— {damage}!",
"Sliced her clothes— {damage}!"
]>>
<<set setup.combatNarrative.slash_upper_hit_log_male to [
"Slash tears his shirt— {damage}!",
"Upper cut lands— {damage}!",
"His top shreds— {damage}!",
"Shirt ripped— {damage}!",
"Sliced his clothes— {damage}!"
]>>
<<set setup.combatNarrative.slash_lower_hit_log_female to [
"Slash tears her pants— {damage}!",
"Lower cut lands— {damage}!",
"Her bottoms shred— {damage}!",
"Pants ripped— {damage}!",
"Sliced her bottoms— {damage}!"
]>>
<<set setup.combatNarrative.slash_lower_hit_log_male to [
"Slash tears his pants— {damage}!",
"Lower cut lands— {damage}!",
"His bottoms shred— {damage}!",
"Pants ripped— {damage}!",
"Sliced his bottoms— {damage}!"
]>>
<<set setup.combatNarrative.light_strike_miss_log_female to [
"Quick jab misses!",
"She's too fast— miss!",
"She dodged!",
"Jab whiffs!",
"Too slow— missed!"
]>>
<<set setup.combatNarrative.light_strike_miss_log_male to [
"Quick jab misses!",
"He's too fast— miss!",
"He dodged!",
"Jab whiffs!",
"Too slow— missed!"
]>>
<<set setup.combatNarrative.heavy_strike_miss_log_female to [
"Heavy swing misses!",
"She slipped away!",
"She dodged!",
"Overextended— miss!",
"Crushing blow whiffs!"
]>>
<<set setup.combatNarrative.heavy_strike_miss_log_male to [
"Heavy swing misses!",
"He slipped away!",
"He dodged!",
"Overextended— miss!",
"Crushing blow whiffs!"
]>>
<<set setup.combatNarrative.power_strike_miss_log_female to [
"Power strike misses!",
"She evaded!",
"All that effort— nothing!",
"She saw it coming!",
"Whiffed completely!"
]>>
<<set setup.combatNarrative.power_strike_miss_log_male to [
"Power strike misses!",
"He evaded!",
"All that effort— nothing!",
"He saw it coming!",
"Whiffed completely!"
]>>
<<set setup.combatNarrative.brutal_stab_miss_log_female to [
"Stab misses!",
"She twisted away!",
"She parried!",
"Thrust dodged!",
"Blade finds air!"
]>>
<<set setup.combatNarrative.brutal_stab_miss_log_male to [
"Stab misses!",
"He twisted away!",
"He parried!",
"Thrust dodged!",
"Blade finds air!"
]>>
<<set setup.combatNarrative.slash_upper_miss_log_female to [
"Upper slash misses!",
"She dodged!",
"She twisted away!",
"Blade whiffs!",
"Cut finds air!"
]>>
<<set setup.combatNarrative.slash_upper_miss_log_male to [
"Upper slash misses!",
"He dodged!",
"He twisted away!",
"Blade whiffs!",
"Cut finds air!"
]>>
<<set setup.combatNarrative.slash_lower_miss_log_female to [
"Lower slash misses!",
"She jumped back!",
"She evaded!",
"Blade whiffs!",
"Cut misses!"
]>>
<<set setup.combatNarrative.slash_lower_miss_log_male to [
"Lower slash misses!",
"He jumped back!",
"He evaded!",
"Blade whiffs!",
"Cut misses!"
]>>
<<set setup.combatNarrative.light_strike_kill_log to [
"{enemy} drops!",
"{enemy} DOWN!",
"{enemy} finished!",
"{enemy} collapses!",
"Knocked out {enemy}!"
]>>
<<set setup.combatNarrative.heavy_strike_kill_log to [
"{enemy} CRUSHED!",
"{enemy} DESTROYED!",
"{enemy} FLATTENED!",
"{enemy} DEMOLISHED!",
"OBLITERATED {enemy}!"
]>>
<<set setup.combatNarrative.power_strike_kill_log to [
"{enemy} ANNIHILATED!",
"{enemy} WRECKED!",
"{enemy} DEVASTATED!",
"{enemy} RUINED!",
"PULVERIZED {enemy}!"
]>>
<<set setup.combatNarrative.brutal_stab_kill_log to [
"{enemy} GUTTED!",
"{enemy} IMPALED!",
"{enemy} SKEWERED!",
"{enemy} RUN THROUGH!",
"BUTCHERED {enemy}!"
]>>
<<set setup.combatNarrative.slash_upper_kill_log to [
"{enemy} slashed down!",
"{enemy} cut open!",
"{enemy} finished!",
"{enemy} sliced!",
"Carved up {enemy}!"
]>>
<<set setup.combatNarrative.slash_lower_kill_log to [
"{enemy} slashed down!",
"{enemy} cut open!",
"{enemy} finished!",
"{enemy} sliced!",
"Carved up {enemy}!"
]>>
<<set setup.combatNarrative.finisher_kill_log to [
"{enemy} OBLITERATED!",
"{enemy} ANNIHILATED!",
"{enemy} FUCKING DESTROYED!",
"{enemy} ERASED!",
"{enemy} ENDED!"
]>>
<<set setup.combatNarrative.light_strike_kill_female to [
"Your final jab catches {enemy} square in the jaw— her eyes roll back and she crumples like a broken doll, tits heaving with her last conscious breath.",
"{enemy} staggers from your quick strike, legs giving out as she collapses face-first, ass up in the air like she's presenting herself.",
"The finishing blow snaps {enemy}'s head back— she drops to her knees, then face-plants with her pussy exposed to the world.",
"Your jab connects and {enemy} goes down HARD, sprawled out and helpless, her chest rising and falling as consciousness fades.",
"{enemy} takes the hit and her body just... stops. She collapses in a heap, defeated and vulnerable, ready to be used."
]>>
<<set setup.combatNarrative.heavy_strike_kill_female to [
"Your crushing blow DEMOLISHES {enemy}— she flies backward, tits bouncing wildly as she crashes down, completely fucking destroyed.",
"{enemy} takes the full force and her body CRUMPLES— she hits the ground hard, limbs splayed, cunt exposed, utterly beaten.",
"CRACK! {enemy} folds like paper from your devastating strike, collapsing in a broken heap with her ass in the air.",
"Your heavy blow sends {enemy} SPRAWLING— she lands hard, tits jiggling from the impact, knocked the fuck out.",
"{enemy} is CRUSHED by your strike— she drops like a sack of meat, spread-eagle and completely at your mercy."
]>>
<<set setup.combatNarrative.power_strike_kill_female to [
"Your power strike ANNIHILATES {enemy}— she's launched off her feet, crashing down with her holes exposed and her body broken.",
"{enemy} takes MAXIMUM DAMAGE and her body just gives up— she collapses, twitching, tits heaving, completely fucking wrecked.",
"The sheer force of your strike RUINS {enemy}— she crumples like trash, sprawled out and helpless at your feet.",
"DEVASTATING! {enemy} is DESTROYED by your blow— she hits the ground hard, ass up, face down, utterly defeated.",
"Your full-power strike ends {enemy}— she drops like a puppet with cut strings, her body spread and vulnerable."
]>>
<<set setup.combatNarrative.brutal_stab_kill_female to [
"Your blade GUTS {enemy}— she screams as you tear it free, then collapses in a heap, holes exposed and body ruined.",
"{enemy} is IMPALED by your savage thrust— you rip the blade out and she drops, twitching and moaning, completely fucked.",
"You SKEWER {enemy} with brutal force— she gasps, eyes wide, then crumples around your blade before sliding off onto the ground.",
"Your stab finds something vital in {enemy}— she spasms, screams, then collapses face-first with her ass in the air.",
"{enemy} takes your blade DEEP— she gurgles, staggers, then falls in a broken heap, defeated and helpless."
]>>
<<set setup.combatNarrative.slash_upper_kill_female to [
"Your upward slash finishes {enemy}— she falls backward, top completely destroyed, bare tits bouncing as she hits the ground.",
"{enemy} drops from your cut, her ruined top falling away to expose her heaving breasts as she collapses.",
"The slash ends {enemy}— she crumples with her shirt in tatters, tits fully on display as she sprawls defeated.",
"Your blade finishes the job— {enemy} falls, top shredded, her bare chest exposed as she lands in a helpless heap.",
"{enemy} goes down from your slash, her destroyed clothing leaving nothing to the imagination as she collapses."
]>>
<<set setup.combatNarrative.slash_lower_kill_female to [
"Your downward slash finishes {enemy}— she falls forward, pants destroyed, bare pussy and ass completely exposed.",
"{enemy} drops from your cut, her shredded bottoms leaving her cunt on full display as she sprawls out.",
"The slash ends {enemy}— she collapses with her pants in ribbons, naked from the waist down and helpless.",
"Your blade finishes the job— {enemy} falls face-first, ass up, her destroyed clothing hiding nothing.",
"{enemy} goes down from your slash, her ruined pants exposing her holes as she crumples at your feet."
]>>
<<set setup.combatNarrative.finisher_kill_female to [
"Your finisher OBLITERATES {enemy}— she's launched across the ground, landing in a broken heap with her tits and pussy fully exposed, completely fucking destroyed.",
"{enemy} takes the full force of your combo and her body SHATTERS— she crashes down hard, limbs splayed, holes on display, utterly annihilated.",
"Your devastating finisher RUINS {enemy}— she flies backward, crashes down spread-eagle, tits bouncing as she hits the ground, knocked the fuck out.",
"MAXIMUM DAMAGE! {enemy} crumples like paper from your finisher, collapsing in a heap with her ass in the air, completely helpless.",
"Your finisher ENDS {enemy}— she drops like she's been hit by a truck, sprawled out and exposed, ready to be used however you want."
]>>
<<set setup.combatNarrative.light_strike_kill_male to [
"Your final jab catches {enemy} square in the jaw— his eyes roll back and he crumples, cock twitching as he hits the ground.",
"{enemy} staggers from your quick strike, legs giving out as he collapses face-first at your feet like the pathetic fuck he is.",
"The finishing blow snaps {enemy}'s head back— he drops to his knees, then face-plants, ass up and completely helpless.",
"Your jab connects and {enemy} goes down HARD, sprawled out and defeated, his body yours to do with as you please.",
"{enemy} takes the hit and his body just... stops. He collapses in a heap, groaning, totally at your mercy."
]>>
<<set setup.combatNarrative.heavy_strike_kill_male to [
"Your crushing blow DEMOLISHES {enemy}— he flies backward, crashing down hard, completely fucking destroyed.",
"{enemy} takes the full force and his body CRUMPLES— he hits the ground, limbs splayed, cock exposed, utterly beaten.",
"CRACK! {enemy} folds like paper from your devastating strike, collapsing in a broken heap at your feet.",
"Your heavy blow sends {enemy} SPRAWLING— he lands hard, knocked the fuck out, his body limp and vulnerable.",
"{enemy} is CRUSHED by your strike— he drops like a sack of meat, spread-eagle and completely at your mercy."
]>>
<<set setup.combatNarrative.power_strike_kill_male to [
"Your power strike ANNIHILATES {enemy}— he's launched off his feet, crashing down with his cock flopping pathetically.",
"{enemy} takes MAXIMUM DAMAGE and his body just gives up— he collapses, twitching, completely fucking wrecked.",
"The sheer force of your strike RUINS {enemy}— he crumples like trash, sprawled out and helpless at your feet.",
"DEVASTATING! {enemy} is DESTROYED by your blow— he hits the ground hard, face down, utterly defeated.",
"Your full-power strike ends {enemy}— he drops like a puppet with cut strings, his body spread and vulnerable."
]>>
<<set setup.combatNarrative.brutal_stab_kill_male to [
"Your blade GUTS {enemy}— he screams as you tear it free, then collapses in a heap, his body ruined.",
"{enemy} is IMPALED by your savage thrust— you rip the blade out and he drops, twitching and groaning, completely fucked.",
"You SKEWER {enemy} with brutal force— he gasps, eyes wide, then crumples around your blade before sliding off onto the ground.",
"Your stab finds something vital in {enemy}— he spasms, screams, then collapses face-first, defeated.",
"{enemy} takes your blade DEEP— he gurgles, staggers, then falls in a broken heap, helpless at your feet."
]>>
<<set setup.combatNarrative.slash_upper_kill_male to [
"Your upward slash finishes {enemy}— he falls backward, chest sliced open, crashing down hard.",
"{enemy} drops from your cut, his ruined shirt falling away as he collapses in a bloody heap.",
"The slash ends {enemy}— he crumples with his chest torn, sprawling defeated at your feet.",
"Your blade finishes the job— {enemy} falls, torso shredded, landing in a helpless heap.",
"{enemy} goes down from your slash, his destroyed clothing soaked red as he crumples."
]>>
<<set setup.combatNarrative.slash_lower_kill_male to [
"Your downward slash finishes {enemy}— he falls forward, pants destroyed, his cock and balls completely exposed.",
"{enemy} drops from your cut, his shredded bottoms leaving his pathetic dick on full display as he sprawls out.",
"The slash ends {enemy}— he collapses with his pants in ribbons, naked from the waist down and humiliated.",
"Your blade finishes the job— {enemy} falls face-first, ass up, his destroyed clothing hiding nothing.",
"{enemy} goes down from your slash, his ruined pants exposing everything as he crumples at your feet."
]>>
<<set setup.combatNarrative.finisher_kill_male to [
"Your finisher OBLITERATES {enemy}— he's launched across the ground, landing in a broken heap, completely fucking destroyed.",
"{enemy} takes the full force of your combo and his body SHATTERS— he crashes down hard, limbs splayed, utterly annihilated.",
"Your devastating finisher RUINS {enemy}— he flies backward, crashes down spread-eagle, knocked the fuck out.",
"MAXIMUM DAMAGE! {enemy} crumples like paper from your finisher, collapsing in a heap at your feet, completely helpless.",
"Your finisher ENDS {enemy}— he drops like he's been hit by a truck, sprawled out and defeated, totally at your mercy."
]>>
<<set setup.combatNarrative.finisher_hit_log to [
"FINISHER! {damage} DAMAGE!",
"COMBO FINISHER— {damage}!",
"DEVASTATING FINISHER— {damage}!",
"MAXIMUM DAMAGE— {damage}!",
"OBLITERATING BLOW— {damage}!"
]>>
<<set setup.combatNarrative.clothing_damage_top_regular_female to [
"Your strike tears through her shirt— fabric rips, exposing more of her heaving tits!",
"The blow shreds her top— her bra peeks through the torn fabric, those fat tits straining!",
"Your attack catches her clothing— her shirt tears, cleavage spilling out!",
"The impact rips her top open— more of her chest exposed with every hit!",
"Your strike damages her shirt— fabric shreds, her tits bouncing against the ruins!"
]>>
<<set setup.combatNarrative.clothing_damage_top_regular_male to [
"Your strike tears through his shirt— fabric rips, exposing his chest!",
"The blow shreds his top— his muscled torso visible through the torn fabric!",
"Your attack catches his clothing— his shirt tears open!",
"The impact rips his top— more of his chest exposed!",
"Your strike damages his shirt— fabric shreds as he stumbles!"
]>>
<<set setup.combatNarrative.clothing_damage_bottom_regular_female to [
"Your strike tears through her pants— fabric rips, exposing her thighs!",
"The blow shreds her bottoms— her panties peek through the torn fabric!",
"Your attack catches her clothing— her pants tear, more skin showing!",
"The impact rips her bottoms— her ass cheeks flash through the damage!",
"Your strike damages her pants— fabric shreds, her crotch barely hidden!"
]>>
<<set setup.combatNarrative.clothing_damage_bottom_regular_male to [
"Your strike tears through his pants— fabric rips, exposing his thighs!",
"The blow shreds his bottoms— his underwear peeks through the torn fabric!",
"Your attack catches his clothing— his pants tear!",
"The impact rips his bottoms— more skin showing!",
"Your strike damages his pants— fabric shreds as he stumbles!"
]>><<silently>>
<<set setup.kiraClothingDamageConfig to {
baseChance: 55,
beltCropPositionedChance: 85,
beltCropPositionedMultiplier: 2,
vulnerablePositions: ["prone_front", "bent_over"],
positionBonusWeapons: ["leather_belt", "riding_crop"],
fallbackDamage: {
min: 12,
max: 22
},
heavyHitThreshold: 12,
knockdownChance: 40
}>>
<<set setup.playerClothingDamageConfig to {
baseChance: 45,
femaleEnemyChance: 60,
fallbackDamage: {
min: 10,
max: 18
}
}>>
<<set setup.enemyTargetingConfig to {
maleTargetKiraChance: 70,
otherTargetKiraChance: 40,
exposedTargetBonus: 15,
vulnerablePositionBonus: 10
}>>
<<set setup.enemyLustTriggersConfig to {
welt: {
base: 5,
perWeltBonus: 3
},
clothingDamage: {
min: 8,
max: 14,
tornBonusMin: 4,
tornBonusMax: 8
},
exposureBurst: {
tits: { min: 12, max: 18 },
pussy: { min: 15, max: 22 },
ass: { min: 10, max: 15 }
},
passivePerTurn: {
titsExposed: 5,
pussyExposed: 10,
assExposed: 6,
vulnerablePosition: 4,
kiraVisiblyAroused: 3
},
knockdown: { min: 10, max: 15 },
bound: {
wrists: { min: 8, max: 12 },
ankles: { min: 8, max: 12 }
},
stunned: { min: 6, max: 10 },
kiraLustThreshold: {
fifty: { min: 5, max: 8 },
seventy: { min: 8, max: 12 }
}
}>>
<</silently>>
<<set setup.clothingDamageNarratives to {
top: {
regular: {
poolKey: "clothing_damage_top_regular",
fallback: "Your strike tears the shirt!"
},
nearly_destroyed: {
poolKey: "rip_top_nearly_destroyed",
fallback: "The top is barely holding together!"
},
full_exposure: {
poolKey: "rip_top_full_exposure",
fallback: "The top is destroyed— chest fully exposed!"
}
},
bottom: {
regular: {
poolKey: "clothing_damage_bottom_regular",
fallback: "Your strike tears the pants!"
},
underwear_only: {
poolKey: "tear_bottom_underwear_only",
fallback: "Pants destroyed— only underwear left!"
},
nearly_destroyed: {
poolKey: "tear_bottom_nearly_destroyed",
fallback: "The bottoms are barely holding together!"
},
full_exposure: {
poolKey: "tear_bottom_full_exposure",
fallback: "The bottoms are destroyed— fully exposed!"
}
}
}>>
<<widget "getKiraClothingDamageChance">>
<<set _cfg to setup.kiraClothingDamageConfig>>
<<set _enemyWeapon to _args[0]>>
<<set _kiraPos to _args[1] || $combat.positions.kira>>
<<set _clothingDmgChance to _cfg.baseChance>>
<<set _clothingDmgBonus to 1>>
<<set _forceBottom to false>>
<<if _cfg.positionBonusWeapons.includes(_enemyWeapon) && _cfg.vulnerablePositions.includes(_kiraPos)>>
<<set _clothingDmgChance to _cfg.beltCropPositionedChance>>
<<set _clothingDmgBonus to _cfg.beltCropPositionedMultiplier>>
<<set _forceBottom to true>>
<</if>>
<</widget>>
<<widget "getEnemyTarget">>
<<set _gtEnemy to _args[0]>>
<<set _cfg to setup.enemyTargetingConfig>>
<<set _enemyTarget to "player">>
<<if setup.kiraInFight()>>
<<set _targetKiraChance to (_gtEnemy.gender === "male") ? _cfg.maleTargetKiraChance : _cfg.otherTargetKiraChance>>
<<if $clothing.kira.titsExposed || $clothing.kira.pussyExposed>>
<<set _targetKiraChance += _cfg.exposedTargetBonus>>
<</if>>
<<set _kiraPos to $combat.positions.kira>>
<<if _kiraPos && _kiraPos !== "standing">>
<<set _targetKiraChance += _cfg.vulnerablePositionBonus>>
<</if>>
<<set _targetKiraChance += Number($combat.kiraTargetBonus) || 0>>
<<set _targetKiraChance to Math.min(95, _targetKiraChance)>>
<<if random(1, 100) <= _targetKiraChance>>
<<set _enemyTarget to "kira">>
<</if>>
<<set _enemyTarget to setup.kiraAidRedirect(_gtEnemy, _enemyTarget)>>
<</if>>
<</widget>>
/* =============================================================================
INIT WIDGET
Note: Config is automatically initialized when the passage loads.
This widget exists for consistency with other config patterns.<<widget "initDefensiveActionConfigs">>
<<run setup.defensiveMechanicsConfig = {
baseParryChance: 40,
baseBlockReduction: 50,
baseDodgeBonus: 30,
parryAgilityMultiplier: 2
}>>
<<run setup.defensiveNarratives = {
parry_success: {
poolKey: "parry_success",
fallback: "You parry the attack perfectly!",
logFallback: "PARRY! Attack deflected!"
},
parry_fail: {
poolKey: "parry_fail",
fallback: "Your parry fails!",
logFallback: "Parry failed!"
},
block_success: {
poolKey: "block_success",
fallback: "You absorb some of the impact.",
logFallback: "BLOCK! Damage reduced."
},
dodge_success: {
poolKey: "dodge_success",
fallback: "You dodge the attack!",
logFallback: "DODGE! Attack evaded!"
}
}>>
<<run setup.defensiveActionConfigs = {
block: {
name: "Block",
actionType: "block",
videoFolder: "combat/block",
energyCost: 3,
hpMinPercent: 0,
blockedPositions: ["pinned"],
positionPenalties: {
kneeling: 20,
prone_front: 50,
prone_back: 50,
bent_over: 40
},
stanceToSet: "blocking",
stancesToClear: ["parrying"],
penaltyVariable: "blockPenalty",
hasEnemySpecificImages: true,
imagePrefix: "combat/player-vs-",
imagePath: "combat/player-defend.png",
logText: "You raise your guard to block."
},
parry: {
name: "Parry",
actionType: "parry",
videoFolder: "combat/parry",
energyCost: 5,
hpMinPercent: 0,
blockedPositions: ["prone_front", "prone_back", "bent_over", "pinned"],
positionPenalties: {
kneeling: 25
},
stanceToSet: "parrying",
stancesToClear: ["blocking"],
penaltyVariable: "parryPenalty",
hasEnemySpecificImages: true,
imagePrefix: "combat/player-vs-",
imagePath: "combat/player-defend.png",
logText: "You prepare to parry."
},
riposte: {
name: "Riposte",
actionType: "riposte",
videoFolder: "combat/riposte",
energyCost: 4,
hpMinPercent: 0,
blockedPositions: ["kneeling", "prone_front", "prone_back", "bent_over", "pinned"],
positionPenalties: {},
stanceToSet: "riposteActive",
stancesToClear: ["blocking", "parrying"],
penaltyVariable: null,
hasEnemySpecificImages: false,
imagePath: "combat/player-defend.png",
logText: "You enter riposte stance, ready to counter."
},
dodge: {
name: "Dodge",
actionType: "dodge",
videoFolder: "combat/dodge",
energyCost: 3,
hpMinPercent: 0,
blockedPositions: [],
positionPenalties: {},
stanceToSet: "dodging",
stancesToClear: [],
penaltyVariable: null,
hasEnemySpecificImages: true,
imagePrefix: "combat/player-vs-",
enemyImageSuffix: "dodge",
imagePath: "combat/player-dodge.png",
logText: "You prepare to dodge."
}
}>>
<</widget>><<set setup.combatNarrative to setup.combatNarrative || {}>>\
<<set setup.combatNarrative.block_stance to [
"You raise your guard, bracing for impact.",
"You set your feet and prepare to absorb the blow.",
"You hunker down behind your defense.",
"You tighten your stance, ready to weather the attack.",
"You bring your arms up in a solid defensive posture.",
"You steel yourself, guard raised high.",
"You shift into a protective stance.",
"You brace yourself, muscles tensed for impact."
]>>
<<set setup.combatNarrative.parry_stance to [
"You watch their movements, ready to deflect.",
"You prepare to redirect their attack.",
"You set yourself for a precise parry.",
"You read their body language, timing your deflection.",
"You position yourself to catch their strike.",
"You focus intently, waiting for the perfect moment.",
"You ready yourself to turn their attack aside.",
"You watch for the opening a parry will create."
]>>
<<set setup.combatNarrative.riposte_stance to [
"You shift into a ready stance, watching for an opening.",
"You lower your guard slightly, baiting an attack.",
"You prepare to counter at the first opportunity.",
"You adopt a deceptive stance, ready to punish mistakes.",
"You watch them carefully, coiled to strike.",
"You position yourself for a swift counter.",
"You ready yourself to exploit any opening.",
"You set a trap, waiting for them to overextend."
]>>
<<set setup.combatNarrative.dodge_stance to [
"You shift your weight, ready to evade.",
"You prepare to dodge, watching the enemy's movements.",
"You loosen up, ready to avoid the next attack.",
"You get ready to sidestep whatever's coming."
]>>
<<set setup.combatNarrative.rest_action to [
"You take a moment to catch your breath and steady yourself.",
"You focus on recovery, breathing deeply despite the danger.",
"You pause to regain your composure, knowing it leaves you exposed.",
"You take a brief respite, recovering your stamina."
]>>
<<set setup.combatNarrative.block_position_kneeling to "From your knees, your block is compromised - you can only deflect part of the blow!">>
<<set setup.combatNarrative.block_position_prone_front to "Face-down on the ground, you can barely raise your arms to block!">>
<<set setup.combatNarrative.block_position_prone_back to "On your back, you can only weakly fend off attacks!">>
<<set setup.combatNarrative.block_position_bent_over to "Bent over, your defensive posture is severely limited!">>
<<set setup.combatNarrative.parry_position_kneeling to "From your knees, your parry is less effective, but you'll try!">>
<<set setup.combatNarrative.info_block to "Block active: Next hit deals {penalty}% damage">>
<<set setup.combatNarrative.info_parry to "Parry active: If enemy misses, you counter!">>
<<set setup.combatNarrative.info_riposte to "Riposte active: If enemy MISSES, you counter-attack!">>
<<set setup.combatNarrative.info_dodge to null>>
<<set setup.combatNarrative.info_rest to "VULNERABLE: Enemies have +20% hit chance this turn!">><<widget "initDickOutConfigs">>
<<set setup.dickOutConfigs to {}>>
<<run setup.dickOutConfigs.cock_slap = {
name: "Cock Slap",
actionName: "cock_slap",
poolExposed: "cock_slap",
poolClothed: null,
fallbackExposed: "You slap her face with your cock! She looks up at you, stunned and humiliated!",
fallbackClothed: null,
videoFolder: "combat/cock_slap",
secondaryVideoFolder: null,
lustExposed: {min: 8, max: 12},
lustClothed: null,
playerLustExposed: {min: 5, max: 8},
playerLustClothed: null,
dominance: 1,
humiliation: 8,
humiliationType: "cock_slap",
intensity: "light",
icon: "lips",
outputText: "You +{playerLust} lust",
clothingCheck: null,
checkSeduceVictory: false,
victoryText: null
}>>
<<run setup.dickOutConfigs.rub_face = {
name: "Rub Face",
actionName: "rub_face",
poolExposed: "rub_face",
poolClothed: null,
fallbackExposed: "You rub your hard cock across her face, smearing precum on her cheeks!",
fallbackClothed: null,
videoFolder: "combat/rub_face",
secondaryVideoFolder: null,
lustExposed: {min: 10, max: 15},
lustClothed: null,
playerLustExposed: {min: 8, max: 12},
playerLustClothed: null,
dominance: 1,
humiliation: 10,
humiliationType: "rub_face",
intensity: "light",
icon: "lips",
outputText: "You +{playerLust} lust",
clothingCheck: null,
checkSeduceVictory: false,
victoryText: null
}>>
<<run setup.dickOutConfigs.press_lips = {
name: "Press Lips",
actionName: "press_lips",
poolExposed: "press_lips",
poolClothed: null,
fallbackExposed: "You press the head of your cock against her lips. She resists, but her lips part slightly...",
fallbackClothed: null,
videoFolder: "combat/press_lips",
secondaryVideoFolder: null,
lustExposed: {min: 12, max: 18},
lustClothed: null,
playerLustExposed: {min: 10, max: 15},
playerLustClothed: null,
dominance: 2,
humiliation: 12,
humiliationType: "press_lips",
intensity: "light",
icon: "lips",
outputText: "You +{playerLust} lust",
clothingCheck: null,
checkSeduceVictory: false,
victoryText: null
}>>
<<run setup.dickOutConfigs.slap_lips = {
name: "Slap Lips",
actionName: "slap_lips",
poolExposed: "slap_lips",
poolClothed: null,
fallbackExposed: "You slap your cock against her lips— she gasps, mouth opening involuntarily!",
fallbackClothed: null,
videoFolder: "combat/slap_lips",
secondaryVideoFolder: null,
lustExposed: {min: 15, max: 22},
lustClothed: null,
playerLustExposed: {min: 12, max: 18},
playerLustClothed: null,
dominance: 2,
humiliation: 15,
humiliationType: "slap_lips",
intensity: "moderate",
icon: "lips",
outputText: "You +{playerLust} lust",
clothingCheck: null,
checkSeduceVictory: false,
victoryText: null
}>>
<<run setup.dickOutConfigs.make_suck = {
name: "Make Her Suck",
actionName: "make_suck",
poolExposed: "make_suck",
poolClothed: null,
fallbackExposed: "You grab her hair and push past her lips! She gags but her tongue works your shaft!",
fallbackClothed: null,
videoFolder: "combat/make_suck",
secondaryVideoFolder: null,
lustExposed: {min: 20, max: 30},
lustClothed: null,
playerLustExposed: {min: 15, max: 22},
playerLustClothed: null,
dominance: 3,
humiliation: 20,
humiliationType: "forced_suck",
intensity: "intense",
icon: "lips",
outputText: "You +{playerLust} lust",
clothingCheck: null,
checkSeduceVictory: true,
victoryText: "She starts sucking EAGERLY— her eyes glaze with need! SEDUCED!"
}>>
<<run setup.dickOutConfigs.use_throat = {
name: "Use Her Throat",
actionName: "use_throat",
poolExposed: "use_throat",
poolClothed: null,
fallbackExposed: "You thrust DEEP! Her throat bulges around your shaft as she gags and drools!",
fallbackClothed: null,
videoFolder: "combat/use_throat",
secondaryVideoFolder: null,
lustExposed: {min: 30, max: 45},
lustClothed: null,
playerLustExposed: {min: 18, max: 25},
playerLustClothed: null,
dominance: 4,
humiliation: 25,
humiliationType: "throat_fuck",
intensity: "ultra",
icon: "lips",
outputText: "You +{playerLust} lust",
clothingCheck: null,
checkSeduceVictory: true,
victoryText: "Her eyes roll back! She cums from being throat-fucked— COMPLETE SUBMISSION!"
}>>
<<set setup.dickOutConfigs.grind_behind to {
name: "Grind Behind",
actionName: "grind_behind",
poolExposed: "grind_behind_exposed",
poolClothed: "grind_behind_clothed",
fallbackExposed: "You press against her from behind— your hard cock slides between her bare ass cheeks!",
fallbackClothed: "You grind your cock against her clothed ass! She gasps, feeling your hardness!",
videoFolder: "combat/grind_behind_exposed",
secondaryVideoFolder: null,
lustExposed: {min: 15, max: 22},
lustClothed: {min: 10, max: 15},
playerLustExposed: {min: 12, max: 18},
playerLustClothed: {min: 8, max: 12},
dominance: 1,
humiliation: 0,
humiliationType: null,
intensity: "light",
icon: "lust",
outputText: "You gain lust too!",
clothingCheck: "assExposed",
checkSeduceVictory: false,
victoryText: null
}>>
<<run setup.dickOutConfigs.hotdog_ass = {
name: "Hotdog Ass",
actionName: "hotdog_ass",
poolExposed: "hotdog_ass_exposed",
poolClothed: "hotdog_ass_clothed",
fallbackExposed: "You thrust your cock between her bare ass cheeks, hotdogging her! Your shaft slides through her crack!",
fallbackClothed: "You grind your bare cock against her clothed ass, simulating thrusts! She moans despite herself!",
videoFolder: "combat/hotdog_ass_exposed",
secondaryVideoFolder: null,
lustExposed: {min: 20, max: 28},
lustClothed: {min: 12, max: 18},
playerLustExposed: {min: 15, max: 22},
playerLustClothed: {min: 10, max: 15},
dominance: 2,
humiliation: 12,
humiliationType: "hotdog",
intensity: "moderate",
icon: "lust",
outputText: "You gain lust too!",
clothingCheck: "assExposed",
checkSeduceVictory: false,
victoryText: null
}>>
<<run setup.dickOutConfigs.rub_ass = {
name: "Rub Ass",
actionName: "rub_ass",
poolExposed: "rub_ass_exposed",
poolClothed: "rub_ass_clothed",
fallbackExposed: "You rub your cock against her exposed ass, the head teasing her hole!",
fallbackClothed: "You rub your cock along her clothed ass, letting her feel your heat through the fabric!",
videoFolder: "combat/rub_ass_exposed",
secondaryVideoFolder: null,
lustExposed: {min: 18, max: 25},
lustClothed: {min: 10, max: 15},
playerLustExposed: {min: 14, max: 20},
playerLustClothed: {min: 8, max: 12},
dominance: 1,
humiliation: 0,
humiliationType: null,
intensity: "moderate",
icon: "lust",
outputText: "You gain lust too!",
clothingCheck: "assExposed",
checkSeduceVictory: false,
victoryText: null
}>>
<<run setup.dickOutConfigs.hotdog_prone = {
name: "Hotdog Prone",
actionName: "hotdog_prone",
poolExposed: "hotdog_prone_exposed",
poolClothed: "hotdog_prone_clothed",
fallbackExposed: "You mount her prone form and slide your cock between her bare cheeks! She writhes beneath you!",
fallbackClothed: "You grind against her prone ass through her clothes! She can feel every inch of you!",
videoFolder: "combat/hotdog_prone_exposed",
secondaryVideoFolder: null,
lustExposed: {min: 22, max: 32},
lustClothed: {min: 15, max: 22},
playerLustExposed: {min: 18, max: 25},
playerLustClothed: {min: 12, max: 18},
dominance: 2,
humiliation: 15,
humiliationType: "prone_hotdog",
intensity: "intense",
icon: "lust",
outputText: "You gain lust too!",
clothingCheck: "assExposed",
checkSeduceVictory: true,
victoryText: "She starts pushing back against you, moaning in heat— SEDUCED!"
}>>
<<run setup.dickOutConfigs.tease_entrance = {
name: "Tease Entrance",
actionName: "tease_entrance",
poolExposed: "tease_entrance",
poolClothed: null,
fallbackExposed: "You press the head of your cock against her wet pussy, teasing but not entering! She whimpers!",
fallbackClothed: null,
videoFolder: "combat/tease_entrance",
secondaryVideoFolder: null,
lustExposed: {min: 25, max: 35},
lustClothed: null,
playerLustExposed: {min: 18, max: 25},
playerLustClothed: null,
dominance: 3,
humiliation: 18,
humiliationType: "tease_entrance",
intensity: "intense",
icon: "lust",
outputText: "You +{playerLust} lust",
clothingCheck: null,
checkSeduceVictory: true,
victoryText: "She pushes back trying to impale herself! \"Just put it in!\" she begs— SEDUCED!"
}>>
<<run setup.dickOutConfigs.grind_back = {
name: "Grind Back",
actionName: "grind_back",
poolExposed: "grind_back_exposed",
poolClothed: "grind_back_clothed",
fallbackExposed: "You grind your cock along her exposed pussy, your shaft sliding through her wet slit!",
fallbackClothed: "You grind your cock against her clothed crotch! She squirms beneath you!",
videoFolder: "combat/grind_back_exposed",
secondaryVideoFolder: null,
lustExposed: {min: 20, max: 28},
lustClothed: {min: 12, max: 18},
playerLustExposed: {min: 15, max: 22},
playerLustClothed: {min: 10, max: 15},
dominance: 2,
humiliation: 0,
humiliationType: null,
intensity: "moderate",
icon: "lust",
outputText: "You gain lust too!",
clothingCheck: "pussyExposed",
checkSeduceVictory: true,
victoryText: "She grinds back against you desperately! \"Please... I need it!\" — SEDUCED!"
}>>
<<set setup.dickOutConfigs.rub_thighs to {
name: "Rub Thighs",
actionName: "rub_thighs",
poolExposed: "rub_thighs_exposed",
poolClothed: "rub_thighs_clothed",
fallbackExposed: "You thrust between her thighs, your cock rubbing against her slick pussy lips!",
fallbackClothed: "You thrust between her thighs, grinding against her through the fabric!",
videoFolder: "combat/rub_thighs_exposed",
secondaryVideoFolder: null,
lustExposed: {min: 22, max: 30},
lustClothed: {min: 15, max: 20},
playerLustExposed: {min: 18, max: 24},
playerLustClothed: {min: 12, max: 16},
dominance: 2,
humiliation: 12,
humiliationType: "thigh_fuck",
intensity: "moderate",
icon: "lust",
outputText: "You gain lust too!",
clothingCheck: "pussyExposed",
checkSeduceVictory: true,
victoryText: "She squeezes her thighs together, grinding back! \"Just put it in already!\" — SEDUCED!"
}>>
<<run setup.dickOutConfigs.tease_pussy = {
name: "Tease Pussy",
actionName: "tease_pussy",
poolExposed: "tease_pussy",
poolClothed: null,
fallbackExposed: "You slide your cockhead up and down her wet slit, teasing her hole mercilessly!",
fallbackClothed: null,
videoFolder: "combat/tease_pussy",
secondaryVideoFolder: null,
lustExposed: {min: 28, max: 38},
lustClothed: null,
playerLustExposed: {min: 20, max: 28},
playerLustClothed: null,
dominance: 3,
humiliation: 20,
humiliationType: "tease_pussy",
intensity: "intense",
icon: "lust",
outputText: "You +{playerLust} lust",
clothingCheck: null,
checkSeduceVictory: true,
victoryText: "She arches her hips desperately! \"Please! I need it!\" — COMPLETELY SEDUCED!"
}>>
<</widget>><<set setup.combatNarrative to setup.combatNarrative || {}>>
<<set setup.combatNarrative.cock_slap to [
"You slap her face with your cock! She looks up at you, stunned and humiliated!",
"SMACK! Your cock leaves a red mark on her cheek! Her eyes widen in shock!",
"You backhand her face with your shaft! She gasps, a mix of outrage and arousal!",
"Your cock slaps against her cheek! 'You bastard—' she starts, but her voice wavers!",
"You slap your cock against her face repeatedly! Each impact makes her flinch— and moan!",
"CRACK! Your shaft strikes her cheek! She glares up at you, but her thighs squeeze together!"
]>>
<<set setup.combatNarrative.rub_face to [
"You rub your hard cock across her face, smearing precum on her cheeks!",
"You drag your shaft across her lips, leaving a glistening trail on her skin!",
"You rub your cock all over her face! She tries to turn away but you follow her!",
"You mark her face with your cock, precum painting her cheeks and nose!",
"You grind your shaft against her face! She whimpers as your musk fills her senses!",
"You smear your cock across her face like you own her! Her protests grow weaker!"
]>>
<<set setup.combatNarrative.press_lips to [
"You press the head of your cock against her lips! She resists, but her lips part slightly...",
"Your cockhead pushes against her closed mouth! A drop of precum glistens on her lips!",
"You press against her lips! She clamps them shut but you feel her resolve weakening!",
"The head of your cock pushes insistently at her lips! Her breath comes hot against your shaft!",
"You rub your cockhead across her lips! She refuses to open, but her tongue darts out briefly!",
"You push against her mouth! 'Open,' you command! She whimpers, lips trembling!"
]>>
<<set setup.combatNarrative.slap_lips to [
"You slap your cock against her lips— she gasps, mouth opening involuntarily!",
"SMACK! Your shaft strikes her lips! She opens her mouth in surprise!",
"You slap her lips with your cock! Each impact makes her mouth gape a little wider!",
"Your cock slaps against her pouty lips! 'Ah!' She can't help but open up!",
"You spank her mouth with your shaft! Her lips part, drooling slightly!",
"SMACK SMACK! You slap her lips repeatedly! She's moaning now, mouth hanging open!"
]>>
<<set setup.combatNarrative.make_suck to [
"You grab her hair and push past her lips! She gags but her tongue works your shaft!",
"You force her mouth open and push inside! She struggles at first, then starts sucking!",
"You shove your cock into her mouth! After a moment of resistance, she starts bobbing!",
"You push past her lips! She glares up at you, but her cheeks hollow as she sucks!",
"You grip her hair and thrust into her mouth! Her muffled protests become moans!",
"You push inside her warm mouth! Her eyes water, but she sucks obediently!"
]>>
<<set setup.combatNarrative.use_throat to [
"You thrust DEEP! Her throat bulges around your shaft as she gags and drools!",
"You grab her head and SLAM your cock down her throat! She chokes, spit flying!",
"You fuck her throat mercilessly! Drool pours down her chin, eyes streaming!",
"You use her throat like a sleeve! She gags and sputters but takes every inch!",
"You POUND her throat! Her eyes roll back, completely overwhelmed!",
"You hold her head and thrust deep! Her throat massages your cock as she struggles to breathe!"
]>>
<<set setup.combatNarrative.grind_behind_clothed to [
"You grind your cock against her clothed ass! She gasps, feeling your hardness!",
"You press your bare cock against her ass through her clothes! She shivers!",
"You rub your hard cock against her clothed backside! She can feel every inch!",
"You grind into her from behind! Your cock presses against the fabric covering her ass!",
"You hump her clothed ass! Even through the fabric, she feels your throbbing heat!",
"You push your cock against her ass! The friction through her clothes makes her moan!"
]>>
<<set setup.combatNarrative.grind_behind_exposed to [
"You press against her from behind— your hard cock slides between her bare ass cheeks!",
"Your cock slides between her naked cheeks! She gasps at the skin contact!",
"You grind your bare cock against her exposed ass! Your shaft nestles in her crack!",
"You push between her bare cheeks! She moans as your cock slides through!",
"Your hard cock grinds against her naked ass! She pushes back involuntarily!",
"You hotdog her bare ass from behind! Your cock throbs between her cheeks!"
]>>
<<set setup.combatNarrative.hotdog_ass_clothed to [
"You grind your bare cock against her clothed ass, simulating thrusts! She moans despite herself!",
"You thrust against her clothed ass! Each pump makes her gasp!",
"You dry-hump her ass through her clothes! She tries to pull away but you hold her!",
"Your cock slides against the fabric covering her ass! She feels every inch!",
"You grind against her clothed backside! Her protests turn to whimpers!",
"You thrust against her ass repeatedly! The friction drives you both wild!"
]>>
<<set setup.combatNarrative.hotdog_ass_exposed to [
"You thrust your cock between her bare ass cheeks! Your shaft slides through her crack!",
"Your cock glides between her naked cheeks! She moans as the head teases past her hole!",
"You hotdog her bare ass! Each thrust makes your cock slide through her crack!",
"You pump between her bare cheeks! Your shaft coated in her sweat!",
"Your cock slips up and down her naked crack! She pushes back against you!",
"You fuck the cleft of her bare ass! She moans as the head brushes her hole!"
]>>
<<set setup.combatNarrative.rub_ass_clothed to [
"You rub your cock along her clothed ass, letting her feel your heat through the fabric!",
"Your shaft grinds against her clothed backside! She squirms beneath you!",
"You press your cock against her ass through the fabric! She feels every throb!",
"You drag your cock across her clothed ass! The pressure makes her whimper!",
"Your cock rubs insistently against her covered ass! She can't ignore your heat!",
"You grind your shaft against the fabric covering her ass! She trembles!"
]>>
<<set setup.combatNarrative.rub_ass_exposed to [
"You rub your cock against her exposed ass, the head teasing her hole!",
"Your cockhead brushes against her exposed hole! She shivers at the contact!",
"You drag your shaft across her bare ass! The head bumps against her hole!",
"Your cock slides across her naked ass! She feels you pulsing against her skin!",
"You tease her bare ass with your cock! The head presses against her hole briefly!",
"Your shaft rubs across her exposed backside! She moans at each pass!"
]>>
<<set setup.combatNarrative.hotdog_prone_clothed to [
"You grind against her prone ass through her clothes! She can feel every inch of you!",
"You mount her from behind, grinding into her clothed ass! She squirms!",
"You hump her prone form through her clothes! Each thrust makes her gasp!",
"Your cock grinds against her clothed ass as she lies prone! She moans!",
"You thrust against her prone ass through the fabric! She pushes back!",
"You dry-hump her prone form! The friction through her clothes drives her wild!"
]>>
<<set setup.combatNarrative.hotdog_prone_exposed to [
"You mount her prone form and slide your cock between her bare cheeks! She writhes beneath you!",
"Your cock slips between her naked cheeks as she lies face-down! She moans!",
"You fuck between her bare cheeks! Her ass squeezes around your shaft!",
"You thrust into her crack! Your cock slides through her bare cheeks with each pump!",
"You mount her prone body and hotdog her bare ass! She pushes back desperately!",
"Your shaft glides through her exposed crack! She cries out as the head teases her!"
]>>
<<set setup.combatNarrative.tease_entrance to [
"You press the head of your cock against her wet pussy, teasing but not entering! She whimpers!",
"Your cockhead presses against her hole but doesn't push in! 'Please!' she begs!",
"You tease her cunt with your tip! She tries to push back but you pull away!",
"The head of your cock rests against her pussy! She squirms, desperate for more!",
"You rub your cockhead against her pussy! Each circle makes her moan louder!",
"You press against her wet hole! One push and you'd be inside! She trembles!"
]>>
<<set setup.combatNarrative.grind_back_clothed to [
"You grind your cock against her clothed crotch! She squirms beneath you!",
"Your shaft presses against the fabric covering her pussy! She gasps!",
"You thrust against her clothed pussy! Even through the fabric, she feels you!",
"You grind into her from above! Your cock rubs against her covered sex!",
"Your hard cock grinds against her clothed pussy! She moans despite herself!",
"You dry-hump her through her clothes! Each thrust makes her whimper!"
]>>
<<set setup.combatNarrative.grind_back_exposed to [
"You grind your cock along her exposed pussy, your shaft sliding through her wet slit!",
"Your cock slides through her slick pussy lips! She arches her back!",
"You grind your shaft against her bare pussy! Your cock coated in her wetness!",
"You rub your cock up and down her exposed slit! She moans with each pass!",
"Your shaft glides through her wet slit! She spreads wider involuntarily!",
"You grind against her naked pussy! Your cock throbs against her clit!"
]>>
<<set setup.combatNarrative.rub_thighs_clothed to [
"You thrust between her thighs, grinding against her through the fabric!",
"Your cock pushes between her clothed thighs! She squeezes them together!",
"You fuck her thighs through her clothes! The pressure makes her moan!",
"Your shaft slides between her clothed thighs! She feels every inch!",
"You thrust between her legs! The friction through the fabric drives you both wild!",
"You rub your cock between her clothed thighs! She squirms beneath you!"
]>>
<<set setup.combatNarrative.rub_thighs_exposed to [
"You thrust between her thighs, your cock rubbing against her slick pussy lips!",
"Your cock slides between her bare thighs! Her wetness coats your shaft!",
"You fuck her thighs! Each thrust rubs your cock against her exposed pussy!",
"Your shaft glides through her thighs and against her wet slit! She moans!",
"You pump between her naked thighs! Your cock slides through her slickness!",
"You thrust between her legs! Your cock brushes her pussy with each stroke!"
]>>
<<set setup.combatNarrative.tease_pussy to [
"You slide your cockhead up and down her wet slit, teasing her hole mercilessly!",
"Your cockhead parts her lips, teasing her hole! She begs for more!",
"You rub your tip through her wet pussy lips! Each pass makes her writhe!",
"You tease her clit with your cockhead! She bucks her hips desperately!",
"Your cock slides through her soaked pussy! You tease every inch of her slit!",
"You torture her with your tip! Sliding along her slit but never pushing inside!"
]>><<widget "initDominationConfigs">>
<<run setup.dominationConfigs = {}>>
<<run setup.dominationConfigs.intimidate = {
name: "Intimidate",
actionType: "intimidate",
energyCost: 8,
baseChance: 40,
statModifier: {
player: "dominance",
enemy: "will",
playerPositive: true
},
armorBonus: 15,
onSuccess: {
applyStatus: "fear",
duration: 3,
narrativePool: "intimidate_success"
},
onFailure: {
narrativePool: "intimidate_failure"
},
videoFolder: "combat/intimidate_success",
videoFolderFail: "combat/intimidate_fail",
secondaryVideoFolder: null,
logSuccess: "Enemy terrified!",
logFailure: "Intimidate failed!",
nextPassage: "Combat_Companion_Turn"
}>>
<<run setup.dominationConfigs.verbal_degrade = {
name: "Verbal Degradation",
actionType: "verbal_degrade",
energyCost: 3,
humiliationByPosition: {
standing: [8, 15],
kneeling: [10, 18],
bent_over: [12, 20],
prone_front: [12, 18],
prone_back: [12, 18],
pinned: [15, 22]
},
exposureBonus: {
titsExposed: 5,
pussyExposed: 8
},
sideEffects: {
enemyLust: 5,
playerLust: 3,
playerDominance: 1
},
narrativePools: {
standing: "verbal_degradation",
kneeling: "verbal_degradation_kneeling",
bent_over: "verbal_degradation_bent",
prone_front: "verbal_degradation_prone",
prone_back: "verbal_degradation_prone",
pinned: "verbal_degradation_prone"
},
videoFolders: {
standing: "combat/verbal_degradation",
kneeling: "combat/verbal_degradation_kneeling",
bent_over: "combat/verbal_degradation_bent",
prone_front: "combat/verbal_degradation_prone",
prone_back: "combat/verbal_degradation_prone",
pinned: "combat/verbal_degradation_prone"
},
secondaryVideoFolder: null,
humiliationStateReactions: {
embarrassed: "Her cheeks burn red as your words hit home...",
degraded: "She flinches at your words, spirit breaking...",
broken: "She can only whimper, completely broken..."
},
nextPassage: "Combat_Companion_Turn"
}>>
<<run setup.dominationConfigs.break_will = {
name: "Break Will",
actionType: "break_will",
baseResistanceDamage: 15,
exposureBonus: {
both: 10,
either: 5
},
positionBonus: {
pinned: 10,
bent_over: 8,
prone_front: 5,
prone_back: 5,
kneeling: 3,
standing: 0
},
lustBonus: {
threshold: 50,
perTwentyLust: 1
},
effects: {
enemyLust: 10,
addHumiliation: 10
},
narrativePools: {
female: "break_will_female",
male: "break_will_male"
},
videoFolders: {
female: "combat/break_will_female",
male: "combat/break_will_male"
},
secondaryVideoFolder: null,
fallbackText: {
female: "You lean in close, voice low and commanding. Your hands roam her exposed body, claiming her. \"Stop fighting. You know you want this.\" Her resolve wavers visibly.",
male: "You lean in close, voice low and commanding. Your hands assert dominance over his body. \"Stop fighting. Submit.\" His resolve wavers visibly."
}
}>>
<<run setup.dominationConfigs.force_beg = {
name: "Force Beg",
actionType: "force_beg",
effects: {
humiliation: 25,
resistance: -20,
setHasBegged: true
},
narrativePools: {
female: "force_beg_female",
male: "force_beg_male"
},
videoFolders: {
female: "combat/force_beg_female",
male: "combat/force_beg_male"
},
secondaryVideoFolder: null,
fallbackText: {
female: "\"Beg for it,\" you command. After a long, trembling pause, the words come: \"Please... please, I need it... I need you to...\"",
male: "\"Beg for it,\" you command. After a long, trembling pause, the words come: \"Please... please, I need it...\""
},
logText: "begs pathetically! Humiliated and broken!",
logType: "domination"
}>>
<</widget>><<run setup.combatNarrative = setup.combatNarrative || {}>>
<<set setup.combatNarrative.intimidate_success to [
"You bare your teeth and roar! The raider recoils in terror!",
"Your presence radiates menace— {he} stumbles backward, eyes wide with fear!",
"You step forward, voice dropping to a deadly growl. {He} FREEZES.",
"The killing intent in your eyes is unmistakable. {He} knows {he}'s outmatched— TERRIFIED!",
"You lock eyes with {him} and let the darkness show. {He} whimpers and backs away!",
"A primal snarl escapes you. {His} bravado shatters— {he}'s AFRAID!",
"You tower over {him}, radiating dominance. {He} shrinks back, trembling!",
"Your intimidating aura is overwhelming. {He} can barely hold {his} weapon steady!"
]>>
<<set setup.combatNarrative.intimidate_failure to [
"You try to intimidate {him}, but {he} stands firm, unimpressed.",
"{He} meets your glare with {his} own— not backing down!",
"Your attempt to frighten {him} falls flat. {He} smirks mockingly.",
"{He}'s not scared of you. \"That all you got?\" {he} taunts.",
"Your roar echoes out, but {he} doesn't flinch. Tough one.",
"{He} looks you up and down, unimpressed. \"Try harder.\"",
"Your intimidation attempt fails— {he}'s seen worse than you!",
"{He} laughs in your face! \"You'll have to do better than that!\""
]>>
<<set setup.combatNarrative.verbal_degradation to [
"\"Look at you, still trying to fight back. Pathetic.\"",
"\"You're nothing but a piece of meat standing there pretending to be tough.\"",
"\"I'm going to enjoy breaking you down, bitch.\"",
"\"That's right, keep standing there like you have a choice in this.\"",
"\"You really think you can win this? How adorable.\"",
"\"I can see the fear in your eyes. You know what's coming.\"",
"\"Still acting tough? We'll fix that soon enough.\"",
"\"Look at you trembling. Already breaking, aren't you?\""
]>>
<<set setup.combatNarrative.verbal_degradation_kneeling to [
"\"That's where you belong— on your knees before me.\"",
"\"Look at you down there. Such a good little slut, already kneeling.\"",
"\"Stay on your knees where you belong. Don't even think about getting up.\"",
"\"Perfect position for you. Now beg.\"",
"\"How does it feel to kneel before your betters?\"",
"\"That's right, kneel there and accept your place.\"",
"\"Such a pretty sight— you on your knees, completely helpless.\"",
"\"I could get used to seeing you like this— submissive and kneeling.\""
]>>
<<set setup.combatNarrative.verbal_degradation_bent to [
"\"Look at that ass up in the air. You're just begging for it, aren't you?\"",
"\"Bent over like a bitch in heat. How fitting.\"",
"\"Stay bent over. I like the view from here.\"",
"\"That position suits you— bent over and ready to be used.\"",
"\"Such a humiliating position, isn't it? And you can't do anything about it.\"",
"\"Look at you presenting yourself. What a desperate whore.\"",
"\"I wonder how long you can stay bent over like that before you break completely.\"",
"\"That's it, stay bent over. Everyone can see what a slut you are.\""
]>>
<<set setup.combatNarrative.verbal_degradation_prone to [
"\"Face down where you belong— in the dirt like the trash you are.\"",
"\"Look at you, sprawled out helplessly. This is what defeat looks like.\"",
"\"Stay down there. That's your natural position.\"",
"\"How does the ground taste? Get used to it.\"",
"\"Laying there helpless, completely at my mercy. Pathetic.\"",
"\"I could do anything I want to you right now, and you can't stop me.\"",
"\"Stay face down. I'm not done humiliating you yet.\"",
"\"Look at you pinned down like the weak little bitch you are.\""
]>>
<<set setup.combatNarrative.break_will_female to [
"You lean in close, voice low and commanding. Your hands roam her exposed body, claiming her. \"Stop fighting. You know you want this.\" Her resolve wavers visibly.",
"\"Give in,\" you whisper, fingers tracing her curves. \"You can't win. Your body already knows who it belongs to.\" She trembles under your touch.",
"Your hands explore her body possessively. \"Resistance is pointless. You're mine.\" Her will begins to crumble.",
"\"Feel that?\" you murmur, hands sliding over her skin. \"Your body responds to me. Your mind will follow.\" She gasps, weakening.",
"You press close, dominating her space. \"Stop pretending you don't want this. I can feel you giving in.\" Her resistance falters.",
"\"Your will is breaking,\" you tell her, voice dripping with command. \"Accept it. Submit.\" Her defiance cracks.",
"Your touch is relentless, claiming every inch. \"You can't resist forever. Your body knows its master.\" She whimpers, resolve shattering.",
"\"Look at you, still trying to fight,\" you taunt. \"But we both know you're already mine.\" Her will crumbles under your words."
]>>
<<set setup.combatNarrative.force_beg_female to [
"\"Beg for it,\" you command. After a long, trembling pause, the words come: \"Please... please, I need it... I need you to...\"",
"\"Say it. Beg me.\" Her lips tremble. \"Please... I'm begging... please give it to me...\"",
"\"I want to hear you beg like the desperate slut you are.\" She whimpers: \"Please... I'll do anything... just please...\"",
"\"Beg properly, or you get nothing.\" Her voice breaks: \"Please! I'm begging you! I need it so badly...\"",
"\"Let me hear those pretty words.\" She gasps out: \"Please... please, I'm begging... I can't take it anymore...\"",
"\"Beg for what you want. Say it.\" She sobs: \"Please... I need you... I'm begging, please...\"",
"\"I'm waiting. Beg.\" Her resistance crumbles: \"Please, please, PLEASE... I'll beg, I'll do anything...\"",
"\"Louder. Beg like you mean it.\" She cries out: \"PLEASE! I'm begging you! I need it!\""
]>><<set setup.combatNarrative to setup.combatNarrative || {}>>\
<<run Object.assign(setup.combatNarrative, {
slap_tits_hit: [
"You slap her exposed tit HARD! The flesh jiggles from the impact!",
"SMACK! Your palm connects with her bare breast!",
"You deliver a sharp slap to her exposed tit!",
"Your hand cracks across her bare breast— she gasps!"
],
slap_tits_stun: "She gasps in shock— stunned for a moment!",
slap_tits_welt: "A red handprint blooms across her breast!",
slap_tits_lust_high: "She moans despite herself, face flushing with unwanted arousal!",
slap_tits_lust_mid: "She glares at you, but her nipples are hardening...",
grope_tits_hit: [
"You grab both her tits and SQUEEZE! Soft flesh spills between your fingers!",
"You seize her breasts, kneading them roughly!",
"Your hands close around her exposed tits, groping firmly!",
"You grab her bare breasts and squeeze hard!"
],
grope_tits_resist: "She slaps your hands away before you can grab her!",
grope_tits_nipple_pinch: "You pinch her nipples, rolling them between thumb and finger!",
grope_tits_lust_high: "She moans openly, knees weakening! Her resistance is crumbling!",
grope_tits_lust_mid: "Her breath catches, eyes glazing slightly. She's getting wet...",
grope_tits_lust_low: "\"Get— your hands— off me!\" she snarls, but her nipples betray her!",
slap_ass_hit: [
"SMACK! Your hand connects with her bare ass cheek!",
"You deliver a sharp slap to her exposed ass!",
"Your palm cracks across her bare ass— the sound echoes!",
"You spank her hard— the flesh ripples from the impact!"
],
slap_ass_stun: "The impact sends her stumbling forward!",
slap_ass_welt: "A red handprint marks her ass cheek!",
slap_ass_lust_high: "She moans, pushing her ass back toward you!",
slap_ass_lust_mid: "Her ass clenches, betraying her arousal!",
slap_pussy_hit: [
"SLAP! Your hand connects with her bare pussy! She SCREAMS!",
"Your palm strikes her exposed pussy— she shrieks!",
"You deliver a sharp slap directly to her pussy lips!",
"SMACK! Right on her bare pussy— her knees buckle!"
],
slap_pussy_stun: "The impact leaves her stunned, knees buckling!",
slap_pussy_welt: "Her pussy lips flush red from the impact!",
slap_pussy_lust_high: "She moans through the pain— she's dripping down her thighs now!",
slap_pussy_lust_mid: "Her pussy reddens from the slap... and gets wetter!",
grope_pussy_hit: [
"You cup her bare pussy, fingers sliding between her lips!",
"Your hand closes over her exposed pussy, groping firmly!",
"You grab her pussy, fingers pressing into wet flesh!",
"Your palm covers her pussy— she gasps as you squeeze!"
],
grope_pussy_resist: "She twists away before you can grab her!",
grope_pussy_finger: "You slide a finger inside— she's already wet!",
grope_pussy_lust_high: "She's soaking wet now, grinding against your hand despite herself!",
grope_pussy_lust_mid: "Her pussy clenches around your fingers— getting wetter!",
grope_pussy_lust_low: "She tries to close her legs, but you feel her wetness!",
twist_nipples_hit: [
"You pinch both nipples and TWIST! She cries out!",
"You seize her hard nipples and twist cruelly!",
"You grab her nipples and twist them between your fingers!",
"Your fingers close on her nipples, twisting sharply!"
],
twist_nipples_lust_high: "She moans loudly— her nipples are rock hard!",
twist_nipples_lust_mid: "Her nipples stiffen in your grasp despite the pain!",
suck_tits_hit: [
"You latch onto her nipple, sucking hard!",
"Your mouth closes over her breast, tongue swirling!",
"You suck her nipple into your mouth, teeth grazing!",
"You seal your lips around her nipple and suck!"
],
suck_tits_lust_high: "She arches into you, moaning uncontrollably!",
suck_tits_lust_mid: "Her breathing quickens as you suck and lick!",
spread_cheeks_hit: [
"You grab her ass cheeks and SPREAD them wide!",
"You seize her ass and pull the cheeks apart!",
"You pry her ass cheeks open, exposing everything!",
"Your hands grip her ass, spreading her wide open!"
],
spread_cheeks_lust_high: "Her asshole clenches— she's completely exposed and dripping!",
spread_cheeks_lust_mid: "She trembles as you expose her asshole and dripping cunt!",
finger_pussy_hit: [
"You slide two fingers deep into her wet pussy!",
"Your fingers plunge into her, curling inside!",
"You finger her roughly, pumping in and out!",
"You thrust your fingers into her soaking pussy!"
],
finger_pussy_lust_high: "She's clenching around your fingers, moaning with each thrust!",
finger_pussy_lust_mid: "Her pussy grips your fingers— she's getting close!",
eat_pussy_hit: [
"You bury your face between her thighs, tongue diving deep!",
"Your tongue laps at her pussy, tasting her arousal!",
"You lick from bottom to top, tongue swirling over her clit!",
"Your mouth seals over her pussy, tongue plunging inside!"
],
eat_pussy_lust_high: "She grinds against your face, lost in pleasure!",
eat_pussy_lust_mid: "Her thighs tremble as your tongue works!",
rip_top_hit: [
"You grab her top and RIP! Fabric tears— her tits bounce free!",
"RIIIP! You tear her top open, exposing her breasts!",
"You seize her clothing and yank— her top tears away!",
"With a sharp pull, you rip her top completely open!"
],
rip_top_exposed: "Her bare tits are now exposed to your gaze!",
tear_bottom_hit: [
"You grab her bottoms and TEAR! Fabric rips— her pussy exposed!",
"RIIIP! You tear her bottoms away, baring her completely!",
"You yank hard— her bottoms tear open!",
"With a savage pull, you rip her bottoms to shreds!"
],
tear_bottom_exposed: "Her pussy is now completely exposed!"
})>><<widget "initCombatMediaFallbacks">>
<<run setup.combatMediaFallbacks = {
"combat/twist_nipples": "combat/pinch_tease_nipples",
"combat/suck_tits": "combat/bite_lick_nipples",
"combat/hair_pull_grind": "combat/grab_grind",
"combat/finisher": "combat/power_strike_hit",
"combat/brutal_stab_hit": "combat/heavy_strike_hit",
"combat/heavy_strike_hit": "combat/light_strike_hit",
"combat/deep_throat": "combat/use_throat",
"combat/unzip_throat": "combat/use_throat",
"combat/use_mouth": "combat/make_suck",
"combat/worsen_position_kneeling": "combat/force_to_knees",
"combat/worsen_position_prone_front": "combat/shove_face_down",
"combat/worsen_position_prone_back": "combat/tackle_to_back",
"combat/worsen_position_pinned": "combat/pin_enemy",
"combat/used_throat": "combat/use_throat",
"combat/used_facefuck": "combat/use_throat",
"combat/used_oral": "combat/make_suck",
"combat/used_fuck": "combat/use_her_penetration",
"combat/used_fuck_start": "combat/use_her_penetration",
"combat/used_anal": "combat/anal",
"combat/used_missionary": "combat/fuck_pinned",
"combat/used_doggy": "combat/claim_her",
"combat/used_moans": "combat/use_her_moans",
"combat/used_climax": "combat/use_her_climax",
"combat/choke_fuck_moans": "combat/use_her_moans",
"combat/choke_fuck_ally_reaction": "combat/use_her_ally_reaction",
"combat/choke_fuck_climax": "combat/use_her_climax",
"combat/choke_fuck_orgasm": "combat/use_her_climax",
"combat/enemy_climax_broken_female": "combat/break_will_female",
"combat/enemy_climax_claimed": "combat/enemy_forced_orgasm_female",
"combat/enemy_climax_oral": "combat/enemy_forced_orgasm_female",
"combat/kira_attack_kill": "combat/kira_attack_hit",
"combat/enemy_light_strike_hit": "combat/enemy_attack_hit",
"combat/enemy_light_strike_miss": "combat/enemy_attack_miss",
"combat/enemy_heavy_strike_hit": "combat/enemy_attack_hit",
"combat/enemy_heavy_strike_miss": "combat/enemy_attack_miss",
"combat/enemy_brutal_stab_hit": "combat/enemy_slash_upper_hit",
"combat/enemy_brutal_stab_miss": "combat/enemy_slash_upper_miss",
"combat/enemy_machete_hit": "combat/enemy_attack_hit",
"combat/enemy_machete_miss": "combat/enemy_attack_miss",
"combat/enemy_rapid_strikes_hit": "combat/enemy_attack_hit",
"combat/enemy_rapid_strikes_miss": "combat/enemy_attack_miss",
"combat/enemy_slash_upper_hit": "combat/enemy_attack_hit",
"combat/enemy_slash_upper_miss": "combat/enemy_attack_miss",
"combat/hotdog_prone_exposed": "combat/hotdog_ass_exposed",
"combat/hotdog_ass_exposed": "combat/rub_ass_exposed",
"combat/rub_ass_exposed": "combat/grind_behind_exposed",
"combat/grind_behind_exposed": "combat/grind_clothed",
"combat/grind_back_exposed": "combat/mount_grind",
"combat/rub_thighs_exposed": "combat/grind_clothed",
"combat/enemy_ability_strike": "combat/enemy_attack_hit",
"combat/enemy_ability_chain_swing": "combat/enemy_heavy_strike_hit",
"combat/player_facefucks_enemy": "combat/use_throat",
"combat/player_show_off": "combat/player_flaunt",
"combat/ride_look_kira": "combat/enemy_rides_player",
"combat/intervene_attack": "combat/heavy_strike_hit",
"combat/attack_distracted": "combat/power_strike_hit",
"combat/kill_stunned": "combat/power_strike_hit",
"events/victory": "combat/kira_standing",
"events/defeated_enemy_tie_up": "combat/hold_position",
"events/defeated_enemy_search": "events/defeated_enemy_secondary_search",
"events/defeated_enemy_secondary_search": "combat/grope_tits",
"events/defeated_enemy_strip_top": "events/defeated_enemy_strip",
"events/defeated_enemy_strip_bottom": "events/defeated_enemy_strip",
"events/defeated_enemy_strip": "combat/use_her_strip",
"events/defeated_enemy_grope_tits_tied": "combat/abuse_tits_pinned",
"events/defeated_enemy_grope_tits": "combat/grope_tits",
"events/defeated_enemy_finger_tied": "combat/finger_pinned",
"events/defeated_enemy_finger": "combat/finger_pussy",
"events/defeated_enemy_eatout": "combat/eat_pussy",
"events/defeated_enemy_facesit": "combat/eat_pussy",
"events/defeated_enemy_titfuck_tied": "combat/abuse_tits_pinned",
"events/defeated_enemy_titfuck": "combat/suck_tits",
"events/defeated_enemy_fuck_tied": "combat/fuck_pinned",
"events/defeated_enemy_fuck": "combat/used_fuck",
"events/defeated_enemy_anal": "combat/used_anal",
"events/defeated_enemy_facefuck_tied": "combat/deepthroat_pinned",
"events/defeated_enemy_facefuck": "combat/used_facefuck",
"events/defeated_enemy_beg": "combat/enemy_begging_female",
"events/enemy_released": "combat/enemy_flee",
"events/execute_enemy": "combat/kill_stunned",
"events/defeated_enemy_kira_uses": "combat/eat_pussy",
"events/defeated_enemy_kira_uses_watch": "events/defeated_enemy_kira_uses",
"events/defeated_enemy_kira_uses_join": "events/defeated_enemy_kira_uses",
"events/defeated_enemy_threesome": "events/defeated_enemy_kira_uses_join",
"events/defeated_male_kira_rides": "combat/enemy_rides_player",
"events/defeated_enemy_fuck_makehercum": "combat/enemy_forced_orgasm_female",
"events/defeated_enemy_fuck_kira_cums": "events/defeated_enemy_threesome",
"events/defeated_enemy_facefuck_cum_face": "events/defeated_enemy_fuck_cum_face",
"events/defeated_enemy_titfuck_cum_face": "events/defeated_enemy_fuck_cum_face",
"events/defeated_enemy_titfuck_cum_tits": "events/defeated_enemy_fuck_cum_tits",
"events/defeated_enemy_titfuck_cum_mouth": "events/defeated_enemy_facefuck_cum_throat",
"events/defeated_enemy_threesome_cum_enemy": "events/defeated_enemy_threesome",
"events/defeated_enemy_threesome_cum_both": "events/defeated_enemy_threesome",
"events/defeated_enemy_threesome_cum_kira": "events/defeated_enemy_threesome",
"events/arousal_mutual_explosion": "combat/use_her_penetration",
"events/arousal_kira_jumps_player": "combat/enemy_rides_player",
"events/arousal_player_takes_kira": "combat/claim_her",
"events/seduced_strip": "combat/seduce_strip_tease",
"events/seduced_oral": "combat/used_oral",
"events/seduced_fuck": "events/defeated_enemy_fuck",
"events/seduced_tease": "events/defeated_enemy_finger",
"events/seduced_interrogate": "combat/enemy_begging_female",
"events/seduced_aftermath": "combat/enemy_subdued"
}>>
<<run setup.enemyAttackVideoFolders = {
hit: "combat/enemy_attack_hit",
miss: "combat/enemy_attack_miss",
sexual: "combat/enemy_sexual_attack"
}>>
<<run setup.enemyAbilityVideoFolders = {
quick_strike: "combat/enemy_ability_strike",
heavy_strike: "combat/enemy_ability_strike",
power_strike: "combat/enemy_ability_strike",
flurry: "combat/enemy_ability_strike",
dirty_fighting: "combat/enemy_ability_strike",
dirty_fighting_plus: "combat/enemy_ability_strike",
dirty_fighting_master: "combat/enemy_ability_strike",
intimidate: "combat/enemy_ability_roar",
battle_cry: "combat/enemy_ability_roar",
rally_troops: "combat/enemy_ability_roar",
seductive_taunt: "combat/enemy_ability_seduce",
seduction_irresistible: "combat/enemy_ability_seduce",
rope_bind: "combat/enemy_ability_rope_bind",
rope_bind_quick: "combat/enemy_ability_rope_bind",
rope_bind_master: "combat/enemy_ability_rope_bind",
chain_swing: "combat/enemy_ability_chain_swing",
chain_swing_brutal: "combat/enemy_ability_chain_swing"
}>>
<<run setup.knockdownVideoFolders = {
player: "combat/player_knockdown",
kira: "combat/kira_knockdown"
}>>
<<run setup.enemySexPlayerVideoFolders = {
leg_sweep_female: "combat/enemy_grinds_player",
push_down_mount: "combat/enemy_grinds_player",
grab_and_straddle: "combat/enemy_grinds_player",
pounce_player: "combat/enemy_grinds_player",
knee_to_balls: "combat/enemy_knee_groin",
pants_yank_player: "combat/enemy_strips_player",
whip_cock: "combat/enemy_whips_cock",
cock_grab: "combat/enemy_handjob_player",
teasing_handjob: "combat/enemy_handjob_player",
claw_caress: "combat/enemy_claw_caress",
drain_touch: "combat/enemy_drain_touch"
}>>
<<run setup.mediaPendingReview = {
"combat/coop_hold_and_strip": { top: "combat/kira_stripped_top", bottom: "combat/kira_stripped_bottom" },
"combat/coop_pin_down": "combat/kira_forced_down"
}>>
<<run setup.kiraAssaultVideoFolders = {
fuck_pussy: { cock: "combat/kira_groped_pussy", noCock: "combat/kira_groped_pussy" },
fuck_ass: { cock: "combat/kira_groped_ass", noCock: "combat/kira_groped_ass" },
grope_tits: "combat/kira_groped_tits",
grope_pussy: "combat/kira_groped_pussy",
grope_ass: "combat/kira_groped_ass",
ass_slap: "combat/kira_ass_slap",
hair_grab_force: "combat/kira_forced_down",
leg_sweep: "combat/kira_forced_down",
wrist_yank: "combat/kira_forced_down",
hip_throw: "combat/kira_forced_down",
belt_whip: "combat/kira_whipped",
crop_pussy: "combat/kira_whipped",
crop_tits: "combat/kira_whipped",
crop_ass: "combat/kira_whipped",
pants_yank: "combat/kira_stripped_bottom",
belt_yank_pants: "combat/kira_stripped_bottom",
rip_underwear: "combat/kira_stripped_bottom",
slice_underwear: "combat/kira_stripped_bottom",
belt_yank_underwear: "combat/kira_stripped_bottom",
rip_top_off: "combat/kira_stripped_top",
slice_top: "combat/kira_stripped_top",
forced_oral: "combat/kira_forced_oral",
chain_choke: "combat/kira_choked",
leash_choke: "combat/kira_choked",
chain_bind: "combat/kira_bound",
rope_bind_wrists: "combat/kira_bound",
rope_bind_ankles: "combat/kira_bound",
rope_leash: "combat/kira_leashed",
leash_pull_kneel: "combat/kira_leashed",
expose_self: "combat/enemy_expose_self"
}>>
<<run setup.kiraAssaultResistVideoFolders = {
hair_grab_force: "combat/kira_hair_grabbed",
forced_oral: "combat/kira_hair_grabbed",
rope_bind_wrists: "combat/kira_attack_hit",
rope_bind_ankles: "combat/kira_attack_hit"
}>>
<<run setup.kiraNearestClothingIntents = ["grope_tits", "grope_pussy", "grope_ass"]>>
<<run setup.combatStatusVideoFolders = {
lust_break: { female: "combat/enemy_lust_break_female", male: "combat/enemy_lust_break_male" },
subdued: "combat/enemy_subdued",
feared_cower: "combat/enemy_cower",
feared_fled: "combat/enemy_flee"
}>>
<</widget>><<widget "initOrgasmControlConfigs">>
<<run setup.orgasmControlConfigs = {}>>
<<run setup.orgasmControlConfigs.allow_orgasm = {
name: "Allow Orgasm",
actionType: "allow_orgasm",
energyCost: 4,
effects: {
stunTurns: 2,
lustReduction: [40, 60],
resetDenialTurns: true,
incrementOrgasmCount: true
},
submissionThreshold: 2,
narrativePools: {
beggingFemale: "enemy_begging_release_female",
orgasmFemale: "enemy_allowed_orgasm_female"
},
videoFolders: {
orgasmFemale: "combat/enemy_allowed_orgasm_female",
beggingFemale: "combat/enemy_begging_release_female"
},
secondaryVideoFolder: null,
fallbackText: {
female: "You give her what she needs. Her back arches as the orgasm washes over her."
},
comboAction: "allow_orgasm",
logText: "cums gratefully! Stunned 1 turn.",
logType: "intimate",
nextPassage: "Combat_Companion_Turn"
}>>
<<run setup.orgasmControlConfigs.deny_orgasm = {
name: "Deny Orgasm",
actionType: "deny_orgasm",
effects: {
frustrationDamage: 5,
incrementDenialTurns: true,
beggingThreshold: 3
},
narrativePools: {
deniedFemale: "enemy_denied_female",
beggingFemale: "enemy_begging_female"
},
videoFolders: {
deniedFemale: "combat/enemy_denied_female",
beggingFemale: "combat/enemy_begging_female"
},
secondaryVideoFolder: null,
fallbackText: {
deniedFemale: "She whimpers as you pull away. The denial is torture—she needs release.",
beggingFemale: "\"Please...\" she gasps, \"I can't take it anymore. Please just let me...\""
}
}>>
<<run setup.orgasmControlConfigs.force_orgasm = {
name: "Force Orgasm",
actionType: "force_orgasm",
effects: {
humiliation: 30,
stunTurns: 3,
lustReduction: 50,
minLustRemaining: 30,
incrementOrgasmCount: true,
resetDenialTurns: true
},
brokenThreshold: 60,
narrativePools: {
female: "enemy_forced_orgasm_female"
},
videoFolders: {
female: "combat/enemy_forced_orgasm_female",
broken_female: "combat/enemy_climax_broken_female"
},
secondaryVideoFolder: null,
fallbackText: {
female: "Her body convulses as climax rips through her. She screams, unable to control herself.",
brokenFemale: "The combination of humiliation and forced pleasure is too much—she's completely broken."
},
logText: "orgasms uncontrollably! Stunned 2 turns, +30 humiliation!",
logType: "critical"
}>>
<</widget>><<run setup.combatNarrative = setup.combatNarrative || {}>>
<<set setup.combatNarrative.enemy_begging_release_female to [
"\"Please...\" she gasps, \"I need to cum... please let me...\"",
"\"I can't take it anymore,\" she whimpers. \"Please, I'll do anything... just let me finish...\"",
"Her voice cracks with desperation: \"Please... I'm begging you... I need this so badly...\"",
"\"Oh god, please,\" she moans. \"I need it... I NEED to cum... please!\"",
"Tears in her eyes, she begs: \"Please... please let me orgasm... I can't stand it...\"",
"\"I'll be good,\" she whimpers. \"I promise... just please let me cum...\"",
"\"Please!\" she cries out, body trembling. \"I'm so close... please don't stop now...\"",
"\"I'm begging you,\" she gasps breathlessly. \"Let me finish... please...\""
]>>
<<set setup.combatNarrative.enemy_allowed_orgasm_female to [
"\"Thank you...\" she gasps as climax hits. Her body shudders, overwhelmed by the release you've granted.",
"The orgasm crashes through her. She moans your name, grateful for the mercy you've shown.",
"You let her cum. Her eyes roll back, body convulsing as the pent-up pleasure explodes through her.",
"The relief on her face is palpable as she finally reaches climax, gasping \"Thank you, thank you...\"",
"She cums hard, body trembling in gratitude. The orgasm is intense but gentle— a gift, not a punishment.",
"You allow her release. She sobs in relief as the orgasm takes her, overwhelmed by your generosity.",
"The climax ripples through her body. She's grateful, submissive, completely yours in this moment."
]>>
<<set setup.combatNarrative.enemy_denied_female to [
"\"No, please don't stop!\" she gasps, but you pull back. Her frustration is palpable.",
"You stop just as she's about to cum. She cries out in frustration: \"Please! I was so close!\"",
"The denial hits her hard. She trembles, desperate, aching for the release you've withheld.",
"\"Why did you stop?\" she whimpers, body shaking with need. The denial is unbearable.",
"You pull away at the crucial moment. Her moan of frustration echoes—she NEEDED that.",
"The orgasm denial leaves her trembling, whimpering, completely desperate for release.",
"She gasps as you deny her. \"Please... I can't... I need it so badly...\" The frustration consumes her."
]>>
<<set setup.combatNarrative.enemy_begging_female to [
"\"Please...\" she gasps, \"I can't take it anymore. Please just let me...\"",
"After multiple denials, she breaks: \"I'm begging you... please let me cum... I can't stand it anymore!\"",
"\"Please, PLEASE!\" she sobs. \"I'll do anything... just let me orgasm... I'm going insane!\"",
"The frustration overwhelms her: \"I'm begging... I need to cum so badly... please don't deny me again!\"",
"\"I can't take another denial,\" she whimpers. \"Please... I'm begging... let me finish...\"",
"Her voice cracks with desperation: \"Please let me cum... I'm begging you... I need it so much!\"",
"\"I'll do whatever you want,\" she pleads. \"Just please... let me orgasm... I'm begging!\"",
"Tears in her eyes: \"Please... the denial hurts... I'm begging you... let me cum!\""
]>>
<<set setup.combatNarrative.enemy_forced_orgasm_female to [
"The forced orgasm tears through her body. She cries out, shaking violently, completely overwhelmed.",
"\"NO! NO, I'M—\" Her protest cuts off as the orgasm explodes through her. She screams.",
"You force her over the edge. Her body arches, convulsing, as she cums uncontrollably.",
"The climax hits her like a freight train. She screams, body shaking, unable to stop cumming.",
"\"I CAN'T STOP!\" she wails as the forced orgasm rips through her. Her body betrays her completely.",
"Forced past her limit, she cums HARD. Her scream echoes as pleasure overwhelms all resistance.",
"Her body convulses in forced ecstasy. She shakes, moans, screams—completely at the mercy of the climax you've inflicted."
]>><<widget "initPainPleasureConfigs">>
<<set setup.painPleasureConfigs to {}>>\
<<run setup.painPleasureConfigs.slap_grope_tits = {
name: "Slap & Grope Tits",
icon: "slap",
actionName: "slap_grope_tits",
narrativePool: "slap_grope_tits",
videoFolder: "combat/slap_grope_tits",
secondaryVideoFolder: null,
painDamage: {min: 8, max: 15},
lustDamage: {min: 10, max: 18},
humiliation: 8,
comboType: "slap_grope",
actionType: "grope",
clothingCheck: null,
exposedBonus: null,
requirements: null,
blockedMessage: null,
specialEffects: null
}>>
<<run setup.painPleasureConfigs.slap_grope_ass = {
name: "Slap & Grope Ass",
icon: "slap",
actionName: "slap_grope_ass",
narrativePool: "slap_grope_ass",
videoFolder: "combat/slap_grope_ass",
secondaryVideoFolder: null,
painDamage: {min: 8, max: 15},
lustDamage: {min: 10, max: 18},
humiliation: 8,
comboType: "slap_grope",
actionType: "grope",
clothingCheck: null,
exposedBonus: null,
requirements: null,
blockedMessage: null,
specialEffects: null
}>>
<<run setup.painPleasureConfigs.pinch_tease_nipples = {
name: "Pinch & Tease Nipples",
icon: "pinch",
actionName: "pinch_tease_nipples",
narrativePool: "pinch_tease_nipples",
videoFolder: "combat/pinch_tease_nipples",
secondaryVideoFolder: null,
painDamage: {min: 5, max: 10},
lustDamage: {min: 12, max: 22},
humiliation: 0,
comboType: "pinch_tease",
actionType: "finger",
clothingCheck: "titsExposed",
exposedBonus: {lustBonus: 5},
requirements: null,
blockedMessage: null,
specialEffects: null
}>>
<<run setup.painPleasureConfigs.pinch_tease_clit = {
name: "Pinch & Tease Clit",
icon: "pinch",
actionName: "pinch_tease_clit",
narrativePool: "pinch_tease_clit",
videoFolder: "combat/pinch_tease_clit",
secondaryVideoFolder: null,
painDamage: {min: 5, max: 10},
lustDamage: {min: 12, max: 22},
humiliation: 0,
comboType: "pinch_tease",
actionType: "finger",
clothingCheck: "pussyExposed",
exposedBonus: {lustBonus: 8},
requirements: null,
blockedMessage: null,
specialEffects: null
}>>
<<run setup.painPleasureConfigs.bite_lick_neck = {
name: "Bite & Lick Neck",
icon: "bite",
actionName: "bite_lick_neck",
narrativePool: "bite_lick_neck",
videoFolder: "combat/bite_lick_neck",
secondaryVideoFolder: null,
painDamage: {min: 6, max: 12},
lustDamage: {min: 15, max: 25},
humiliation: 0,
comboType: "bite_lick",
actionType: "oral",
clothingCheck: null,
exposedBonus: null,
requirements: null,
blockedMessage: null,
specialEffects: null
}>>
<<run setup.painPleasureConfigs.bite_lick_nipples = {
name: "Bite & Lick Nipples",
icon: "bite",
actionName: "bite_lick_nipples",
narrativePool: "bite_lick_nipples",
videoFolder: "combat/bite_lick_nipples",
secondaryVideoFolder: null,
painDamage: {min: 6, max: 12},
lustDamage: {min: 15, max: 25},
humiliation: 0,
comboType: "bite_lick",
actionType: "oral",
clothingCheck: null,
exposedBonus: null,
requirements: null,
blockedMessage: null,
specialEffects: null
}>>
<<run setup.painPleasureConfigs.bite_lick_thighs = {
name: "Bite & Lick Thighs",
icon: "bite",
actionName: "bite_lick_thighs",
narrativePool: "bite_lick_thighs",
videoFolder: "combat/bite_lick_thighs",
secondaryVideoFolder: null,
painDamage: {min: 6, max: 12},
lustDamage: {min: 15, max: 25},
humiliation: 0,
comboType: "bite_lick",
actionType: "oral",
clothingCheck: null,
exposedBonus: null,
requirements: null,
blockedMessage: null,
specialEffects: null
}>>
<<run setup.painPleasureConfigs.spank_finger = {
name: "Spank & Finger",
icon: "slap",
actionName: "spank_finger",
narrativePool: "spank_finger",
videoFolder: "combat/spank_finger",
secondaryVideoFolder: null,
painDamage: {min: 10, max: 18},
lustDamage: {min: 18, max: 28},
humiliation: 10,
comboType: "spank_finger",
actionType: "finger",
clothingCheck: "pussyExposed",
exposedBonus: {lustBonus: 10},
requirements: null,
blockedMessage: null,
specialEffects: [
"humiliationWelt",
{widget: "increaseMasochism", args: [4]}
]
}>>
<<run setup.painPleasureConfigs.hair_pull_grind = {
name: "Hair Pull & Grind",
icon: "grab",
actionName: "hair_pull_grind",
narrativePool: "hair_pull_grind",
videoFolder: "combat/hair_pull_grind",
secondaryVideoFolder: null,
painDamage: {min: 8, max: 14},
lustDamage: {min: 12, max: 20},
humiliation: 6,
comboType: "hair_pull_grind",
actionType: "grope",
clothingCheck: null,
exposedBonus: null,
requirements: null,
blockedMessage: null,
specialEffects: null
}>>
<<run setup.painPleasureConfigs.choke_fuck = {
name: "Choke & Fuck",
icon: "choke",
actionName: "choke_fuck",
narrativePool: "choke_fuck",
videoFolder: "combat/choke_fuck",
secondaryVideoFolder: null,
painDamage: {min: 12, max: 20},
lustDamage: {min: 25, max: 40},
humiliation: 15,
comboType: "choke_fuck",
actionType: "penetration",
clothingCheck: null,
exposedBonus: null,
requirements: {
playerDickOut: true,
enemyPussyExposed: true
},
blockedMessage: "Requires your dick out and her pussy exposed.",
specialEffects: [
{widget: "addResistance", args: [-8]}
]
}>>
<</widget>><<set setup.combatNarrative to setup.combatNarrative || {}>>\
<<set setup.combatNarrative.slap_grope_tits to [
"CRACK! Your palm crashes against her exposed tit, making it bounce and redden. Before she can scream, you're groping it hard, kneading the stinging flesh.",
"You slap her tits hard—one, two, three times! Each impact makes them jiggle. Then your hands are on them, squeezing, mixing pain with rough pleasure.",
"Her tits bounce from the force of your slap. She gasps in pain, then moans as you immediately cup and massage the reddening flesh.",
"You backhand her tit, watching it sway. She cries out. Your fingers find her nipple and pinch—then twist—then roll gently. Confusion floods her face.",
"SMACK! Her breast bounces from your strike. Before the sting fades, you're groping her roughly, feeling her nipple harden against your palm despite herself.",
"You slap both tits at once, watching them collide and bounce. She yelps—then whimpers as you grab them possessively, thumbs circling her stiffening nipples.",
"Your open hand cracks across her breast. Red handprint forming. You squeeze the abused flesh, kneading it while she trembles from the mixed sensations.",
"Sharp slap to her tit—she jerks. Immediate grope—she moans. The rapid switch between pain and pleasure scrambles her senses.",
"You slap her exposed breast hard enough to leave a mark, then immediately soothe it with rough groping. Her body doesn't know whether to flinch or press closer.",
"CRACK across her tit! She cries out. Your mouth finds the stinging flesh, tongue swirling her nipple. Pain and pleasure blur together."
]>>
<<set setup.combatNarrative.slap_grope_ass to [
"CRACK! Your hand crashes against her ass, leaving a perfect red handprint. She yelps—then groans as you squeeze the stinging cheek possessively.",
"You spank her ass hard enough to make her whole body jerk. Before the pain registers fully, you're groping the reddened flesh, spreading her cheeks.",
"Sharp slap to her ass—she cries out. Your hand immediately cups and kneads the stinging flesh, fingers dangerously close to her pussy.",
"You rain slaps on her ass until it glows red. Then you grab both cheeks, squeezing and spreading, making her feel every mark you've left.",
"SMACK! Her ass bounces from your palm. She gasps in pain—then moans as you massage the abused flesh, fingers trailing between her legs.",
"You crack your palm against her ass, watching the ripple spread. Then you're groping hard, pulling her cheeks apart, admiring your handiwork.",
"Spank after spank reddns her ass. When you finally stop hitting, your hands are all over it—squeezing, kneading, making her whimper.",
"Your hand leaves a stinging imprint on her ass. You immediately grab it, thumb pressing between her cheeks as you massage the abused flesh.",
"CRACK! She jerks. GROPE! She moans. You alternate until she can't tell where pain ends and pleasure begins.",
"You spank her ass until she's begging you to stop—then grope it until she's begging you not to stop. The contradiction breaks her."
]>>
<<set setup.combatNarrative.pinch_tease_nipples to [
"You pinch her nipple hard—she squeals! Then your fingers soften, circling the abused bud until her squeals become moans.",
"Sharp pinch to both nipples! She arches in pain. Immediately you're teasing them gently, rolling them between your fingers until she trembles.",
"You twist her nipple cruelly. Her scream becomes a whimper as you immediately soothe it with soft caresses and gentle flicks.",
"Pinch! She cries out. Tease. She moans. Pinch! Cry. Tease. Moan. You cycle faster and faster until she's lost in sensation.",
"You grab her nipple and pull hard, stretching her breast. She wails—then whimpers as you let go and circle the peaked bud tenderly.",
"Sharp nails dig into her sensitive nipples. She gasps in pain—then confusion as your tongue soothes the scratches with long, slow licks.",
"You pinch her nipples so hard she sees stars. Then you're sucking them gently, tongue swirling until her pain transforms to desperate pleasure.",
"Cruel twist to her nipple—she screams! Soft caress—she moans. You keep her on the edge between agony and ecstasy.",
"You clamp down on her nipples hard enough to hurt. She whimpers. Your mouth finds one, suckling gently while your fingers continue tormenting the other.",
"Pinch, pull, twist—she's crying. Stroke, circle, tease—she's moaning. Her mind can't process the rapid shifts anymore."
]>>
<<set setup.combatNarrative.pinch_tease_clit to [
"You pinch her clit sharply—she screams! Immediately your fingers soften, circling her abused clit until her screams become desperate moans.",
"Sharp pinch to her exposed clit! Her whole body jerks. Then you're rubbing it gently, in slow circles that make her hips buck involuntarily.",
"You find her clit and squeeze hard. She wails in mixed pain and pleasure. Then your thumb circles it gently while she trembles uncontrollably.",
"Pinch! She gasps. Stroke. She moans. You alternate faster, keeping her clit throbbing between pain and pleasure.",
"You trap her clit between your fingers and squeeze. She nearly levitates off the ground. Immediately you're rubbing softly, tongue replacing fingers.",
"Sharp nails graze her clit—she hisses. Then soft fingertips massage it tenderly. Pain, pleasure, pain, pleasure—she can't think anymore.",
"You pinch her swollen clit hard enough to make her sob. Then you suck it gently into your mouth, tongue circling while she loses her mind.",
"Cruel pinch to her clit! She screams. Gentle circles immediately after. The whiplash between sensations has her completely overwhelmed.",
"You flick her clit hard—sharp sting! Then stroke it slowly. Flick—sting! Stroke—pleasure. She's dripping from the confusion.",
"Pinch her clit until she begs you to stop. Massage it until she begs you never to stop. Break her with the contradiction."
]>>
<<set setup.combatNarrative.bite_lick_neck to [
"Your teeth sink into her neck, hard enough to leave marks. She whimpers in pain—then moans as your tongue soothes the bitten flesh.",
"You bite her neck like a predator claiming prey. She gasps. Your lips and tongue follow, kissing and licking the mark you've left.",
"Sharp bite to her sensitive neck—she cries out! Immediately your mouth is on the spot, sucking gently, tongue swirling over your teethmarks.",
"You sink your teeth into the curve of her neck. She trembles. Then you're kissing the bruise, tongue tracing the indentation of your bite.",
"Bite! She flinches. Lick. She shivers. You trail bites and licks down her neck until she's a moaning, trembling mess.",
"Your teeth mark her neck possessively. She whimpers. Then you're sucking on the spot, leaving a hickey over your bite mark.",
"You bite her neck hard—she gasps in shock. Your tongue immediately soothes the hurt, tracing the marks your teeth left behind.",
"Sharp teeth against tender neck. She cries out. Soft lips follow, kissing apologies into her skin even as you prepare to bite again.",
"You bite her where her pulse pounds, feeling her heartbeat against your teeth. Then your mouth is gentle, kissing and licking devotedly.",
"Mark her with your teeth, soothe her with your tongue. Pain, then pleasure. She'll wear your marks for days."
]>>
<<set setup.combatNarrative.bite_lick_nipples to [
"Your teeth close on her nipple—she screams! Then you're suckling gently, tongue swirling the abused bud until screams become moans.",
"You bite down on her nipple, feeling her whole body jerk. Then you're licking it tenderly, tongue circling until she's trembling with confused pleasure.",
"Sharp teeth on sensitive nipple. She arches in pain. Your mouth softens, sucking gently, tongue flicking until she arches in pleasure instead.",
"Bite! She cries. Suck. She moans. You alternate on each nipple until she's lost in the painful pleasure.",
"You trap her nipple between your teeth and pull. She wails. Then you're kissing the abused flesh, tongue soothing every mark.",
"Your teeth mark the peak of her breast. She gasps. Your tongue immediately lavishes attention on the bitten nipple, swirling and flicking.",
"Cruel bite to her stiff nipple—she screams! Gentle suckling immediately after. Her body doesn't know whether to pull away or press closer.",
"You bite her nipple hard enough to leave marks. Then your mouth gentles, sucking and licking until her cries of pain become whimpers of need.",
"Sharp pain as you bite—sweet relief as you lick. Her nipple throbs between your teeth and tongue, caught in sensation.",
"Bite, suck, bite, lick. Her nipples are red and swollen, aching and throbbing, perfectly abused and perfectly pleasured."
]>>
<<set setup.combatNarrative.bite_lick_thighs to [
"Your teeth sink into her inner thigh, dangerously close to her pussy. She cries out—then moans as your tongue traces the bite mark.",
"You bite the soft flesh of her inner thigh, leaving clear teeth marks. Then you lick slowly upward, breath hot against her dripping pussy.",
"Sharp bite to her thigh—she jerks! Your tongue soothes the spot, then trails higher, making her squirm with anticipation.",
"You mark her inner thighs with your teeth, one side then the other. Each bite followed by long, slow licks that edge ever closer to her cunt.",
"Bite! She gasps. Lick... lick... lick... getting closer to where she needs you. Then another bite, and the cycle starts again.",
"Your teeth leave a trail of marks up her inner thigh. Your tongue follows the same path, soothing and teasing all at once.",
"You bite her thigh hard—she yelps. Then your mouth is so close to her pussy she can feel your breath. You lick the bite instead.",
"Sharp teeth against tender thigh. She moans in mixed pain and pleasure. Your tongue traces lazy circles around the bite mark.",
"Bite, kiss, bite, lick. Her thighs tremble, marked by your teeth, soothed by your tongue, desperate for more.",
"You bite so close to her pussy she thinks you'll eat her out. But you only lick the mark and move to the other thigh. The tease is torture."
]>>
<<set setup.combatNarrative.spank_finger to [
"CRACK! Your palm hits her ass while two fingers plunge deep inside her. She screams—in pain or pleasure, even she can't tell.",
"You spank her ass hard while your fingers curl inside her pussy. Each slap makes her clench around you, mixing sensations.",
"Finger, spank, finger, spank. Your rhythm is relentless. Her ass is red, her pussy is dripping, her mind is gone.",
"Your hand crashes against her ass. At the same moment, your fingers find her g-spot. She convulses from the overwhelming input.",
"You fuck her with your fingers while raining slaps on her ass. Pain and pleasure blend until she's sobbing with confused ecstasy.",
"SMACK to her ass—she clenches around your fingers. Again and again until she's coming apart, destroyed by the dual assault.",
"Your fingers pump her pussy while your palm punishes her ass. She doesn't know whether to pull away or push back for more.",
"Spank! She gasps. Thrust! She moans. The rhythm is hypnotic, pain and pleasure perfectly balanced, breaking her completely.",
"You finger her ruthlessly while spanking her ass red. Her juices run down your hand as she surrenders to the mixed sensations.",
"Palm cracking against ass, fingers curling inside cunt. She's overwhelmed, overstimulated, utterly destroyed by pleasure and pain."
]>>
<<set setup.combatNarrative.choke_fuck to [
"Your hand wraps around her throat as you thrust deep inside her. You control her breath, her pleasure, her pain—she can only take what you give.",
"You choke her while fucking her hard. Each thrust pushes air from her lungs. Each release lets her gasp. She's completely at your mercy.",
"Fingers tighten on her throat. Cock buries in her pussy. She can't breathe, can't think, can only feel you owning her completely.",
"You thrust into her while squeezing her throat. Her eyes roll back. The mix of oxygen deprivation and pleasure is too much—she shatters.",
"Hand on throat, cock in cunt. You control everything. She chokes and comes simultaneously, destroyed by your dominance.",
"You fuck her while controlling her breath. Squeeze—she gasps. Thrust—she moans. Release—she gulps air. You own her utterly.",
"Your grip on her throat matches your rhythm inside her. Tighter as you thrust deeper. She's dizzy with pleasure and lack of air.",
"Choking her while you fuck her—the ultimate control. She can't scream, only take it. Her pussy clenches desperately around you.",
"You squeeze her throat just enough to feel her pulse racing. Each thrust rocks her body. She's on the edge of consciousness and orgasm.",
"Hand choking, cock fucking. She surrenders completely, trusting you with her breath and her pleasure. Total domination achieved."
]>>
<<set setup.combatNarrative.hair_pull_grind to [
"You grab a fistful of her hair and yank her head back, forcing her to arch. Your body grinds against her, the pain in her scalp mixing with friction.",
"Hair wrapped around your fist, you pull hard. She gasps as her head goes back, exposing her throat. You grind against her trapped body.",
"You drag her head back by her hair while grinding your cock against her. She moans from the painful pleasure, completely controlled.",
"Fist in her hair, yanking back. Your hips press forward, grinding. She's caught between the sharp pain in her scalp and the friction between her legs.",
"You pull her hair hard enough to make her cry out, then grind against her until her cries become moans of need.",
"Hair-pulling forces her to look at you while you grind against her. Pain in her scalp, pleasure between her legs. She can't escape either.",
"You control her completely—by the hair, by the grinding pressure of your body. She's trapped between pain and desperate arousal.",
"Yank her hair back, grind forward. She's bent like a bow, scalp stinging, pussy throbbing. Completely at your mercy.",
"Your grip in her hair is punishing. Your body against hers is teasing. The combination reduces her to whimpering need.",
"Hair pulled taut, body grinding close. Pain and pleasure war in her expression as you dominate her completely."
]>><<widget "initPinnedConfigs">>
<<set setup.pinnedConfigs to {}>>
<<run setup.pinnedConfigs.grind = {
name: "Grind (Pinned)",
actionName: "grind_pinned",
narrativePool: "player_grind_pinned",
videoFolder: "combat/grind_pinned",
secondaryVideoFolder: null,
lustDamage: {min: 25, max: 40},
painDamage: null,
playerLust: 15,
secondaryEffect: null,
lustThresholds: [
{threshold: 85, text: "She starts grinding back, moaning! She's lost to the friction!", cssClass: "lust-high"},
{threshold: 60, text: "She whimpers, feeling your hardness! Her body is betraying her!", cssClass: ""}
],
specialEffect: null,
damageIcon: "high-arousal"
}>>
<<run setup.pinnedConfigs.choke = {
name: "Choke (Pinned)",
actionName: "choke_pinned",
narrativePool: "player_choke_pinned",
videoFolder: "combat/choke_pinned",
secondaryVideoFolder: null,
lustDamage: {min: 15, max: 25},
painDamage: {min: 5, max: 10},
playerLust: 10,
secondaryEffect: {
chance: 40,
lustBonus: 10,
text: "Her face flushes as you control her air! Her eyes flutter!"
},
lustThresholds: [
{threshold: 80, text: "The lack of air is making her lightheaded... and aroused!", cssClass: "lust-high"}
],
specialEffect: null,
damageIcon: "high-arousal"
}>>
<<run setup.pinnedConfigs.abuse_tits = {
name: "Abuse Tits (Pinned)",
actionName: "abuse_tits_pinned",
narrativePool: "player_abuse_tits_pinned",
videoFolder: "combat/abuse_tits_pinned",
secondaryVideoFolder: null,
lustDamage: {min: 30, max: 45},
painDamage: {min: 3, max: 7},
playerLust: 12,
secondaryEffect: null,
lustThresholds: [
{threshold: 90, text: "She's moaning from the abuse! Pain has become pleasure!", cssClass: "lust-high"},
{threshold: 70, text: "Her nipples are rock hard despite the punishment! She's getting off on this!", cssClass: ""}
],
specialEffect: null,
damageIcon: "high-arousal"
}>>
<<run setup.pinnedConfigs.finger = {
name: "Finger (Pinned)",
actionName: "finger_pinned",
narrativePool: "player_finger_pinned",
videoFolder: "combat/finger_pinned",
secondaryVideoFolder: null,
lustDamage: {min: 45, max: 60},
painDamage: null,
playerLust: 20,
secondaryEffect: {
chance: 50,
lustBonus: 15,
text: "You find her g-spot and abuse it mercilessly! She SCREAMS!"
},
lustThresholds: [
{threshold: 95, text: "She's cumming around your fingers! Her whole body convulses!", cssClass: "lust-high"},
{threshold: 80, text: "She's riding your fingers shamelessly! Completely broken!", cssClass: "lust-high"}
],
orgasmEffect: {chance: 60, minLust: 80},
specialEffect: null,
damageIcon: "high-arousal"
}>>
<<run setup.pinnedConfigs.dick_out = {
name: "Take Dick Out (Pinned)",
actionName: "dick_out_pinned",
narrativePool: "player_dick_out_pinned",
videoFolder: "combat/dick_out_pinned",
secondaryVideoFolder: null,
lustDamage: {min: 15, max: 25},
painDamage: null,
playerLust: 10,
secondaryEffect: null,
lustThresholds: [
{threshold: 80, text: "Her eyes fixate on your cock! She's licking her lips!", cssClass: "lust-high"},
{threshold: 0, text: "Fear and anticipation war in her eyes as she stares at your hard cock!", cssClass: ""}
],
specialEffect: {type: "dickExposed", value: true},
damageIcon: "high-arousal"
}>>
<<run setup.pinnedConfigs.deepthroat = {
name: "Deepthroat (Pinned)",
actionName: "deepthroat_pinned",
narrativePool: "player_deepthroat_pinned",
videoFolder: "combat/deepthroat_pinned",
secondaryVideoFolder: null,
lustDamage: {min: 40, max: 55},
painDamage: {min: 3, max: 6},
playerLust: 25,
secondaryEffect: {
chance: 40,
lustBonus: 10,
text: "You hold her head down, cock buried in her throat! She gags and drools!"
},
lustThresholds: [
{threshold: 90, text: "She's sucking eagerly now, throat massaging your cock!", cssClass: "lust-high"},
{threshold: 70, text: "Her gagging turns to moaning! She's starting to enjoy being used!", cssClass: ""}
],
specialEffect: null,
damageIcon: "high-arousal"
}>>
<<run setup.pinnedConfigs.fuck = {
name: "Fuck (Pinned)",
actionName: "fuck_pinned",
narrativePool: "player_fuck_pinned",
videoFolder: "combat/fuck_pinned",
secondaryVideoFolder: null,
lustDamage: {min: 60, max: 80},
painDamage: null,
playerLust: 30,
secondaryEffect: {
chance: 60,
lustBonus: 20,
text: "You pound her mercilessly! Her screams of protest become moans of pleasure!"
},
lustThresholds: [
{threshold: 100, text: "She BREAKS completely, cumming around your cock! Her body is yours!", cssClass: "lust-high"},
{threshold: 90, text: "She's fucking you back now, pinned but desperate for more!", cssClass: "lust-high"}
],
specialEffect: null,
damageIcon: "high-arousal"
}>>
<</widget>><<set setup.combatNarrative to setup.combatNarrative || {}>>\
<<set setup.combatNarrative.player_grind_pinned to [
"You grind your body against hers! She can feel your hardness pressing against her!",
"Pinning her down, you rub yourself against her! She whimpers, feeling you throb!",
"You dry-hump her trapped body! She can't escape the friction!",
"Your hips grind against hers! She feels every inch of your hard cock!",
"Pressed down beneath you, she feels you grinding! She's getting wet despite herself!",
"You rub your hard cock against her! Even through clothes, she feels the heat!",
"Grinding down on her pinned body, you make sure she knows what's coming!",
"Your weight on her, you grind relentlessly! She moans, unable to resist!",
"She's trapped beneath you as you grind! Her resistance is melting away!",
"You thrust and grind against her trapped form! She's panting, arousal building!"
]>>
<<set setup.combatNarrative.player_choke_pinned to [
"Your hand closes around her throat! Her eyes go wide as you squeeze!",
"You grip her neck firmly, controlling her breathing! She gasps, helpless!",
"Fingers wrap around her throat! She claws at your arm but can't break free!",
"You choke her just enough to see stars in her eyes! Her body goes limp!",
"Your hand on her throat, you control when she breathes! She's completely yours!",
"You squeeze her neck, cutting off her air briefly! Her eyes roll back!",
"Choking her firmly, you watch her face flush! She's terrified... and aroused!",
"Your grip on her throat is absolute! She can only whimper and submit!",
"You choke her while grinding, watching her eyes flutter! She's losing herself!",
"Hand around her neck, you assert total dominance! She's yours to use!"
]>>
<<set setup.combatNarrative.player_abuse_tits_pinned to [
"With her pinned, you maul her tits without mercy! Slapping, groping, twisting!",
"You abuse her exposed breasts while she's trapped! She screams but can't escape!",
"Her tits take the full brunt of your assault! Pinned down, she endures everything!",
"Slapping and groping her tits, you use her helpless body! She's sobbing!",
"You torture her breasts while she's pinned! Nipples twisted, flesh squeezed!",
"Her exposed tits get no mercy! You abuse them savagely while she writhes!",
"Pinned beneath you, her tits are your playthings! You use them roughly!",
"You maul her breasts without restraint! She's trapped and can only take it!",
"Her tits are completely at your mercy! You abuse them until she's screaming!",
"With her pinned, you have full access! Her tits are slapped, squeezed, tortured!"
]>>
<<set setup.combatNarrative.player_finger_pinned to [
"With her pinned, you finger her roughly! She can't escape your probing digits!",
"You thrust fingers inside her trapped body! She moans, helplessly impaled!",
"Pinned and fingered without mercy! Her pussy clenches around your invading fingers!",
"Your fingers plunge into her while she's trapped! She can only moan and take it!",
"You finger-fuck her pinned body roughly! She's so wet, dripping on the ground!",
"With her helpless, you finger her to the edge! She's begging— but for what?",
"Pinned down, she endures your relentless fingering! Her body betrays her!",
"You pump fingers in and out of her trapped pussy! She's losing her mind!",
"Her pinned body shakes as you finger her! She's going to cum whether she wants or not!",
"Fingering her mercilessly while she's trapped! She can't hold back her moans!"
]>>
<<set setup.combatNarrative.player_dick_out_pinned to [
"You free your hard cock while keeping her pinned! Her eyes go wide seeing your size!",
"With her trapped, you pull out your throbbing dick! She knows what's coming!",
"Your cock springs free above her pinned body! She whimpers, knowing her fate!",
"You reveal your hard cock while she's helpless! She can't stop what's about to happen!",
"Keeping her pinned, you pull out your massive erection! She gasps at the sight!",
"Your throbbing cock is out! Pinned beneath you, she stares at what's about to claim her!",
"You free yourself while keeping her trapped! Your cock throbs over her exposed body!",
"With her helpless, you pull out your hard dick! Pre-cum drips onto her bare skin!",
"Your erection springs free! She's pinned and about to be used!",
"Cock out and ready, you hover over her pinned body! The anticipation is unbearable!"
]>>
<<set setup.combatNarrative.player_deepthroat_pinned to [
"You shove your cock into her mouth while she's pinned! She gags as you hit her throat!",
"Pinned down, she has nowhere to go as you fuck her face! She chokes on your cock!",
"Your cock plunges down her trapped throat! She gags and drools around your shaft!",
"You use her pinned mouth like a pussy! Thrusting deep until she can't breathe!",
"Throat-fucking her while she's helpless! Her eyes water as you pump mercilessly!",
"With her pinned, you skull-fuck her roughly! Spit and drool coat your cock!",
"You force your cock deep down her trapped throat! She gurgles, choking on you!",
"Pinned and throat-stuffed! She can only gag and take your cock hitting her throat!",
"Your hips slam against her face! Pinned down, she deepthroats every inch!",
"You fuck her helpless mouth until she's gagging! Drool runs down her chin!"
]>>
<<set setup.combatNarrative.player_fuck_pinned to [
"You slam your cock inside her pinned body! She SCREAMS as you fill her completely!",
"With her trapped, you thrust inside! She's helpless as you fuck her roughly!",
"Your cock plunges into her pinned pussy! She's crying out with every brutal thrust!",
"You pound her while she's pinned! She can't escape, can only take every inch!",
"Fucking her trapped body without mercy! She's moaning, completely overwhelmed!",
"You claim her while she's pinned! Your cock drives deep as she screams!",
"Pinned and fucked hard! She writhes beneath you but there's no escape!",
"Your hips slam against hers! Pinned down, she takes your cock to the hilt!",
"You fuck her helpless body savagely! She's cumming around your cock already!",
"With her pinned beneath you, you thrust inside and own her completely!"
]>><<widget "initRapidStrikesConfig">>
<<run setup.rapidStrikesConfig = {
actionName: "rapid_strikes",
energyCost: 15,
numStrikes: 3,
damageMultiplier: 0.7,
damageVariance: [-1, 2],
useWeaponBonus: true,
baseAccuracy: 65,
accuracyModifier: 0,
narrativePools: {
intro: "rapid_strikes_intro",
hit: "rapid_strikes_hit",
miss: "rapid_strikes_miss",
finale: "rapid_strikes_finale"
},
videoFolders: {
intro: "combat/rapid_strikes_intro",
hit: "combat/rapid_strikes_hit",
miss: "combat/rapid_strikes_miss",
finale: "combat/rapid_strikes_finale"
},
secondaryVideoFolder: null,
clothingDamage: {
chance: 20,
amount: [5, 10],
perHit: true
},
imagePath: "combat/rapid-strikes.png",
nextPassage: "Combat_Companion_Turn"
}>>
<</widget>><<set setup.combatNarrative to setup.combatNarrative || {}>>
<<set setup.combatNarrative.rapid_strikes_intro to [
"You unleash a flurry of rapid attacks!",
"Your strikes come in lightning-fast succession!",
"You attack with blinding speed— strike after strike!",
"A barrage of blows rains down on {him}!",
"You move like a whirlwind— attack, attack, attack!",
"Your hands become a blur as you strike repeatedly!",
"You unleash a storm of blows!",
"Rapid-fire strikes come one after another!"
]>>
<<set setup.combatNarrative.rapid_strikes_hit to [
"Hit! Another blow lands!",
"CONNECT! Your strike finds its mark!",
"Strike lands cleanly!",
"Impact! {He} takes another hit!",
"Contact! You tag {him} again!",
"Another hit— {he}'s getting overwhelmed!",
"Your strike connects solidly!",
"Hit after hit— {he} can't keep up!"
]>>
<<set setup.combatNarrative.rapid_strikes_miss to [
"Miss! That one whiffed!",
"{He} dodges one strike!",
"Your attack finds only air!",
"{He} evades this one!",
"That strike goes wide!",
"{He} slips past your attack!",
"Miss— but more are coming!",
"{He} manages to avoid one!"
]>><<widget "initSeductionConfigs">>
<<set $seductionActions to {
sultry_gaze: {
id: "sultry_gaze",
name: "Sultry Gaze",
lustMin: 8,
lustMax: 12,
energyCost: 5,
baseChance: 70,
narrativePool: "seduce_sultry_gaze",
successPool: "seduce_sultry_gaze_success",
videoFolder: "combat/seduce_sultry_gaze",
secondaryVideoFolder: null,
unlockRequirement: "day >= 4"
},
flirt: {
id: "flirt",
name: "Flirt",
lustMin: 10,
lustMax: 15,
energyCost: 5,
baseChance: 60,
narrativePool: "seduce_flirt",
successPool: "seduce_flirt_success",
videoFolder: "combat/seduce_flirt",
secondaryVideoFolder: null,
unlockRequirement: "day >= 4"
},
pose: {
id: "pose",
name: "Provocative Pose",
lustMin: 12,
lustMax: 18,
energyCost: 8,
baseChance: 65,
narrativePool: "seduce_pose",
successPool: "seduce_pose_success",
videoFolder: "combat/seduce_pose",
secondaryVideoFolder: null,
unlockRequirement: "day >= 4"
},
blow_kiss: {
id: "blow_kiss",
name: "Blow Kiss",
lustMin: 15,
lustMax: 20,
energyCost: 10,
baseChance: 55,
narrativePool: "seduce_blow_kiss",
successPool: "seduce_blow_kiss_success",
videoFolder: "combat/seduce_blow_kiss",
secondaryVideoFolder: null,
unlockRequirement: "day >= 4 && corruption >= 5"
},
strip_tease: {
id: "strip_tease",
name: "Strip Tease",
lustMin: 20,
lustMax: 30,
energyCost: 15,
baseChance: 60,
narrativePool: "seduce_strip_tease",
successPool: "seduce_strip_tease_success",
videoFolder: "combat/seduce_strip_tease",
secondaryVideoFolder: null,
unlockRequirement: "allure >= 20",
removesArmor: true
},
approach: {
id: "approach",
name: "Close the Distance",
lustMin: 25,
lustMax: 35,
energyCost: 15,
baseChance: 50,
narrativePool: "seduce_approach",
successPool: "seduce_approach_success",
videoFolder: "combat/seduce_approach",
secondaryVideoFolder: null,
unlockRequirement: "allure >= 20"
},
whisper: {
id: "whisper",
name: "Whisper Promises",
lustMin: 18,
lustMax: 25,
energyCost: 10,
baseChance: 70,
narrativePool: "seduce_whisper",
successPool: "seduce_whisper_success",
videoFolder: "combat/seduce_whisper",
secondaryVideoFolder: null,
unlockRequirement: "charm >= 15"
},
dark_allure: {
id: "dark_allure",
name: "Dark Allure",
lustMin: 30,
lustMax: 45,
energyCost: 20,
baseChance: 80,
narrativePool: "seduce_dark_allure",
successPool: "seduce_dark_allure_success",
videoFolder: "combat/seduce_dark_allure",
secondaryVideoFolder: null,
unlockRequirement: "corruption >= 30",
corruptionCost: 2
}
}>>
<</widget>><<set setup.combatNarrative to setup.combatNarrative || {}>>
<<set setup.combatNarrative.seduce_sultry_gaze to [
"You lock eyes with her, letting desire show plainly in your gaze.",
"Your eyes meet hers— you don't look away, letting hunger show.",
"You catch her eye and hold it, your stare heavy with want.",
"You fix her with a look that promises exactly what you're thinking.",
"Your gaze travels over her slowly before meeting her eyes with clear intent.",
"You stare at her like you're already undressing her in your mind— because you are.",
"You meet her eyes with a look that makes your desires unmistakable.",
"Your stare holds hers, weighted with unspoken promise."
]>>
<<set setup.combatNarrative.seduce_flirt to [
"\"You know, we don't have to fight...\" You let the implication hang.",
"\"Seems a waste to hurt someone so interesting,\" you say with a half-smile.",
"\"I can think of better ways we could spend this time,\" you suggest.",
"\"What if I told you I find this... exciting?\" You flash a teasing grin.",
"\"Careful— keep looking at me like that and I'll get ideas,\" you tease.",
"\"Such aggression. I wonder what else you're passionate about?\" Your tone is playful.",
"\"We could keep fighting... or we could do something more fun,\" you offer.",
"\"You're cute when you're trying to kill me,\" you say with deliberate charm."
]>>
<<set setup.combatNarrative.seduce_pose to [
"You shift your stance, arching slightly— highlighting your body.",
"You stretch deliberately, letting the movement draw her eyes.",
"You roll your shoulders back, turning to show your profile provocatively.",
"You adjust your position with calculated sensuality, catching the light.",
"You lean back slightly, your pose inviting her gaze to wander.",
"You adopt a stance that's more runway than battlefield— it works.",
"You shift your weight with deliberate grace, every line intentional.",
"You pose like you know exactly what you're doing— because you do."
]>>
<<set setup.combatNarrative.seduce_blow_kiss to [
"You blow her a kiss— it shimmers with subtle corruption as it crosses the distance.",
"You press your fingers to your lips, then release a kiss charged with dark energy.",
"You send a kiss trailing supernatural allure through the air toward her.",
"Your blown kiss carries something more than air— power, promise, temptation.",
"You kiss your fingertips and blow— the gesture crackles with corrupted charm.",
"A kiss from your lips, carried on breath that tastes of darkness.",
"You blow a kiss that seems to pulse with unnatural magnetism.",
"Your kiss travels the space between you, heavy with inhuman allure."
]>>
<<set setup.combatNarrative.seduce_strip_tease to [
"You slowly peel away a piece of clothing, eyes locked on hers the whole time.",
"Your hands work at your clothing with deliberate slowness, revealing skin inch by inch.",
"You remove something with practiced sensuality, watching her watch you.",
"Slowly, teasingly, you strip away a layer— her eyes follow every movement.",
"You make removing clothing an art form, each motion calculated to entice.",
"Your fingers trail over your own body as you undress, putting on a show.",
"You strip with the confidence of someone who knows exactly the effect they're having.",
"Piece by piece, you reveal more— her attention is completely captured."
]>>
<<set setup.combatNarrative.seduce_approach to [
"You step close— close enough to touch. Your fingers brush her arm.",
"You close the distance until you're almost touching, the air between you charged.",
"You move into her space with deliberate intimacy, near enough to feel her heat.",
"You approach until there's barely a breath between you, eyes locked.",
"You step forward slowly, predatory— she could stop you, but she doesn't.",
"You invade her personal space with quiet confidence, testing boundaries.",
"You move closer with each step, watching her pulse quicken.",
"You close the gap between you until you can feel her breathing change."
]>>
<<set setup.combatNarrative.seduce_whisper to [
"You lean in close and describe, in explicit detail, exactly what you want to do to her.",
"Your voice drops low as you whisper promises that make her breath hitch.",
"You murmur filthy suggestions directly into her ear, painting vivid pictures.",
"You whisper your desires— graphic, specific, irresistible.",
"You lean close and tell her everything you're imagining, holding nothing back.",
"Your words are hot against her ear, each one a carefully chosen temptation.",
"You describe the scenario playing in your head— her in it, under you, moaning.",
"You whisper exactly how you'd touch her, where, how hard— she's listening."
]>>
<<set setup.combatNarrative.seduce_dark_allure to [
"Something inhuman flickers behind your eyes— she's drawn to it like a moth to flame.",
"You let your corruption show, just a glimpse— she can't look away.",
"Your presence darkens with supernatural magnetism— irresistible, terrifying, intoxicating.",
"Power rolls off you in waves— corrupted, dangerous, utterly compelling.",
"You reveal a fragment of what you're becoming— the darkness is seductive.",
"Your eyes flash with something that shouldn't exist— it only makes her want you more.",
"You let the mask slip, showing the inhuman hunger beneath— she's mesmerized.",
"Corruption coils around you like smoke— she breathes it in willingly."
]>>
<<set setup.combatNarrative.seduce_sultry_gaze_success to [
"Her breath catches— she's staring back now, transfixed.",
"She freezes under your gaze, pupils dilating.",
"Her lips part slightly as she holds your stare.",
"She can't look away— you've got her."
]>>
<<set setup.combatNarrative.seduce_flirt_success to [
"A smile tugs at her lips despite herself.",
"She laughs, but there's heat in her eyes now.",
"\"You're terrible,\" she says— but her voice is breathy.",
"She's flustered, trying to hide it— failing."
]>>
<<set setup.combatNarrative.seduce_pose_success to [
"Her eyes travel over you— she's definitely looking.",
"She bites her lip, gaze lingering.",
"You catch her staring— she doesn't stop.",
"Her face flushes as she drinks in the sight."
]>>
<<set setup.combatNarrative.seduce_blow_kiss_success to [
"It hits her like a physical touch— she gasps.",
"The kiss lands and she shudders, eyes glazing.",
"She sways slightly, power washing over her.",
"Her knees weaken as corruption caresses her."
]>>
<<set setup.combatNarrative.seduce_strip_tease_success to [
"She's staring openly now, hunger clear on her face.",
"\"Oh fuck,\" she breathes, eyes glued to your skin.",
"She's transfixed— you could do anything right now.",
"Her breathing quickens, watching every inch revealed."
]>>
<<set setup.combatNarrative.seduce_approach_success to [
"She doesn't step back— if anything, she leans in.",
"Her breath hitches at the proximity.",
"You feel her trembling as you close the distance.",
"She's frozen, letting you into her space."
]>>
<<set setup.combatNarrative.seduce_whisper_success to [
"She whimpers— actually whimpers— at your words.",
"\"Jesus...\" she breathes, cheeks burning.",
"Your words paint pictures in her mind— she's lost in them.",
"She's breathing hard, imagination running wild."
]>>
<<set setup.combatNarrative.seduce_dark_allure_success to [
"She's utterly entranced, drawn to the darkness in you.",
"\"What... what are you?\" she whispers— but she's stepping closer.",
"The corruption calls to something in her— she answers.",
"She's drowning in your presence— and she's not fighting it."
]>>
<<set setup.combatNarrative.seduce_failure to [
"She resists your advances, shaking her head clear.",
"She pulls back, snapping out of it.",
"\"Nice try,\" she says, refocusing.",
"She's not falling for it— discipline holds."
]>>
<<set setup.combatNarrative.seduce_failure_anger to [
"Her eyes narrow— that pissed her off.",
"\"You think you can just—\" She's angry now.",
"She looks insulted. Offended. Furious.",
"That backfired— she's twice as aggressive now."
]>>
<<set setup.combatNarrative.seduce_enemy_reaction_low to [
"She's keeping it together, but you see the cracks forming.",
"Her focus wavers— just for a moment— before she recovers.",
"She shifts uncomfortably, trying to maintain composure.",
"There's a flush creeping up her neck despite her resistance.",
"She clears her throat, working to stay professional.",
"Her grip on her weapon tightens— overcompensating."
]>>
<<set setup.combatNarrative.seduce_enemy_reaction_mid to [
"Her breathing is noticeably heavier now— she's struggling to focus.",
"She's distracted, eyes wandering where they shouldn't.",
"\"This is... this isn't...\" She can't finish the sentence.",
"Her stance wavers— arousal is interfering with combat instinct.",
"She bites her lip, clearly affected, clearly trying not to be.",
"Her weapon lowers slightly— her mind is elsewhere."
]>>
<<set setup.combatNarrative.seduce_enemy_reaction_high to [
"She's panting openly, barely holding her weapon.",
"\"I can't... I need...\" She's losing it.",
"Her thighs press together— she's soaked and everyone knows it.",
"She's staring at you with naked hunger now.",
"\"Fuck the fight,\" she breathes. \"Just... fuck me.\"",
"She's on the edge of surrender— lust overwhelming all else."
]>><<widget "initStripAttackConfigs">>
<<run setup.stripAttackConfigs = {
rip_top: {
name: "Rip Top",
clothingSlot: "top",
underwearSlot: null,
exposureFlags: ["titsExposed"],
autoSuccess: false,
baseChance: 70,
strengthBonus: true,
clothingDamageRange: [20, 35],
hpDamageRange: [1, 3],
fullExposure: {
humiliation: 15,
playerLust: 10,
enemyLust: 8,
narrativeKey: "rip_top_full_exposure"
},
nearlyDestroyed: {
threshold: 25,
humiliation: 5,
playerLust: 5,
narrativeKey: "rip_top_nearly_destroyed"
},
icon: "shirt",
narrativeKey: "rip_top",
videoFolder: "combat/attacks_strip_top",
missFallback: "They block your grab!"
},
tear_bottom: {
name: "Tear Bottom",
clothingSlot: "bottom",
underwearSlot: "underwear",
exposureFlags: ["pussyExposed", "assExposed"],
autoSuccess: false,
baseChance: 70,
strengthBonus: true,
clothingDamageRange: [20, 35],
hpDamageRange: [1, 3],
fullExposure: {
humiliation: 10,
playerLust: 15,
enemyLust: 12,
narrativeKey: "tear_bottom_full_exposure"
},
underwearExposure: {
playerLust: 8,
humiliation: 5,
narrativeKey: "tear_bottom_underwear_only"
},
nearlyDestroyed: {
threshold: 25,
humiliation: 0,
playerLust: 3,
narrativeKey: "tear_bottom_nearly_destroyed"
},
icon: "pants",
narrativeKey: "tear_bottom",
videoFolder: "combat/attacks_strip_bottom",
missFallback: "They twist away before you can grab!"
},
rip_top_pinned: {
name: "Rip Top (Pinned)",
clothingSlot: "top",
underwearSlot: null,
exposureFlags: ["titsExposed"],
autoSuccess: true,
baseChance: 100,
strengthBonus: false,
clothingDamageRange: [100, 100],
hpDamageRange: [0, 0],
fullExposure: {
humiliation: 20,
playerLust: 12,
enemyLust: 25,
narrativeKey: "rip_top_pinned_full_exposure"
},
nearlyDestroyed: {
threshold: 0,
humiliation: 0,
playerLust: 0,
narrativeKey: null
},
icon: "shirt",
narrativeKey: "rip_top_pinned",
videoFolder: "combat/attacks_strip_top"
},
tear_bottom_pinned: {
name: "Tear Bottom (Pinned)",
clothingSlot: "bottom",
underwearSlot: null,
exposureFlags: ["pussyExposed", "assExposed"],
autoSuccess: true,
baseChance: 100,
strengthBonus: false,
clothingDamageRange: [100, 100],
hpDamageRange: [0, 0],
fullExposure: {
humiliation: 25,
playerLust: 15,
enemyLust: 30,
narrativeKey: "tear_bottom_pinned_full_exposure"
},
nearlyDestroyed: {
threshold: 0,
humiliation: 0,
playerLust: 0,
narrativeKey: null
},
icon: "pants",
narrativeKey: "tear_bottom_pinned",
videoFolder: "combat/attacks_strip_bottom"
}
}>>
<</widget>><<set setup.combatNarrative to setup.combatNarrative || {}>>
<<set setup.combatNarrative.rip_top_regular_female to [
"You grab her shirt and YANK— fabric tears with a satisfying rip! Her tits strain against what's left, the slut's cleavage on full display!",
"Your strike shreds her top— she yelps as her bra peeks through, those fat tits barely contained!",
"You tear at her shirt like wrapping paper— more of her heaving chest exposed with every rip!",
"Fabric gives way under your grip— her tits bounce as her top falls apart, the whore gasping!",
"Her top tears open— she tries to cover herself but you can see her nipples straining against thin fabric!"
]>>
<<set setup.combatNarrative.rip_top_nearly_destroyed_female to [
"You shred her ruined top— it's barely threads now! Her tits threaten to spill out, nipples poking through!",
"Her shirt hangs in tatters— one more rip and this slut's tits will be completely bare for you!",
"You tear away more fabric— just scraps cling to her heaving chest, her hard nipples visible through the shreds!",
"Her top is destroyed— she whimpers as the tattered remains barely cover her fat tits, one slip from total exposure!",
"Another savage rip— her ruined shirt falls open, only scraps of fabric keeping her from being your topless fucktoy!"
]>>
<<set setup.combatNarrative.rip_top_full_exposure_female to [
"You grab her shirt and TEAR it away completely— her bare tits bounce free, nipples rock-hard! The slut gasps as you drink in the sight!",
"RIIIIP! Her top shreds apart— her naked tits spill out, heavy and perfect! She can't hide them from you now!",
"You rip her clothing away savagely— her chest is completely bare! Those fat tits jiggle obscenely as she struggles!",
"The last of her top tears off— she's topless and helpless! Her exposed tits heave with panicked breaths, nipples stiff!",
"Her shirt is GONE! Her naked tits swing free, bouncing with every movement— this whore's chest is yours to ogle!"
]>>
<<set setup.combatNarrative.rip_top_regular_male to [
"You grab his shirt and YANK— fabric tears! His muscled chest partially exposed, the bastard snarls!",
"Your strike shreds his top— he growls as his torso is revealed through the torn fabric!",
"You tear at his shirt savagely— more of his chest exposed with every rip!",
"Fabric gives way under your grip— his muscles flex as his top falls apart!",
"His shirt tears open— he tries to regain balance as cool air hits his bare skin!"
]>>
<<set setup.combatNarrative.rip_top_nearly_destroyed_male to [
"You shred his ruined shirt— barely threads now! One more rip and this fucker's chest is fully bare!",
"His top hangs in tatters— another tear and he'll be fighting shirtless!",
"You tear away more fabric— just scraps cling to his heaving chest!",
"His shirt is destroyed— tattered remains barely cover his sweat-slicked muscles!",
"Another savage rip— his ruined top falls open, chest almost fully exposed!"
]>>
<<set setup.combatNarrative.rip_top_full_exposure_male to [
"You grab his shirt and TEAR it away completely— his bare chest exposed! He snarls, muscles rippling!",
"RIIIIP! His top shreds apart— his naked torso glistens with sweat! Nothing left to hide behind!",
"You rip his clothing away savagely— his chest is completely bare! Muscles flex as he recoils!",
"The last of his shirt tears off— he's shirtless! His exposed chest heaves with rage!",
"His shirt is GONE! His naked torso drips with sweat— this bastard's fighting bare-chested now!"
]>>
<<set setup.combatNarrative.tear_bottom_regular_female to [
"You grab her pants and YANK— fabric tears! Her thighs exposed, the slut squirms as you eye her crotch!",
"Your strike shreds her bottoms— she gasps as her panties peek through the torn fabric!",
"You tear at her pants savagely— more skin exposed with every rip, her pussy barely hidden!",
"Fabric gives way under your grip— her ass cheeks flash as her bottoms fall apart!",
"Her pants tear open— she tries to cover her crotch but you can see her panties through the rips!"
]>>
<<set setup.combatNarrative.tear_bottom_underwear_only_female to [
"Her pants RIP AWAY completely— just soaked panties left! You can see her wet cunt through the thin fabric, the desperate slut!",
"You tear her bottoms off— she's left in drenched panties! Her fat pussy lips strain against the fabric, clearly aroused!",
"Her pants are GONE— only her sopping underwear remains! The wet spot spreading as her slutty body betrays her!",
"You strip her pants off roughly— her panties cling to her pussy lips, soaked through! Her cunt is basically visible!",
"Her bottoms shred away— just flimsy panties now! The damp fabric molds to her pussy, leaving nothing to imagination!"
]>>
<<set setup.combatNarrative.tear_bottom_nearly_destroyed_female to [
"You shred her ruined pants— they're barely threads! Her wet cunt peeks through, one rip from being your naked fucktoy!",
"Her bottoms hang in tatters— another tear and this whore's pussy will be completely bare for you!",
"You tear away more fabric— scraps barely cover her dripping cunt! She squirms, knowing what comes next!",
"Her pants are destroyed— tattered remains cling between her thighs, her swollen pussy lips visible through the shreds!",
"Another savage rip— her ruined bottoms fall apart, only threads keeping her from total exposure!"
]>>
<<set setup.combatNarrative.tear_bottom_full_exposure_female to [
"You grab her bottoms and TEAR them away— her bare cunt glistens, completely exposed! The slut whimpers as you stare at her wet pussy!",
"RIIIIP! Her pants shred apart— her naked pussy is revealed, pink and dripping! She can't hide her shameful arousal!",
"You rip her clothing away savagely— her cunt is completely bare! Her swollen lips glisten with wetness as she trembles!",
"The last of her bottoms tears off— she's naked below the waist! Her exposed pussy twitches, the whore's body betraying her!",
"Her pants are GONE! Her bare cunt is on full display— wet, pink, and ready! This slut's pussy is yours to see!"
]>>
<<set setup.combatNarrative.tear_bottom_regular_male to [
"You grab his pants and YANK— fabric tears! His thighs exposed, the bastard tries to cover himself!",
"Your strike shreds his bottoms— he snarls as his underwear peeks through the torn fabric!",
"You tear at his pants savagely— more skin exposed with every rip!",
"Fabric gives way under your grip— he stumbles as his bottoms fall apart!",
"His pants tear open— he tries to cover his crotch as you eye the damage!"
]>>
<<set setup.combatNarrative.tear_bottom_underwear_only_male to [
"His pants RIP AWAY completely— just tight briefs left! His thick cock strains against the fabric!",
"You tear his bottoms off— he's left in stretched underwear! His hard cock clearly visible!",
"His pants are GONE— only his briefs remain! The outline of his hard cock impossible to hide!",
"You strip his pants off roughly— his underwear barely contains his throbbing package!",
"His bottoms shred away— just thin fabric now! His cock tents the material obscenely!"
]>>
<<set setup.combatNarrative.tear_bottom_nearly_destroyed_male to [
"You shred his ruined pants— barely threads now! One more rip and his cock will be out!",
"His bottoms hang in tatters— another tear and this fucker's dick will be exposed!",
"You tear away more fabric— scraps barely cover his straining cock!",
"His pants are destroyed— tattered remains cling between his thighs, his cock visible through shreds!",
"Another savage rip— his ruined bottoms fall apart, cock almost exposed!"
]>>
<<set setup.combatNarrative.tear_bottom_full_exposure_male to [
"You grab his bottoms and TEAR them away— his hard cock springs free! He snarls as you expose him!",
"RIIIIP! His pants shred apart— his thick cock bounces out, rock-hard and throbbing!",
"You rip his clothing away savagely— his cock is completely bare! His shaft stands at full attention!",
"The last of his bottoms tears off— he's naked below the waist! His exposed cock throbs with rage!",
"His pants are GONE! His naked cock stands rigid— this bastard's fighting with his dick out now!"
]>>
<<set setup.combatNarrative.rip_top_pinned_regular_female to [
"With her pinned beneath you, you grab her shirt and RIP— fabric shreds easily! Her fat tits strain against the ruins, helpless to stop you!",
"She struggles uselessly as you tear at her top— more of her heaving chest exposed, the slut whimpering!",
"Pinned and powerless, she can only gasp as you rip her shirt apart, exposing her bra-clad tits!",
"You tear her top while she writhes helplessly— her cleavage spills out, the whore unable to cover herself!",
"She can't fight back as you shred her shirt— her bouncing tits barely contained, nipples straining against thin fabric!"
]>>
<<set setup.combatNarrative.rip_top_pinned_nearly_destroyed_female to [
"Pinned and helpless, you tear the last scraps of her ruined top— her bare tits nearly exposed, nipples visible through shreds!",
"She whimpers as you rip away more of her destroyed shirt— just threads keeping this slut's tits from being fully bare!",
"With her unable to resist, you shred what's left of her top— her heaving chest on display, one rip from total exposure!",
"You tear her ruined top apart while she struggles beneath you— her fat tits ready to spill free!",
"Helpless under your weight, she can only moan as you destroy what's left of her shirt— her nipples poking through tatters!"
]>>
<<set setup.combatNarrative.rip_top_pinned_full_exposure_female to [
"You grab her ruined top and TEAR it completely away— her naked tits bounce free, nipples rock-hard! The pinned slut whimpers as you ogle her bare chest!",
"RIIIIP! With her helpless beneath you, her top shreds off entirely— her heavy tits spill out, completely exposed and yours to enjoy!",
"Pinned and powerless, she can only gasp as you rip her shirt away— her bare tits jiggle obscenely, nothing left to hide behind!",
"You tear away the last of her clothing— she's topless and trapped beneath you! Her exposed tits heave with each panicked breath!",
"Her shirt is GONE and she can't cover herself! Her naked tits bounce as she struggles, the helpless whore's chest completely bare!"
]>>
<<set setup.combatNarrative.tear_bottom_pinned_regular_female to [
"With her pinned beneath you, you grab her pants and YANK— fabric tears! Her thighs exposed, the helpless slut whimpers!",
"She struggles uselessly as you tear at her bottoms— more skin revealed, her panties peeking through!",
"Pinned and powerless, she can only gasp as you rip her pants apart— her crotch barely hidden!",
"You tear her bottoms while she writhes helplessly— her ass cheeks flash as fabric gives way!",
"She can't fight back as you shred her pants— her panties visible through the growing tears!"
]>>
<<set setup.combatNarrative.tear_bottom_pinned_underwear_only_female to [
"Pinned beneath you, you RIP her pants away completely— just soaked panties left! Her wet cunt visible through thin fabric, the trapped slut moaning!",
"She struggles helplessly as you tear her bottoms off— only drenched panties remain! Her pussy lips strain against the fabric!",
"With her unable to resist, her pants shred away— she's left in sopping underwear, her arousal impossible to hide!",
"You strip her pants off while she's pinned— her panties cling to her pussy lips, soaked through! The desperate whore can't cover herself!",
"Her bottoms are GONE and she can't stop you! Just flimsy, wet panties mold to her cunt, leaving nothing to imagination!"
]>>
<<set setup.combatNarrative.tear_bottom_pinned_nearly_destroyed_female to [
"Pinned and helpless, you tear the last scraps of her ruined pants— her wet cunt peeks through, one rip from total exposure!",
"She whimpers as you rip away more of her destroyed bottoms— just threads keeping this slut's pussy covered!",
"With her unable to resist, you shred what's left of her pants— her dripping cunt ready to be bared!",
"You tear her ruined bottoms apart while she struggles beneath you— her swollen pussy lips visible through tatters!",
"Helpless under your weight, she can only moan as you destroy what's left of her pants— her naked cunt almost exposed!"
]>>
<<set setup.combatNarrative.tear_bottom_pinned_full_exposure_female to [
"You grab her bottoms and TEAR them completely away— her bare cunt glistens, fully exposed! The pinned slut whimpers as you stare at her wet, naked pussy!",
"RIIIIP! With her helpless beneath you, her pants shred off entirely— her pussy is revealed, pink and dripping! Nothing left to hide!",
"Pinned and powerless, she can only gasp as you rip her bottoms away— her naked cunt twitches, completely bare and vulnerable!",
"You tear away the last of her clothing— she's naked below the waist and trapped! Her exposed pussy glistens with shameful arousal!",
"Her pants are GONE and she's helpless! Her bare cunt is on full display— wet, pink, and ready! This whore's pussy is yours to see!"
]>>
<<set setup.combatNarrative.rip_top_miss_female to [
"She slaps your hands away from her chest!",
"The bitch twists away before you can grab her top!",
"She blocks your grab— her tits safe for now!",
"She catches your wrists and shoves you back!",
"Too slow! She protects her chest!"
]>>
<<set setup.combatNarrative.rip_top_miss_male to [
"He slaps your hands away!",
"The bastard twists away before you can grab his shirt!",
"He blocks your grab!",
"He catches your wrists and shoves you back!",
"Too slow! He protects himself!"
]>>
<<set setup.combatNarrative.tear_bottom_miss_female to [
"She twists away before you can grab her pants!",
"The bitch protects her crotch, blocking your grab!",
"She kicks at you, stopping your grab!",
"She slaps your hands away from her bottoms!",
"Too slow! Her pussy stays covered!"
]>>
<<set setup.combatNarrative.tear_bottom_miss_male to [
"He twists away before you can grab his pants!",
"The bastard blocks your grab!",
"He kicks at you, stopping your grab!",
"He slaps your hands away from his bottoms!",
"Too slow! He protects himself!"
]>>
<<set setup.combatNarrative.strip_top_humiliation_bonus_female to [
"She gasps, hands flying up to cover her exposed tits— the humiliation clear on her face!",
"Her cheeks burn red as she realizes her tits are completely bare!",
"She whimpers in shame, trying uselessly to cover her naked chest!",
"The humiliation hits her hard— her bare tits on display for everyone to see!",
"She trembles with shame, her exposed tits heaving with panicked breaths!"
]>>
<<set setup.combatNarrative.strip_top_humiliation_bonus_male to [
"He grunts, the humiliation of being stripped visible on his face!",
"His jaw clenches as he realizes he's been exposed!",
"He snarls in rage and shame at being stripped!",
"The humiliation hits him— fighting shirtless wasn't in his plan!",
"He seethes with rage at being so easily stripped!"
]>>
<<set setup.combatNarrative.strip_bottom_lust_bonus_female to [
"Her face flushes as she realizes she's completely bare— her wet cunt betraying her arousal!",
"Despite her shame, her pussy glistens— the whore's body clearly enjoying this!",
"She whimpers, her exposed cunt dripping with shameful arousal!",
"Her naked pussy twitches— the slut can't hide how much this turns her on!",
"Her bare cunt glistens with wetness— her body betraying her true nature!"
]>><<widget "initSupernaturalConfigs">>
<<run setup.supernaturalConfigs = {}>>
<<run setup.supernaturalConfigs.dark_pulse = {
name: "Dark Pulse",
actionType: "dark_pulse",
energyCost: 15,
baseDamage: 15,
corruptionScaling: 4,
corruptionGain: 1,
targetType: "all",
narrativePool: "dark_pulse",
videoFolder: "combat/dark_pulse",
secondaryVideoFolder: null,
fallbackText: "Dark energy erupts from you in a wave of purple-black power!",
deathText: "is consumed by darkness!",
victoryCheck: true
}>>
<<run setup.supernaturalConfigs.drain_essence = {
name: "Drain Essence",
actionType: "drain_essence",
energyCost: 20,
baseDamage: 12,
corruptionScaling: 5,
corruptionGain: 1,
targetType: "single",
lifestealMultiplier: 0.5,
applyArmor: true,
narrativePool: "drain_essence",
videoFolder: "combat/drain_essence",
secondaryVideoFolder: null,
fallbackText: "Purple tendrils of energy reach out from you, latching onto the enemy!",
deathText: "withers to nothing!",
victoryCheck: true
}>>
<<run setup.supernaturalConfigs.succubus_kiss = {
name: "Succubus Kiss",
actionType: "succubus_kiss",
energyCost: 25,
lustDrain: 30,
healMultiplier: 0.5,
corruptionGain: 1,
targetType: "single",
narrativePool: "succubus_kiss",
videoFolder: "combat/succubus_kiss",
secondaryVideoFolder: null,
fallbackText: "Your lips glow with purple energy as you press them to the enemy...",
victoryCheck: false
}>>
<<run setup.supernaturalConfigs.terror_visage = {
name: "Terror Visage",
actionType: "terror_visage",
energyCost: 18,
baseChance: 70,
corruptionScaling: 3,
corruptionGain: 1,
targetType: "all",
statusApplied: "fear",
checkImmunity: true,
narrativePool: "terror_visage",
videoFolder: "combat/terror_visage",
secondaryVideoFolder: null,
fallbackText: "You let your transformation show—horns, claws, eyes glowing with unholy power!",
successText: "is terrified!",
victoryCheck: false
}>>
<<run setup.supernaturalConfigs.shadow_step = {
name: "Shadow Step",
actionType: "shadow_step",
energyCost: 15,
corruptionGain: 1,
targetType: "self",
flagsToSet: {
shadowStepped: true,
dodging: true
},
narrativePool: "shadow_step",
videoFolder: "combat/shadow_step",
secondaryVideoFolder: null,
fallbackText: "You dissolve into shadow, becoming one with the darkness...",
effectText: "The enemies strike at empty air. Your next attack will be guaranteed to hit!",
victoryCheck: false
}>>
<<run setup.supernaturalConfigs.abyssal_form = {
name: "Abyssal Form",
actionType: "abyssal_form",
energyCost: 40,
duration: 3,
damageBonus: 0.5,
corruptionGain: 3,
targetType: "self",
flagsToSet: {
abyssalForm: 3,
abyssalDamageBonus: 0.5
},
narrativePool: "abyssal_form",
videoFolder: "combat/abyssal_form",
secondaryVideoFolder: null,
fallbackText: "Dark energy erupts from your body as you fully embrace your supernatural nature!",
effectText: "ABYSSAL FORM ACTIVATED!<br>Damage +50% for 3 turns!",
victoryCheck: false
}>>
<</widget>><<run setup.combatNarrative = setup.combatNarrative || {}>>
<<set setup.combatNarrative.dark_pulse to [
"Dark energy erupts from you in a wave of purple-black power!",
"You unleash a pulse of corrupted energy that ripples through the battlefield!"
]>>
<<set setup.combatNarrative.drain_essence to [
"Purple tendrils of energy reach out from you, latching onto the enemy!",
"You drain their life force, dark energy flowing into you!"
]>>
<<set setup.combatNarrative.succubus_kiss to [
"Your lips glow with purple energy as you press them to the enemy...",
"You kiss them with supernatural power, draining their essence!"
]>>
<<set setup.combatNarrative.terror_visage to [
"You let your transformation show—horns, claws, eyes glowing with unholy power!",
"Your demonic visage fills them with primal terror!"
]>>
<<set setup.combatNarrative.shadow_step to [
"You dissolve into shadow, becoming one with the darkness...",
"You melt into the shadows, leaving only an afterimage!"
]>>
<<set setup.combatNarrative.abyssal_form to [
"Dark energy erupts from your body as you fully embrace your supernatural nature!",
"You transform, power surging through your corrupted form!"
]>><<set setup.combatNarrative to setup.combatNarrative || {}>>\
<<set setup.combatNarrative.takedown_kneel to [
"You sweep her legs and SHOVE— she crashes to her knees before you!",
"A vicious leg sweep drops her— she lands hard on her knees, gasping!",
"You grab her shoulder and kick her legs out— down she goes, kneeling!",
"She stumbles as you trip her, catching herself on her knees at your feet.",
"Your foot hooks behind her ankle— with a sharp pull, she's on her knees!",
"You force her down with brutal efficiency— she kneels, trembling."
]>>
<<set setup.combatNarrative.takedown_back to [
"You tackle her hard— she slams onto her back with you on top!",
"You charge forward, driving her down— she lands flat on her back!",
"A full-body tackle sends her crashing backward— she's pinned beneath you!",
"You grab and THROW— she hits the ground on her back, stunned!",
"Your weight drives her down— she sprawls on her back, legs spread!",
"She goes down hard, landing on her back with you between her legs!"
]>>
<<set setup.combatNarrative.takedown_prone to [
"You shove her hard— she goes down face-first, ass up!",
"A brutal push sends her sprawling— face in the dirt, ass presented!",
"You grab her neck and SLAM— she's pinned face-down beneath you!",
"She crashes forward, landing face-first with her rear raised!",
"You force her down— she ends up on her stomach, completely vulnerable!",
"With a vicious shove, she's eating dirt— her ass up in the air!"
]>>
<<set setup.combatNarrative.takedown_bent to [
"You grab her hair and BEND her over— she catches herself on her hands, ass thrust up!",
"You spin her around and force her down— bent over, ass presented!",
"A hand on the back of her neck bends her forward— she's completely exposed!",
"You grab her hips and PULL— she's bent double before you, ass out!",
"She's forced to bend over, hands on her knees, rear presented perfectly!",
"You push her head down until she's bent over— utterly vulnerable!"
]>>
<<set setup.combatNarrative.takedown_pin to [
"You drop your full weight on her— she's PINNED beneath you, completely helpless!",
"You slam her down and pin her— she struggles uselessly under your weight!",
"She's trapped beneath you, arms pinned, body immobilized!",
"Your weight crushes down— she can barely breathe, completely pinned!",
"You lock her arms and drop your weight— she's going NOWHERE!",
"Pinned and helpless, she writhes beneath you without hope of escape!"
]>>
<<set setup.combatNarrative.takedown_kneel_dick_exposed to "Your hard cock is right at face level. She stares at it, eyes wide...">>
<<set setup.combatNarrative.takedown_back_tits_exposed to "Her bare tits heave as she gasps for breath!">>
<<set setup.combatNarrative.takedown_back_pussy_exposed to "Spread open beneath you, completely vulnerable...">>
<<set setup.combatNarrative.takedown_prone_ass_exposed to "Her bare ass is right there, completely exposed and vulnerable...">>
<<set setup.combatNarrative.takedown_bent_ass_and_dick to "Your cock presses against her bare ass— just one thrust...">>
<<set setup.combatNarrative.takedown_pin_tits_exposed to "Her bare tits press against your chest as she writhes!">>
<<set setup.combatNarrative.takedown_pin_pussy_and_dick to "Your hard cock presses against her bare pussy! Just one thrust and...">>
<<set setup.combatNarrative.takedown_resist to [
"She twists out of your grip— still on her feet!",
"She slips away before you can take her down!",
"She breaks free— you can't get control!",
"She evades your attempt— still standing!",
"She kicks and writhes— you can't get a solid hold!"
]>>
<<set setup.combatNarrative.success_kneel to "Forced to her KNEES!">>
<<set setup.combatNarrative.success_back to "Pinned on her BACK!">>
<<set setup.combatNarrative.success_prone to "Face-down on the ground!">>
<<set setup.combatNarrative.success_bent to "BENT OVER!">>
<<set setup.combatNarrative.success_pin to "Enemy PINNED!">><<widget "initUltraExtremeConfigs">>
<<set setup.ultraExtremeConfigs to {}>>\
<<run setup.ultraExtremeConfigs.claim_her = {
actionName: "claim_her",
narrativePool: "claim_her",
videoFolder: "combat/claim_her",
secondaryVideoFolder: null,
lustDamage: {min: 50, max: 70},
playerLust: 25,
actionType: "penetration",
hasResistRoll: true,
resistBase: 35,
resistLustDivisor: 2,
missMessage: "She twists her hips— you miss your mark!",
missDamage: null,
clothingAction: null,
clothingChance: null,
clothingDamage: null,
exposeDickFirst: false,
targetExposure: null,
positionChange: null,
specialEffects: null,
canDefeat: true,
defeatType: "claimed",
dominanceGain: 5,
lustReactions: {
highPool: "claim_her_high_lust",
lowPool: "claim_her_low_lust"
}
}>>
<<run setup.ultraExtremeConfigs.mount_claim = {
actionName: "mount_claim",
narrativePool: "mount_claim",
videoFolder: "combat/mount_claim",
secondaryVideoFolder: null,
lustDamage: {min: 45, max: 65},
playerLust: 22,
actionType: "penetration",
hasResistRoll: true,
resistBase: 40,
resistLustDivisor: 2,
missMessage: "She kicks you back! \"Get OFF me!\"",
missDamage: 2,
clothingAction: null,
clothingChance: null,
clothingDamage: null,
exposeDickFirst: true,
targetExposure: null,
positionChange: null,
specialEffects: null,
canDefeat: true,
defeatType: "claimed",
dominanceGain: 5,
lustReactions: {
highPool: "mount_claim_high_lust",
lowPool: "mount_claim_low_lust"
}
}>>
<<run setup.ultraExtremeConfigs.tear_and_take = {
actionName: "tear_and_take",
narrativePool: "tear_and_take",
videoFolder: "combat/tear_and_take",
secondaryVideoFolder: null,
lustDamage: {min: 50, max: 70},
playerLust: 25,
actionType: "penetration",
hasResistRoll: false,
resistBase: null,
resistLustDivisor: null,
missMessage: null,
missDamage: null,
clothingAction: "destroy_before",
clothingChance: null,
clothingDamage: null,
exposeDickFirst: true,
targetExposure: {pussy: true, ass: true},
positionChange: null,
specialEffects: null,
canDefeat: true,
defeatType: "claimed",
dominanceGain: 5,
lustReactions: {
highPool: "tear_and_take_high_lust",
lowPool: "tear_and_take_low_lust"
}
}>>
<<run setup.ultraExtremeConfigs.rip_and_enter = {
actionName: "rip_and_enter",
narrativePool: "rip_and_enter",
videoFolder: "combat/rip_and_enter",
secondaryVideoFolder: null,
lustDamage: {min: 50, max: 70},
playerLust: 25,
actionType: "penetration",
hasResistRoll: false,
resistBase: null,
resistLustDivisor: null,
missMessage: null,
missDamage: null,
clothingAction: "destroy_before",
clothingChance: null,
clothingDamage: null,
exposeDickFirst: true,
targetExposure: {pussy: true, ass: true},
positionChange: null,
specialEffects: null,
canDefeat: true,
defeatType: "claimed",
dominanceGain: 5,
lustReactions: {
highPool: "rip_and_enter_high_lust",
lowPool: "rip_and_enter_low_lust"
}
}>>
<<run setup.ultraExtremeConfigs.anal = {
actionName: "anal",
narrativePool: "anal",
videoFolder: "combat/anal",
secondaryVideoFolder: null,
lustDamage: {min: 45, max: 65},
playerLust: 28,
actionType: "penetration",
hasResistRoll: true,
resistBase: 30,
resistLustDivisor: 3,
missMessage: "She clenches tight and twists away— \"Not THERE!\"",
missDamage: null,
clothingAction: null,
clothingChance: null,
clothingDamage: null,
exposeDickFirst: false,
targetExposure: null,
positionChange: null,
specialEffects: [
{widget: "addHumiliation", args: [25, "anal"]}
],
canDefeat: true,
defeatType: "claimed",
dominanceGain: 6,
lustReactions: {
highPool: "anal_high_lust",
lowPool: "anal_low_lust"
}
}>>
<<run setup.ultraExtremeConfigs.grind_clothed = {
actionName: "grind_clothed",
narrativePool: "grind_clothed",
videoFolder: "combat/grind_clothed",
secondaryVideoFolder: null,
lustDamage: {min: 20, max: 35},
playerLust: 15,
actionType: "grinding",
hasResistRoll: false,
resistBase: null,
resistLustDivisor: null,
missMessage: null,
missDamage: null,
clothingAction: "damage_chance",
clothingChance: 40,
clothingDamage: {min: 15, max: 25},
exposeDickFirst: false,
targetExposure: null,
positionChange: null,
specialEffects: null,
canDefeat: false,
defeatType: null,
dominanceGain: null,
lustReactions: {
highPool: "grind_clothed_high_lust",
lowPool: "grind_clothed_low_lust"
}
}>>
<<run setup.ultraExtremeConfigs.mount_grind = {
actionName: "mount_grind",
narrativePool: "mount_grind",
videoFolder: "combat/mount_grind",
secondaryVideoFolder: null,
lustDamage: {min: 25, max: 40},
playerLust: 18,
actionType: "grinding",
hasResistRoll: false,
resistBase: null,
resistLustDivisor: null,
missMessage: null,
missDamage: null,
clothingAction: "damage_chance",
clothingChance: 50,
clothingDamage: {min: 15, max: 25},
exposeDickFirst: false,
targetExposure: null,
positionChange: null,
specialEffects: null,
canDefeat: false,
defeatType: null,
dominanceGain: null,
lustReactions: {
highPool: "mount_grind_high_lust",
lowPool: "mount_grind_low_lust"
}
}>>
<<run setup.ultraExtremeConfigs.grab_grind = {
actionName: "grab_grind",
narrativePool: "grab_grind",
videoFolder: "combat/grab_grind",
secondaryVideoFolder: null,
lustDamage: {min: 18, max: 30},
playerLust: 12,
actionType: "grinding",
hasResistRoll: false,
resistBase: null,
resistLustDivisor: null,
missMessage: null,
missDamage: null,
clothingAction: null,
clothingChance: null,
clothingDamage: null,
exposeDickFirst: false,
targetExposure: null,
positionChange: {
chance: 35,
newPosition: "bent_over",
message: "You bend her forward, forcing her into position!"
},
specialEffects: null,
canDefeat: false,
defeatType: null,
dominanceGain: null,
lustReactions: {
highPool: "grab_grind_high_lust",
lowPool: "grab_grind_low_lust"
}
}>>
<</widget>><<silently>>
<<set setup.combatNarrative.claim_her to [
"You position yourself between her spread legs and thrust DEEP! Her pussy clenches around your cock as you claim her!",
"You mount her prone form and slam inside! She screams as you fill her completely, pinned beneath your weight!",
"Your cock slides between her legs— you thrust home with dominant force! She's yours now!",
"You spread her legs wider and enter her with one brutal thrust! Her back arches as you claim what's yours!",
"Positioning yourself above her, you drive your cock deep into her exposed pussy! She gasps, overwhelmed!",
"You grab her hips and pull her onto your throbbing cock! The penetration is total— she's completely claimed!",
"Your dick finds her cunt and you thrust forward relentlessly! She cries out as you take her!",
"You pin her down and slam into her pussy with dominant force! Every inch of you claiming every inch of her!"
]>>
<<set setup.combatNarrative.mount_claim to [
"You mount her and thrust HOME! She screams as you fill her completely, your cock buried deep!",
"Straddling her prone form, you drive into her pussy! She gasps as you claim her with brutal intensity!",
"You settle your weight on her and penetrate deep! Her eyes go wide as you fill her up!",
"Mounting her from above, you thrust inside with dominant power! She moans as you claim her body!",
"You pin her beneath you and slide your cock inside! The penetration is complete— she's yours!",
"Your weight presses her down as you enter her! She can't escape as you fuck her into submission!",
"You mount her like a prize and drive your cock home! She cries out, overwhelmed by your dominance!",
"Settling between her legs, you thrust deep and claim her! Your cock fills her completely!"
]>>
<<set setup.combatNarrative.tear_and_take to [
"You thrust into her exposed pussy from behind! She screams as you take her with savage force!",
"Your cock enters her from behind in one brutal thrust! She gasps, face down and helpless!",
"You drive into her doggy style, hands gripping her hips! Each thrust claims her more completely!",
"Positioned behind her, you slam your cock inside! She moans, unable to resist your dominance!",
"You take her from behind with relentless force! Your cock pounds into her again and again!",
"Grabbing her hips, you pull her onto your cock! The penetration is deep and dominant!",
"You mount her from behind and fuck her mercilessly! Each thrust breaks her will further!",
"Your dick slides into her pussy from behind! She whimpers as you claim her prone body!"
]>>
<<set setup.combatNarrative.rip_and_enter to [
"You spread her legs and THRUST inside! Her back arches as you claim her face-to-face!",
"Mounting her missionary, you drive your cock deep! She gasps, watching your dominant expression!",
"You enter her from above, your cock filling her completely! Her eyes lock with yours as you claim her!",
"Spreading her wide, you thrust home with brutal force! She moans, pinned beneath your weight!",
"You settle between her legs and penetrate deep! Face-to-face, she can't escape your dominance!",
"Your cock slides into her as you hold her down! She gasps, completely at your mercy!",
"You thrust into her missionary style, claiming every inch! Her body yields to your power!",
"Pinning her legs back, you drive your cock inside! She cries out as you take her completely!"
]>>
<<set setup.combatNarrative.anal to [
"You position yourself behind her and press your cock against her tight hole! You push inside her ass— she cries out as you fill her completely!",
"Your dick finds her rear entrance and you thrust forward! She gasps as you penetrate her ass with dominant force!",
"You spread her cheeks and enter her tight hole! She whimpers as your cock claims her ass!",
"Positioning at her rear, you drive your cock into her ass! She moans, overwhelmed by the intense penetration!",
"You press against her tight asshole and push inside! Her ass clenches around your cock as you claim her!",
"Your cock slides into her ass with relentless pressure! She cries out, completely dominated!",
"You take her ass with brutal efficiency! Each thrust makes her moan louder as you claim her completely!",
"Entering her from behind, you fill her ass with your throbbing cock! She gasps, utterly helpless!"
]>>
<<set setup.combatNarrative.grind_clothed to [
"You press yourself against her ass, grinding your hard cock through the fabric! She squirms beneath you!",
"Your dick grinds against her clothed ass, the friction building heat! She moans despite herself!",
"You mount her prone form and grind your cock against her! The fabric between you strains and tears!",
"Pressing your hardness against her ass, you grind rhythmically! She whimpers, feeling every inch through her clothes!",
"You settle on top of her and grind your cock against her prone body! The friction is maddening for both of you!",
"Your dick slides against her clothed ass again and again! She can feel your size through the thin fabric!",
"You grind against her from behind, your cock pressing insistently! Her clothes offer little protection!",
"Mounting her face-down, you grind your hard cock against her ass! She gasps with each rhythmic thrust!"
]>>
<<set setup.combatNarrative.mount_grind to [
"You mount her, pinning her down as you grind against her through her clothes! She struggles but can't escape!",
"Straddling her, you grind your cock against her clothed pussy! She moans, feeling every inch!",
"Your weight presses her down as you grind rhythmically! The fabric between you is soaked with heat!",
"You settle on top of her and grind your hard cock against her! She gasps, overwhelmed by your dominance!",
"Mounting her missionary style, you grind against her clothed entrance! She whimpers, desperate!",
"You pin her beneath you and grind your dick against her! The friction builds unbearable need!",
"Your cock grinds against her pussy through thin fabric! She moans, her body betraying her!",
"You mount her and thrust against her rhythmically! Her clothes provide little barrier to your hardness!"
]>>
<<set setup.combatNarrative.grab_grind to [
"You grab her and pull her against you, grinding your hard cock against her ass! She gasps at your sudden dominance!",
"Yanking her backwards, you grind your dick against her! She moans as you hold her tight!",
"You seize her from behind and grind your cock against her ass! She squirms but can't escape!",
"Grabbing her waist, you pull her onto your hardness! Your cock grinds against her insistently!",
"You catch her and press your dick against her from behind! She whimpers, feeling your size!",
"Wrapping your arms around her, you grind your cock against her ass! She's trapped against your body!",
"You grab her roughly and grind yourself against her! Your hard cock drags against her, impossible to ignore!",
"Seizing her, you press your hard cock against her ass and grind! She moans despite her resistance!"
]>>
<<set setup.combatNarrative.claim_her_high_lust to [
"She moans loudly, her pussy clenching around you as pleasure overwhelms her resistance!",
"Her hips push back against you instinctively, desperate for more despite herself!",
"She cries out in ecstasy, her body responding eagerly to your dominant claim!",
"Her legs tremble as she moans— she's close to breaking completely!"
]>>
<<set setup.combatNarrative.claim_her_low_lust to [
"She struggles beneath you, trying desperately to escape your penetration!",
"She whimpers, her body resisting even as you claim her!",
"Her hands claw at the ground as she fights against your dominance!",
"She gasps in shock, overwhelmed by your brutal invasion!"
]>>
<<set setup.combatNarrative.mount_claim_high_lust to [
"She moans beneath you, her pussy gripping your cock eagerly!",
"Her legs wrap around you instinctively, pulling you deeper!",
"She gasps and pushes her hips up to meet your thrusts!",
"Her resistance crumbles as pleasure floods through her!"
]>>
<<set setup.combatNarrative.mount_claim_low_lust to [
"She struggles beneath your weight, trying to throw you off!",
"Her hands push against your chest, desperate to escape!",
"She twists and writhes, fighting your dominance!",
"Her eyes flash with defiance even as you claim her body!"
]>>
<<set setup.combatNarrative.tear_and_take_high_lust to [
"She moans and pushes her ass back against you, desperate for more!",
"Her pussy clenches around your cock, pulling you deeper!",
"She gasps and arches her back, submitting to your dominance!",
"Her resistance melts as pleasure overwhelms her will!"
]>>
<<set setup.combatNarrative.tear_and_take_low_lust to [
"She whimpers and tries to crawl away, but you hold her hips tight!",
"Her hands scrabble for purchase as she fights your claim!",
"She gasps in shock, overwhelmed by your brutal penetration!",
"Her body tenses, resisting your dominance with every fiber!"
]>>
<<set setup.combatNarrative.rip_and_enter_high_lust to [
"Her pussy clenches as she moans, lost in overwhelming pleasure!",
"She wraps her legs around you, pulling you deeper inside her!",
"Her back arches as she gasps, surrendering to ecstasy!",
"Her eyes roll back as pleasure destroys her resistance!"
]>>
<<set setup.combatNarrative.rip_and_enter_low_lust to [
"She struggles beneath you, trying to push you away!",
"Her hands beat against your chest as she fights!",
"She gasps and twists, desperate to escape your claim!",
"Her body resists even as you pin her completely!"
]>>
<<set setup.combatNarrative.anal_high_lust to [
"Her ass clenches rhythmically around your cock as she moans in ecstasy!",
"She pushes back against you, desperate for more despite the intensity!",
"She gasps and trembles, completely overwhelmed by the anal penetration!",
"Her resistance crumbles as pleasure floods through her!"
]>>
<<set setup.combatNarrative.anal_low_lust to [
"She whimpers and tries to pull away, but you hold her tight!",
"Her body tenses, resisting the intense penetration!",
"She gasps 'Not there!' but you ignore her protests!",
"Her hands claw desperately as you claim her ass!"
]>>
<<set setup.combatNarrative.grind_clothed_high_lust to [
"She moans and pushes back against you, desperate for more friction!",
"Her hips grind back rhythmically, her body betraying her need!",
"She gasps, soaking through her clothes from arousal!",
"Her resistance melts as she whimpers with desperate need!"
]>>
<<set setup.combatNarrative.grind_clothed_low_lust to [
"She squirms beneath you, trying to escape your grinding!",
"Her hands push against the ground, desperate for leverage!",
"She whimpers, hating how you dominate her prone form!",
"Her body tenses, resisting your insistent hardness!"
]>>
<<set setup.combatNarrative.mount_grind_high_lust to [
"She wraps her legs around you instinctively, moaning!",
"Her hips push up to meet your grinding, desperate!",
"She gasps, her clothes soaked with arousal!",
"Her resistance crumbles as pleasure overwhelms her!"
]>>
<<set setup.combatNarrative.mount_grind_low_lust to [
"She struggles beneath you but can't escape your weight!",
"Her hands push against your chest, desperate to throw you off!",
"She twists and bucks, fighting your dominance!",
"Her eyes flash defiance even as you grind against her!"
]>>
<<set setup.combatNarrative.grab_grind_high_lust to [
"She moans, pressing back against your hardness!",
"Her resistance falters as she grinds against you!",
"She gasps, her body responding eagerly despite herself!",
"Her legs tremble as arousal overwhelms her will!"
]>>
<<set setup.combatNarrative.grab_grind_low_lust to [
"She tries to pull away but you hold her tight!",
"Her hands claw at your arms, desperate to escape!",
"She whimpers, hating how your cock presses against her!",
"Her body tenses, fighting your dominant grip!"
]>>
<</silently>><<widget "initUseHerConfig">>
<<run setup.useHerConfig = {
actionName: "use_her",
energyCost: 5,
requiredState: "broken",
narrativePools: {
strip: "use_her_strip",
position: "use_her_position",
penetration: "use_her_penetration",
victimMoans: "use_her_victim_moans",
allyReactions: "use_her_ally_reactions",
climax: "use_her_climax"
},
videoFolders: {
strip: "combat/use_her_strip",
position: "combat/use_her_position",
penetration: "combat/use_her_penetration",
victimMoans: "combat/use_her_moans",
allyReactions: "combat/use_her_ally_reaction",
climax: "combat/use_her_climax"
},
secondaryVideoFolder: null,
fearEffect: {
duration: 2,
stacks: 1
},
playerLustDrop: {min: 25, max: 40},
dominanceGain: 3,
stunTarget: true,
stunnedTurns: 2,
markAsUsed: true,
nextPassage: "Combat_Actions"
}>>\
<</widget>><<silently>>
<<set setup.combatNarrative.use_her_strip to [
"You tear away what's left of her clothes, leaving her completely naked and exposed.",
"Her remaining clothing comes off easily—she doesn't even try to stop you anymore.",
"You rip the last scraps from her body. She's fully exposed now, broken and bare.",
"She whimpers as you strip her naked, too defeated to resist.",
"The last of her clothing falls away. She kneels before you, completely vulnerable.",
"You expose her fully, every inch of her body now on display for her allies to see."
]>>
<<set setup.combatNarrative.use_her_position to [
"You shove her down onto all fours, positioning yourself behind her.",
"You push her onto her back, spreading her legs wide.",
"You force her face-down, pulling her hips up to meet you.",
"She goes where you put her—bent over, ass raised, waiting.",
"You position her on her knees, her body angled for your use.",
"She's positioned exactly how you want her, completely at your mercy."
]>>
<<set setup.combatNarrative.use_her_penetration to [
"You thrust into her without warning, claiming her in front of everyone.",
"She gasps as you enter her, her body betraying her with immediate wetness.",
"You bury yourself inside her, making her allies watch their friend being used.",
"Her pussy takes you easily—she was wet before you even touched her.",
"You fuck her hard, each thrust making her moan despite herself.",
"She cries out as you fill her, her broken will offering no resistance.",
"You pound into her, using her body for your pleasure while combat rages.",
"Her walls clench around you as you take what you want from her."
]>>
<<set setup.combatNarrative.use_her_victim_moans to [
"\"Ah—! N-no... not in front of them...\"",
"\"Please... they're watching...\"",
"\"I can't... stop... feeling it...\"",
"\"Why does it... feel good...\"",
"\"Don't make me... cum... in front of them...\"",
"\"I'm... I'm just a hole to you...\"",
"\"Use me... I'm yours...\"",
"\"Harder... please... I need it...\""
]>>
<<set setup.combatNarrative.use_her_ally_reactions to [
"Her allies freeze, watching in horror as their companion is taken.",
"The remaining enemies falter, distracted by the brutal display.",
"\"You bastard!\" one of them screams, but makes no move to help.",
"They watch, transfixed and horrified, as you use their friend.",
"One of them looks away, unable to watch. The others can't stop staring.",
"Fear flickers across their faces—they know they could be next.",
"The sight of their ally being fucked shakes their resolve.",
"They hesitate, torn between fighting and fleeing."
]>>
<<set setup.combatNarrative.use_her_climax to [
"You finish inside her with a grunt, filling her in front of everyone.",
"You pull out and cum across her back, marking her as used.",
"She cums around you, screaming her shame as her allies watch.",
"You empty yourself into her, then shove her aside like a used toy.",
"With a final thrust you fill her, your seed dripping from her as you pull out.",
"You finish on her face, leaving her marked and humiliated before her friends."
]>>
<<set setup.combatNarrative.used_throat to [
"You ram your cock down her throat without mercy. She gags, chokes, drools—but takes every inch like the broken fucktoy she is.",
"You skull-fuck her brutally, your balls slapping her chin. Tears stream down her face as you use her throat like a wet sleeve.",
"Her throat bulges obscenely around your shaft. You hold her head and thrust deeper, cutting off her air. She can only take it.",
"You fuck her face hard and fast. Spit and precum drip from her chin. Her eyes roll back as you bottom out in her throat.",
"Grabbing fistfuls of her hair, you pound her mouth. She gurgles around your cock, completely destroyed, completely yours."
]>>
<<set setup.combatNarrative.used_fuck to [
"You slam into her ruined cunt without warning. She's still dripping from before—her body betrays her, desperate for more abuse.",
"You grab her hips and fuck her like the worthless cumslut she's become. Each savage thrust makes her scream in shameful pleasure.",
"Her pussy is wrecked and soaking. You pound into her anyway, using her body for your pleasure. She exists only as your fucktoy now.",
"You rail her mercilessly, her broken moans filling the air. She's nothing but holes to fill, and you fill them brutally.",
"Cock buried deep, you fuck her with punishing force. Her cunt clenches desperately around you—even now, she craves your abuse."
]>>
<<set setup.combatNarrative.used_anal to [
"You force your cock into her tight ass without prep. She screams as you stretch her, then moans as the pain turns to degrading pleasure.",
"Her ass resists, then surrenders. You pound her backdoor mercilessly, claiming this last hole as yours. She's completely owned now.",
"You sodomize her savagely, your cock splitting her open. She sobs and moans, her body shaking with each brutal thrust.",
"Balls deep in her ass, you fuck her like an animal. She claws at the ground, overwhelmed, but pushes back for more.",
"Her tight asshole grips your cock desperately as you destroy it. She'll feel this for days—a constant reminder of what she's become."
]>>
<<set setup.combatNarrative.used_missionary to [
"You force her onto her back and mount her, pinning her wrists above her head. She has to watch your face as you fuck her into submission.",
"Face to face, nowhere to hide. You pound into her while staring into her broken eyes. She cums anyway, hating herself for it.",
"You crush her beneath you, driving deep with each thrust. She wraps her legs around you instinctively—her body knows its master now.",
"Pinned and helpless, she takes every inch. You watch the shame and pleasure war across her face as you use her cunt.",
"You fuck her missionary so she has to look at you. So she has to see who owns her. She breaks under your gaze and begs for more."
]>>
<<set setup.combatNarrative.used_doggy to [
"You mount her from behind like a bitch in heat. She arches her back, presenting herself—she's learned her place.",
"Gripping her hips hard enough to bruise, you pound her from behind. The wet slap of flesh fills the air. She's just a hole to fuck.",
"You rail her doggy-style, one hand fisting her hair, yanking her head back. She moans like a whore with each savage thrust.",
"Ass up, face down—exactly where she belongs. You fuck her hard and deep, using her like the breeding stock she's become.",
"From behind, you can see your cock disappearing into her stretched cunt. You slap her ass hard and fuck her even harder."
]>>
<<set setup.combatNarrative.used_facefuck to [
"You grab her skull with both hands and fuck her face like a fleshlight. She gags, drools, chokes—none of it slows you down.",
"Her mouth is just another hole to ruin. You thrust down her throat relentlessly, her gagging sounds music to your ears.",
"You facefuck her until her makeup runs in streaks. Spit covers your cock and her chin. She's a ruined, drooling mess.",
"Holding her head still, you piston into her mouth. Her eyes water, her nose runs, but she keeps sucking like a good fucktoy.",
"You use her throat brutally, cutting off her air with each deep thrust. She's nothing but a warm, wet hole for your cock."
]>>
<<set setup.combatNarrative.used_victim_moans to [
"\"Nngh—! Fuck... use me... I'm just your toy...\"",
"\"Please... harder... break me more...\"",
"\"I'm nothing... just holes for you to fill...\"",
"\"God yes... ruin me... I deserve this...\"",
"\"More... please... I need your cock...\"",
"\"I'm your slut now... use me however you want...\"",
"\"Ahh—! Don't stop... I'm already broken...\""
]>>
<<set setup.combatNarrative.used_climax to [
"You bury yourself to the hilt and flood her with cum. She moans as your seed fills her—marked, claimed, owned.",
"You pull out and paint her with your load. Face, tits, stomach—she's covered in proof of what she's become.",
"With a final savage thrust, you empty your balls inside her. She cums too, unable to resist anymore.",
"You pump her full of cum, then shove her aside. She lies there leaking, a used and discarded fucktoy.",
"You finish deep inside, your cock pulsing as you fill her. She's nothing but a cumdump now, and she knows it."
]>>
<<set setup.combatNarrative.choke_fuck_grab to [
"Your hand clamps around her throat like a vice. You feel her pulse hammering against your palm—she knows what's coming.",
"You seize her neck and squeeze. Her eyes go wide with terror as you cut off her air, asserting total control.",
"Your fingers dig into her throat, crushing her windpipe. She claws at your hand but you only grip tighter.",
"You choke her hard, watching her face turn red. Her mouth opens in a silent scream—she can't breathe, can't fight, can only submit."
]>>
<<set setup.combatNarrative.choke_fuck_action to [
"Hand on throat, cock in cunt. You fuck her while controlling every breath she takes. Squeeze—thrust—release. She's yours completely.",
"You pound into her savagely while choking the life from her. Her pussy clenches desperately around you, her body betraying her terror.",
"Each brutal thrust drives deeper as you tighten your grip. Her face is crimson, veins bulging, but her cunt is dripping.",
"You choke-fuck her mercilessly, cutting off her air with each thrust. She gurgles and twitches, on the edge of consciousness and orgasm."
]>>
<<set setup.combatNarrative.choke_fuck_victim_sounds to [
"Wet, strangled gurgles escape her crushed throat—sounds no longer human, just animal desperation.",
"She makes pathetic choking noises, her tongue lolling out, drool running down her chin as you fuck her senseless.",
"Her attempts to breathe come out as ragged wheezes between your thrusts. She sounds like a dying animal—and cums like one too.",
"Strangled screams turn to gurgles turn to silence as you choke her harder. Only the wet slap of flesh and her spasming cunt make sound."
]>>
<<set setup.combatNarrative.choke_fuck_climax to [
"You release her throat as you cum, and she SCREAMS—a raw, primal sound as air and orgasm hit simultaneously. You flood her convulsing cunt.",
"Her eyes roll back as you empty yourself inside her. She cums from the asphyxiation, her whole body seizing, cunt milking your cock.",
"You finish deep as her face goes purple. Only then do you release her. She gulps air and cum leaks from her ruined hole.",
"With one final choking squeeze, you pump her full of seed. She passes out on your cock, twitching, destroyed, utterly conquered."
]>>
<</silently>><<widget "enhancedEnemyAbilityCard">>
<<set _eabAction to _args[0]>>
<<set _eabEnemy to _eabAction.enemyRef>>
<<set _eabAbility to _eabAction.abilityObject>>
<<set _eabResult to _eabAction.abilityResult>>
<<set _eabIdx to _eabAction.enemyIndex>>
<<if !_eabEnemy>>
<div class="combat-card enemy-card enemy-ability-card"><div class="card-header ability-header"><<icon "ghost" "medium">><span class="enemy-card-name">ENEMY</span></div></div>
<<else>>
<div class="combat-card enemy-card enemy-ability-card">
<!-- HEADER -->
<div class="card-header ability-header">
<<icon "ghost" "medium">>
<span class="enemy-card-name"><<print _eabEnemy.name.toUpperCase()>></span>
<span class="enemy-card-number">#<<print (_eabIdx + 1)>></span>
<span class="ability-name"><<print _eabAbility.toUpperCase().replace(/_/g, " ")>></span>
</div>
<!-- VIDEO PRIMARY: the ability's slot (setup.enemyAbilityVideoFolders),
filtered on whoever it targets -->
<div class="card-video-primary" @id="'enemy-video-primary-' + _eabIdx" style="display:none"></div>
<<set _eabFolder to setup.enemyAbilityVideoFolders && setup.enemyAbilityVideoFolders[_eabAbility]>>
<<if _eabFolder>>
<<if _eabAction.abilityTarget === "kira">>
<<kiraMediaTarget>>
<<set _eabMediaTarget to _kiraMediaTarget>>
<<else>>
<<playerMediaTarget _eabEnemy>>
<<set _eabMediaTarget to _playerMediaTarget>>
<</if>>
<<if _eabEnemy.gender === "male" || _eabEnemy.gender === "female">>
<<set _eabMediaTarget.mediaGender to _eabEnemy.gender>>
<</if>>
<<fillCombatVideoBox `"enemy-video-primary-" + _eabIdx` _eabFolder `setup.attackerFolderTarget(_eabMediaTarget)`>>
<</if>>
<!-- NARRATIVE -->
<div class="card-narrative ability" @id="'enemy-narrative-' + _eabIdx">
<<if _eabResult.narrative>>
<p><<print _eabResult.narrative>></p>
<<else>>
<!-- Narrative may be injected during execution -->
<</if>>
</div>
<!-- VIDEO SECONDARY (placeholder) -->
<div class="card-video-secondary" @id="'enemy-video-secondary-' + _eabIdx">
<!-- Secondary effect video if applicable -->
</div>
<!-- STATS (using shared helpers) -->
<<enemyCardStats _eabEnemy>>
<!-- ACTION LABEL -->
<div class="card-action">
<<icon "ghost" "medium">>
<<print _eabAbility.replace(/_/g, " ").toUpperFirst()>>
<span class="action-target">→ <<print (_eabAction.abilityTarget === "kira" ? "KIRA" : "YOU")>></span>
</div>
<!-- ABILITY STATS -->
<div class="ability-stats">
<<if _eabResult.damageMultiplier && _eabResult.damageMultiplier > 0>>
<div class="ability-stat">
<span class="stat-label">Damage:</span>
<span class="stat-value"><<print Math.floor(_eabResult.damageMultiplier * 100)>>% weapon damage</span>
<<if _eabResult.hits > 1>>
<span class="stat-extra">(×<<print _eabResult.hits>> hits)</span>
<</if>>
</div>
<</if>>
<<if _eabResult.accuracyMod !== 0>>
<div class="ability-stat">
<span class="stat-label">Accuracy:</span>
<span @class="'stat-value ' + ((_eabResult.accuracyMod > 0 ? 'stat-positive' : 'stat-negative'))">
<<if _eabResult.accuracyMod > 0>>+<</if>><<print _eabResult.accuracyMod>>%
</span>
</div>
<</if>>
<<if _eabResult.effects && _eabResult.effects.length > 0>>
<div class="ability-stat">
<span class="stat-label">Effects:</span>
<span class="stat-value">
<<print _eabResult.effects.map(function(e) { return e.replace(/_/g, " ").toUpperFirst(); }).join(", ")>>
</span>
</div>
<</if>>
</div>
<!-- RESULT (placeholder - populated during execution) -->
<div @id="'enemy-result-' + _eabIdx">
<!-- Damage results injected here during execution -->
</div>
<!-- HEALTH UPDATE (placeholder - populated during execution) -->
<div @id="'enemy-health-update-' + _eabIdx">
<!-- Target HP bar injected here during execution -->
</div>
<!-- KNOCKDOWN (populated if the ability's weapon effect knocks the target
down: clip + position text, moved in by executeAbilityDamage) -->
<div class="card-knockdown" @id="'enemy-knockdown-' + _eabIdx"></div>
</div>
<</if>>
<</widget>><<widget "enhancedEnemyAttackCard">>
<<set _eacAction to _args[0]>>
<<set _eacEnemy to _eacAction.enemyRef>>
<<set _eacIdx to _eacAction.enemyIndex>>
<<if !_eacEnemy>>
<div class="combat-card enemy-card enemy-attack-card">
<div class="card-header attack-header"><<icon "attack" "medium">><span class="enemy-card-name">ENEMY</span></div>
</div>
<<else>>
<div class="combat-card enemy-card enemy-attack-card">
<!-- HEADER with enemy type icon -->
<div class="card-header attack-header">
<<if _eacEnemy.tier === "boss" || _eacEnemy.tier === "champion">>
<<icon "skull-bones" "medium">>
<<elseif _eacEnemy.type === "supernatural">>
<<icon "ghost" "medium">>
<<elseif _eacEnemy.gender === "female">>
<<icon "corruption" "medium">>
<<else>>
<<icon "attack" "medium">>
<</if>>
<span class="enemy-card-name"><<print _eacEnemy.name.toUpperCase()>></span>
<span class="enemy-card-number">#<<print (_eacIdx + 1)>></span>
</div>
<div class="card-narrative attack" @id="'enemy-narrative-' + _eacIdx"></div>
<div class="card-video-primary" @id="'enemy-video-primary-' + _eacIdx"></div>
<div class="card-video-secondary" @id="'enemy-video-secondary-' + _eacIdx"></div>
<!-- STATS (using shared helpers) -->
<<enemyCardStats _eacEnemy>>
<!-- ACTION LABEL (with weapon if applicable) -->
<div class="card-action">
<<icon "attack" "medium">>
Attacking<<if setup.weaponFor(_eacEnemy)>> <span class="action-weapon">(<<print setup.weaponFor(_eacEnemy).name>>)</span><</if>>
<span class="action-target">→ <<print (_eacAction.attackTarget === "kira" ? "KIRA" : "YOU")>></span>
</div>
<!-- FEAR PENALTY (if applicable) -->
<<if _eacEnemy.fearPenalty>>
<div class="card-status-modifier fear">
<<icon "afraid" "medium">>
<em>Fear weakens their attack...</em>
</div>
<</if>>
<!-- COVERING STATUS (narrative + penalty if applicable) -->
<<if _eacAction.coveringNarrative && _eacAction.coveringNarrativeType !== "none">>
<div @class="'card-status-modifier covering ' + (_eacAction.coveringNarrativeType)">
<<if _eacAction.coveringNarrativeType === "broken">>
<<icon "humiliation" "medium">>
<<elseif _eacAction.coveringNarrativeType === "stopped">>
<<icon "shield" "medium">>
<<else>>
<<icon "shield" "medium">>
<</if>>
<p class="covering-narrative"><<print _eacAction.coveringNarrative>></p>
<<if _eacAction.coveringNarrativeType === "covering" && _eacEnemy.coveringAccPenalty>>
<span class="penalty-value">Covering penalty: -<<print _eacEnemy.coveringAccPenalty>>% accuracy, no heavy attacks</span>
<</if>>
</div>
<<elseif _eacEnemy.isCovering && _eacEnemy.coveringAccPenalty>>
<div class="card-status-modifier covering">
<<icon "shield" "medium">>
Covering <<if _eacEnemy.coveringPart === "both">>herself<<elseif _eacEnemy.coveringPart === "pussy">>her pussy<<else>>her tits<</if>>
<span class="penalty-value">(-<<print _eacEnemy.coveringAccPenalty>>% accuracy)</span>
</div>
<</if>>
<!-- WEAPON ESCALATION (if tier 2 or 3) -->
<<if _eacEnemy.weaponTier && _eacEnemy.weaponTier > 1>>
<div @class="'card-status-modifier escalation tier-' + (_eacEnemy.weaponTier)">
<<if _eacEnemy.weaponTier === 3>>
<<icon "flame" "medium">>
<em>Weapon used as sexual tool...</em>
<<else>>
<<icon "high-arousal" "medium">>
<em>Sexual intent in their attacks...</em>
<</if>>
</div>
<</if>>
<div class="card-result-placeholder" @id="'enemy-result-' + _eacIdx"></div>
<div class="card-clothing-damage" @id="'enemy-clothing-' + _eacIdx"></div>
<div class="card-health-placeholder" @id="'enemy-health-update-' + _eacIdx"></div>
<div class="card-status-effects" @id="'enemy-status-' + _eacIdx"></div>
<div class="card-knockdown" @id="'enemy-knockdown-' + _eacIdx"></div>
</div>
<</if>>
<</widget>><<widget "executeAbilityDamage">>
<<set _eadAction to _args[0]>>
<<set _eadEnemy to _eadAction.enemyRef>>
<<set _eadIdx to _eadAction.enemyIndex>>
<<set _eadResult to _eadAction.abilityResult>>
<<set _eadTarget to _eadAction.abilityTarget>>
<<set _eadDamaging to !!(_eadResult.damageMultiplier && _eadResult.damageMultiplier > 0)>>
<<if !_eadDamaging && _eadResult.effects && _eadResult.effects.length > 0>>
<<applyAbilityEffects _eadEnemy _eadResult.effects _eadTarget _eadResult>>
<</if>>
<<if _eadResult.damageMultiplier && _eadResult.damageMultiplier > 0>>
<<set _eadWeapon to null>>
<<set _eadWeapon to setup.weaponFor(_eadEnemy)>>
<<set _eadBaseDmg to setup.enemyHitBase(_eadEnemy) + _eadAction.preRolls.damageVariance>>
<<set _eadDamage to Math.floor(_eadBaseDmg * _eadResult.damageMultiplier)>>
<<getEnemyDamageModifiers _eadEnemy>>
<<set _eadDamage to Math.floor(_eadDamage * _returnDamageMod)>>
<<getArousalModifiers _eadIdx>>
<<getCoveringModifiers _eadIdx>>
<<set _eadArousalAccPenalty to (_aroAccPenalty || 0) + (_covAccPenalty || 0)>>
<<set _eadArousalDmgPenalty to (_aroDmgPenalty || 0) + (_covDmgPenalty || 0)>>
<<if _eadArousalDmgPenalty > 0>>
<<set _eadDamage to Math.floor(_eadDamage * (100 - _eadArousalDmgPenalty) / 100)>>
<</if>>
<<set _eadTotalDamage to 0>>
<<set _eadHitsLanded to 0>>
<<for _eadHit to 0; _eadHit lt _eadResult.hits; _eadHit++>>
<<set _eadHitChance to 70 + (_eadResult.accuracyMod || 0) + setup.enemyAccuracyMod(_eadEnemy) - _eadArousalAccPenalty>>
<<set _eadHitChance to Math.floor(_eadHitChance * setup.enemyAccuracyFactor(_eadEnemy))>>
<<set _eadHitDamage to _eadDamage>>
<<set _eadHitRoll to (_eadHit === 0 && _eadAction.preRolls && _eadAction.preRolls.hitRoll) ? _eadAction.preRolls.hitRoll : random(1, 100)>>
<<if _eadHitRoll gt _eadHitChance>>
<<set _eadHitDamage to 0>>
<</if>>
<<if !setup.defensiveMechanicsConfig>><<initDefensiveActionConfigs>><</if>>
<<set _defMechCfg to setup.defensiveMechanicsConfig>>
<<if $combat.parrying && _eadTarget === "player">>
<<set _eadParryChance to _defMechCfg.baseParryChance + ($player.agility * _defMechCfg.parryAgilityMultiplier) - ($combat.parryPenalty || 0)>>
<<if _eadAction.preRolls.parryRoll <= _eadParryChance>>
<<set _eadHitDamage to 0>>
<<set $combat.parrySuccess to true>>
<</if>>
<<elseif $combat.blocking && _eadTarget === "player">>
<<set _eadBlockReduction to _defMechCfg.baseBlockReduction - ($combat.blockPenalty || 0)>>
<<set _eadHitDamage to Math.floor(_eadHitDamage * (100 - _eadBlockReduction) / 100)>>
<<elseif $combat.defending && _eadTarget === "player">>
<<set _eadHitDamage to Math.floor(_eadHitDamage / 2)>>
<</if>>
<<if $combat.dodging && _eadTarget === "player" && _eadHitDamage > 0>>
<<set _eadDodgeChance to _defMechCfg.baseDodgeBonus + ($player.agility * _defMechCfg.parryAgilityMultiplier)>>
<<if _eadAction.preRolls.dodgeRoll <= _eadDodgeChance>>
<<set _eadHitDamage to 0>>
<</if>>
<</if>>
<<if _eadHitDamage > 0>>
<<set _eadHitsLanded += 1>>
<<if _eadTarget === "player">>
<<set _negEadHitDamage to -_eadHitDamage>>
<<clampStat "player.health" _negEadHitDamage 0 100>>
<<set _eadTotalDamage += _eadHitDamage>>
<<elseif _eadTarget === "kira">>
<<set _eadHitDamage to Math.floor(_eadHitDamage * setup.kiraDamageTakenFactor())>>
<<getCompanion "kira">>
<<set $tempCompanion.health to setup.kiraFloorHealth(Math.max(1, $tempCompanion.health - _eadHitDamage))>>
<<updateCompanion "kira">>
<<set _eadTotalDamage += _eadHitDamage>>
<</if>>
<</if>>
<</for>>
<<if _eadHitsLanded > 0 && _eadResult.effects && _eadResult.effects.length > 0>>
<<applyAbilityEffects _eadEnemy _eadResult.effects _eadTarget _eadResult>>
<</if>>
<<if _eadTotalDamage > 0>>
<<if _eadWeapon>>
<div class="weapon-effects-wrapper" @data-enemy-idx="_eadIdx">
<<applyWeaponEffects _eadTarget _eadWeapon _eadTotalDamage _eadEnemy>>
</div>
<</if>>
<<if $flags.seductionUnlocked && random(1, 100) <= (_eadTarget === "kira" ? setup.kiraClothingTearChance(_eadEnemy, _eadWeapon) : 40)>>
<<if _eadTarget === "kira">>
<<set _eadClothingPart to ($clothing.kira.bottom === 0) ? either("top", "underwear") : either("top", "bottom")>>
<<damageClothingWithArmor "kira" _eadClothingPart `setup.kiraClothingTear(_eadEnemy, _eadWeapon, _eadClothingPart)`>>
<<elseif _eadWeapon && _eadWeapon.clothingDamage>>
<<set _eadClothingPart to either("top", "bottom")>>
<<damageClothingWithArmor _eadTarget _eadClothingPart _eadWeapon.clothingDamage[_eadClothingPart]>>
<<else>>
<<damageClothingWithArmor _eadTarget "random" `random(10, 20)`>>
<</if>>
<<checkWardrobeMalfunction _eadTarget "combat">>
<</if>>
<<if _eadTarget === "player" && $player.health <= 0>>
<<set _etDefeat to true>>
<</if>>
<<run (function(idx, totalDamage, hits) {
setTimeout(function() {
var resultContainer = document.getElementById('enemy-result-' + idx);
if (resultContainer) {
var statusText = (hits > 1) ? hits + ' HITS' : 'HIT';
var html = '<div class="card-result hit">';
html += '<span class="result-status">' + statusText + '</span>';
html += '<span class="result-sep">|</span>';
html += '<span class="result-damage">' + totalDamage + ' DMG</span>';
html += '<span class="result-sep">|</span>';
html += '<span class="result-type">Supernatural</span>';
html += '</div>';
resultContainer.innerHTML = html;
}
setup.emptyWeaponWrapper(
document.querySelector('.weapon-effects-wrapper[data-enemy-idx="' + idx + '"]'),
document.getElementById('enemy-status-' + idx),
document.getElementById('enemy-knockdown-' + idx));
}, 50);
})(State.temporary.eadIdx, State.temporary.eadTotalDamage, State.temporary.eadHitsLanded)>>
<<injectHealthUpdate _eadIdx _eadTarget>>
<<else>>
<<logCombat `_eadEnemy.name + "'s attack misses!"` "miss">>
<<run (function(idx) {
setTimeout(function() {
var resultContainer = document.getElementById('enemy-result-' + idx);
if (resultContainer) resultContainer.innerHTML = '<div class="card-result miss"><span class="result-status">MISS</span></div>';
}, 50);
})(State.temporary.eadIdx)>>
<</if>>
<</if>>
<</widget>>
<<widget "executeEnemyAction">>
<<set _eexAction to _args[0]>>
<<set _eexIdx to _eexAction.enemyIndex>>
<<set _eexEnemy to $combat.enemies[_eexIdx]>>
<<switch _eexAction.actionType>>
<<case "subdued">>
<<case "sleep">>
<<case "stunned">>
<<set $combat.enemies[_eexIdx].stunnedTurns to Math.max(0, (Number($combat.enemies[_eexIdx].stunnedTurns) || 0) - 1)>>
<<if $combat.enemies[_eexIdx].stunnedTurns lte 0>>
<<set $combat.enemies[_eexIdx].stunned to false>>
<<set $combat.enemies[_eexIdx].stunnedTurns to 0>>
<</if>>
<<case "lust_break">>
<<if $combat.enemies[_eexIdx].stunnedTurns && $combat.enemies[_eexIdx].stunnedTurns > 0>>
<<set $combat.enemies[_eexIdx].stunnedTurns -= 1>>
<<if $combat.enemies[_eexIdx].stunnedTurns lte 0>>
<<set $combat.enemies[_eexIdx].stunned to false>>
<<set $combat.enemies[_eexIdx].stunnedTurns to 0>>
<<set _lustDrop to random(35, 50)>>
<<set $combat.enemies[_eexIdx].lust to Math.max(0, $combat.enemies[_eexIdx].lust - _lustDrop)>>
<</if>>
<</if>>
<<case "feared_cower" "feared_fail" "humiliation_broken">>
<<case "pinned_struggle">>
<<if _eexAction.breaksFree>>
<<set $combat.enemies[_eexIdx].position to "standing">>
<<set $combat.enemies[_eexIdx].positionHeldTurns to 0>>
<<set $combat.enemies[_eexIdx].pinStruggles to 0>>
<<logEnemyPositionChange _eexIdx "pinned" "escape">>
<<else>>
<<set $combat.enemies[_eexIdx].pinStruggles to ($combat.enemies[_eexIdx].pinStruggles || 0) + 1>>
<</if>>
<<case "feared_fled">>
<<set $combat.enemies[_eexIdx].health to 0>>
<<set $combat.enemies[_eexIdx].fled to true>>
<<case "sex">>
<<set _actualEnemyIdx to _eexAction.enemyIndex>>
<<set $combat.currentEnemyIndex to _actualEnemyIdx>>
<<set _currentEnemyIndex to _actualEnemyIdx>>
<<if _eexAction.sexTarget === "kira" && !setup.kiraInFight()>>
<<set $combat.pendingSexAction to null>>
<<set _eexDropLog to _eexEnemy.name + " #" + (_actualEnemyIdx + 1) + " turns away from Kira: she's down.">>
<<logCombat _eexDropLog "tactical">>
<<else>>
<<set $combat.pendingSexAction to {
passage: _eexAction.sexPassage,
intent: _eexAction.sexIntent,
enemyIndex: _actualEnemyIdx,
enemyName: _eexEnemy.name
}>>
<</if>>
<<case "ability">>
<<executeAbilityDamage _eexAction>>
<<case "attack">>
<<executeStandardAttack _eexAction>>
<</switch>>
<</widget>>
<<widget "executeStandardAttack">>
<<set _esaAction to _args[0]>>
<<set _esaEnemy to _esaAction.enemyRef>>
<<set _esaIdx to _esaAction.enemyIndex>>
<<set _esaTarget to _esaAction.attackTarget>>
<<if _esaTarget === "player">>
<<set _esaPositionHitBonus to 0>>
<<if $combat.positions && $combat.positions.player>>
<<switch $combat.positions.player>>
<<case "kneeling">><<set _esaPositionHitBonus to 10>>
<<case "prone_front" "prone_back">><<set _esaPositionHitBonus to 20>>
<<case "bent_over">><<set _esaPositionHitBonus to 25>>
<<case "pinned">><<set _esaPositionHitBonus to 30>>
<</switch>>
<</if>>
<<set _esaAccuracy to 70 - ($player.agility || 10)>>
<<if $clothing && $clothing.player && $clothing.player.dickExposed>>
<<set _esaAccuracy += 5>>
<</if>>
<<if $combat.playerVulnerable>><<set _esaAccuracy += 10>><</if>>
<<if $combat.resting>><<set _esaAccuracy += 20>><</if>>
<<getArousalModifiers _esaIdx>>
<<getCoveringModifiers _esaIdx>>
<<getFlauntModifiers _esaIdx>>
<<set _esaAccuracy -= (_aroAccPenalty || 0)>>
<<if _esaEnemy.isCovering>><<set _esaAccuracy -= (_esaEnemy.coveringAccPenalty || 0)>><</if>>
<<set _esaAccuracy -= (_flauntAccPenalty || 0)>>
<<set _esaAccuracy += setup.enemyAccuracyMod(_esaEnemy)>>
<<set _esaHitChance to _esaAccuracy + _esaPositionHitBonus>>
<<set _esaHitChance to Math.floor(_esaHitChance * setup.enemyAccuracyFactor(_esaEnemy))>>
<<if _esaAction.preRolls.hitRoll lte _esaHitChance>>
<<if setup.weaponFor(_esaEnemy)>>
<<set _esaWeapon to setup.weaponFor(_esaEnemy)>>
<<else>>
<<set _esaWeapon to null>>
<</if>>
<<set _esaDamage to (setup.enemyHitBase(_esaEnemy) || 5) + (_esaAction.preRolls.damageVariance || 0)>>
<<if isNaN(_esaDamage)>>
<<run console.warn('[DAMAGE] NaN detected, defaulting to 5')>>
<<set _esaDamage to 5>>
<</if>>
<<set _esaDamage to Math.round(_esaDamage * setup.enemyDamageFactor(_esaEnemy))>>
<<if $combat.enemies.length >= 4>><<set _esaDamage to Math.floor(_esaDamage * 1.15)>>
<<elseif $combat.enemies.length >= 3>><<set _esaDamage to Math.floor(_esaDamage * 1.08)>>
<</if>>
<<set _esaEnemy.fearPenalty to false>>
<<if _aroDmgPenalty gt 0>><<set _esaDamage to Math.floor(_esaDamage * (100 - _aroDmgPenalty) / 100)>><</if>>
<<getPositionDamageMultipliers _esaIdx>>
<<if _posDefMult lt 1.0>><<set _esaDamage to Math.floor(_esaDamage * _posDefMult)>><</if>>
<<if _esaEnemy.dealsLustDamage>>
<<set $player.lust to Math.min(100, Math.max(0, (Number($player.lust) || 0) + Number(_esaEnemy.lustDamage || 10)))>>
<</if>>
<<if !setup.defensiveMechanicsConfig>><<initDefensiveActionConfigs>><</if>>
<<set _esaDefMechCfg to setup.defensiveMechanicsConfig>>
<<if $combat.parrying>>
<<set _esaParryChance to _esaDefMechCfg.baseParryChance + ($player.agility * _esaDefMechCfg.parryAgilityMultiplier) - ($combat.parryPenalty || 0)>>
<<if _esaAction.preRolls.parryRoll <= _esaParryChance>>
<<set _esaDamage to 0>>
<<set $combat.parrySuccess to true>>
<</if>>
<<elseif $combat.blocking>>
<<set _esaBlockReduction to _esaDefMechCfg.baseBlockReduction - ($combat.blockPenalty || 0)>>
<<set _esaDamage to Math.floor(_esaDamage * (100 - _esaBlockReduction) / 100)>>
<<elseif $combat.defending>>
<<set _esaDamage to Math.floor(_esaDamage / 2)>>
<<elseif $combat.dodging>>
<<set _esaDodgeChance to _esaDefMechCfg.baseDodgeBonus + ($player.agility * _esaDefMechCfg.parryAgilityMultiplier)>>
<<if $combat.armorEffects && $combat.armorEffects.mobilityPenalty > 0>>
<<set _esaDodgeChance to Math.floor(_esaDodgeChance * (1 - $combat.armorEffects.mobilityPenalty))>>
<</if>>
<<if _esaPositionHitBonus gt 0>>
<<set _esaDodgeChance to Math.max(0, _esaDodgeChance - _esaPositionHitBonus)>>
<</if>>
<<if _esaAction.preRolls.dodgeRoll lte _esaDodgeChance>>
<<set _esaDamage to 0>>
<</if>>
<</if>>
<<if _esaDamage gt 0>>
<<set _attackType to "strike">>
<<if _esaEnemy && _esaEnemy.weapon>>
<<silently>><<selectEnemyAttackType _esaEnemy "player" $clothing.player>><</silently>>
<</if>>
<<set _esaPlayerDefense to ($combat.armorEffects && $combat.armorEffects.defense) || 0>>
<<if $clothing && $clothing.player && $clothing.player.top>>
<<if $clothing.player.top >= 26 && $clothing.player.top <= 50>><<set _esaPlayerDefense -= 1>>
<<elseif $clothing.player.top >= 1 && $clothing.player.top <= 25>><<set _esaPlayerDefense -= 2>>
<</if>>
<</if>>
<<set _esaDamage to Math.max(1, _esaDamage - _esaPlayerDefense)>>
<<set _esaSexHit to !!(_esaEnemy && _esaEnemy.gender === "female" && _esaEnemy.weapon && (_esaEnemy.lust || 0) >= 60)>>
<<if _esaSexHit>><<set _esaDamage to Math.max(1, Math.floor(_esaDamage / 2))>><</if>>
<<set _esaNegDamage to -_esaDamage>>
<<clampStat "player.health" _esaNegDamage 0 100>>
<<if _esaSexHit>><<addLust "player" `random(8, 12)`>><</if>>
<<set $player.energy to Math.min($player.maxEnergy || 100, $player.energy + 3)>>
<<breakCombo "took damage">>
<<if _esaEnemy && _esaDamage !== undefined>>
<<set _enemyHitLog to _esaEnemy.name + " #" + (_esaIdx + 1) + " hits you for " + _esaDamage + " damage!">>
<<logCombat _enemyHitLog "damage">>
<</if>>
<<getEnemyHitPlayerNarrative _esaDamage _esaEnemy _attackType>>
<<set _mediaPath to null>>
<<set _mediaFormat to null>>
<<set _isSexualAttack to false>>
<<set _sexualReason to "">>
<<if $clothing && $clothing.player && ($clothing.player.dickExposed || $clothing.player.dickOut)>>
<<if _esaEnemy && _esaEnemy.gender === "female" && (_esaEnemy.lust || 0) >= 50>>
<<set _isSexualAttack to true>>
<<set _sexualReason to "exposed_lust">>
<</if>>
<</if>>
<<if _esaEnemy && _esaEnemy.gender === "female" && _esaEnemy.weaponTier === 3>>
<<set _isSexualAttack to true>>
<<set _sexualReason to "weapon_tier3">>
<</if>>
<<playerMediaTarget _esaEnemy>>
<<enemyAttackVideo `"enemy-video-primary-" + _esaIdx` _esaWeapon "hit" _isSexualAttack _playerMediaTarget _esaEnemy>>
<<if _esaWeapon>>
<div class="weapon-effects-wrapper" @data-enemy-idx="_esaIdx">
<<applyWeaponEffects "player" _esaWeapon _esaDamage _esaEnemy>>
</div>
<</if>>
<<injectHealthUpdate _esaIdx _esaTarget>>
<<set _clothingDamaged to false>>
<<set _clothingMessage to "">>
<<set _wasDickExposedBefore to ($clothing.player.dickExposed || false)>>
<<set _pcdCfg to setup.playerClothingDamageConfig || {baseChance: 45, femaleEnemyChance: 60, fallbackDamage: {min: 10, max: 18}}>>
<<set _pcdBaseChance to (_esaEnemy && _esaEnemy.gender === "female") ? _pcdCfg.femaleEnemyChance : _pcdCfg.baseChance>>
<<set _cdChance to (_esaWeapon && _esaWeapon.clothingDamageChance) ? _esaWeapon.clothingDamageChance : _pcdBaseChance>>
<<set _cdRoll to random(1, 100)>>
<<if $flags.seductionUnlocked && _cdRoll lte _cdChance>>
<<set _clothingBefore to {top: $clothing.player.top, bottom: $clothing.player.bottom, underwear: $clothing.player.underwear}>>
<<silently>>
<<if _esaWeapon && _esaWeapon.clothingDamage>>
<<set _esaCD to either("top", "bottom")>>
<<damageClothingWithArmor "player" _esaCD _esaWeapon.clothingDamage[_esaCD]>>
<<else>>
<<if $clothing.player.bottom === 0>>
<<set _esaCDRandom to either("top", "underwear")>>
<<else>>
<<set _esaCDRandom to either("top", "bottom")>>
<</if>>
<<damageClothingWithArmor "player" _esaCDRandom `random(_pcdCfg.fallbackDamage.min, _pcdCfg.fallbackDamage.max)`>>
<</if>>
<</silently>>
<<set _clothingReaction to "">>
<<capture _clothingReaction>><<checkWardrobeMalfunction "player" "combat">><</capture>>
<<if $clothing.player.top lt _clothingBefore.top>>
<<set _clothingDamaged to true>>
<<set _cdAmount to _clothingBefore.top - $clothing.player.top>>
<<if $clothing.player.top === 0>>
<<set _clothingMessage to '<span class="icon icon-broken-heart icon-small"></span> Top destroyed!'>>
<<elseif $clothing.player.top lt 26>>
<<set _clothingMessage to '<span class="icon icon-shirt icon-small"></span> -' + _cdAmount + '% top (torn)'>>
<<else>>
<<set _clothingMessage to '<span class="icon icon-shirt icon-small"></span> -' + _cdAmount + '% top'>>
<</if>>
<<elseif $clothing.player.bottom lt _clothingBefore.bottom>>
<<set _clothingDamaged to true>>
<<set _cdAmount to _clothingBefore.bottom - $clothing.player.bottom>>
<<if $clothing.player.bottom === 0>>
<<set _clothingMessage to '<span class="icon icon-broken-heart icon-small"></span> Bottom destroyed!'>>
<<elseif $clothing.player.bottom lt 26>>
<<set _clothingMessage to '<span class="icon icon-pants icon-small"></span> -' + _cdAmount + '% bottom (torn)'>>
<<else>>
<<set _clothingMessage to '<span class="icon icon-pants icon-small"></span> -' + _cdAmount + '% bottom'>>
<</if>>
<<elseif $clothing.player.underwear lt _clothingBefore.underwear>>
<<set _clothingDamaged to true>>
<<set _cdAmount to _clothingBefore.underwear - $clothing.player.underwear>>
<<if $clothing.player.underwear === 0>>
<<set _clothingMessage to '<span class="icon icon-broken-heart icon-small"></span> Underwear destroyed!'>>
<<elseif $clothing.player.underwear lt 26>>
<<set _clothingMessage to '<span class="icon icon-underwear icon-small"></span> -' + _cdAmount + '% underwear (torn)'>>
<<else>>
<<set _clothingMessage to '<span class="icon icon-underwear icon-small"></span> -' + _cdAmount + '% underwear'>>
<</if>>
<</if>>
<</if>>
<<set _kiraExposureReaction to "">>
<<if !_wasDickExposedBefore && $clothing.player.dickExposed && setup.kiraInFight() && setup.combatNarrative && setup.combatNarrative.kira_sees_player_exposed>>
<<set _kiraExposureReaction to setup.combatNarrative.kira_sees_player_exposed.random()>>
<</if>>
<<if $flags.seductionUnlocked && _esaDamage gte 12 && random(1, 100) lte 40>>
<<knockdown "player" "random">>
<</if>>
<<run (function(idx, narrativeText, damage, mediaPath, mediaFormat, clothingDamaged, clothingMessage, clothingReaction, statusEffectOutput, enemyTaunt, kiraExposureReaction, lustFlavor, playerReaction) {
setTimeout(function() {
if (mediaPath) {
var mediaContainer = document.getElementById('enemy-video-primary-' + idx);
if (mediaContainer) {
if (mediaFormat === 'webm' || mediaFormat === 'mp4') {
mediaContainer.innerHTML = '<video src="' + mediaPath + '" autoplay loop muted playsinline class="constrained-combat-video"></video>';
} else {
mediaContainer.innerHTML = '<img src="' + mediaPath + '" class="constrained-combat-video" alt="Attack">';
}
}
}
var narrativeContainer = document.getElementById('enemy-narrative-' + idx);
if (narrativeContainer && narrativeText) {
var narrativeHtml = '<p class="enemy-narrative">' + narrativeText + '</p>';
if (playerReaction) {
narrativeHtml += '<p class="player-reaction">' + playerReaction + '</p>';
}
if (lustFlavor) {
narrativeHtml += '<p class="lust-flavor">' + lustFlavor + '</p>';
}
if (enemyTaunt) {
narrativeHtml += '<p class="enemy-taunt">' + enemyTaunt + '</p>';
}
if (kiraExposureReaction) {
narrativeHtml += '<p class="kira-reaction">' + kiraExposureReaction + '</p>';
}
narrativeContainer.innerHTML = narrativeHtml;
} else {
}
var resultContainer = document.getElementById('enemy-result-' + idx);
if (resultContainer) {
var html = '<div class="card-result hit flash">';
html += '<span class="result-status">HIT</span>';
html += '<span class="result-sep">|</span>';
html += '<span class="result-damage">' + damage + ' DMG</span>';
html += '<span class="result-sep">|</span>';
html += '<span class="result-type">Physical</span>';
if (clothingDamaged && clothingMessage) {
html += '<span class="result-sep">|</span>';
html += '<span class="result-clothing">' + clothingMessage + '</span>';
}
html += '</div>';
resultContainer.innerHTML = html;
}
setup.emptyWeaponWrapper(
document.querySelector('.weapon-effects-wrapper[data-enemy-idx="' + idx + '"]'),
document.getElementById('enemy-status-' + idx),
document.getElementById('enemy-knockdown-' + idx));
var knockdownContainer = document.getElementById('enemy-knockdown-' + idx);
if (knockdownContainer) {
var knockdownVideos = document.querySelectorAll('.knockdown-video');
knockdownVideos.forEach(function(el) {
if (!el.closest('.card-knockdown') && !el.closest('.combat-card')) {
knockdownContainer.appendChild(el);
}
});
var positionChanges = document.querySelectorAll('.position-change');
positionChanges.forEach(function(el) {
if (!el.closest('.card-knockdown') && !el.closest('.combat-card')) {
knockdownContainer.appendChild(el);
}
});
var explicitTexts = document.querySelectorAll('p.explicit');
explicitTexts.forEach(function(el) {
if (!el.closest('.card-knockdown') && !el.closest('.combat-card')) {
knockdownContainer.appendChild(el);
}
});
var narratorThoughts = document.querySelectorAll('.narrator-thought');
narratorThoughts.forEach(function(el) {
if (!el.closest('.card-knockdown') && !el.closest('.combat-card')) {
knockdownContainer.appendChild(el);
}
});
var dialogueBoxes = document.querySelectorAll('.dialogue-box');
dialogueBoxes.forEach(function(el) {
if (!el.closest('.card-knockdown') && !el.closest('.combat-card')) {
knockdownContainer.appendChild(el);
}
});
}
}, 100);
})(State.temporary.esaIdx, State.temporary.narrativeText, State.temporary.esaDamage, State.temporary.mediaPath, State.temporary.mediaFormat, State.temporary.clothingDamaged, State.temporary.clothingMessage, State.temporary.clothingReaction || '', State.temporary.statusEffectOutput || '', State.temporary.enemyTaunt || '', State.temporary.kiraExposureReaction || '', State.temporary.lustFlavor || '', State.temporary.playerReaction || '')>>
<<if $player.health lte 0>>
<<set _etDefeat to true>>
<</if>>
<</if>>
<<else>>
<<if _esaEnemy>>
<<set _enemyMissLog to _esaEnemy.name + " #" + (_esaIdx + 1) + " misses you!">>
<<logCombat _enemyMissLog "damage">>
<</if>>
<<silently>>
<<combatNarrative "enemy_miss" "The attack misses!">>
<</silently>>
<<if _narrativeResult && _narrativeResult.text && _esaEnemy && _esaEnemy.name>>
<<set _narrativeResult.text to setup.fillEnemyName(_narrativeResult.text, _esaEnemy)>>
<</if>>
<<set _mediaPathMiss to null>>
<<playerMediaTarget _esaEnemy>>
<<enemyAttackVideo `"enemy-video-primary-" + _esaIdx` `setup.weaponFor(_esaEnemy)` "miss" false _playerMediaTarget _esaEnemy>>
<<run (function(idx, narrativeText, mediaPath, mediaFormat) {
setTimeout(function() {
if (mediaPath) {
var mediaContainer = document.getElementById('enemy-video-primary-' + idx);
if (mediaContainer) {
if (mediaFormat === 'webm' || mediaFormat === 'mp4') {
mediaContainer.innerHTML = '<video src="' + mediaPath + '" autoplay loop muted playsinline class="constrained-combat-video"></video>';
} else {
mediaContainer.innerHTML = '<img src="' + mediaPath + '" class="constrained-combat-video" alt="Attack">';
}
}
}
var narrativeContainer = document.getElementById('enemy-narrative-' + idx);
if (narrativeContainer) {
narrativeContainer.innerHTML = '<p class="enemy-narrative">' + narrativeText + '</p>';
}
var resultContainer = document.getElementById('enemy-result-' + idx);
if (resultContainer) {
var html = '<div class="card-result miss">';
html += '<span class="result-status">MISS</span>';
html += '</div>';
resultContainer.innerHTML = html;
}
}, 50);
})(State.temporary.esaIdx, State.temporary.narrativeResult.text, State.temporary.mediaPathMiss, State.temporary.mediaFormatMiss)>>
<<if $combat.riposteActive>>
<<set _esaRiposteDamage to Math.floor(($player.strength * 1.0) + random(2, 6))>>
<<set _esaEnemy.health -= _esaRiposteDamage>>
<<if _esaEnemy.health <= 0>><<set _esaEnemy.health to 0>><</if>>
<</if>>
<</if>>
<<elseif _esaTarget === "kira">>
<<getCompanion $combat.companionInCombat>>
<<set _esaPosHitBonusK to 0>>
<<if $combat.positions && $combat.positions.kira>>
<<switch $combat.positions.kira>>
<<case "kneeling">><<set _esaPosHitBonusK to 10>>
<<case "prone_front" "prone_back">><<set _esaPosHitBonusK to 20>>
<<case "bent_over">><<set _esaPosHitBonusK to 25>>
<<case "pinned">><<set _esaPosHitBonusK to 30>>
<</switch>>
<</if>>
<<set _esaAccuracyK to 70 - ($tempCompanion.agility || 10)>>
<<getArousalModifiers _esaIdx>>
<<getFlauntModifiers _esaIdx>>
<<set _esaAccuracyK -= (_aroAccPenalty || 0)>>
<<if _esaEnemy.isCovering>><<set _esaAccuracyK -= (_esaEnemy.coveringAccPenalty || 0)>><</if>>
<<set _esaAccuracyK -= (_flauntAccPenalty || 0)>>
<<set _esaAroDmgPenaltyK to (_aroDmgPenalty || 0)>>
<<set _esaHitChanceK to Math.floor((_esaAccuracyK + _esaPosHitBonusK + setup.enemyAccuracyMod(_esaEnemy)) * setup.enemyAccuracyFactor(_esaEnemy))>>
<<if _esaAction.preRolls.hitRoll lte _esaHitChanceK>>
<<if setup.weaponFor(_esaEnemy)>>
<<set _esaWeaponK to setup.weaponFor(_esaEnemy)>>
<<set _esaDamageK to Math.floor((setup.enemyHitBase(_esaEnemy) + _esaAction.preRolls.damageVariance) * 0.7)>>
<<else>>
<<set _esaWeaponK to null>>
<<set _esaDamageK to Math.floor(setup.enemyHitBase(_esaEnemy) * 0.7)>>
<</if>>
<<set _esaDamageK to Math.round(_esaDamageK * setup.enemyDamageFactor(_esaEnemy))>>
<<if $combat.enemies.length >= 4>><<set _esaDamageK to Math.floor(_esaDamageK * 1.15)>>
<<elseif $combat.enemies.length >= 3>><<set _esaDamageK to Math.floor(_esaDamageK * 1.08)>>
<</if>>
<<set _esaEnemy.fearPenalty to false>>
<<if _esaAroDmgPenaltyK gt 0>><<set _esaDamageK to Math.floor(_esaDamageK * (100 - _esaAroDmgPenaltyK) / 100)>><</if>>
<<if _esaPosHitBonusK gt 0>>
<<set _esaDamageK to Math.floor(_esaDamageK * (1 + (_esaPosHitBonusK / 100)))>>
<</if>>
<<if (_esaEnemy.weapon === "leather_belt" || _esaEnemy.weapon === "riding_crop") && ($combat.positions.kira === "prone_front" || $combat.positions.kira === "bent_over")>>
<<set _esaDamageK to Math.floor(_esaDamageK * 1.5)>>
<</if>>
<<set _attackType to "strike">>
<<if _esaEnemy && _esaEnemy.weapon>>
<<silently>><<selectEnemyAttackType _esaEnemy "kira" $clothing.kira>><</silently>>
<</if>>
<<set _esaSexHitK to !!(_esaEnemy && _esaEnemy.weapon && (_esaEnemy.lust || 0) >= 60)>>
<<if _esaSexHitK>><<set _esaDamageK to Math.max(1, Math.floor(_esaDamageK / 2))>><</if>>
<<set _esaDamageK to Math.floor(_esaDamageK * setup.kiraDamageTakenFactor())>>
<<set $tempCompanion.health to setup.kiraFloorHealth(Math.max(0, $tempCompanion.health - _esaDamageK))>>
<<updateCompanion "kira">>
<<if _esaSexHitK>><<addKiraLust `random(8, 12)`>><</if>>
<<if _esaEnemy && _esaDamageK !== undefined>>
<<set _enemyHitKiraLog to _esaEnemy.name + " #" + (_esaIdx + 1) + " hits Kira for " + _esaDamageK + " damage!">>
<<logCombat _enemyHitKiraLog "damage">>
<</if>>
<<getEnemyHitKiraNarrative _esaDamageK _esaEnemy _attackType>>
<<set _mediaPathK to null>>
<<set _mediaFormatK to null>>
<<set _isSexualAttackK to false>>
<<set _sexualReasonK to "">>
<<if $clothing && $clothing.kira && ($clothing.kira.titsExposed || $clothing.kira.pussyExposed)>>
<<if _esaEnemy && (_esaEnemy.lust || 0) >= 50>>
<<set _isSexualAttackK to true>>
<<set _sexualReasonK to "exposed_lust">>
<</if>>
<</if>>
<<if _esaEnemy && _esaEnemy.weaponTier === 3>>
<<set _isSexualAttackK to true>>
<<set _sexualReasonK to "weapon_tier3">>
<</if>>
<<kiraMediaTarget>>
<<enemyAttackVideo `"enemy-video-primary-" + _esaIdx` _esaWeaponK "hit" _isSexualAttackK _kiraMediaTarget _esaEnemy>>
<<set _esaKiraKnockedOut to ($tempCompanion.health lt 1)>>
<<if _esaKiraKnockedOut>>
<<set $tempCompanion.health to 1>>
<<updateCompanion "kira">>
<</if>>
<<injectHealthUpdate _esaIdx _esaTarget>>
<<if _esaKiraKnockedOut>>
<<if !$flags.kiraIsUnconscious>>
<<set $combat.kiraIncapacitated to true>>
<<set _etKiraDown to true>>
<<else>>
<<set $combat.kiraIncapacitated to true>>
<<set $flags.kiraIsUnconscious to true>>
<</if>>
<</if>>
<<if _esaWeaponK>>
<div class="weapon-effects-wrapper" @data-enemy-idx="_esaIdx">
<<applyWeaponEffects "kira" _esaWeaponK _esaDamageK _esaEnemy>>
</div>
<</if>>
<<set _clothingDamagedK to false>>
<<set _clothingMessageK to "">>
<<set _wasKiraTitsExposedBefore to ($clothing.kira.titsExposed || false)>>
<<set _wasKiraPussyExposedBefore to ($clothing.kira.pussyExposed || false)>>
<<getKiraClothingDamageChance _esaEnemy.weapon>>
<<set _esaCDChance to (_esaWeaponK && _esaWeaponK.clothingDamageChance) ? _esaWeaponK.clothingDamageChance : _clothingDmgChance>>
<<set _esaCDBonus to _clothingDmgBonus>>
<<set _esaForceBottom to _forceBottom>>
<<set _cdRollK to random(1, 100)>>
<<if $flags.seductionUnlocked && _cdRollK lte _esaCDChance>>
<<set _clothingBeforeK to {top: $clothing.kira.top, bottom: $clothing.kira.bottom, underwear: $clothing.kira.underwear}>>
<<silently>>
<<if _esaWeaponK && _esaWeaponK.clothingDamage>>
<<if _esaForceBottom>>
<<damageClothingWithArmor "kira" "bottom" `Math.floor(setup.kiraClothingTear(_esaEnemy, _esaWeaponK, "bottom") * _esaCDBonus)`>>
<<else>>
<<set _esaCDK to ($clothing.kira.bottom === 0) ? either("top", "underwear") : either("top", "bottom")>>
<<damageClothingWithArmor "kira" _esaCDK `setup.kiraClothingTear(_esaEnemy, _esaWeaponK, _esaCDK)`>>
<</if>>
<<else>>
<<if $clothing.kira.bottom === 0>>
<<set _esaCDKRandom to either("top", "underwear")>>
<<else>>
<<set _esaCDKRandom to either("top", "bottom")>>
<</if>>
<<damageClothingWithArmor "kira" _esaCDKRandom `setup.kiraClothingTear(_esaEnemy, null, _esaCDKRandom)`>>
<</if>>
<</silently>>
<<set _clothingReactionK to "">>
<<capture _clothingReactionK>><<checkWardrobeMalfunction "kira" "combat">><</capture>>
<<if $tempKiraClothingReaction && $tempKiraClothingReaction.length > 0>>
<<if _clothingReactionK.length > 0>>
<<set _clothingReactionK += " " + $tempKiraClothingReaction>>
<<else>>
<<set _clothingReactionK to $tempKiraClothingReaction>>
<</if>>
<<set $tempKiraClothingReaction to "">>
<</if>>
<<if $clothing.kira.top lt _clothingBeforeK.top>>
<<set _clothingDamagedK to true>>
<<set _cdAmountK to _clothingBeforeK.top - $clothing.kira.top>>
<<if $clothing.kira.top === 0>>
<<set _clothingMessageK to '<span class="icon icon-broken-heart icon-small"></span> Kira\'s top destroyed!'>>
<<elseif $clothing.kira.top lt 26>>
<<set _clothingMessageK to '<span class="icon icon-shirt icon-small"></span> Kira: -' + _cdAmountK + '% top (torn)'>>
<<else>>
<<set _clothingMessageK to '<span class="icon icon-shirt icon-small"></span> Kira: -' + _cdAmountK + '% top'>>
<</if>>
<<elseif $clothing.kira.bottom lt _clothingBeforeK.bottom>>
<<set _clothingDamagedK to true>>
<<set _cdAmountK to _clothingBeforeK.bottom - $clothing.kira.bottom>>
<<if $clothing.kira.bottom === 0>>
<<set _clothingMessageK to '<span class="icon icon-broken-heart icon-small"></span> Kira\'s bottom destroyed!'>>
<<elseif $clothing.kira.bottom lt 26>>
<<set _clothingMessageK to '<span class="icon icon-pants icon-small"></span> Kira: -' + _cdAmountK + '% bottom (torn)'>>
<<else>>
<<set _clothingMessageK to '<span class="icon icon-pants icon-small"></span> Kira: -' + _cdAmountK + '% bottom'>>
<</if>>
<<elseif $clothing.kira.underwear lt _clothingBeforeK.underwear>>
<<set _clothingDamagedK to true>>
<<set _cdAmountK to _clothingBeforeK.underwear - $clothing.kira.underwear>>
<<if $clothing.kira.underwear === 0>>
<<set _clothingMessageK to '<span class="icon icon-broken-heart icon-small"></span> Kira\'s underwear destroyed!'>>
<<elseif $clothing.kira.underwear lt 26>>
<<set _clothingMessageK to '<span class="icon icon-underwear icon-small"></span> Kira: -' + _cdAmountK + '% underwear (torn)'>>
<<else>>
<<set _clothingMessageK to '<span class="icon icon-underwear icon-small"></span> Kira: -' + _cdAmountK + '% underwear'>>
<</if>>
<<else>>
<</if>>
<</if>>
<<set _kiraExposedReaction to "">>
<<set _kiraJustExposedTits to (!_wasKiraTitsExposedBefore && $clothing.kira.titsExposed)>>
<<set _kiraJustExposedPussy to (!_wasKiraPussyExposedBefore && $clothing.kira.pussyExposed)>>
<<if (_kiraJustExposedTits || _kiraJustExposedPussy) && setup.combatNarrative && setup.combatNarrative.kira_exposed>>
<<set _kiraExposedReaction to setup.combatNarrative.kira_exposed.random()>>
<</if>>
<<if $flags.seductionUnlocked && _esaDamageK gte 12 && random(1, 100) lte 40>>
<<knockdown "kira" "random">>
<</if>>
<<run (function(idx, narrativeText, damage, mediaPath, mediaFormat, clothingDamagedK, clothingMessageK, clothingReactionK, statusEffectOutputK, enemyTaunt, kiraReaction, kiraExposedReaction, lustFlavor, kiraHitReaction) {
setTimeout(function() {
if (mediaPath) {
var mediaContainer = document.getElementById('enemy-video-primary-' + idx);
if (mediaContainer) {
if (mediaFormat === 'webm' || mediaFormat === 'mp4') {
mediaContainer.innerHTML = '<video src="' + mediaPath + '" autoplay loop muted playsinline class="constrained-combat-video"></video>';
} else {
mediaContainer.innerHTML = '<img src="' + mediaPath + '" class="constrained-combat-video" alt="Attack">';
}
}
}
var narrativeContainer = document.getElementById('enemy-narrative-' + idx);
if (narrativeContainer && narrativeText) {
var narrativeHtml = '<p class="enemy-narrative">' + narrativeText + '</p>';
if (kiraHitReaction) {
narrativeHtml += '<p class="kira-reaction kira-hit">' + kiraHitReaction + '</p>';
}
if (lustFlavor) {
narrativeHtml += '<p class="lust-flavor">' + lustFlavor + '</p>';
}
if (enemyTaunt) {
narrativeHtml += '<p class="enemy-taunt">' + enemyTaunt + '</p>';
}
if (kiraReaction) {
narrativeHtml += '<p class="kira-reaction">' + kiraReaction + '</p>';
}
if (kiraExposedReaction) {
narrativeHtml += '<p class="kira-reaction kira-exposed">' + kiraExposedReaction + '</p>';
}
if (clothingReactionK) {
narrativeHtml += '<p class="kira-reaction kira-clothing">' + clothingReactionK + '</p>';
}
narrativeContainer.innerHTML = narrativeHtml;
} else {
}
var resultContainer = document.getElementById('enemy-result-' + idx);
if (resultContainer) {
var html = '<div class="card-result hit flash">';
html += '<span class="result-status">HIT</span>';
html += '<span class="result-sep">|</span>';
html += '<span class="result-damage">' + damage + ' DMG</span>';
html += '<span class="result-sep">|</span>';
html += '<span class="result-type">Physical</span>';
if (clothingDamagedK && clothingMessageK) {
html += '<span class="result-sep">|</span>';
html += '<span class="result-clothing">' + clothingMessageK + '</span>';
}
html += '</div>';
resultContainer.innerHTML = html;
}
setup.emptyWeaponWrapper(
document.querySelector('.weapon-effects-wrapper[data-enemy-idx="' + idx + '"]'),
document.getElementById('enemy-status-' + idx),
document.getElementById('enemy-knockdown-' + idx));
var knockdownContainer = document.getElementById('enemy-knockdown-' + idx);
if (knockdownContainer) {
var knockdownVideos = document.querySelectorAll('.knockdown-video');
knockdownVideos.forEach(function(el) {
if (!el.closest('.card-knockdown') && !el.closest('.combat-card')) {
knockdownContainer.appendChild(el);
}
});
var positionChanges = document.querySelectorAll('.position-change');
positionChanges.forEach(function(el) {
if (!el.closest('.card-knockdown') && !el.closest('.combat-card')) {
knockdownContainer.appendChild(el);
}
});
var explicitTexts = document.querySelectorAll('p.explicit');
explicitTexts.forEach(function(el) {
if (!el.closest('.card-knockdown') && !el.closest('.combat-card')) {
knockdownContainer.appendChild(el);
}
});
var narratorThoughts = document.querySelectorAll('.narrator-thought');
narratorThoughts.forEach(function(el) {
if (!el.closest('.card-knockdown') && !el.closest('.combat-card')) {
knockdownContainer.appendChild(el);
}
});
var dialogueBoxes = document.querySelectorAll('.dialogue-box');
dialogueBoxes.forEach(function(el) {
if (!el.closest('.card-knockdown') && !el.closest('.combat-card')) {
knockdownContainer.appendChild(el);
}
});
}
}, 100);
})(State.temporary.esaIdx, State.temporary.narrativeText, State.temporary.esaDamageK, State.temporary.mediaPathK, State.temporary.mediaFormatK, State.temporary.clothingDamagedK, State.temporary.clothingMessageK, State.temporary.clothingReactionK || '', State.temporary.statusEffectOutputK || '', State.temporary.enemyTaunt || '', State.temporary.kiraReaction || '', State.temporary.kiraExposedReaction || '', State.temporary.lustFlavor || '', State.temporary.kiraHitReaction || '')>>
<<else>>
<<if _esaEnemy>>
<<set _enemyMissKiraLog to _esaEnemy.name + " #" + (_esaIdx + 1) + " misses Kira!">>
<<logCombat _enemyMissKiraLog "damage">>
<</if>>
<<silently>>
<<combatNarrative "enemy_miss_kira" "The attack misses Kira!">>
<</silently>>
<<if _narrativeResult && _narrativeResult.text && _esaEnemy && _esaEnemy.name>>
<<set _narrativeResult.text to setup.fillEnemyName(_narrativeResult.text, _esaEnemy)>>
<</if>>
<<set _mediaPathKMiss to null>>
<<kiraMediaTarget>>
<<enemyAttackVideo `"enemy-video-primary-" + _esaIdx` `setup.weaponFor(_esaEnemy)` "miss" false _kiraMediaTarget _esaEnemy>>
<<run (function(idx, narrativeText, mediaPath, mediaFormat) {
setTimeout(function() {
if (mediaPath) {
var mediaContainer = document.getElementById('enemy-video-primary-' + idx);
if (mediaContainer) {
if (mediaFormat === 'webm' || mediaFormat === 'mp4') {
mediaContainer.innerHTML = '<video src="' + mediaPath + '" autoplay loop muted playsinline class="constrained-combat-video"></video>';
} else {
mediaContainer.innerHTML = '<img src="' + mediaPath + '" class="constrained-combat-video" alt="Attack">';
}
}
}
var narrativeContainer = document.getElementById('enemy-narrative-' + idx);
if (narrativeContainer) {
narrativeContainer.innerHTML = '<p class="enemy-narrative">' + narrativeText + '</p>';
}
var resultContainer = document.getElementById('enemy-result-' + idx);
if (resultContainer) {
var html = '<div class="card-result miss">';
html += '<span class="result-status">MISS</span>';
html += '</div>';
resultContainer.innerHTML = html;
}
}, 50);
})(State.temporary.esaIdx, State.temporary.narrativeResult.text, State.temporary.mediaPathKMiss, State.temporary.mediaFormatKMiss)>>
<</if>>
<</if>>
<</widget>>
<<widget "postEnemyTurnProcessing">>
<<processStatusEffects $player>>
<<set _peptStKilled to false>>
<<for _peptStEnemy range $combat.enemies>>
<<if _peptStEnemy>>
<<set _peptStHp to _peptStEnemy.health>>
<<processStatusEffects _peptStEnemy>>
<<if _peptStHp > 0 && _peptStEnemy.health <= 0>><<set _peptStKilled to true>><</if>>
<<set _peptStEnemy.fearPenalty to false>>
<</if>>
<</for>>
<<if _peptStKilled>>
<<run setup.removeDefeatedEnemies()>>
<<if $combat.enemies.length === 0>><<set _etVictory to true>><</if>>
<</if>>
<<if $combat.playerEffects>>
<<if $combat.playerEffects.bound && $combat.playerEffects.bound > 0>>
<<set $combat.playerEffects.bound -= 1>>
<<if $combat.playerEffects.bound <= 0>>
<<set $combat.playerEffects.bound to 0>>
<div class="status-cleared">You break free from the bindings!</div>
<</if>>
<</if>>
<<if $combat.playerEffects.stunned && $combat.playerEffects.stunned > 0>>
<<set $combat.playerEffects.stunned -= 1>>
<<if $combat.playerEffects.stunned <= 0>>
<<set $combat.playerEffects.stunned to 0>>
<div class="status-cleared">You shake off the stun!</div>
<</if>>
<</if>>
<</if>>
<<if $combat.enemies.length gt 0 && $combat.enemies[0].type === "boss">>
<<checkBossPhase>>
<<checkBossEnrage>>
<<checkLustVictory>>
<</if>>
<<tickAbilityCooldowns>>
<<if $combat.parrySuccess && $combat.enemies.length > 0>>
<<set _peptRiposteTarget to $combat.enemies[0]>>
<<set _peptRiposteDamage to Math.floor(($player.strength * 1.5) + random(3, 8))>>
<<set _peptRiposteTarget.health -= _peptRiposteDamage>>
<<if _peptRiposteTarget.health <= 0>>
<<set _peptRiposteTarget.health to 0>>
<<run setup.removeDefeatedEnemies()>>
<<if $combat.enemies.length === 0>>
<<set _etVictory to true>>
<</if>>
<</if>>
<</if>>
<<if $player.health lte 0>>
<<set _etDefeat to true>>
<</if>>
<<set _peptActiveEnemies to $combat.enemies.filter(function(e) { return e.health > 0 && !e.beenUsed; })>>
<<if $combat.enemies.length gt 0 && _peptActiveEnemies.length === 0>>
<<set _etVictory to true>>
<</if>>
<<set $combat.defending to false>>
<<set $combat.blocking to false>>
<<set $combat.parrying to false>>
<<set $combat.parrySuccess to false>>
<<set $combat.riposteActive to false>>
<<set $combat.playerVulnerable to false>>
<<set $combat.resting to false>>
<<set $combat.dodging to false>>
<<for _peptTurnEndIdx, _peptTurnEndEnemy range $combat.enemies>>
<<if _peptTurnEndEnemy && _peptTurnEndEnemy.health > 0>>
<<clampEnemyStats _peptTurnEndIdx>>
<<updateResistanceState _peptTurnEndIdx>>
<<applyResistanceDecay _peptTurnEndIdx>>
<<updateArousalState _peptTurnEndIdx>>
<<updateCncPhase _peptTurnEndIdx>>
<<updateOverwhelmState _peptTurnEndIdx>>
<<resetFlauntDistracted _peptTurnEndIdx>>
<</if>>
<</for>>
<<run setTimeout(function() {
$('.cnc-phase-change[data-enemy-idx]').each(function() {
var idx = $(this).data('enemy-idx');
var statusContainer = $('#enemy-status-' + idx);
if (statusContainer.length) {
statusContainer.append($(this).detach());
}
});
}, 50)>>
<<run setTimeout(function() {
if (typeof window.refreshCombatSidebar === 'function') {
window.refreshCombatSidebar();
}
}, 500)>>
<<set $combat.turn += 1>>
<<set $combat.phase to "player">>
<<checkLustEvent>>
<<tickKiraRefractory>>
<<tickEnemyExpressions>>
<</widget>>
<<widget "enemyMoveOnKiraDropped">>
<<set _emkdAction to _args[0]>>
<<set _emkdEnemy to _emkdAction.enemyRef>>
<<set _emkdIdx to _emkdAction.enemyIndex>>
<<if _emkdAction.actionType === "sex">>
<<set $combat.pendingSexAction to null>>
<</if>>
<<set _emkdLog to _emkdEnemy.name + " #" + (_emkdIdx + 1) + " turns away from Kira: she's down.">>
<<logCombat _emkdLog "tactical">>
<<set _emkdLine to setup.fillEnemyName(setup.pickFresh(setup.combatNarrative.enemy_move_on_downed_kira || ["[Enemy] turns away from Kira: she's down."]), _emkdEnemy)>>
<<run (function(idx, line) {
setTimeout(function() {
var n = document.getElementById('enemy-narrative-' + idx);
if (!n) return;
n.innerHTML = '<p class="kira-down-note"></p>';
n.firstChild.textContent = line;
var card = n.closest('.enemy-card');
var t = card && card.querySelector('.action-target');
if (t) t.textContent = '→ KIRA (DOWN)';
var st = card && card.querySelector('.ability-stats');
if (st) st.remove();
}, 50);
})(_emkdIdx, _emkdLine)>>
<</widget>>
<<widget "executeAllEnemyActions">>
<<for _eaeaIdx to 0; _eaeaIdx lt $combat.enemyActions.length; _eaeaIdx++>>
<<set _eaeaAction to $combat.enemyActions[_eaeaIdx]>>
<<if _eaeaAction && _eaeaAction.enemyRef && _eaeaAction.enemyRef.health > 0>>
<div class="card-outbox" @data-card="'enemy:' + _eaeaAction.enemyIndex">
<<if setup.enemyActionOnKira(_eaeaAction) && !setup.kiraInFight()>>
<<enemyMoveOnKiraDropped _eaeaAction>>
<<else>>
<<executeEnemyAction _eaeaAction>>
<</if>>
</div>
<<if $player.health <= 0>>
<<set _etDefeat to true>>
<</if>>
<</if>>
<</for>>
<div class="enemy-turn-aftermath"><<postEnemyTurnProcessing>></div>
<</widget>>
<<widget "injectHealthUpdate">>
<<set _ihuIdx to _args[0]>>
<<set _ihuTarget to _args[1]>>
<<if _ihuTarget === "kira">>
<<set _ihuHealth to $companions[0].health>>
<<set _ihuMaxHealth to $companions[0].maxHealth>>
<<if isNaN($companions[0].lust)>><<set $companions[0].lust to 0>><</if>>
<<set _ihuLust to $companions[0].lust || 0>>
<<set _ihuTension to $companions[0].tension || 0>>
<<set _ihuLabel to "Kira's HP:">>
<<else>>
<<set _ihuHealth to $player.health>>
<<set _ihuMaxHealth to $player.maxHealth>>
<<set _ihuLust to $player.lust || 0>>
<<set _ihuTension to 0>>
<<set _ihuLabel to "Your HP:">>
<</if>>
<<run (function(idx, target, health, maxHealth, lust, tension, label) {
setTimeout(function() {
var healthContainer = document.getElementById('enemy-health-update-' + idx);
if (healthContainer) {
var pct = Math.floor((health / maxHealth) * 100);
var html = '<div class="card-health-update">';
html += '<div class="stat-row">';
html += '<span class="stat-label">' + label + '</span>';
html += '<div class="stat-bar health-bar">';
html += '<div class="stat-fill" style="width: ' + pct + '%"></div>';
html += '</div>';
html += '<span class="stat-value">' + health + '/' + maxHealth + '</span>';
html += '</div>';
if (target === "kira" || lust > 0) {
var lustPct = Math.min(100, lust);
html += '<div class="stat-row">';
html += '<span class="stat-label">Lust:</span>';
html += '<div class="stat-bar lust-bar">';
html += '<div class="stat-fill lust-fill" style="width: ' + lustPct + '%"></div>';
html += '</div>';
html += '<span class="stat-value">' + lust + '</span>';
html += '</div>';
}
html += '</div>';
healthContainer.innerHTML = html;
}
}, 50);
})(State.temporary.ihuIdx, State.temporary.ihuTarget, State.temporary.ihuHealth, State.temporary.ihuMaxHealth, State.temporary.ihuLust, State.temporary.ihuTension, State.temporary.ihuLabel)>>
<</widget>><<widget "getCombatEnemyMedia">>
<<set _cemGroup to _args[0]>>
<<set _cemEnemy to _args[1]>>
<<deriveCombatMediaFilters _cemEnemy>>
<<set _cemPath to "combat/enemies/" + (setup.enemyPortraitGroup(_cemEnemy) || _cemGroup)>>
<<runCombatMediaCascade _cemPath _combatFilters>>
<<if !_result && _combatFilters.performer && _combatFilters.performer !== "universal">>
<<for _cemAlt range setup.enemyCardClothingFallbacks(_combatFilters.clothing)>>
<<set _cemAltFilters to clone(_combatFilters)>>
<<set _cemAltFilters.clothing to _cemAlt>>
<<runCombatMediaCascade _cemPath _cemAltFilters>>
<<if _result>><<break>><</if>>
<</for>>
<</if>>
<<set _combatEnemyMedia to _result>>
<</widget>>
<<widget "enemyTurnCard" container>>
<<set _etcEnemy to _args[0]>>
<<set _etcIndex to _args[1]>>
<<if !_etcEnemy>>
<div class="enemy-turn-card"><div class="enemy-turn-header"><<icon "attack" "medium">><span class="enemy-turn-name">ENEMY'S TURN</span></div><div class="enemy-turn-content"><<print _contents>></div></div>
<<else>>
<div class="enemy-turn-card" @data-enemy-index="(_etcIndex)">
<div class="enemy-turn-header">
<span class="enemy-turn-icon">
<<if _etcEnemy.type === "supernatural">><<icon "ghost" "medium">>
<<elseif _etcEnemy.type === "boss">><<icon "skull-bones" "medium">>
<<elseif _etcEnemy.gender === "female">><<icon "corruption" "medium">>
<<else>><<icon "attack" "medium">>
<</if>>
</span>
<span class="enemy-turn-name"><<print _etcEnemy.name.toUpperCase()>>'S TURN</span>
<span class="enemy-turn-number">#<<print (_etcIndex + 1)>></span>
</div>
<div class="enemy-turn-status">
<div class="enemy-turn-portrait">
<<if _etcEnemy.id && _etcEnemy.position>>
<<if _etcEnemy.visualGroup>>
<<getCombatEnemyMedia _etcEnemy.visualGroup _etcEnemy>>
<<else>>
<<set _combatEnemyMedia to null>>
<</if>>
<<if _combatEnemyMedia && _combatEnemyMedia.file>>
<<if _combatEnemyMedia.format === "webp" || _combatEnemyMedia.format === "jpg" || _combatEnemyMedia.format === "png">>
<img class="enemy-turn-portrait-media" @src="_combatEnemyMedia.file">
<<else>>
<video class="enemy-turn-portrait-media" autoplay loop muted playsinline>
<source @src="_combatEnemyMedia.file" @type="'video/' + (_combatEnemyMedia.format || setup.videoExt())">
</video>
<</if>>
<<else>>
<div class="portrait-placeholder">
<<if _etcEnemy.gender === "female">>♀<<else>>♂<</if>>
</div>
<</if>>
<<else>>
<div class="portrait-placeholder">
<<if _etcEnemy.gender === "female">>♀<<else>>♂<</if>>
</div>
<</if>>
</div>
<div class="enemy-turn-stats">
<div class="enemy-turn-health">
<span class="stat-label">HP:</span>
<span class="stat-bar-inline">
<<set _hpPct to Math.floor((_etcEnemy.health / (_etcEnemy.maxHealth || 60)) * 100)>>
<<set _bars to Math.min(10, Math.floor(_hpPct / 10))>>
<<set _empty to 10 - _bars>>
<<print "█".repeat(_bars)>><<print "░".repeat(_empty)>>
</span>
<span class="stat-numbers"><<print Math.floor(_etcEnemy.health)>>/<<print _etcEnemy.maxHealth || 60>></span>
</div>
<<if _etcEnemy.position && _etcEnemy.position !== "standing">>
<div class="enemy-turn-position">
<span class="stat-label">Position:</span>
<span @class="'position-badge ' + (_etcEnemy.position)">
<<print _etcEnemy.position.replace(/_/g, ' ').replace(/\b\w/g, function(l){ return l.toUpperCase(); })>>
</span>
</div>
<</if>>
<<if _etcEnemy.clothing && (_etcEnemy.clothing.titsExposed || _etcEnemy.clothing.pussyExposed)>>
<div class="enemy-turn-exposure">
<span class="exposure-icon"><<icon "hazard-sign" "medium">></span>
<<if _etcEnemy.clothing.titsExposed>>Tits Exposed<</if>>
<<if _etcEnemy.clothing.titsExposed && _etcEnemy.clothing.pussyExposed>> · <</if>>
<<if _etcEnemy.clothing.pussyExposed>>Pussy Exposed<</if>>
</div>
<</if>>
<<if _etcEnemy.lust && _etcEnemy.lust >= 50>>
<div class="enemy-turn-lust">
<span class="stat-label">Lust:</span>
<span class="lust-bar-inline">
<<set _etcMaxLust to setup.enemyMaxLust(_etcEnemy)>>
<<set _lustPct to Math.floor(_etcEnemy.lust / _etcMaxLust * 100)>>
<<set _lustBars to Math.max(0, Math.min(10, Math.floor(_lustPct / 10)))>>
<<print "♥".repeat(_lustBars)>><<print "♡".repeat(10 - _lustBars)>>
</span>
<span class="stat-numbers"><<print Math.floor(_etcEnemy.lust)>>/<<print _etcMaxLust>></span>
</div>
<</if>>
</div>
</div>
<div class="enemy-turn-content">
<<print _contents>>
</div>
</div>
<</if>>
<</widget>>
<<widget "initCombatTarget">>
<<set _targetIndex to ($combat.currentTarget || 0)>>
<<set _target to $combat.enemies[_targetIndex]>>
<<if _args[0] === "safe" && !_target>>
<<set _target to {health: 0, name: "Unknown", gender: "female", maxHealth: 60}>>
<</if>>
<</widget>>
<<widget "getCombatNarrative">>
<<set _gcnPool to _args[0]>>
<<set _gcnFallback to _args[1] || "">>
<<if setup.combatNarrative && setup.combatNarrative[_gcnPool] && setup.combatNarrative[_gcnPool].length>>
<<set _return to setup.pickFresh(setup.combatNarrative[_gcnPool])>>
<<else>>
<<set _return to _gcnFallback>>
<</if>>
<<if _args[2]>>
<<print _return || "You strike out, the combat continuing.">>
<</if>>
<</widget>>
<<widget "predetermineEnemyAction">>
<<set _peaIdx to _args[0]>>
<<set _peaEnemy to $combat.enemies[_peaIdx]>>
<<set _peaEnemy.sexIntent to null>>
<<set _peaEnemy.sexTarget to null>>
<<set $combat.enemyActions[_peaIdx] to {
enemyIndex: _peaIdx,
enemyRef: _peaEnemy,
actionType: "",
preRolls: {}
}>>
<<set _peaAction to $combat.enemyActions[_peaIdx]>>
<<set _peaActionDetermined to false>>
<<if _peaEnemy.beenUsed || _peaEnemy.lustBroken>>
<<set _peaAction.actionType to "subdued">>
<<set _peaAction.statusMessage to _peaEnemy.name + (_peaEnemy.gender === "male" ? " lies spent where he fell. He is out of the fight." : setup.enemySheIsYours(_peaEnemy) ? " lies where you left her, used. She is out of the fight." : " is beaten. She is out of the fight.")>>
<<set _peaAction.statusIcon to "submission">>
<<set _peaActionDetermined to true>>
<</if>>
<<if !_peaActionDetermined>>
<<hasStatus _peaEnemy "sleep">>
<<if _hasStatusResult>>
<<set _peaAction.actionType to "sleep">>
<<set _peaAction.statusMessage to _peaEnemy.name + " is fast asleep, snoring softly.">>
<<set _peaAction.statusIcon to "sleep">>
<<set _peaActionDetermined to true>>
<</if>>
<</if>>
<<set _peaStunStatus to setup.hasStatus(_peaEnemy, "stun")>>
<<if !_peaActionDetermined && ((_peaEnemy.stunned && _peaEnemy.stunnedTurns > 0) || _peaStunStatus) && !(_peaEnemy.lust >= (_peaEnemy.lustBreak || 100))>>
<<set _peaAction.actionType to "stunned">>
<<set _peaAction.statusMessage to _peaEnemy.name + " is stunned and can't act!">>
<<set _peaAction.statusIcon to "stunned">>
<<set _peaAction.stunnedTurnsRemaining to Math.max(_peaEnemy.stunnedTurns || 0, _peaStunStatus ? 1 : 0)>>
<<set _peaActionDetermined to true>>
<</if>>
<<set _peaTakesKira to false>>
<<if !_peaActionDetermined && _peaEnemy.lust >= (_peaEnemy.lustBreak || 100) && setup.maleTakesKiraBeforeBreak(_peaEnemy)>>
<<enemySexDecision _peaEnemy _peaIdx>>
<<if _peaEnemy.sexIntent && _peaEnemy.sexTarget === "kira">>
<<set _peaTakesKira to true>>
<<set _peaEnemy.lustBreakDeferred to (Number(_peaEnemy.lustBreakDeferred) || 0) + 1>>
<<set $combat.enemies[_peaIdx].lustBreakDeferred to _peaEnemy.lustBreakDeferred>>
<<else>>
<<set _peaEnemy.sexIntent to null>>
<<set _peaEnemy.sexTarget to null>>
<</if>>
<</if>>
<<if !_peaActionDetermined && !_peaTakesKira && _peaEnemy.lust >= (_peaEnemy.lustBreak || 100)>>
<<set _peaEnemy.lustBroken to true>>
<<set _peaEnemy.beenUsed to true>>
<<set $combat.enemies[_peaIdx].beenUsed to true>>
<<set _peaEnemy.sexUsed to _peaEnemy.sexUsed === true>>
<<set $combat.enemies[_peaIdx].sexUsed to _peaEnemy.sexUsed>>
<<run setup.countWomanUsed($combat.enemies[_peaIdx])>>
<<set _peaAction.actionType to "lust_break">>
<<set _peaAction.statusIcon to "high-arousal">>
<<setPronouns _peaEnemy>>
<<set _peaLbPool to setup.combatNarrative && setup.combatNarrative[_peaEnemy.gender === "male" ? "enemy_lust_break_male" : "enemy_lust_break_female"]>>
<<if (_peaEnemy.gender === "male" || _peaEnemy.gender === "female") && Array.isArray(_peaLbPool) && _peaLbPool.length>>
<<set _peaAction.statusMessage to setup.pickFresh(_peaLbPool)>>
<<elseif _peaEnemy.gender === "male">>
<<set _peaAction.statusMessage to _p.He + " can't take it anymore. " + _p.He + " reaches for " + _p.his + " cock, combat forgotten.">>
<<else>>
<<set _peaAction.statusMessage to _p.He + " can't take it anymore. " + _p.His + " hand slides between " + _p.his + " thighs, combat forgotten.">>
<</if>>
<<set _peaAction.lustValue to _peaEnemy.lust>>
<<if !_peaEnemy.stunned || _peaEnemy.stunnedTurns <= 0>>
<<set _peaEnemy.stunned to true>>
<<set _peaEnemy.stunnedTurns to 2>>
<</if>>
<<set _peaAction.stunnedTurnsRemaining to _peaEnemy.stunnedTurns>>
<<set _peaActionDetermined to true>>
<</if>>
<<if _peaEnemy.position !== "pinned" && _peaEnemy.pinStruggles>><<set _peaEnemy.pinStruggles to 0>><</if>>
<<if !_peaActionDetermined && _peaEnemy.position === "pinned">>
<<setPronouns _peaEnemy>>
<<set _peaAction.actionType to "pinned_struggle">>
<<set _peaAction.breaksFree to (random(1, 100) <= setup.pinStruggleChance(_peaEnemy))>>
<<if _peaAction.breaksFree>>
<<set _peaAction.statusMessage to _peaEnemy.name + " twists out from under you and gets back on " + _p.his + " feet.">>
<<else>>
<<set _peaAction.statusMessage to _peaEnemy.name + " is pinned down and can only struggle to get free.">>
<</if>>
<<set _peaAction.statusIcon to "prone">>
<<set _peaActionDetermined to true>>
<</if>>
<<if !_peaActionDetermined && _peaEnemy.humiliationState === "broken">>
<<setPronouns _peaEnemy>>
<<set _peaAction.actionType to "humiliation_broken">>
<<set _peaAction.statusMessage to _peaEnemy.name + " is broken. " + _p.He + " can't make " + _p.himself + " fight back.">>
<<set _peaAction.statusIcon to "broken-heart">>
<<set _peaActionDetermined to true>>
<</if>>
<<if !_peaActionDetermined>>
<<set _peaIsFeared to false>>
<<set _peaFearStacks to 1>>
<<if _peaEnemy.statusEffects>>
<<for _peaStatus range _peaEnemy.statusEffects>>
<<if _peaStatus.id === "fear">>
<<set _peaIsFeared to true>>
<<set _peaFearStacks to Math.max(1, _peaStatus.stacks || 1)>>
<<break>>
<</if>>
<</for>>
<</if>>
<<if _peaIsFeared>>
<<set _peaFearRoll to random(1, 100)>>
<<if _peaFearRoll lte 50>>
<<set _peaAction.actionType to "feared_cower">>
<<set _peaAction.statusMessage to _peaEnemy.name + " cowers in terror, too afraid to act!">>
<<set _peaAction.statusIcon to "afraid">>
<<set _peaActionDetermined to true>>
<<elseif _peaFearRoll lte 75>>
<<set _peaEnemy.fearPenalty to true>>
<<else>>
<<set _peaFleeRoll to random(1, 100)>>
<<if _peaFleeRoll lte Math.min(60, 15 + 15 * _peaFearStacks)>>
<<set _peaAction.actionType to "feared_fled">>
<<set _peaFleePool to setup.combatNarrative && setup.combatNarrative[_peaEnemy.gender === "male" ? "enemy_fear_flee_male" : "enemy_fear_flee_female"]>>
<<if Array.isArray(_peaFleePool) && _peaFleePool.length>>
<<set _peaAction.statusMessage to _peaEnemy.name + ": " + setup.pickFresh(_peaFleePool)>>
<<else>>
<<set _peaAction.statusMessage to _peaEnemy.name + " panics and flees the battle!">>
<</if>>
<<set _peaAction.statusIcon to "run">>
<<set _peaAction.willFlee to true>>
<<set _peaActionDetermined to true>>
<<else>>
<<set _peaAction.actionType to "feared_fail">>
<<set _peaAction.statusMessage to _peaEnemy.name + " tries to flee but can't escape!">>
<<set _peaAction.statusIcon to "afraid">>
<<set _peaActionDetermined to true>>
<</if>>
<</if>>
<</if>>
<</if>>
<<if _peaEnemy.gender === "female" && _peaEnemy.clothing && (_peaEnemy.clothing.titsExposed || _peaEnemy.clothing.pussyExposed)>>
<<checkEnemyCoveringSilent _peaIdx>>
<<if _coveringNarrative && _coveringNarrativeType !== "none">>
<<set _peaAction.coveringNarrative to _coveringNarrative>>
<<set _peaAction.coveringNarrativeType to _coveringNarrativeType>>
<</if>>
<<if _peaEnemy.isCovering>>
<<getCoveringModifiers _peaIdx>>
<<set _peaEnemy.coveringAccPenalty to _covAccPenalty>>
<<set _peaEnemy.coveringCanHeavy to _covCanHeavy>>
<</if>>
<</if>>
<<set _peaSexActionSet to false>>
<<if !_peaActionDetermined && $flags.seductionUnlocked && !$combat.sexActionThisTurn>>
<<if !_peaTakesKira>><<enemySexDecision _peaEnemy _peaIdx>><</if>>
<<if _peaEnemy.sexIntent && !_peaEnemy.stunned && !(_peaEnemy.gender === "male" && _peaEnemy.sexTarget !== "kira")>>
<<set _peaAction.actionType to "sex">>
<<set _peaAction.sexTarget to _peaEnemy.sexTarget>>
<<set _peaAction.sexIntent to _peaEnemy.sexIntent>>
<<if _peaEnemy.sexTarget === "kira">>
<<set _peaAction.sexPassage to "Combat_Enemy_Sex_Kira_Check">>
<<else>>
<<set _peaAction.sexPassage to "Combat_Enemy_Sex_Player_Check">>
<</if>>
<<set $combat.sexActionThisTurn to true>>
<<set _peaSexActionSet to true>>
<</if>>
<</if>>
<<if !_peaActionDetermined && !_peaSexActionSet>>
<<if $combat.companionInCombat>>
<<getEnemyTarget _peaEnemy>>
<<set _peaEnemyTarget to _enemyTarget>>
<<else>>
<<set _peaEnemyTarget to "player">>
<</if>>
<<set _peaAction.attackTarget to _peaEnemyTarget>>
<<initEnemyAbilityState _peaEnemy>>
<<checkCanUseAbility _peaIdx>>
<<checkArousalAbilityBlock _peaIdx>>
<<set _peaCanUseAbilities to (_canUseAbility && !_arousalBlocksAbility)>>
<<if _peaCanUseAbilities>>
<<selectEnemyAbility _peaEnemy _peaEnemyTarget>>
<<if _returnAbility>>
<<set _peaAction.actionType to "ability">>
<<set _peaAction.abilityObject to _returnAbility>>
<<set _peaAction.abilityTarget to _peaEnemyTarget>>
<<executeEnemyAbility _peaEnemy _returnAbility _peaEnemyTarget>>
<<set _peaAction.abilityResult to _returnAbilityResult>>
<<if _returnAbilityResult.damageMultiplier && _returnAbilityResult.damageMultiplier > 0>>
<<set _peaAction.preRolls.hitRoll to random(1, 100)>>
<<set _peaAction.preRolls.damageVariance to random(0, 10)>>
<<set _peaAction.preRolls.dodgeRoll to random(1, 100)>>
<<set _peaAction.preRolls.parryRoll to random(1, 100)>>
<</if>>
<<set _peaActionDetermined to true>>
<</if>>
<</if>>
<<if !_peaActionDetermined>>
<<set _peaAction.actionType to "attack">>
<<if $flags.seductionUnlocked && _peaEnemy.isHuman>>
<<set _peaGrappleChance to 30>>
<<if $clothing && $clothing.kira && $clothing.kira.titsExposed>>
<<set _peaGrappleChance += 20>>
<</if>>
<<if $clothing && $clothing.player && $clothing.player.assExposed>>
<<set _peaGrappleChance += 10>>
<</if>>
<<if $clothing && $clothing.kira && $clothing.kira.assExposed>>
<<set _peaGrappleChance += 10>>
<</if>>
<<set _peaAction.grappleChance to _peaGrappleChance>>
<<set _peaAction.willGrapple to (random(1, 100) lte _peaGrappleChance)>>
<</if>>
<<set _peaAction.preRolls.hitRoll to random(1, 100)>>
<<set _peaAction.preRolls.damageVariance to random(-2, 2)>>
<</if>>
<</if>>
<</widget>>
<<widget "predetermineAllEnemyActions">>
<<set $combat.enemyActions to []>>
<<set $combat.sexActionThisTurn to false>>
<<set $combat.pendingSexAction to null>>
<<for _paeaIdx to 0; _paeaIdx lt $combat.enemies.length; _paeaIdx++>>
<<if $combat.enemies[_paeaIdx].health > 0>>
<<predetermineEnemyAction _paeaIdx>>
<</if>>
<</for>>
<<run State.variables.combat.enemyActions = State.variables.combat.enemyActions.filter(function(a) { return a !== undefined && a !== null; })>>
<<run (function() {
var actions = State.variables.combat.enemyActions;
if (!actions || actions.length === 0) return;
for (var i = actions.length - 1; i > 0; i--) {
var j = Math.floor(Math.random() * (i + 1));
var temp = actions[i];
actions[i] = actions[j];
actions[j] = temp;
}
for (var k = 0; k < actions.length; k++) {
if (actions[k]) {
actions[k].cardIndex = k;
}
}
})()>>
<</widget>>
<<widget "renderEnemyActionCards">>
<div class="enemy-actions-container">
<<for _reacIdx to 0; _reacIdx lt $combat.enemyActions.length; _reacIdx++>>
<<set _reacAction to $combat.enemyActions[_reacIdx]>>
<<if _reacAction && _reacAction.enemyRef && _reacAction.enemyRef.health > 0>>
<<switch _reacAction.actionType>>
<<case "subdued" "sleep" "stunned" "feared_cower" "feared_fled" "feared_fail" "lust_break" "pinned_struggle" "humiliation_broken">>
<<enhancedEnemyStatusCard _reacAction>>
<<case "sex">>
<<enhancedEnemySexCard _reacAction>>
<<case "ability">>
<<enhancedEnemyAbilityCard _reacAction>>
<<case "attack">>
<<enhancedEnemyAttackCard _reacAction>>
<<default>>
<div class="combat-card error-card">
<div class="card-header">
<<icon "error">> Error
</div>
<div class="card-body">
<p>Unknown action type: '<strong><<print _reacAction.actionType>></strong>'</p>
</div>
</div>
<</switch>>
<</if>>
<</for>>
</div>
<</widget>><<widget "canBlock">>
<<set _playerPos to ($combat.positions && $combat.positions.player) || "standing">>
<<set _canBlock to (_playerPos !== "pinned")>>
<</widget>>
<<widget "canParry">>
<<set _playerPos to ($combat.positions && $combat.positions.player) || "standing">>
<<set _canParry to (_playerPos === "standing" || _playerPos === "kneeling")>>
<</widget>>
<<widget "canRiposte">>
<<set _playerPos to ($combat.positions && $combat.positions.player) || "standing">>
<<set _canRiposte to (_playerPos === "standing")>>
<</widget>>
<<widget "canDodge">>
<<set _canDodge to true>>
<</widget>>
<<widget "canRest">>
<<set _canRest to true>>
<</widget>>
<<widget "defenseRefusal">>
<<set _drCfg to _args[0]>>
<<set _drPos to ($combat.positions && $combat.positions.player) || "standing">>
<<set _defenseRefusalMsg to "">>
<<if !_drCfg>>
<<set _defenseRefusalMsg to "">>
<<elseif _drCfg.blockedPositions && _drCfg.blockedPositions.includes(_drPos)>>
<<set _defenseRefusalMsg to "Cannot use " + _drCfg.name + " from this position!">>
<<elseif _drCfg.hpMinPercent && _drCfg.hpMinPercent > 0 && $player.health lt ($player.maxHealth * _drCfg.hpMinPercent)>>
<<if setup.defensiveNarratives && setup.defensiveNarratives[_drCfg.actionType + "_error_low_hp"]>>
<<set _defenseRefusalMsg to setup.defensiveNarratives[_drCfg.actionType + "_error_low_hp"]>>
<<else>>
<<set _defenseRefusalMsg to "Cannot perform this action at low HP!">>
<</if>>
<<elseif _drCfg.energyCost > 0 && $player.energy lt _drCfg.energyCost>>
<<set _defenseRefusalMsg to "Too tired! (Need " + _drCfg.energyCost + " energy)">>
<</if>>
<</widget>>
<<widget "executeDefensiveAction">>
<<set _config to _args[0]>>
<<set _playerPos to ($combat.positions && $combat.positions.player) || "standing">>
<<defenseRefusal _config>>
<<set _defenseRefused to (_defenseRefusalMsg !== "")>>
<<if _defenseRefused>>
<<set $combat.actionNotice to _defenseRefusalMsg>>
<<goto "Combat_Actions">>
<</if>>
<<if !_defenseRefused>>
<<set _positionPenalty to 0>>
<<if _config.positionPenalties && _config.positionPenalties[_playerPos]>>
<<set _positionPenalty to _config.positionPenalties[_playerPos]>>
<</if>>
<<if _config.energyCost > 0>>
<<set _negEnergyCost to -(_config.energyCost || 0)>>
<<clampStat "player.energy" _negEnergyCost 0 $player.maxEnergy>>
<</if>>
<</if>>
<<if !_defenseRefused>>
<<if _config.recoversEnergy>>
<<set _energyRecovered to random(_config.energyRecovery[0], _config.energyRecovery[1])>>
<<set $player.energy to Math.min($player.maxEnergy || 100, $player.energy + _energyRecovered)>>
<<set _defensiveEnergyRecovered to _energyRecovered>>
<<set $combat.energyRecovered to _energyRecovered>>
<</if>>
<<if _config.stancesToClear && _config.stancesToClear.length > 0>>
<<for _stance range _config.stancesToClear>>
<<run $combat[_stance] = false>>
<</for>>
<</if>>
<<if _config.stanceToSet>>
<<run $combat[_config.stanceToSet] = true>>
<</if>>
<<if _config.penaltyVariable && _positionPenalty > 0>>
<<run $combat[_config.penaltyVariable] = _positionPenalty>>
<<elseif _config.penaltyVariable>>
<<run $combat[_config.penaltyVariable] = 0>>
<</if>>
<<if _config.recoversEnergy && _energyRecovered>>
<<logCombat `"You catch your breath, recovering " + _energyRecovered + " energy."` "damage">>
<<else>>
<<logCombat _config.logText "damage">>
<</if>>
<<set _target to $combat.enemies[0] || {id: "raider"}>>
<div class="combat-action-visual">
<<set _eaPicSuffix to _config.enemyImageSuffix || "defend">>
<<if _config.hasEnemySpecificImages>>
<<switch _target.id>>
<<case "raider" "raider_grunt">>
<img @src="'assets/images/' + _config.imagePrefix + 'raider-' + _eaPicSuffix + '.png'" @alt="_config.name" class="combat-action-img">
<<case "raider_scout">>
<img @src="'assets/images/' + _config.imagePrefix + 'scout-' + _eaPicSuffix + '.png'" @alt="_config.name" class="combat-action-img">
<<case "raider_brute">>
<img @src="'assets/images/' + _config.imagePrefix + 'brute-' + _eaPicSuffix + '.png'" @alt="_config.name" class="combat-action-img">
<<default>>
<img @src="'assets/images/' + _config.imagePath" @alt="_config.name" class="combat-action-img">
<</switch>>
<<else>>
<img @src="'assets/images/' + _config.imagePath" @alt="_config.name" class="combat-action-img">
<</if>>
</div>
<div class="choice-container">
<<vchoice "Continue" "Combat_Companion_Turn" "move" "map">>
</div>
<</if>>
<</widget>>
<<widget "executeTakedown">>
<<set _config to _args[0]>>
<<initCombatTarget>>
<<set _targetPos to _target.position || "standing">>
<<set _takedownRoll to random(1, 100)>>
<<set _takedownChance to _config.baseChance>>
<<if _config.strengthBonus>>
<<set _takedownChance += ($player.strength || 10)>>
<</if>>
<<if _config.dominanceBonus>>
<<set _takedownChance += ($player.dominance || 0)>>
<</if>>
<<if _config.lustBonus && _target.lust >= _config.lustBonus.threshold>>
<<set _takedownChance += _config.lustBonus.amount>>
<</if>>
<<if _config.healthBonus && _target.health < ((_target.maxHealth || 50) * _config.healthBonus.threshold)>>
<<set _takedownChance += _config.healthBonus.amount>>
<</if>>
<<if _config.positionBonus && _config.positionBonus[_targetPos]>>
<<set _takedownChance += _config.positionBonus[_targetPos]>>
<</if>>
<<set $combat.lastTakedownRoll to _takedownRoll>>
<<set $combat.lastTakedownChance to _takedownChance>>
<<set $combat.takedownSuccess to (_takedownRoll <= _takedownChance)>>
<div class="combat-action-result takedown-action">
<<if $combat.takedownSuccess>>
<<set _target.position to _config.targetPosition>>
<<set $combat.enemies[_targetIndex].position to _config.targetPosition>>
<<set $combat.enemies[_targetIndex].pinStruggles to 0>>
<<set _target.positionHeldTurns to 0>>
<<set $combat.enemies[_targetIndex].positionHeldTurns to 0>>
<<if _target.combatExpression !== "fearful" && _target.combatExpression !== "defiant">>
<<setEnemyExpression _target "surprised" 1>>
<</if>>
<<if _config.setEnemyPinned>>
<<set $combat.enemyPinned to _targetIndex>>
<</if>>
<<set _target.lust to setup.enemyLustPlus(_target, _config.enemyLustGain)>>
<<clampStat "player.lust" _config.playerLustGain>>
<<set $player.dominance to ($player.dominance || 0) + _config.dominanceGain>>
<<if _target && _config>>
<<set _posText to _config.targetPosition>>
<<if _posText === "prone_front">>
<<set _posText to "face-down">>
<<elseif _posText === "prone_back">>
<<set _posText to "onto their back">>
<<elseif _posText === "bent_over">>
<<set _posText to "bent over">>
<<elseif _posText === "pinned">>
<<set _posText to "pinned down">>
<<elseif _posText === "kneeling">>
<<set _posText to "to their knees">>
<</if>>
<<set _takedownLog to _config.name + " " + _target.name + " #" + (_targetIndex + 1) + "! Forced " + _posText + "!">>
<<logCombat _takedownLog "tactical">>
<</if>>
<<set $combat.exposureLustGains to {player: 0, enemy: 0}>>
<</if>>
</div>
<</widget>>
<<widget "executeExploitAction">>
<<set _config to _args[0]>>
<<set $combat.positionBonusApplied to false>>
<<set $combat.positionBonusPct to 0>>
<<initCombatTarget>>
<<set $combat.exploitSuccess to true>>
<<if _config.hasResistanceCheck>>
<<checkResistanceEscape _targetIndex _config.resistanceDifficulty>>
<<set $combat.exploitResisted to _resistedAction>>
<<if _resistedAction>>
<<set $combat.exploitSuccess to false>>
<<if _target && _config>>
<<set _resistLog to _target.name + " resists " + _config.name + "!">>
<<logCombat _resistLog "damage">>
<</if>>
<</if>>
<</if>>
<<if $combat.exploitSuccess>>
<<set _lustDamage to random(_config.lustDamageRange[0], _config.lustDamageRange[1])>>
<<if _config.usePositionMultiplier>>
<<applyPositionLustDamage _lustDamage _targetIndex>>
<<set $combat.positionBonusApplied to (_posLustMult gt 1)>>
<<set $combat.positionBonusPct to Math.round((_posLustMult - 1) * 100)>>
<<set _lustDamage to _posModifiedLustDamage>>
<</if>>
<<set _painDamage to 0>>
<<if _config.painDamageRange>>
<<set _painDamage to random(_config.painDamageRange[0], _config.painDamageRange[1])>>
<<set _painDamage to Math.floor(_painDamage * setup.fighterDamageFactor("player"))>>
<</if>>
<<set _target.lust to setup.enemyLustPlus(_target, _lustDamage)>>
<<if _painDamage > 0>>
<<set _target.health to Math.max(0, _target.health - _painDamage)>>
<</if>>
<<clampStat "player.lust" _config.playerLustGain>>
<<set $combat.exploitLustDamage to _lustDamage>>
<<set $combat.exploitPainDamage to _painDamage>>
<<if _target && _config>>
<<if _painDamage > 0>>
<<set _exploitLog to _config.name + " " + _target.name + "! +" + _lustDamage + " lust, " + _painDamage + " damage">>
<<logCombat _exploitLog "sexual">>
<<else>>
<<set _exploitLog to _config.name + " " + _target.name + "! +" + _lustDamage + " lust">>
<<logCombat _exploitLog "sexual">>
<</if>>
<</if>>
<<set $combat.exploitStunned to false>>
<<if _config.stunChance > 0 && random(1, 100) <= _config.stunChance>>
<<set _target.stunned to true>>
<<set _target.stunnedTurns to _config.stunTurns || 2>>
<<set $combat.enemies[_targetIndex].stunned to true>>
<<set $combat.enemies[_targetIndex].stunnedTurns to _config.stunTurns || 2>>
<<set $combat.exploitStunned to true>>
<</if>>
<<set $combat.exploitWelt to false>>
<<if _config.weltChance > 0 && random(1, 100) <= _config.weltChance>>
<<set $combat.exploitWelt to true>>
<</if>>
<<set $combat.exploitSecondaryEffect to false>>
<<if _config.secondaryEffect && _config.secondaryEffect.chance > 0>>
<<if random(1, 100) <= _config.secondaryEffect.chance>>
<<set _target.lust to setup.enemyLustPlus(_target, _config.secondaryEffect.lustBonus)>>
<<set $combat.exploitSecondaryEffect to true>>
<</if>>
<</if>>
<<if _config.increaseMasochism > 0>>
<<increaseMasochism _targetIndex _config.increaseMasochism>>
<</if>>
<</if>>
<</widget>>
<<widget "executeUltraExtreme">>
<<set _config to _args[0]>>
<<initCombatTarget>>
<<if !_config || !_config.narrativePool>>
<div style="color: red; border: 2px solid red; padding: 10px; margin: 10px 0;">
DEBUG CONFIG ERROR:<br>
Config exists: <<= !!_config>><br>
actionName: <<= _config ? _config.actionName : "NO CONFIG">><br>
narrativePool: <<= _config ? (_config.narrativePool || "EMPTY STRING") : "NO CONFIG">><br>
Pool exists in setup: <<= setup.combatNarrative && setup.combatNarrative.grab_grind ? "YES" : "NO">>
</div>
<</if>>
<div class="combat-action-result ultra-action">
<<if _config.exposeDickFirst && !$clothing.player.dickExposed>>
<p class="explicit">You fumble with your pants— your rock-hard cock springs free!</p>
<<set $clothing.player.dickExposed to true>>
<<clampStat "player.lust" 5>>
<</if>>
<<if _config.clothingAction === "destroy_before">>
<p class="explicit ultra">You grab the remnants of her pants and RIP them away!</p>
<<set _target.clothing.bottom to 0>>
<<set $combat.enemies[_targetIndex].clothing.bottom to 0>>
<<if _config.targetExposure.pussy>>
<<set _target.clothing.pussyExposed to true>>
<<set $combat.enemies[_targetIndex].clothing.pussyExposed to true>>
<</if>>
<<if _config.targetExposure.ass>>
<<set _target.clothing.assExposed to true>>
<<set $combat.enemies[_targetIndex].clothing.assExposed to true>>
<</if>>
<<if !$clothing.player.dickExposed && _config.actionType === "penetration">>
<p class="explicit">You free your cock—</p>
<<set $clothing.player.dickExposed to true>>
<</if>>
<</if>>
<<set _actionSucceeds to true>>
<<if _config.hasResistRoll>>
<<set _resistRoll to random(1, 100)>>
<<set _resistChance to _config.resistBase - (_target.lust || 0) / _config.resistLustDivisor - ($player.dominance || 0)>>
<<if _resistRoll lte _resistChance>>
<<set _actionSucceeds to false>>
<</if>>
<</if>>
<<if !_actionSucceeds>>
<p class="combat-miss"><<print _config.missMessage>></p>
<<if _config.missDamage>>
<<set _negMissDamage to -(_config.missDamage || 0)>>
<<clampStat "player.health" _negMissDamage 0 100>>
<div class="damage-taken">You take <<print _config.missDamage>> damage!</div>
<</if>>
<<else>>
<<combatActionVideo "ultra-action-video" _config.videoFolder _target>>
<<set _lustDmg to random(_config.lustDamage.min, _config.lustDamage.max)>>
<<set _target.lust to setup.enemyLustPlus(_target, _lustDmg)>>
<<clampStat "player.lust" _config.playerLust>>
<<set _actionVerb to (_config.actionName || "ultra action").replace("_", " ")>>
<<if _actionVerb === "grab grind">>
<<set _actionVerb to "grabbed and grinded on">>
<<elseif _actionVerb === "face sit">>
<<set _actionVerb to "sat on the face of">>
<<elseif _actionVerb === "force kiss">>
<<set _actionVerb to "force kissed">>
<</if>>
<<set _logText to "You " + _actionVerb + " " + _target.name + " #" + (_targetIndex + 1) + "! +" + _lustDmg + " arousal">>
<<logCombat _logText "intimate">>
<<set _ueNarrFallback to "[FALLBACK: " + (_config.actionName || "unnamed") + " - narrative pool '" + (_config.narrativePool || "EMPTY") + "' not found]">>
<p class="explicit ultra"><<combatNarrative _config.narrativePool _ueNarrFallback>></p>
<<if _config.clothingAction === "damage_chance">>
<<set _grindBottom to setup.clothingValue(_target.clothing.bottom)>>
<<if random(1,100) lte _config.clothingChance>>
<<set _clothDmg to random(_config.clothingDamage.min, _config.clothingDamage.max)>>
<<if _grindBottom gt 0>>
<<set _target.clothing.bottom to Math.max(0, _grindBottom - _clothDmg)>>
<p class="explicit">The friction tears at her clothes— they're giving way!</p>
<</if>>
<</if>>
<<if setup.clothingValue(_target.clothing.bottom) lte 0 && !_target.clothing.pussyExposed>>
<<set _grindTargetObj to _target>>
<<updateExposure _targetIndex>>
<<set _target to _grindTargetObj>>
<<if _target.clothing.pussyExposed>>
<p class="explicit">Nothing is left of her pants. She's bare under you now.</p>
<</if>>
<</if>>
<</if>>
<<if _config.positionChange>>
<<if random(1,100) lte _config.positionChange.chance>>
<<set _target.position to _config.positionChange.newPosition>>
<<set $combat.enemies[_targetIndex].position to _config.positionChange.newPosition>>
<<set $combat.enemies[_targetIndex].pinStruggles to 0>>
<p class="explicit"><<print _config.positionChange.message>></p>
<<logEnemyPositionChange _targetIndex _config.positionChange.newPosition "worsen">>
<</if>>
<</if>>
<<if _config.specialEffects>>
<<for _effect range _config.specialEffects>>
<<switch _effect.widget>>
<<case "addHumiliation">>
<<addHumiliation _targetIndex _effect.args[0] _effect.args[1]>>
<</switch>>
<</for>>
<</if>>
<<if _config.canDefeat>><<set _target.sexUsed to true>><</if>>
<<run setup.countWomanUsed(_target)>>
<<if _config.canDefeat && _target.lust gte _target.seduceThreshold>>
<<fillCombatVideoBox "ultra-action-video" "combat/enemy_climax_claimed" _target>>
<p class="explicit victory">She cums HARD— CLAIMED AND CONQUERED!</p>
<<set _target.defeated to true>>
<<set _target.beenUsed to true>>
<<set _target.sexUsed to true>>
<<run setup.countWomanUsed(_target)>>
<<set _target.defeatType to _config.defeatType>>
<<set $player.dominance to ($player.dominance || 0) + _config.dominanceGain>>
<<else>>
<<if _target.lust gte 70>>
<p class="explicit lust-high"><<combatNarrative _config.lustReactions.highPool>></p>
<<else>>
<p class="explicit"><<combatNarrative _config.lustReactions.lowPool>></p>
<</if>>
<</if>>
<div class="lust-dealt ultra">
<<icon "corruption" "medium">> <<print "+" + _lustDmg>> enemy lust | You +<<print _config.playerLust>> lust
</div>
<</if>>
</div>
<div class="choice-container">
<<vchoice "Continue" "Combat_Companion_Turn" "move" "map">>
</div>
<</widget>>
<<widget "executeRapidStrikes">>
<<set _config to setup.rapidStrikesConfig>>
<<set _rsVictory to false>>
<<initCombatTarget>>
<<if $player.energy lt _config.energyCost>>
<<set $combat.actionNotice to "Not enough energy! (Need " + _config.energyCost + " energy)">>
<<goto "Combat_Actions">>
<<else>>
<<set _negEnergyCost to -(_config.energyCost || 0)>>
<<clampStat "player.energy" _negEnergyCost 0 $player.maxEnergy>>
<<set _baseDamage to 5 + Math.floor(($player.strength || 10) / 2)>>
<<if _config.useWeaponBonus && $equipped && $equipped.weapon>>
<<set _baseDamage += $equipped.weapon.damage>>
<</if>>
<<set _baseDamage to Math.floor(_baseDamage * _config.damageMultiplier)>>
<<set _baseAccuracy to _config.baseAccuracy + ($player.agility || 10) - setup.enemyDodge(_target) + _config.accuracyModifier>>
<<set _baseAccuracy -= setup.enemyDefenseMod(_target)>>
<<set _baseAccuracy to setup.playerStrikeChance(_baseAccuracy)>>
<div class="combat-action-result rapid-strikes">
<<combatActionVideo "rapid-strikes-video" _config.videoFolders.intro _target>>
<p class="combat-narrative"><<combatNarrative _config.narrativePools.intro>></p>
<<set _totalDamage to 0>>
<<set _hitCount to 0>>
<<set _missCount to 0>>
<<for _strike to 0; _strike lt _config.numStrikes; _strike++>>
<<set _hitRoll to random(1, 100)>>
<<if _hitRoll lte _baseAccuracy>>
<<set _damage to _baseDamage + random(_config.damageVariance[0], _config.damageVariance[1])>>
<<set _damage to Math.max(1, _damage - (_target.armor || 0))>>
<<set _damage to Math.max(1, Math.floor(_damage * setup.fighterDamageFactor("player")))>>
<<set _target.health -= _damage>>
<<applyEnemyDamageExpression _target>>
<<set _totalDamage += _damage>>
<<set _hitCount += 1>>
<div class="combat-hit-effect rapid-hit">
<<fillCombatVideoBox "rapid-strikes-video" _config.videoFolders.hit _target>>
<<combatNarrative _config.narrativePools.hit>>
<span class="damage-number">-<<print _damage>></span>
</div>
<<if _config.useWeaponBonus>>
<<set _rsWeaponStatus to setup.weaponStatusLine(setup.applyWeaponStatuses(_target), _target)>>
<<if _rsWeaponStatus>><div class="weapon-status-effect"><<print _rsWeaponStatus>></div><</if>>
<</if>>
<<if _config.clothingDamage.perHit && random(1, 100) lte _config.clothingDamage.chance>>
<<if $flags.seductionUnlocked && _target.clothing>>
<<set _clothingDmg to random(_config.clothingDamage.amount[0], _config.clothingDamage.amount[1])>>
<<set _rsTargetRef to _target>>
<<damageClothingWithArmor _targetIndex "random" _clothingDmg>>
<<set _target to _rsTargetRef>>
<</if>>
<</if>>
<<if _target.health lte 0>>
<<break>>
<</if>>
<<else>>
<<set _missCount += 1>>
<div class="combat-miss-effect rapid-miss">
<<fillCombatVideoBox "rapid-strikes-video" _config.videoFolders.miss _target>>
<<combatNarrative _config.narrativePools.miss>>
</div>
<</if>>
<</for>>
<<fillCombatVideoBox "rapid-strikes-video" _config.videoFolders.finale _target>>
<div class="rapid-strikes-summary">
<strong><<print _hitCount>> / <<print _config.numStrikes>> strikes connected!</strong>
<<if _totalDamage gt 0>>
<span class="total-damage">Total: -<<print _totalDamage>> damage</span>
<</if>>
</div>
<<if _target.health lte 0>>
<p class="enemy-defeated"><<print _target.name>> collapses under the barrage!</p>
<<run setup.defeatEnemyAt(_targetIndex)>>
<<if $combat.enemies.length === 0>>
<<set _rsVictory to true>>
<</if>>
<</if>>
<<logCombat `"Rapid Strikes: " + _hitCount + "/" + _config.numStrikes + " hits for " + _totalDamage + " total damage!"` "damage">>
</div>
<div class="choice-container">
<<vchoice "Continue" `_rsVictory ? "Combat_Victory" : _config.nextPassage` "move" "map">>
</div>
<</if>>
<</widget>>
<<widget "executeVerbalDegrade">>
<<set _config to _args[0]>>
<<initCombatTarget>>
<<if $player.energy lt _config.energyCost>>
<<set $combat.actionNotice to "Not enough energy! (Need " + _config.energyCost + " energy)">>
<<goto "Combat_Actions">>
<<else>>
<<set _negEnergyCost to -(_config.energyCost || 0)>>
<<clampStat "player.energy" _negEnergyCost 0 $player.maxEnergy>>
<<initHumiliation _targetIndex>>
<div class="combat-action-result">
<<set _targetPos to _target.position || ($combat.positions && $combat.positions.enemies && $combat.positions.enemies[_targetIndex]) || "standing">>
<<set _humRange to _config.humiliationByPosition[_targetPos] || _config.humiliationByPosition.standing>>
<<set _humAmount to random(_humRange[0], _humRange[1])>>
<<if _target.clothing && _target.clothing.titsExposed>>
<<set _humAmount += _config.exposureBonus.titsExposed>>
<</if>>
<<if _target.clothing && _target.clothing.pussyExposed>>
<<set _humAmount += _config.exposureBonus.pussyExposed>>
<</if>>
<<set _narrativePool to _config.narrativePools[_targetPos] || _config.narrativePools.standing>>
<<combatActionVideo "verbal-degrade-video" `_config.videoFolders[_targetPos] || _config.videoFolders.standing` _target>>
<div class="verbal-degradation">
<<combatNarrative _narrativePool>>
</div>
<<addHumiliation _targetIndex _humAmount "verbal">>
<<set _target.lust to setup.enemyLustPlus(_target, _config.sideEffects.enemyLust)>>
<<clampStat "player.lust" _config.sideEffects.playerLust>>
<<set $player.dominance to ($player.dominance || 0) + _config.sideEffects.playerDominance>>
<<if _target && _config && _humAmount !== undefined>>
<<set _degradeLog to _config.name + " " + _target.name + "! +" + _humAmount + " humiliation">>
<<logCombat _degradeLog "humiliation">>
<</if>>
<<if _target.humiliationState === "embarrassed">>
<p class="explicit hum-state"><<print _config.humiliationStateReactions.embarrassed>></p>
<<elseif _target.humiliationState === "degraded">>
<p class="explicit hum-state"><<print _config.humiliationStateReactions.degraded>></p>
<<elseif _target.humiliationState === "broken">>
<p class="explicit hum-state"><<print _config.humiliationStateReactions.broken>></p>
<</if>>
</div>
<div class="choice-container">
<<vchoice "Continue" _config.nextPassage "move" "map">>
</div>
<</if>>
<</widget>>
<<widget "executeAllowOrgasm">>
<<set _config to _args[0]>>
<<initCombatTarget>>
<<if !_target || _target.gender !== "female">>
<<goto "Combat_Actions">>
<<elseif $player.energy lt _config.energyCost>>
<<set $combat.actionNotice to "Not enough energy! (Need " + _config.energyCost + " energy)">>
<<goto "Combat_Actions">>
<<else>>
<<set _negEnergyCost to -(_config.energyCost || 0)>>
<<clampStat "player.energy" _negEnergyCost 0 $player.maxEnergy>>
<div class="combat-action arousal-action allow-orgasm">
<<initArousalState _targetIndex>>
<<set _genderSuffix to "Female">>
<<set _target.orgasmCount += 1>>
<<set $combat.enemies[_targetIndex].orgasmCount to _target.orgasmCount>>
<<set _target.denialTurns to 0>>
<<set $combat.enemies[_targetIndex].denialTurns to 0>>
<<set _target.stunned to true>>
<<set _target.stunnedTurns to _config.effects.stunTurns>>
<<set $combat.enemies[_targetIndex].stunned to true>>
<<set $combat.enemies[_targetIndex].stunnedTurns to _config.effects.stunTurns>>
<<combatActionVideo "allow-orgasm-video" `_config.videoFolders["begging" + _genderSuffix]` _target>>
<<set _beggingPool to _config.narrativePools["begging" + _genderSuffix]>>
<<combatNarrative _beggingPool "" "explicit enemy-dialogue">>
<<fillCombatVideoBox "allow-orgasm-video" `_config.videoFolders["orgasm" + _genderSuffix]` _target>>
<<set _orgasmPool to _config.narrativePools["orgasm" + _genderSuffix]>>
<<set _orgasmFallback to _config.fallbackText.female>>
<p class="explicit"><<combatNarrative _orgasmPool _orgasmFallback>></p>
<div class="orgasm-result">
<<icon "heart" "medium">> Allowed Release (Orgasm #<<print _target.orgasmCount>>)
<div class="orgasm-effects">
<<icon "stunned" "medium">> Stunned for <<print _config.effects.stunTurns>> turn
</div>
</div>
<<set _lustDrop to random(_config.effects.lustReduction[0], _config.effects.lustReduction[1])>>
<<set _target.lust to Math.max(0, _target.lust - _lustDrop)>>
<<set $combat.enemies[_targetIndex].lust to _target.lust>>
<div class="lust-change">
<<icon "drop" "medium">> Lust -<<print _lustDrop>> (now <<print _target.lust>>)
</div>
<<updateArousalState _targetIndex>>
<<if _target.orgasmCount gte _config.submissionThreshold>>
<div class="submission-effect">
<<icon "submission" "medium">> She's becoming compliant...
</div>
<</if>>
<<if $combat.log>>
<<run $combat.log.push({
text: _target.name + " " + _config.logText,
type: _config.logType
})>>
<</if>>
</div>
<<if !$combat.combo>><<set $combat.combo to {count: 0, lastAction: "", target: -1, bonus: 0}>><</if>>
<<set $combat.combo.lastAction to _config.comboAction>>
<<set $combat.combo.target to _targetIndex>>
<div class="choice-container">
<<vchoice "Continue" _config.nextPassage "move" "map">>
</div>
<</if>>
<</widget>>
<<widget "executeDrainEssence">>
<<set _config to setup.supernaturalConfigs.drain_essence>>
<<set _deVictory to false>>
<<set _target to $combat.enemies[0]>>
<<if $player.energy lt _config.energyCost>>
<<set $combat.actionNotice to "Not enough energy! (Need " + _config.energyCost + " energy)">>
<<goto "Combat_Actions">>
<<else>>
<<set _negEnergyCost to -(_config.energyCost || 0)>>
<<clampStat "player.energy" _negEnergyCost 0 $player.maxEnergy>>
<<combatActionVideo "drain-essence-video" _config.videoFolder _target>>
<<combatNarrative _config.narrativePool _config.fallbackText>>
<<set _damage to _config.baseDamage + Math.floor($player.corruption / _config.corruptionScaling)>>
<<if _config.applyArmor>>
<<set _damage to Math.max(1, _damage - _target.armor)>>
<</if>>
<<set _damage to Math.max(1, Math.floor(_damage * setup.fighterDamageFactor("player")))>>
<<set _target.health -= _damage>>
<<applyEnemyDamageExpression _target>>
<<set _heal to Math.floor(_damage * _config.lifestealMultiplier)>>
<<set $player.health to Math.min($player.maxHealth, $player.health + _heal)>>
<div class="damage-number supernatural">-<<print _damage>> HP</div>
<div class="heal-effect">You drain their life force! +<<print _heal>> HP</div>
<<if _target.health lte 0>>
<<run setup.defeatEnemyAt($combat.enemies.indexOf(_target))>>
<<print setup.enemyRef(_target, true)>> <<print _config.deathText>>
<<if _config.victoryCheck && $combat.enemies.length === 0>>
<<set _deVictory to true>>
<</if>>
<</if>>
<<addCorruption _config.corruptionGain>>
<<if _target && _damage !== undefined && _heal !== undefined>>
<<set _drainLog to "Drain Essence " + _target.name + "! " + _damage + " damage, +" + _heal + " HP healed">>
<<logCombat _drainLog "critical">>
<</if>>
<div class="choice-container">
<<vchoice "Continue" `_deVictory ? "Combat_Victory" : "Combat_Companion_Turn"` "move" "map">>
</div>
<</if>>
<</widget>>
<<widget "executeSuccubusKiss">>
<<set _config to setup.supernaturalConfigs.succubus_kiss>>
<<set _target to $combat.enemies[0]>>
<<if $player.energy lt _config.energyCost>>
<<set $combat.actionNotice to "Not enough energy! (Need " + _config.energyCost + " energy)">>
<<goto "Combat_Actions">>
<<else>>
<<set _negEnergyCost to -(_config.energyCost || 0)>>
<<clampStat "player.energy" _negEnergyCost 0 $player.maxEnergy>>
<<combatActionVideo "succubus-kiss-video" _config.videoFolder _target>>
<<combatNarrative _config.narrativePool _config.fallbackText>>
<<set _target.lust to Math.max(0, (_target.lust || 0) - _config.lustDrain)>>
<<set _heal to Math.floor(_config.lustDrain * _config.healMultiplier)>>
<<set $player.health to Math.min($player.maxHealth, $player.health + _heal)>>
<div class="lust-damage">You drain <<print _config.lustDrain>> Lust!</div>
<div class="heal-effect">+<<print _heal>> HP restored</div>
<<addCorruption _config.corruptionGain>>
<<if _target && _config.lustDrain !== undefined>>
<<set _lustDrain to _config.lustDrain>>
<<set _kissLog to "Succubus Kiss " + _target.name + "! +" + _lustDrain + " lust drained">>
<<logCombat _kissLog "sexual">>
<</if>>
<div class="choice-container">
<<vchoice "Continue" "Combat_Companion_Turn" "move" "map">>
</div>
<</if>>
<</widget>>
<<widget "executeTerrorVisage">>
<<set _config to setup.supernaturalConfigs.terror_visage>>
<<if $player.energy lt _config.energyCost>>
<<set $combat.actionNotice to "Not enough energy! (Need " + _config.energyCost + " energy)">>
<<goto "Combat_Actions">>
<<else>>
<<set _negEnergyCost to -(_config.energyCost || 0)>>
<<clampStat "player.energy" _negEnergyCost 0 $player.maxEnergy>>
<<set _tvTarget to $combat.enemies[$combat.currentTarget || 0] || $combat.enemies[0]>>
<<combatActionVideo "terror-visage-video" _config.videoFolder _tvTarget>>
<<combatNarrative _config.narrativePool _config.fallbackText>>
<<for _enemy range $combat.enemies>>
<<if _enemy.health gt 0>>
<<set _canApply to true>>
<<if _config.checkImmunity && _enemy.statusImmunities && _enemy.statusImmunities.includes(_config.statusApplied)>>
<<set _canApply to false>>
<</if>>
<<if _canApply>>
<<set _successRoll to random(1, 100)>>
<<set _successChance to _config.baseChance + Math.floor($player.corruption / _config.corruptionScaling)>>
<<if _successRoll lte _successChance>>
<<applyStatus _enemy _config.statusApplied>>
<div class="status-applied"><<print _enemy.name>> <<print _config.successText>></div>
<</if>>
<</if>>
<</if>>
<</for>>
<<addCorruption _config.corruptionGain>>
<<set _terrorLog to "Terror Visage! All enemies shaken">>
<<logCombat _terrorLog "critical">>
<div class="choice-container">
<<vchoice "Continue" "Combat_Companion_Turn" "move" "map">>
</div>
<</if>>
<</widget>>
<<widget "executeShadowStep">>
<<set _config to setup.supernaturalConfigs.shadow_step>>
<<if $player.energy lt _config.energyCost>>
<<set $combat.actionNotice to "Not enough energy! (Need " + _config.energyCost + " energy)">>
<<goto "Combat_Actions">>
<<else>>
<<set _negEnergyCost to -(_config.energyCost || 0)>>
<<clampStat "player.energy" _negEnergyCost 0 $player.maxEnergy>>
<<set _ssTarget to $combat.enemies[$combat.currentTarget || 0] || $combat.enemies[0]>>
<<combatActionVideo "shadow-step-video" _config.videoFolder _ssTarget>>
<<combatNarrative _config.narrativePool _config.fallbackText>>
<<for _key, _value range _config.flagsToSet>>
<<set $combat[_key] to _value>>
<</for>>
<<print _config.effectText>>
<<addCorruption _config.corruptionGain>>
<<set _shadowLog to "Shadow Step! Dodge chance +" + _config.dodgeBonus + "% for " + _config.duration + " turns">>
<<logCombat _shadowLog "tactical">>
<div class="choice-container">
<<vchoice "Continue" "Combat_Companion_Turn" "move" "map">>
</div>
<</if>>
<</widget>>
<<widget "executeAbyssalForm">>
<<set _config to setup.supernaturalConfigs.abyssal_form>>
<<if $player.energy lt _config.energyCost>>
<<set $combat.actionNotice to "Not enough energy! (Need " + _config.energyCost + " energy)">>
<<goto "Combat_Actions">>
<<else>>
<<set _negEnergyCost to -(_config.energyCost || 0)>>
<<clampStat "player.energy" _negEnergyCost 0 $player.maxEnergy>>
<<set _afTarget to $combat.enemies[$combat.currentTarget || 0] || $combat.enemies[0]>>
<<combatActionVideo "abyssal-form-video" _config.videoFolder _afTarget>>
<<combatNarrative _config.narrativePool _config.fallbackText>>
<<for _key, _value range _config.flagsToSet>>
<<set $combat[_key] to _value>>
<</for>>
<div class="boss-transition">
<<print _config.effectText>>
</div>
<<addCorruption _config.corruptionGain>>
<<set _abyssalLog to "Abyssal Form! Damage +" + _config.damageBoost + "% for " + _config.duration + " turns">>
<<logCombat _abyssalLog "critical">>
<div class="choice-container">
<<vchoice "Continue" "Combat_Companion_Turn" "move" "map">>
</div>
<</if>>
<</widget>><<widget "kiraHelpUpCard">>
<div class="combat-card companion-card kira-help-card">
<div class="card-header help-header">
<span class="card-icon"><<icon "strength">></span>
<span class="card-title">HELPING KIRA</span>
</div>
<div class="card-body">
<div class="help-narrative"></div>
<div class="help-result"></div>
</div>
<div class="card-footer companion-card-footer">
<div class="kira-status-row">
<span class="kira-hp"><<icon "health" "medium">> <<print $companions[0].health>>/<<print $companions[0].maxHealth>></span>
<span class="kira-lust"><<icon "lust" "medium">> <<print $companions[0].lust>>%</span>
</div>
</div>
</div>
<</widget>>
<<widget "executeKiraHelpUpCard">>
<<silently>>
<<set _enemy to $combat.enemies[$combat.currentTarget]>>
<<if !_enemy>><<set _enemy to $combat.enemies[0]>><</if>>
<<setPronouns _enemy>>
<<set _playerPos to $combat.positions.player || "standing">>
<<set _success to false>>
<<set _narrative to "">>
<<if setup.playerIsStunned()>>
<<set _narrative to "You try to help Kira but your body won't cooperate. Still dazed.">>
<<elseif _playerPos === "prone_back" || _playerPos === "prone_stomach">>
<<set _crawlRoll to random(1, 20) + Math.floor(($player.agility || 10) / 3)>>
<<if _crawlRoll >= 10>>
<<set $combat.positions.player to "standing">>
<<set $combat.positions.kira to "standing">>
<<set _success to true>>
<<relationChange "kira" "trust" 2>>
<<relationChange "kira" "affection" 1>>
<<set _narrative to "You manage to reach her and help pull her up while getting up yourself.">>
<<else>>
<<set _dmg to -random(2, 4)>>
<<clampStat "player.health" _dmg 0 100>>
<<set _narrative to "You can't reach her in time. The enemy kicks you back.">>
<</if>>
<<else>>
<<set $combat.positions.kira to "standing">>
<<set _success to true>>
<<relationChange "kira" "trust" 2>>
<<relationChange "kira" "affection" 1>>
<<set _narrative to "You rush to Kira and grab her arm, hauling her to her feet.">>
<</if>>
<<set window._kiraHelpUpData to {
success: _success,
narrative: _narrative
}>>
<</silently>>
<<script>>
setTimeout(function() {
var data = window._kiraHelpUpData;
if (!data) return;
var narrativeEl = document.querySelector('.help-narrative');
var resultEl = document.querySelector('.help-result');
if (narrativeEl) {
narrativeEl.innerHTML = '<p>' + data.narrative + '</p>';
}
if (resultEl && data.success) {
resultEl.innerHTML = '<p class="kira-speech">"Thanks. I owe you one."</p>';
}
}, 50);
<</script>>
<</widget>>
<<widget "kiraHelpUpCardFlow">>
<<kiraHelpUpCard>>
<<executeKiraHelpUpCard>>
<div class="choice-container">
<<vchoice "Continue fighting" "Combat_Actions" "move" "map">>
</div>
<</widget>>
<<widget "kiraCNCStripCard">>
<div class="combat-card companion-card kira-cnc-card">
<div class="card-header cnc-header dark-header">
<span class="card-icon"><<icon "voyeur">></span>
<span class="card-title">STRIPPING HER</span>
</div>
<div class="card-body">
<div class="cnc-scene-display"></div>
<div id="kira-cnc-strip-video" class="card-video-container" style="display:none"></div>
<div class="cnc-narrative"></div>
</div>
<div class="card-footer companion-card-footer">
<div class="kira-status-row">
<span class="kira-hp"><<icon "health" "medium">> <<print $companions[0].health>>/<<print $companions[0].maxHealth>></span>
<span class="kira-lust"><<icon "lust" "medium">> <<print $companions[0].lust>>%</span>
</div>
</div>
</div>
<</widget>>
<<widget "executeKiraCNCStripCard">>
<<silently>>
<<set $flags.watchedKiraStripped to true>>
<<addCorruption 3>>
<<clampStat "player.lust" 15>>
<<kiraMediaTarget>>
<<if !_storyClip>><<fillCombatVideoBox "kira-cnc-strip-video" "combat/kira_cnc_strip" _kiraMediaTarget>><</if>>
<<set $clothing.kira.top to 0>>
<<set $clothing.kira.titsExposed to true>>
<<set window._kiraCNCStripData to {
enemyName: $temp.cncEnemyName,
enemyGender: $temp.cncEnemyGender || "male"
}>>
<</silently>>
<<script>>
var storyClip = State.temporary.storyClip;
setTimeout(function() {
var data = window._kiraCNCStripData;
if (!data) return;
var sceneEl = document.querySelector('.cnc-scene-display');
var narrativeEl = document.querySelector('.cnc-narrative');
if (sceneEl) {
sceneEl.innerHTML = '<p class="dark-intro">You watch as they expose her...</p>';
}
if (narrativeEl) {
var html = '';
if (data.enemyGender === "male") {
html += (storyClip === "a7cb360740f8" ? '<p>The raider\'s hands are rough but deliberate. He shoves her clothes up around her waist and drags her underwear aside.</p>' : '<p>The raider\'s hands are rough but deliberate. He tugs her top up, exposing her stomach, then higher.</p>');
html += (storyClip === "a7cb360740f8" ? '<p class="enemy-speech">"Fuck. Look at that..."</p>' : '<p class="enemy-speech">"Fuck. Look at these..."</p>');
html += (storyClip === "a7cb360740f8" ? '<p>Her thighs fall open, limp, when he pushes them apart. Her hips twitch at the cool air—an involuntary response that makes the raider grin.</p>' : '<p>Her breasts spill free, pale in the Reclaimed light. Her nipples harden in the cool air—an involuntary response that makes the raider grin.</p>');
html += '<p class="enemy-speech">"Even out cold she\'s responsive. Wonder what else she\'ll respond to."</p>';
html += (storyClip === "a7cb360740f8" ? '<p>He gets his face down between her thighs, one hand kneading her breast through the fabric, watching her face for any reaction. Kira remains unconscious, unaware of the violation.</p>' : '<p>He squeezes one breast roughly, watching her face for any reaction. Kira remains unconscious, unaware of the violation.</p>');
html += '<p>One of her hands closes on a fistful of cloth, then lets go before his eyes come back to her face.</p>';
html += (storyClip === "a7cb360740f8" ? '' : '<p>His other hand moves to her pants, working at the fastenings.</p>');
html += '<p class="internal-thought dark">Your cock is hard. You hate yourself for it.</p>';
} else {
html += '<p>The female raider works with practiced efficiency, stripping Kira\'s top away with swift tugs.</p>';
html += '<p class="enemy-speech">"Oh, she\'s got nice ones. Shame to hide them."</p>';
html += '<p>She cups Kira\'s exposed breasts, thumbs brushing over the nipples.</p>';
html += '<p>Kira\'s back lifts a finger\'s width into the raider\'s palms and settles again.</p>';
html += '<p class="enemy-speech">"You watching this, hero? Getting off on seeing your girl fondled?"</p>';
html += '<p>Her hands slide lower, tugging at Kira\'s waistband.</p>';
html += '<p class="enemy-speech">"Let\'s see what else she\'s hiding."</p>';
}
narrativeEl.innerHTML = html;
}
}, 50);
<</script>>
<</widget>>
<<widget "kiraCNCStripCardFlow">>
<<kiraCNCStripCard>>
<<executeKiraCNCStripCard>>
<<run VaultUI.showCharacter("kira", "center", "vulnerable")>>
<div class="choice-container">
<<vchoice "Keep watching" "Combat_Kira_CNC_Full" "intimate" "voyeur">>
<<vchoice "Stop this NOW" "Combat_Kira_CNC_Intervene_Late" "action" "attack">>
<<if $player.corruption >= 50 && $temp.cncEnemyGender === "male">>
<<vchoice "Take her other hole" "Combat_Kira_CNC_Join_Male" "intimate" "lust">>
<<elseif $player.corruption >= 50 && $temp.cncEnemyGender === "female">>
<<vchoice "Make her service me while you use her" "Combat_Kira_CNC_Join_Female" "intimate" "lust">>
<</if>>
</div>
<</widget>>
<<widget "kiraCNCFullCard">>
<div class="combat-card companion-card kira-cnc-card">
<div class="card-header cnc-header extreme-header">
<span class="card-icon"><<icon "corruption">></span>
<span class="card-title">VIOLATION</span>
</div>
<div class="card-body">
<div class="cnc-scene-display"></div>
<div id="kira-cnc-full-video" class="card-video-container" style="display:none"></div>
<div class="cnc-narrative"></div>
<div class="cnc-aftermath"></div>
</div>
<div class="card-footer companion-card-footer">
<div class="kira-status-row">
<span class="kira-hp"><<icon "health" "medium">> <<print $companions[0].health>>/<<print $companions[0].maxHealth>></span>
<span class="kira-lust"><<icon "lust" "medium">> <<print $companions[0].lust>>%</span>
</div>
</div>
</div>
<</widget>>
<<widget "executeKiraCNCFullCard">>
<<silently>>
<<set $flags.watchedKiraRaped to true>>
<<addCorruption 10>>
<<clampStat "player.lust" 25>>
<<set $companions[0].trauma to ($companions[0].trauma || 0) + 20>>
<<set $clothing.kira.top to 0>>
<<set $clothing.kira.bottom to 0>>
<<set $clothing.kira.titsExposed to true>>
<<set $clothing.kira.pussyExposed to true>>
<<set window._kiraCNCFullData to {
enemyName: $temp.cncEnemyName,
enemyGender: $temp.cncEnemyGender || "male"
}>>
<<kiraMediaTarget>>
<<if !_storyClip>><<fillCombatVideoBox "kira-cnc-full-video" "combat/kira_cnc_fucked" _kiraMediaTarget>><</if>>
<</silently>>
<<script>>
setTimeout(function() {
var data = window._kiraCNCFullData;
if (!data) return;
var sceneEl = document.querySelector('.cnc-scene-display');
var narrativeEl = document.querySelector('.cnc-narrative');
var aftermathEl = document.querySelector('.cnc-aftermath');
if (sceneEl) {
sceneEl.innerHTML = '<p class="extreme-intro">You watch the full violation unfold...</p>';
}
if (narrativeEl) {
var html = '';
if (data.enemyGender === "male") {
html += '<p>The raider yanks her pants down, exposing her completely. His breathing is heavy now, cock straining against his own clothing.</p>';
html += '<p class="enemy-speech">"She\'s gonna feel this when she wakes up."</p>';
html += '<p>He positions himself between her legs, spreading them roughly.</p>';
html += '<p class="explicit">He enters her unconscious body with a grunt, not bothering with any preparation. Her body shifts limply with each thrust, breasts bouncing despite her stillness.</p>';
html += '<p class="enemy-speech">"Fuck—tight little thing—"</p>';
html += '<p class="explicit">You watch him use her, his pace increasing. Kira\'s face remains slack, unaware of the violation.</p>';
html += '<p class="explicit">Her toes curl, hard, and slowly uncurl.</p>';
html += '<p class="internal-thought dark">You\'re fully hard now. Watching someone use your companion. What does that make you?</p>';
html += '<p>After several brutal minutes, he finishes inside her with a groan, then pulls out carelessly.</p>';
html += '<p class="enemy-speech">"Thanks for the show. She\'s all yours now."</p>';
html += '<p>He collects his things and leaves, satisfied.</p>';
} else {
html += '<p>The female raider fully strips Kira, spreading her legs wide.</p>';
html += '<p class="enemy-speech">"Let\'s see how she tastes."</p>';
html += '<p>She buries her face between Kira\'s thighs, tongue working despite the lack of response.</p>';
html += '<p class="enemy-speech">"Mmm... she\'s getting wet. Body knows what it wants even when the mind\'s gone."</p>';
html += '<p class="explicit">She fingers Kira while licking her, occasionally looking up at you with a smirk. Your cock is painfully hard watching this.</p>';
html += '<p class="explicit">Kira\'s thighs fall wider open.</p>';
html += '<p class="enemy-speech">"Touch yourself. I know you want to."</p>';
html += '<p class="explicit">She works Kira to an unconscious orgasm—Kira\'s hips twitch, a moan escapes her slack lips.</p>';
html += '<p class="enemy-speech">"There we go. Good girl."</p>';
html += '<p>She wipes her mouth, standing.</p>';
html += '<p class="enemy-speech">"Fun toy you\'ve got. Maybe I\'ll find you again sometime."</p>';
html += '<p>She disappears into the Reclaimed.</p>';
}
narrativeEl.innerHTML = html;
}
if (aftermathEl) {
aftermathEl.innerHTML = '<p>You approach Kira\'s violated body. She\'s still unconscious, unaware of what just happened.</p>' +
'<p class="dark-consequence">But you know. And she\'ll find out eventually—the evidence is unmistakable.</p>';
}
}, 50);
<</script>>
<</widget>>
<<widget "kiraCNCFullCardFlow">>
<<kiraCNCFullCard>>
<<executeKiraCNCFullCard>>
<<run VaultUI.showCharacter("kira", "center", "vulnerable")>>
<div class="choice-container">
<<vchoice "Clean her up and carry her home" "Combat_CNC_Aftermath_Cleanup" "action" "health">>
<<vchoice "Leave her as she is" "Combat_CNC_Aftermath_Leave" "action" "run">>
</div>
<</widget>>
<<widget "kiraCNCInterveneLateCard">>
<div class="combat-card companion-card kira-heroic-card">
<div class="card-header heroic-header">
<span class="card-icon"><<icon "attack">></span>
<span class="card-title">NO MORE!</span>
</div>
<div class="card-body">
<div class="heroic-narrative"></div>
<div class="heroic-result"></div>
</div>
<div class="card-footer companion-card-footer">
<div class="kira-status-row">
<span class="kira-hp"><<icon "health" "medium">> <<print $companions[0].health>>/<<print $companions[0].maxHealth>></span>
<span class="kira-lust"><<icon "lust" "medium">> <<print $companions[0].lust>>%</span>
</div>
</div>
</div>
<</widget>>
<<widget "executeKiraCNCInterveneLateCard">>
<<silently>>
<<set $flags.stoppedKiraCNC to true>>
<<set $combat.enemies[0].stunned to true>>
<<set $combat.enemies[0].stunnedTurns to 3>>
<<set $combat.enemies[0].health -= 20>>
<<applyEnemyDamageExpression $combat.enemies[0]>>
<<logCombat "Shame-fueled rage! You attack with desperate force!" "critical">>
<<set window._kiraCNCInterveneLateData to {
damageDealt: 20,
enemyName: $combat.enemies[0].name
}>>
<</silently>>
<<script>>
setTimeout(function() {
var data = window._kiraCNCInterveneLateData;
if (!data) return;
var narrativeEl = document.querySelector('.heroic-narrative');
var resultEl = document.querySelector('.heroic-result');
if (narrativeEl) {
var html = '<h2>NO MORE!</h2>';
html += '<p>Shame burns through you. You shouldn\'t have let it get this far.</p>';
html += '<p class="player-speech">"That\'s ENOUGH!"</p>';
html += '<p>You tackle ' + data.enemyName + ' away from Kira\'s exposed body. They\'re off-balance, caught with their pants down—literally.</p>';
narrativeEl.innerHTML = html;
}
if (resultEl) {
var html = '<p class="success">Your attack catches them completely vulnerable. +' + data.damageDealt + ' damage dealt!</p>';
html += '<p class="concern">Kira is still half-naked. You\'ll need to deal with her clothing after the fight.</p>';
resultEl.innerHTML = html;
}
}, 50);
<</script>>
<</widget>>
<<widget "kiraCNCInterveneLateCardFlow">>
<<kiraCNCInterveneLateCard>>
<<executeKiraCNCInterveneLateCard>>
<div class="choice-container">
<<vchoice "END THEM" "Combat_Actions" "action" "attack">>
</div>
<</widget>>
<<widget "executeKiraCNCJoinCard">>
<<silently>>
<<set $flags.joinedKiraCNC to true>>
<<addCorruption 15>>
<<set $player.lust to 0>><<run setup.playerReleased()>>
<<set $companions[0].trauma to ($companions[0].trauma || 0) + 30>>
<<set $clothing.kira.top to 0>>
<<set $clothing.kira.bottom to 0>>
<<set $clothing.kira.titsExposed to true>>
<<set $clothing.kira.pussyExposed to true>>
<<set $flags.rapedUnconsciousKira to true>>
<<set window._kiraCNCJoinData to {
enemyName: $temp.cncEnemyName,
enemyGender: $temp.cncEnemyGender || "male"
}>>
<<kiraMediaTarget>>
<<if !_storyClip>><<fillCombatVideoBox "kira-cnc-join-video" `$temp.cncEnemyGender === "female" ? "combat/kira_cnc_join_female" : "combat/kira_cnc_join_male"` _kiraMediaTarget>><</if>>
<</silently>>
<<script>>
setTimeout(function() {
var data = window._kiraCNCJoinData;
if (!data) return;
var sceneEl = document.querySelector('.cnc-scene-display');
var narrativeEl = document.querySelector('.cnc-narrative');
if (sceneEl) {
sceneEl.innerHTML = '<h2>The Darkest Path</h2>';
}
if (narrativeEl) {
var html = '<p class="player-speech">"Room for one more?"</p>';
html += '<p>' + data.enemyName + ' laughs, surprised but approving.</p>';
if (data.enemyGender === "male") {
html += '<p class="enemy-speech">"Fuck, man. Didn\'t think you had it in you."</p>';
html += '<p>Between the two of you, Kira\'s unconscious body is used thoroughly. You take her mouth while he takes her pussy, her limp form shifting between you like a ragdoll.</p>';
html += '<p class="explicit">Her throat is warm and wet around your cock. She can\'t gag, can\'t protest—just takes you deeper with each thrust.</p>';
html += '<p class="explicit">Once, her tongue presses flat against the underside of your cock. Then it lies still.</p>';
html += '<p>When you both finish, you leave her covered in evidence of what you did.</p>';
} else {
html += '<p class="enemy-speech">"Oh, this is getting interesting."</p>';
html += '<p>She positions Kira\'s face at her pussy while you slide between Kira\'s legs.</p>';
html += '<p class="explicit">You fuck Kira\'s unconscious body while the raider grinds against her slack face, using her mouth and tongue despite her complete lack of participation.</p>';
html += '<p class="explicit">Her cunt gives one hard squeeze around you, then goes soft again.</p>';
html += '<p class="enemy-speech">"She\'s not bad. Bet she\'ll be horrified when she wakes up."</p>';
html += '<p class="dark-consequence">You don\'t care. In this moment, she\'s just a warm body to use.</p>';
}
html += '<p>After, ' + data.enemyName + ' collects their things.</p>';
html += '<p class="enemy-speech">"Well. That was fun. No hard feelings?"</p>';
html += '<p>They leave, and you\'re alone with what you\'ve done.</p>';
narrativeEl.innerHTML = html;
}
}, 50);
<</script>>
<</widget>>
<<widget "kiraCNCJoinCardFlow">>
<<kiraCNCJoinCard "THE DARKEST PATH">>
<<executeKiraCNCJoinCard>>
<<run VaultUI.showCharacter("kira", "center", "vulnerable")>>
<div class="choice-container">
<<vchoice "Clean her up... try to hide it" "Combat_CNC_Aftermath_Cleanup_Guilt" "action" "health">>
<<vchoice "Leave her. She'll never know it was you." "Combat_CNC_Aftermath_Leave_Guilt" "action" "run">>
</div>
<</widget>>
<<widget "kiraCNCJoinCard">>
<div class="combat-card companion-card kira-cnc-card">
<div class="card-header cnc-header extreme-header">
<span class="card-icon"><<icon "corruption">></span>
<span class="card-title"><<print _args[0] || "JOINING IN">></span>
</div>
<div class="card-body">
<div class="cnc-scene-display"></div>
<div id="kira-cnc-join-video" class="card-video-container" style="display:none"></div>
<div class="cnc-narrative"></div>
</div>
<div class="card-footer companion-card-footer">
<div class="kira-status-row">
<span class="kira-hp"><<icon "health" "medium">> <<print $companions[0].health>>/<<print $companions[0].maxHealth>></span>
<span class="kira-lust"><<icon "lust" "medium">> <<print $companions[0].lust>>%</span>
</div>
</div>
</div>
<</widget>>
<<widget "executeKiraCNCJoinMaleCard">>
<<silently>>
<<set $flags.joinedKiraCNC to true>>
<<addCorruption 15>>
<<set $player.lust to 0>><<run setup.playerReleased()>>
<<set $companions[0].trauma to ($companions[0].trauma || 0) + 30>>
<<set $clothing.kira.top to 0>>
<<set $clothing.kira.bottom to 0>>
<<set $clothing.kira.titsExposed to true>>
<<set $clothing.kira.pussyExposed to true>>
<<set $flags.rapedUnconsciousKira to true>>
<<set window._kiraCNCJoinMaleData to {
enemyName: $temp.cncEnemyName
}>>
<<kiraMediaTarget>>
<<if !_storyClip>><<fillCombatVideoBox "kira-cnc-join-video" "combat/kira_cnc_join_male" _kiraMediaTarget>><</if>>
<</silently>>
<<script>>
setTimeout(function() {
var data = window._kiraCNCJoinMaleData;
if (!data) return;
var sceneEl = document.querySelector('.cnc-scene-display');
var narrativeEl = document.querySelector('.cnc-narrative');
if (sceneEl) {
sceneEl.innerHTML = '<p class="player-speech">"She\'s got another hole."</p>';
}
if (narrativeEl) {
var html = '<p class="enemy-speech">"Now you\'re talking."</p>';
html += '<p class="explicit">You position yourself at Kira\'s mouth while the raider continues fucking her pussy. Her unconscious throat opens for you, and soon you\'re both using her limp body in tandem.</p>';
html += '<p class="explicit">Her lips close on your shaft and pull, one hard suck, before her jaw drops slack again.</p>';
html += '<p class="enemy-speech">"Better than fighting, right?"</p>';
html += '<p class="explicit">You grunt agreement, thrusting into her slack mouth. She can\'t control her gag reflex like this—or anything else. Drool and precum leak from the corners of her lips.</p>';
html += '<p>You both finish, leaving her covered in cum—mouth, pussy, and splattered across her exposed breasts.</p>';
html += '<p class="enemy-speech">"Good doing business with you."</p>';
html += '<p>He leaves. You stare at what you\'ve done.</p>';
narrativeEl.innerHTML = html;
}
}, 50);
<</script>>
<</widget>>
<<widget "kiraCNCJoinMaleCardFlow">>
<<kiraCNCJoinCard>>
<<executeKiraCNCJoinMaleCard>>
<<run VaultUI.showCharacter("kira", "center", "vulnerable")>>
<div class="choice-container">
<<vchoice "Clean her up" "Combat_CNC_Aftermath_Cleanup_Guilt" "action" "health">>
<<vchoice "Just carry her home like this" "Combat_CNC_Aftermath_Leave_Guilt" "action" "run">>
</div>
<</widget>>
<<widget "executeKiraCNCJoinFemaleCard">>
<<silently>>
<<set $flags.joinedKiraCNC to true>>
<<addCorruption 15>>
<<set $player.lust to 0>><<run setup.playerReleased()>>
<<set $companions[0].trauma to ($companions[0].trauma || 0) + 30>>
<<set $clothing.kira.top to 0>>
<<set $clothing.kira.bottom to 0>>
<<set $clothing.kira.titsExposed to true>>
<<set $clothing.kira.pussyExposed to true>>
<<set $flags.rapedUnconsciousKira to true>>
<<set window._kiraCNCJoinFemaleData to {
enemyName: $temp.cncEnemyName
}>>
<<kiraMediaTarget>>
<<if !_storyClip>><<fillCombatVideoBox "kira-cnc-join-video" "combat/kira_cnc_join_female" _kiraMediaTarget>><</if>>
<</silently>>
<<script>>
setTimeout(function() {
var data = window._kiraCNCJoinFemaleData;
if (!data) return;
var sceneEl = document.querySelector('.cnc-scene-display');
var narrativeEl = document.querySelector('.cnc-narrative');
if (sceneEl) {
sceneEl.innerHTML = '<p class="player-speech">"Make her mouth useful while I take her pussy."</p>';
}
if (narrativeEl) {
var html = '<p class="enemy-speech">"Ooh, demanding. I like it."</p>';
html += '<p class="explicit">The raider straddles Kira\'s face, grinding against her slack mouth, while you position yourself between Kira\'s legs. Her pussy is wet—aroused despite unconsciousness, body betraying mind.</p>';
html += '<p class="explicit">You slide into her without resistance. She\'s tight, warm, completely limp. The raider moans above you, using Kira\'s face for her own pleasure.</p>';
html += '<p class="explicit">Her hips lift an inch to meet your next thrust and drop back.</p>';
html += '<p class="enemy-speech">"She\'s—fuck—surprisingly good at this even knocked out—"</p>';
html += '<p>You both finish. The raider climbs off, leaving Kira\'s face wet.</p>';
html += '<p class="enemy-speech">"We should do this again sometime. Find me if you want round two."</p>';
html += '<p>She disappears into the Reclaimed, leaving you with your unconscious, violated companion.</p>';
narrativeEl.innerHTML = html;
}
}, 50);
<</script>>
<</widget>>
<<widget "kiraCNCJoinFemaleCardFlow">>
<<kiraCNCJoinCard>>
<<executeKiraCNCJoinFemaleCard>>
<<run VaultUI.showCharacter("kira", "center", "vulnerable")>>
<div class="choice-container">
<<vchoice "Clean her up" "Combat_CNC_Aftermath_Cleanup_Guilt" "action" "health">>
<<vchoice "Carry her home like this" "Combat_CNC_Aftermath_Leave_Guilt" "action" "run">>
</div>
<</widget>><<widget "kiraCNCWatchCard">>
<div class="combat-card companion-card kira-cnc-card">
<div class="card-header cnc-header dark-header">
<span class="card-icon"><<icon "voyeur">></span>
<span class="card-title">A DARK CHOICE</span>
</div>
<div class="card-body">
<div class="cnc-scene-display"></div>
<div class="cnc-narrative"></div>
</div>
<div class="card-footer companion-card-footer">
<div class="kira-status-row">
<span class="kira-hp"><<icon "health" "medium">> <<print $companions[0].health>>/<<print $companions[0].maxHealth>></span>
<span class="kira-lust"><<icon "lust" "medium">> <<print $companions[0].lust>>%</span>
</div>
</div>
</div>
<</widget>>
<<widget "executeKiraCNCWatchCard">>
<<silently>>
<<set $flags.allowedKiraCNC to true>>
<<addCorruption 5>>
<<set _lustEnemy to $combat.enemies.find(e => e.health > 0 && e.lust >= 40)>>
<<if !_lustEnemy>>
<<set _lustEnemy to $combat.enemies.find(e => e.health > 0)>>
<</if>>
<<set $temp.cncEnemyId to _lustEnemy.id>>
<<set $temp.cncEnemyName to _lustEnemy.name>>
<<set $temp.cncEnemyGender to _lustEnemy.gender || "male">>
<<set window._kiraCNCWatchData to {
enemyName: _lustEnemy.name,
enemyGender: _lustEnemy.gender || "male",
narrative: setup.combatNarrative.kira_cnc_approach ? setup.combatNarrative.kira_cnc_approach.random() : "The enemy approaches her unconscious form..."
}>>
<</silently>>
<<script>>
var storyClip = State.temporary.storyClip;
setTimeout(function() {
var data = window._kiraCNCWatchData;
if (!data) return;
var sceneEl = document.querySelector('.cnc-scene-display');
var narrativeEl = document.querySelector('.cnc-narrative');
if (sceneEl) {
sceneEl.innerHTML = '<p class="dark-intro">Something sick twists in your gut as you step back instead of forward.</p>';
}
if (narrativeEl) {
var html = '';
if (data.enemyGender === "male") {
html += '<p class="enemy-speech">"What\'s this? Not rushing to save your girlfriend?"</p>';
html += '<p>He kicks your weapon aside, eyes never leaving Kira\'s prone form.</p>';
html += '<p class="enemy-speech">"Smart move, staying out of my way."</p>';
html += (storyClip === "4292ac66e8d1" ? '<p>He approaches her, crouching down. His rough fingers trace her slack lips, then he leans in and kisses her open mouth.</p>' : '<p>He approaches her, crouching down. His rough hand brushes hair from her face.</p>');
html += '<p>Her lashes flutter. He takes it for a twitch.</p>';
html += '<p class="enemy-speech">"Pretty thing. Shame she had to fight."</p>';
html += '<p class="internal-thought dark">You could stop this. You\'re right here. But something keeps you rooted to the spot.</p>';
html += (storyClip === "4292ac66e8d1" ? '<p>His other hand is already under her clothes, cupping her between the legs.</p>' : '<p>His hands move to her clothing, fingers hooking under the hem of her top.</p>');
} else {
html += '<p class="enemy-speech">"Aww, is she broken? That\'s no fun."</p>';
html += '<p>She saunters over to Kira\'s body, kneeling beside her.</p>';
html += '<p class="enemy-speech">"Still warm though. Still... usable."</p>';
html += '<p>Her fingers trace down Kira\'s neck to her chest.</p>';
html += '<p>Under the thin top one of Kira\'s nipples stiffens against the raider\'s thumb. Her face doesn\'t change.</p>';
html += '<p class="enemy-speech">"Your little girlfriend is quite the catch. Mind if I play?"</p>';
html += '<p class="internal-thought dark">Part of you knows you should stop this. Another part... doesn\'t want to.</p>';
}
narrativeEl.innerHTML = html;
}
}, 50);
<</script>>
<</widget>>
<<widget "kiraCNCWatchCardFlow">>
<<kiraCNCWatchCard>>
<<executeKiraCNCWatchCard>>
<<run VaultUI.showCharacter("kira", "center", "unconscious")>>
<div class="choice-container">
<<vchoice "Watch them strip her" "Combat_Kira_CNC_Strip" "intimate" "voyeur">>
<<vchoice "Changed my mind—STOP!" "Combat_Kira_CNC_Intervene" "action" "attack">>
<<if $player.corruption >= 40>>
<<vchoice "Join in..." "Combat_Kira_CNC_Join" "intimate" "lust">>
<</if>>
</div>
<</widget>>
<<widget "kiraCNCInterveneCard">>
<div class="combat-card companion-card kira-heroic-card">
<div class="card-header heroic-header">
<span class="card-icon"><<icon "attack">></span>
<span class="card-title">ENOUGH!</span>
</div>
<div class="card-body">
<div class="heroic-narrative"></div>
<div class="heroic-result"></div>
</div>
<div class="card-footer companion-card-footer">
<div class="kira-status-row">
<span class="kira-hp"><<icon "health" "medium">> <<print $companions[0].health>>/<<print $companions[0].maxHealth>></span>
<span class="kira-lust"><<icon "lust" "medium">> <<print $companions[0].lust>>%</span>
</div>
</div>
</div>
<</widget>>
<<widget "executeKiraCNCInterveneCard">>
<<silently>>
<<clampStat "player.corruption" -2 0 `$player.maxCorruption || setup.CORRUPTION_MAX`>>
<<set $combat.enemies[0].stunned to true>>
<<set $combat.enemies[0].stunnedTurns to 2>>
<<set $combat.enemies[0].health -= 15>>
<<applyEnemyDamageExpression $combat.enemies[0]>>
<<logCombat "Righteous fury! You attack with renewed vigor!" "critical">>
<<set window._kiraCNCInterveneData to {
damageDealt: 15,
enemyName: $combat.enemies[0].name
}>>
<</silently>>
<<script>>
setTimeout(function() {
var data = window._kiraCNCInterveneData;
if (!data) return;
var narrativeEl = document.querySelector('.heroic-narrative');
var resultEl = document.querySelector('.heroic-result');
if (narrativeEl) {
var html = '<p>The moment breaks. Whatever dark spell held you snaps.</p>';
html += '<p class="player-speech">"GET YOUR HANDS OFF HER!"</p>';
html += '<p>You charge, weapon raised. ' + data.enemyName + ' barely has time to react before you\'re on them.</p>';
narrativeEl.innerHTML = html;
}
if (resultEl) {
resultEl.innerHTML = '<p class="success">Your sudden attack catches them off-guard. +' + data.damageDealt + ' damage dealt!</p>';
}
}, 50);
<</script>>
<</widget>>
<<widget "kiraCNCInterveneCardFlow">>
<<kiraCNCInterveneCard>>
<<executeKiraCNCInterveneCard>>
<div class="choice-container">
<<vchoice "Finish the fight!" "Combat_Actions" "action" "attack">>
</div>
<</widget>>
<<widget "kiraFleeCard">>
<div class="combat-card companion-card kira-flee-card">
<div class="card-header flee-header">
<span class="card-icon"><<icon "run">></span>
<span class="card-title">ESCAPE</span>
</div>
<div class="card-body">
<div class="flee-narrative"></div>
</div>
<div class="card-footer companion-card-footer">
<div class="kira-status-row">
<span class="kira-hp"><<icon "health" "medium">> <<print $companions[0].health>>/<<print $companions[0].maxHealth>></span>
<span class="kira-lust"><<icon "lust" "medium">> <<print $companions[0].lust>>%</span>
</div>
</div>
</div>
<</widget>>
<<widget "executeKiraFleeCard">>
<<silently>>
<<set _savedReturnPassage to $combat.returnPassage || "Vault_Hub">>
<<set $combat.result to "fled_with_kira">>
<<endCombat>>
<<set window._kiraFleeData to {
returnPassage: _savedReturnPassage,
firstTime: setup.kiraKnockoutIsFirst()
}>>
<</silently>>
<<script>>
setTimeout(function() {
var data = window._kiraFleeData;
if (!data) return;
var narrativeEl = document.querySelector('.flee-narrative');
if (narrativeEl) {
var html = '<p>You grab Kira\'s limp body, hoisting her over your shoulder in a fireman\'s carry.</p>';
html += '<p class="player-speech">"We\'re leaving. NOW."</p>';
html += '<p>The enemies give chase but you\'re running on pure adrenaline. Her unconscious weight slows you down, but you push through the pain.</p>';
html += '<p>After what feels like an eternity, you lose them in the maze of ruins.</p>';
html += '<p>You find a sheltered alcove and carefully set Kira down. Her breathing is shallow but steady.</p>';
if (data.firstTime) {
html += '<p class="concern">She\'s completely unresponsive. This isn\'t just being knocked out—something\'s wrong.</p>';
} else {
html += '<p class="concern">She\'s out cold again. You need to get her back to the vault.</p>';
}
narrativeEl.innerHTML = html;
}
}, 50);
<</script>>
<</widget>>
<<widget "kiraFleeCardFlow">>
<<kiraFleeCard>>
<<executeKiraFleeCard>>
<<run VaultUI.setBackgroundDirect(setup.combatBackgroundImage())>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<div class="choice-container">
<<if setup.kiraKnockoutIsFirst()>>
<<vchoice "Continue" "Kira_Unconscious_FirstTime_Start" "action" "forward">>
<<else>>
<<vchoice "Continue" "Kira_Unconscious_Carry_Home" "action" "forward">>
<</if>>
</div>
<</widget>>
<<widget "kiraVictoryUnconsciousCard">>
<div class="combat-card companion-card kira-victory-card">
<div class="card-header victory-header">
<span class="card-icon"><<icon "health">></span>
<span class="card-title">PYRRHIC VICTORY</span>
</div>
<div class="card-body">
<div class="victory-narrative"></div>
</div>
<div class="card-footer companion-card-footer">
<div class="kira-status-row">
<span class="kira-hp"><<icon "health" "medium">> <<print $companions[0].health>>/<<print $companions[0].maxHealth>></span>
<span class="kira-lust"><<icon "lust" "medium">> <<print $companions[0].lust>>%</span>
</div>
</div>
</div>
<</widget>>
<<widget "executeKiraVictoryUnconsciousCard">>
<<silently>>
<<checkKiraUnconscious>>
<<setKiraUnconscious>>
<<set _savedReturnPassage to $combat.returnPassage || "Vault_Hub">>
<<endCombat>>
<<set window._kiraVictoryData to {
firstTime: setup.kiraKnockoutIsFirst()
}>>
<</silently>>
<<script>>
setTimeout(function() {
var data = window._kiraVictoryData;
if (!data) return;
var narrativeEl = document.querySelector('.victory-narrative');
if (narrativeEl) {
var html = '<h2>Pyrrhic Victory</h2>';
html += '<p>The enemies are defeated, but at what cost?</p>';
html += '<p>You rush to Kira\'s side, kneeling beside her crumpled form.</p>';
html += '<p class="player-speech">"Kira! Kira, can you hear me?"</p>';
html += '<p>No response. Her eyes are closed, her face pale. Blood mats her hair where she took the blow.</p>';
html += '<p>You check her pulse—steady but weak. She\'s alive, but completely unconscious.</p>';
if (data.firstTime) {
html += '<p class="concern">This isn\'t normal. Even bad hits don\'t knock someone out like this. Something\'s wrong.</p>';
} else {
html += '<p class="concern">Not again. You need to get her back to the vault for recovery.</p>';
}
narrativeEl.innerHTML = html;
}
}, 50);
<</script>>
<</widget>>
<<widget "kiraVictoryUnconsciousCardFlow">>
<<kiraVictoryUnconsciousCard>>
<<executeKiraVictoryUnconsciousCard>>
<<run VaultUI.setBackgroundDirect(setup.combatBackgroundImage())>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<div class="choice-container">
<<if setup.kiraKnockoutIsFirst()>>
<<vchoice "Continue" "Kira_Unconscious_FirstTime_Start" "action" "forward">>
<<else>>
<<vchoice "Continue" "Kira_Unconscious_Carry_Home" "action" "forward">>
<</if>>
</div>
<</widget>>
<<widget "kiraWatchFuckedCard">>
<div class="combat-card companion-card kira-sex-card">
<div class="card-header sex-header dark-header">
<span class="card-icon"><<icon "voyeur">></span>
<span class="card-title">WATCHING...</span>
</div>
<div class="card-body">
<div id="kira-fucked-image" class="card-image-container"></div>
<div id="kira-fucked-narrative" class="sex-scene-display"></div>
<div id="kira-fucked-video" class="card-video-container"></div>
<div id="kira-fucked-reaction" class="kira-reaction"></div>
<div id="kira-fucked-effects" class="scene-effects"></div>
</div>
<div class="card-footer companion-card-footer">
<div class="kira-status-row">
<<if $companions[0] && typeof $companions[0].health !== "number">>
<<set $companions[0].health to $companions[0].maxHealth || 100>>
<</if>>
<<set _kiraHP to $companions[0] ? $companions[0].health : 100>>
<<set _kiraMaxHP to ($companions[0] && $companions[0].maxHealth) ? $companions[0].maxHealth : 100>>
<<set _kiraLust to ($companions[0] && typeof $companions[0].lust === "number") ? $companions[0].lust : 0>>
<span class="kira-hp"><<icon "health" "medium">> <<print _kiraHP>>/<<print _kiraMaxHP>></span>
<span class="kira-lust"><<icon "lust" "medium">> <<print _kiraLust>>%</span>
</div>
</div>
</div>
<</widget>>
<<widget "executeKiraWatchFuckedCard">>
<<silently>>
<<if $companions[0] && typeof $companions[0].health !== "number">>
<<run console.error("HEALTH ALREADY CORRUPTED at executeKiraWatchFuckedCard start! Value:", $companions[0].health)>>
<</if>>
<<kiraAssailant>>
<<setPronouns _enemy>>
<<set _isBound to ($combat.kiraWristsBound || $combat.kiraAnklesBound)>>
<<set _isRefractory to $combat.kiraInRefractory>>
<<if _isBound>>
<<clampStat "player.lust" 35>>
<<set $flags.watchedKiraGetFucked to true>>
<<set $flags.kiraFuckedWhileBound to true>>
<<if _isRefractory>>
<<trackPostOrgasmAttack "fuck">>
<</if>>
<<addKiraLust 15>>
<<set _kiraOrgasm to ($companions[0].lust >= 100)>>
<<if _kiraOrgasm>>
<<set $companions[0].lust to random(40, 50)>>
<<set $combat.kiraInRefractory to true>>
<<set $combat.kiraRefractoryTurns to 3>>
<</if>>
<<set _enemy.stunned to true>>
<<set _enemy.stunnedTurns to 2>>
<<set $combat.kiraDazed to true>>
<<set $combat.kiraDazedTurns to 3>>
<<relationChange "kira" "trust" `setup.kiraUseTrust(-6)`>>
<<addTension "kira" 12 "" "combat">>
<<elseif _isRefractory>>
<<trackPostOrgasmAttack "fuck">>
<<clampStat "player.lust" 30>>
<<set $flags.watchedKiraGetFucked to true>>
<<set $flags.kiraFuckedInCombat to true>>
<<addKiraLust 10>>
<<set _enemy.stunned to true>>
<<set _enemy.stunnedTurns to 2>>
<<set $combat.kiraDazed to true>>
<<set $combat.kiraDazedTurns to 3>>
<<relationChange "kira" "trust" `setup.kiraUseTrust(-5)`>>
<<addTension "kira" 10 "" "combat">>
<<set _kiraOrgasm to false>>
<<else>>
<<clampStat "player.lust" 30>>
<<set $flags.watchedKiraGetFucked to true>>
<<set $flags.kiraFuckedInCombat to true>>
<<addKiraLust 10>>
<<set _enemy.stunned to true>>
<<set _enemy.stunnedTurns to 2>>
<<set $combat.kiraDazed to true>>
<<set $combat.kiraDazedTurns to 2>>
<<relationChange "kira" "trust" `setup.kiraUseTrust(-4)`>>
<<addTension "kira" 8 "" "combat">>
<<set _kiraOrgasm to false>>
<</if>>
<<addMaleEnemyLust `random(15, 20)` "sex_act_complete">>
<<set _videoPath to null>>
<<kiraMediaTarget>>
<<fillCombatVideoBox "kira-fucked-video" "combat/kira_fucked" _kiraMediaTarget>>
<<if _kiraOrgasm>>
<<fillCombatVideoBox "kira-fucked-video" "combat/kira_orgasm" _kiraMediaTarget>>
<</if>>
<<if _isBound>>
<<set _narrativeStart to setup.combatNarrative.kira_bound_fucked_start ? setup.fillPlayerName(setup.fillEnemyName(setup.combatNarrative.kira_bound_fucked_start.random(), _enemy)) : "Bound and helpless, she can't resist.">>
<<set _narrativePenetration to setup.combatNarrative.kira_bound_fucked_penetration ? setup.combatNarrative.kira_bound_fucked_penetration.random() : "He enters her roughly, using her bound body.">>
<<set _narrativeDuring to setup.combatNarrative.kira_bound_fucked_during ? setup.combatNarrative.kira_bound_fucked_during.random() : "She jerks helplessly with each brutal thrust.">>
<<set _narrativeAftermath to setup.combatNarrative.kira_bound_fucked_aftermath ? setup.combatNarrative.kira_bound_fucked_aftermath.random() : "Cum leaks from her violated body.">>
<<if _kiraOrgasm>>
<<set _narrativeClimax to setup.combatNarrative.kira_bound_fucked_climax ? setup.combatNarrative.kira_bound_fucked_climax.random() : "Despite everything, her body betrays her with a shuddering orgasm.">>
<</if>>
<</if>>
<<set window._kiraWatchFuckedData to {
isBound: _isBound,
isRefractory: _isRefractory,
kiraOrgasm: _kiraOrgasm,
enemyName: _enemy.name,
pronoun: _p,
videoPath: _videoPath,
videoFormat: _videoFormat,
narrativeStart: _narrativeStart,
narrativePenetration: _narrativePenetration,
narrativeDuring: _narrativeDuring,
narrativeAftermath: _narrativeAftermath,
narrativeClimax: _narrativeClimax,
kiraAllows: setup.kiraAllowsUse(),
showVideos: $preferences && $preferences.showVideos
}>>
<</silently>>
<<script>>
setTimeout(function() {
var data = window._kiraWatchFuckedData;
if (!data) return;
var imageEl = document.getElementById('kira-fucked-image');
var narrativeEl = document.getElementById('kira-fucked-narrative');
var videoEl = document.getElementById('kira-fucked-video');
var reactionEl = document.getElementById('kira-fucked-reaction');
var effectsEl = document.getElementById('kira-fucked-effects');
if (imageEl) {
imageEl.innerHTML = '';
}
if (narrativeEl) {
var html = '<p class="dark-intro">You... don\'t intervene. You WATCH.</p>';
if (data.isBound) {
html += '<p class="explicit">' + (data.narrativeStart || 'Bound and helpless, she can\'t stop what\'s coming.') + '</p>';
html += '<p class="enemy-speech">"Can\'t fight back now, can you? Perfect."</p>';
html += '<p class="explicit">' + (data.narrativePenetration || 'He enters her roughly.') + '</p>';
html += '<p class="explicit">' + (data.narrativeDuring || 'You watch her bound body jerk with each brutal thrust.') + '</p>';
html += '<p class="internal-thought dark">You\'re watching her get fucked while tied up. Hard. Aroused.</p>';
if (data.kiraOrgasm) {
html += '<p class="explicit climax">' + (data.narrativeClimax || 'Her body betrays her—shuddering through an unwilling orgasm.') + '</p>';
}
html += '<p>After a minute, ' + data.enemyName + ' GRUNTS, finishing inside her bound body.</p>';
html += '<p class="enemy-speech">"Tied-up slut. Took it all like a good girl."</p>';
html += '<p class="explicit">' + (data.narrativeAftermath || 'Cum leaks from her violated body.') + '</p>';
} else if (data.isRefractory) {
html += '<p class="kira-speech">"What are you— NO! I just— AHHH!"</p>';
html += '<p class="explicit">' + data.enemyName + ' drives ' + data.pronoun.his + ' cock into her still-sensitive pussy.</p>';
html += '<p>' + data.pronoun.He + ' starts fucking her. Her oversensitive body convulses with every thrust.</p>';
html += '<p class="internal-thought dark">You\'re watching. Hard. Aroused.</p>';
html += '<p>After a minute, ' + data.enemyName + ' GRUNTS, finishing inside her.</p>';
if (data.kiraAllows) {
html += '<p>Kira lies there twitching, cum leaking from her pussy, her eyes glazed over. When they find you she manages a lopsided, wrecked grin.</p>';
html += '<p class="kira-speech">"...fuck... can\'t... anymore... ...keep looking..."</p>';
} else {
html += '<p>Kira lies there twitching, cum leaking from her pussy, completely broken. Her eyes are glazed over.</p>';
html += '<p class="kira-speech">"...can\'t... anymore..."</p>';
}
} else if (data.kiraAllows) {
html += '<p class="kira-speech">"Get your fucking— AH—!"</p>';
html += '<p class="explicit">' + data.enemyName + ' drives ' + data.pronoun.his + ' cock into her exposed pussy.</p>';
html += '<p class="kira-speech">"AHHH— you fucking— oh fuck—"</p>';
html += '<p>' + data.pronoun.He + ' starts fucking her. Hard. Brutal. She\'s struggling, and her body is answering every thrust.</p>';
html += '<p class="kira-speech">"Fuck you— nngh— fuck you— fuck—"</p>';
html += '<p>Her curses are getting weaker. Moans mixing with the words. Her eyes find you over ' + data.pronoun.his + ' shoulder, and she doesn\'t call your name.</p>';
html += '<p class="internal-thought dark">You\'re watching. Hard. Aroused.</p>';
html += '<p>After a minute, ' + data.enemyName + ' GRUNTS, finishing inside her.</p>';
html += '<p>Kira lies there, cum leaking from her pussy, and when her eyes find yours they\'re wild and bright, and she licks her lips.</p>';
} else {
html += '<p class="kira-speech">"What are you— HELP ME!"</p>';
html += '<p class="explicit">' + data.enemyName + ' drives ' + data.pronoun.his + ' cock into her exposed pussy.</p>';
html += '<p class="kira-speech">"AHHH— no— oh god—"</p>';
html += '<p>' + data.pronoun.He + ' starts fucking her. Hard. Brutal. She\'s struggling but her body is responding.</p>';
html += '<p class="kira-speech">"Stop— please— nngh— fuck—"</p>';
html += '<p>Her protests are getting weaker. Moans mixing with the words.</p>';
html += '<p class="internal-thought dark">You\'re watching. Hard. Aroused.</p>';
html += '<p>After a minute, ' + data.enemyName + ' GRUNTS, finishing inside her.</p>';
html += '<p>Kira lies there, cum leaking from her pussy, staring at you with betrayal and confusion.</p>';
}
narrativeEl.innerHTML = html;
}
if (reactionEl) {
if (data.kiraAllows) {
if (data.isBound) {
reactionEl.innerHTML = '<p class="kira-speech">"...tied up... couldn\'t stop him... fuck, my pussy... ...you saw that. Tell me you saw that."</p>';
} else {
reactionEl.innerHTML = '<p class="kira-speech">"You watched. ...Good. Keep your eyes on me, vault boy. This fight\'s not over."</p>';
}
} else if (data.isBound) {
reactionEl.innerHTML = '<p class="kira-speech">"...was tied... couldn\'t stop... my pussy..."</p>';
} else {
reactionEl.innerHTML = '<p class="kira-speech">"You... you just WATCHED..."</p>';
}
}
if (effectsEl) {
var effectHtml = '<div class="effect-row"><span class="icon"><span class="gi gi-stunned"></span></span> ' + data.pronoun.He + '\'s stunned. Post-orgasm vulnerability.</div>';
if (data.kiraAllows) {
effectHtml += '<div class="effect-row"><span class="icon"><span class="gi gi-lips"></span></span> Kira is wrecked, and grinning about it.</div>';
} else {
effectHtml += '<div class="effect-row"><span class="icon"><span class="gi gi-broken-heart"></span></span> Kira is dazed from the violation.</div>';
}
if (data.isBound && !data.kiraAllows) {
effectHtml += '<div class="effect-row negative"><span class="icon"><span class="gi gi-arrow-down"></span></span> Trust severely damaged (-6)</div>';
}
effectsEl.innerHTML = effectHtml;
}
}, 50);
<</script>>
<</widget>>
<<widget "kiraWatchFuckedCardFlow">>
<<kiraWatchFuckedCard>>
<<executeKiraWatchFuckedCard>>
<<silently>>
<<kiraAssailant>>
<<setPronouns _enemy>>
<</silently>>
<div class="choice-container">
<<vchoice `"Kill " + _p.him + " NOW"` "Combat_Kill_Stunned" "action" "skull-bones">>
<<vchoice "Check on Kira" "Combat_Check_Kira" "talk" "broken-heart">>
</div>
<</widget>>
<<widget "kiraCheckCard">>
<div class="combat-card companion-card kira-check-card">
<div class="card-header check-header">
<span class="card-icon"><<icon "broken-heart">></span>
<span class="card-title">AFTERMATH</span>
</div>
<div class="card-body">
<div class="check-narrative"></div>
</div>
<div class="card-footer companion-card-footer">
<div class="kira-status-row">
<span class="kira-hp"><<icon "health" "medium">> <<print $companions[0].health>>/<<print $companions[0].maxHealth>></span>
<span class="kira-lust"><<icon "lust" "medium">> <<print $companions[0].lust>>%</span>
</div>
</div>
</div>
<</widget>>
<<widget "executeKiraCheckCard">>
<<script>>
var storyFamily = State.temporary.storyFamily;
var kiraAllows = setup.kiraAllowsUse();
setTimeout(function() {
var narrativeEl = document.querySelector('.check-narrative');
if (narrativeEl) {
if (kiraAllows) {
var html = (storyFamily === "sf_cg_combat_kira_watched_fucked_04" ? '<p>You go to Kira. She\'s slumped face-down where she was left, her fist jammed between her teeth, biting down on it hard enough to leave marks.</p>' : '<p>You go to Kira. She\'s sitting up, cum leaking from her.</p>');
html += '<p class="player-speech">"Kira, I—"</p>';
html += '<p class="kira-speech">"Not a word. Not yet. I can\'t feel my legs."</p>';
html += '<p>She looks up at you, flushed to the ears, and her mouth twitches.</p>';
html += '<p class="kira-speech">"Go on, finish them. I\'m not going anywhere. I couldn\'t if I tried."</p>';
} else {
var html = (storyFamily === "sf_cg_combat_kira_watched_fucked_04" ? '<p>You go to Kira. She\'s slumped face-down where she was left, fist jammed between her teeth to keep from sobbing.</p>' : '<p>You go to Kira. She\'s sitting up, cum leaking from her.</p>');
html += '<p class="player-speech">"Kira, I—"</p>';
html += '<p class="kira-speech">"Don\'t. Just... don\'t."</p>';
html += '<p>She won\'t look at you.</p>';
}
narrativeEl.innerHTML = html;
}
}, 50);
<</script>>
<</widget>>
<<widget "kiraCheckCardFlow">>
<<kiraCheckCard>>
<<executeKiraCheckCard>>
<div class="choice-container">
<<vchoice "Finish the fight" "Combat_Actions" "move" "map">>
</div>
<</widget>>
<<widget "kiraVictoryAfterFuckedCard">>
<div class="combat-card companion-card kira-aftermath-card">
<div class="card-header aftermath-header">
<span class="card-icon"><<icon "broken-heart">></span>
<span class="card-title">VICTORY</span>
</div>
<div class="card-body">
<div class="aftermath-narrative"></div>
</div>
<div class="card-footer companion-card-footer">
<div class="kira-status-row">
<span class="kira-hp"><<icon "health" "medium">> <<print $companions[0].health>>/<<print $companions[0].maxHealth>></span>
<span class="kira-lust"><<icon "lust" "medium">> <<print $companions[0].lust>>%</span>
</div>
</div>
</div>
<</widget>>
<<widget "executeKiraVictoryAfterFuckedCard">>
<<silently>>
<<endCombat>>
<<set $combat.result to "victory">>
<<advanceTime 0 30>>
<</silently>>
<<script>>
var storyFamily = State.temporary.storyFamily;
var kiraAllows = setup.kiraAllowsUse();
setTimeout(function() {
var narrativeEl = document.querySelector('.aftermath-narrative');
if (narrativeEl) {
var html = '<h2>Victory</h2>';
if (kiraAllows) {
html += '<p>The enemies are dead.</p>';
html += (storyFamily === "sf_cg_combat_kira_watched_fucked_04" ? '<p>Kira is slumped where she was left, naked, cum leaking down her thighs, her fist jammed between her teeth.</p>' : '<p>Kira is sitting against a wall, clothes torn, cum visible.</p>');
html += '<p class="kira-speech">"You watched. The whole thing."</p>';
html += '<p class="player-speech">"I\'m sorry. I—"</p>';
html += '<p class="kira-speech">"Sorry? I told you to let them. ...Help me up. My legs are gone, so you\'re carrying the pack. And me, if I ask nicely."</p>';
} else {
html += '<p>The enemies are dead. But the damage is done.</p>';
html += (storyFamily === "sf_cg_combat_kira_watched_fucked_04" ? '<p>Kira is slumped where she was left, naked, cum leaking down her thighs, her fist jammed between her teeth.</p>' : '<p>Kira is sitting against a wall, clothes torn, cum visible.</p>');
html += '<p class="kira-speech">"You watched. You just... watched."</p>';
html += '<p class="player-speech">"I\'m sorry. I—"</p>';
html += '<p class="kira-speech">"Save it. Let\'s just go."</p>';
html += '<p class="consequence">This will have consequences.</p>';
}
narrativeEl.innerHTML = html;
}
}, 50);
<</script>>
<</widget>>
<<widget "kiraVictoryAfterFuckedCardFlow">>
<<kiraVictoryAfterFuckedCard>>
<<executeKiraVictoryAfterFuckedCard>>
<<run VaultUI.setBackgroundDirect(setup.combatBackgroundImage())>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<<if setup.kiraAllowsUse()>>
<<showCharacter "kira" "center" "seductive">>
<<else>>
<<showCharacter "kira" "center" "hurt">>
<</if>>
<<set _kvScene to setup.combatScenePassage("victory")>>
<<run setup.clearCombatScenes()>>
<div class="choice-container">
<<if _kvScene>>
<<vchoice "Continue" _kvScene "action" "forward">>
<<elseif setup.fightOnTrip()>>
<<vchoice "Back on the road" "Travel_Continue" "move" "journey">>
<<elseif setup.fightReturnPassage() !== "Vault_Hub">>
<<vchoice "Continue" `setup.fightReturnPassage()` "action" "forward">>
<<else>>
<<vchoice "Return to vault" "Vault_Hub" "move" "house">>
<</if>>
</div>
<</widget>><<widget "kiraStrippedCard">>
<div class="combat-card companion-card kira-sex-card">
<div class="card-header sex-header">
<span class="card-icon"><<icon "voyeur">></span>
<span class="card-title">STRIPPED</span>
</div>
<div class="card-body">
<div id="kira-stripped-video" class="card-video-container" style="display:none"></div>
<div class="sex-scene-display"></div>
</div>
<div class="card-footer companion-card-footer">
<div class="kira-status-row">
<span class="kira-hp"><<icon "health" "medium">> <<print $companions[0].health>>/<<print $companions[0].maxHealth>></span>
<span class="kira-lust"><<icon "lust" "medium">> <<print $companions[0].lust>>%</span>
</div>
</div>
</div>
<</widget>>
<<widget "executeKiraStrippedCard">>
<<silently>>
<<kiraAssailant>>
<<set _kscIdx to _currentEnemyIndex>>
<<set _enemy to $combat.enemies[_kscIdx]>>
<<setPronouns _enemy>>
<<set _kscEnemy to $combat.enemies[_kscIdx]>>
<<set _kscP to _p>>
<<kiraMediaTarget>>
<<if !_storyClip>><<fillCombatVideoBox "kira-stripped-video" "combat/kira_stripped_bottom" _kiraMediaTarget>><</if>>
<<damageClothing "kira" "bottom" 50>>
<<clampStat "player.lust" 20>>
<<addTension "kira" 4 "" "combat">>
<<set $combat.enemies[_kscIdx].lust to setup.enemyLustPlus($combat.enemies[_kscIdx], 25)>>
<<set window._kiraStrippedData to {
enemyName: _kscEnemy.name,
pronoun: _kscP
}>>
<</silently>>
<<script>>
var storyFamily = State.temporary.storyFamily;
setTimeout(function() {
var data = window._kiraStrippedData;
if (!data) return;
var sceneEl = document.querySelector('.sex-scene-display');
if (sceneEl) {
var html = (storyFamily === "sf_cg_combat_kira_watched_fucked_04" ? '<p>You watch as ' + data.pronoun.he + ' pins her against the wall, wrists wrenched behind her back, and hauls her clothes up over her hips...</p>' : '<p>You watch as ' + data.pronoun.he + ' tears at her clothes...</p>');
html += (storyFamily === "sf_cg_combat_kira_watched_fucked_04" ? '<p class="explicit">A fist in her panties hauls them up into her crack until both cheeks spill out bare. Then ' + data.pronoun.he + ' lets the cotton drop back and kneads her ass through it with both hands, fingers sinking in, while her pinned wrists jerk against the small of her back.</p>' : '<p class="explicit">Her pants rip away, leaving her pussy exposed.</p>');
html += '<p class="kira-speech">"NO! Stop—!"</p>';
html += '<p class="enemy-speech">"There we go. Now the fun starts."</p>';
sceneEl.innerHTML = html;
}
}, 50);
<</script>>
<</widget>>
<<widget "kiraStrippedCardFlow">>
<<kiraStrippedCard>>
<<executeKiraStrippedCard>>
<<silently>>
<<kiraAssailant>>
<<setPronouns _enemy>>
<</silently>>
<div class="choice-container">
<<vchoice `"STOP " + _p.Him.toUpperCase() + "!"` "Combat_Intervene_Attack" "action" "attack">>
<<vchoice `"Watch " + _p.him + " fuck her..."` "Combat_Watch_Kira_Fucked" "intimate" "search">>
</div>
<</widget>>
<<widget "kiraHelpBoundCard">>
<div class="combat-card companion-card kira-help-card">
<div class="card-header help-header">
<span class="card-icon"><<icon "strength">></span>
<span class="card-title">FREEING KIRA</span>
</div>
<div class="card-body">
<div id="kira-help-bound-video" class="card-video-container" style="display:none"></div>
<div class="help-narrative"></div>
<div class="help-result"></div>
</div>
<div class="card-footer companion-card-footer">
<div class="kira-status-row">
<span class="kira-hp"><<icon "health" "medium">> <<print $companions[0].health>>/<<print $companions[0].maxHealth>></span>
<span class="kira-lust"><<icon "lust" "medium">> <<print $companions[0].lust>>%</span>
</div>
</div>
</div>
<</widget>>
<<widget "executeKiraHelpBoundCard">>
<<silently>>
<<set _hasBlade to ($equipped && $equipped.weapon && ($equipped.weapon.type === "blade" || $equipped.weapon.name === "Combat Knife"))>>
<<if _hasBlade>>
<<set $combat.kiraAnklesBound to false>>
<<set $combat.kiraMovementPenalty to false>>
<<set $combat.positions.kira to "kneeling">>
<<relationChange "kira" "trust" 1>>
<<if $combat.log>>
<<run $combat.log.push({type: "buff", text: "Cut Kira's ankle binds!", icon: "breaking-chain"})>>
<</if>>
<<set _success to true>>
<<else>>
<<set $combat.positions.kira to "kneeling">>
<<set _success to false>>
<</if>>
<<set window._kiraHelpBoundData to {
hasBlade: _hasBlade,
success: _success
}>>
<<if _success>>
<<kiraMediaTarget>>
<<fillCombatVideoBox "kira-help-bound-video" "combat/player_frees_kira" _kiraMediaTarget>>
<</if>>
<</silently>>
<<script>>
setTimeout(function() {
var data = window._kiraHelpBoundData;
if (!data) return;
var narrativeEl = document.querySelector('.help-narrative');
var resultEl = document.querySelector('.help-result');
if (narrativeEl) {
var html = '<p>You rush to Kira and help her into a sitting position.</p>';
html += '<p class="player-speech">"Can you move at all?"</p>';
html += '<p class="kira-speech">"Not with my ankles tied like this!"</p>';
narrativeEl.innerHTML = html;
}
if (resultEl) {
if (data.hasBlade) {
resultEl.innerHTML = '<p>You slash the rope around her ankles.</p>' +
'<p class="kira-speech">"Better. Help me up."</p>';
} else {
resultEl.innerHTML = '<p>You work at the knots but they\'re too tight to untie quickly.</p>' +
'<p class="kira-speech">"Just watch my back! I\'ll manage!"</p>' +
'<p>She\'s still bound but at least she\'s not face-down.</p>';
}
}
}, 50);
<</script>>
<</widget>>
<<widget "kiraHelpBoundCardFlow">>
<<kiraHelpBoundCard>>
<<executeKiraHelpBoundCard>>
<div class="choice-container">
<<vchoice "Continue fighting" "Combat_Actions" "move" "map">>
</div>
<</widget>>
<<widget "kiraWatchAnalCard">>
<div class="combat-card companion-card kira-sex-card">
<div class="card-header sex-header dark-header">
<span class="card-icon"><<icon "voyeur">></span>
<span class="card-title">WATCHING...</span>
</div>
<div class="card-body">
<div id="kira-anal-image" class="card-image-container"></div>
<div id="kira-anal-narrative" class="sex-scene-display"></div>
<div id="kira-anal-video" class="card-video-container"></div>
<div id="kira-anal-reaction" class="kira-reaction"></div>
<div id="kira-anal-effects" class="scene-effects"></div>
</div>
<div class="card-footer companion-card-footer">
<div class="kira-status-row">
<<if $companions[0] && typeof $companions[0].health !== "number">>
<<set $companions[0].health to $companions[0].maxHealth || 100>>
<</if>>
<<set _kiraHP to $companions[0] ? $companions[0].health : 100>>
<<set _kiraMaxHP to ($companions[0] && $companions[0].maxHealth) ? $companions[0].maxHealth : 100>>
<<set _kiraLust to ($companions[0] && typeof $companions[0].lust === "number") ? $companions[0].lust : 0>>
<span class="kira-hp"><<icon "health" "medium">> <<print _kiraHP>>/<<print _kiraMaxHP>></span>
<span class="kira-lust"><<icon "lust" "medium">> <<print _kiraLust>>%</span>
</div>
</div>
</div>
<</widget>>
<<widget "executeKiraWatchAnalCard">>
<<silently>>
<<kiraAssailant>>
<<setPronouns _enemy>>
<<set _isBound to ($combat.kiraWristsBound || $combat.kiraAnklesBound)>>
<<if _isBound>>
<<clampStat "player.lust" 40>>
<<set $flags.watchedKiraGetFucked to true>>
<<set $flags.kiraAnalInCombat to true>>
<<set $flags.kiraAnalWhileBound to true>>
<<if $combat.kiraInRefractory>>
<<trackPostOrgasmAttack "fuck">>
<</if>>
<<addKiraLust 15>>
<<set _enemy.stunned to true>>
<<set _enemy.stunnedTurns to 2>>
<<set $combat.kiraDazed to true>>
<<set $combat.kiraDazedTurns to 3>>
<<relationChange "kira" "trust" `setup.kiraUseTrust(-7)`>>
<<addTension "kira" 12 "" "combat">>
<<else>>
<<clampStat "player.lust" 35>>
<<set $flags.watchedKiraGetFucked to true>>
<<set $flags.kiraAnalInCombat to true>>
<<if $combat.kiraInRefractory>>
<<trackPostOrgasmAttack "fuck">>
<</if>>
<<addKiraLust 12>>
<<set _enemy.stunned to true>>
<<set _enemy.stunnedTurns to 2>>
<<set $combat.kiraDazed to true>>
<<set $combat.kiraDazedTurns to 2>>
<<relationChange "kira" "trust" `setup.kiraUseTrust(-5)`>>
<<addTension "kira" 9 "" "combat">>
<</if>>
<<addMaleEnemyLust `random(15, 20)` "anal_complete">>
<<set _videoPath to null>>
<<kiraMediaTarget>>
<<if !_storyClip>><<fillCombatVideoBox "kira-anal-video" "combat/kira_anal" _kiraMediaTarget>><</if>>
<<if _isBound>>
<<set _narrativeStart to setup.combatNarrative.kira_bound_anal_start ? setup.combatNarrative.kira_bound_anal_start.random() : "Tied up with her ass presented...">>
<<set _narrativePenetration to setup.combatNarrative.kira_bound_anal_penetration ? setup.combatNarrative.kira_bound_anal_penetration.random() : "He pushes into her helpless ass.">>
<<set _narrativeDuring to setup.combatNarrative.kira_bound_anal_during ? setup.combatNarrative.kira_bound_anal_during.random() : "The ropes ensure she can't escape any of it.">>
<</if>>
<<set window._kiraWatchAnalData to {
isBound: _isBound,
enemyName: _enemy.name,
pronoun: _p,
videoPath: _videoPath,
videoFormat: _videoFormat,
narrativeStart: _narrativeStart,
narrativePenetration: _narrativePenetration,
narrativeDuring: _narrativeDuring,
kiraAllows: setup.kiraAllowsUse(),
showVideos: $preferences && $preferences.showVideos
}>>
<</silently>>
<<script>>
setTimeout(function() {
var data = window._kiraWatchAnalData;
if (!data) return;
var imageEl = document.getElementById('kira-anal-image');
var narrativeEl = document.getElementById('kira-anal-narrative');
var videoEl = document.getElementById('kira-anal-video');
var reactionEl = document.getElementById('kira-anal-reaction');
var effectsEl = document.getElementById('kira-anal-effects');
if (imageEl) {
imageEl.innerHTML = '';
}
if (narrativeEl) {
var html = '<p>You watch. ' + data.pronoun.He + ' positions ' + data.pronoun.his + ' cock at her tight ass.</p>';
if (data.isBound) {
html += '<p class="explicit">' + (data.narrativeStart || 'Tied up with her ass presented like an offering.') + '</p>';
html += '<p class="enemy-speech">"Ass up and tied down. My favorite."</p>';
html += '<p class="explicit">' + (data.narrativePenetration || 'He pushes into her helpless ass.') + '</p>';
html += '<p class="explicit">' + (data.narrativeDuring || 'You watch her bound body jerk with each brutal thrust. The ropes ensure she can\'t escape any of it.') + '</p>';
html += '<p>' + data.pronoun.He + ' pounds her bound ass ruthlessly. She can\'t clench, can\'t fight, can only take it.</p>';
html += '<p>After two minutes, ' + data.pronoun.he + ' GRUNTS, finishing deep in her helpless ass. Stunned.</p>';
if (data.kiraAllows) {
html += '<p>Kira hangs in her bonds, cum leaking from her ass, gasping, and turns her head until she finds you.</p>';
} else {
html += '<p>Kira hangs limply in her bonds, cum leaking from her ruined ass, broken by the violation.</p>';
}
} else if (data.kiraAllows) {
html += '<p class="kira-speech">"Not THERE— you fucking— AH—!"</p>';
html += '<p>' + data.pronoun.He + ' pushes in. She SCREAMS.</p>';
html += '<p class="explicit">' + data.pronoun.He + '\'s fucking her ass. Hard. Brutal. Taking it. Using her.</p>';
html += '<p class="kira-speech">"It HURTS— you fucking animal— fuck— FUCK—"</p>';
html += '<p>But her pussy is dripping, and she\'s stopped fighting it. The pain is melting into the thing she told you she wanted.</p>';
html += '<p>' + data.pronoun.He + ' pounds her ass for two minutes. She\'s crying. Moaning. Swearing at ' + data.pronoun.him + ' through her teeth, and not hating a second of it.</p>';
html += '<p>After two minutes, ' + data.pronoun.he + ' GRUNTS, finishing deep in her ass. Stunned.</p>';
} else {
html += '<p class="kira-speech">"NO— please— not THERE—"</p>';
html += '<p>' + data.pronoun.He + ' pushes in. She SCREAMS.</p>';
html += '<p class="explicit">' + data.pronoun.He + '\'s fucking her ass. Hard. Brutal. Taking it. Using her.</p>';
html += '<p class="kira-speech">"It HURTS— please STOP— oh god— why does it—"</p>';
html += '<p>But her pussy is dripping. Her body betraying her. The pain mixing with unwanted pleasure.</p>';
html += '<p>' + data.pronoun.He + ' pounds her ass for two minutes. She\'s crying. Moaning. Hating herself for both.</p>';
html += '<p>After two minutes, ' + data.pronoun.he + ' GRUNTS, finishing deep in her ass. Stunned.</p>';
}
narrativeEl.innerHTML = html;
}
if (reactionEl) {
if (data.kiraAllows) {
if (data.isBound) {
reactionEl.innerHTML = '<p class="kira-speech">"...tied up... fuck... my ass... ...you watched him take it. Good."</p>';
} else {
reactionEl.innerHTML = '<p class="kira-speech">"My ass... you let him... ...Fuck. Good. That\'s what I told you to do."</p>';
}
} else if (data.isBound) {
reactionEl.innerHTML = '<p class="kira-speech">"...was tied... couldn\'t stop... my ass..."</p>';
} else {
reactionEl.innerHTML = '<p class="kira-speech">"My ass... you let him..."</p>';
}
}
if (effectsEl) {
var effectHtml = '<div class="effect-row"><span class="icon"><span class="gi gi-stunned"></span></span> ' + data.pronoun.He + '\'s stunned. Post-orgasm vulnerability.</div>';
if (data.kiraAllows) {
effectHtml += '<div class="effect-row"><span class="icon"><span class="gi gi-lips"></span></span> Kira is wrecked, and grinning about it.</div>';
} else {
effectHtml += '<div class="effect-row"><span class="icon"><span class="gi gi-broken-heart"></span></span> Kira is dazed from the anal violation.</div>';
}
if (data.isBound && !data.kiraAllows) {
effectHtml += '<div class="effect-row negative"><span class="icon"><span class="gi gi-arrow-down"></span></span> Trust severely damaged (-7)</div>';
}
effectsEl.innerHTML = effectHtml;
}
}, 50);
<</script>>
<</widget>>
<<widget "kiraWatchAnalCardFlow">>
<<kiraWatchAnalCard>>
<<executeKiraWatchAnalCard>>
<<silently>>
<<kiraAssailant>>
<<setPronouns _enemy>>
<</silently>>
<div class="choice-container">
<<vchoice `"Kill " + _p.him + " NOW"` "Combat_Kill_Stunned" "action" "skull-bones">>
<<vchoice "Check on Kira" "Combat_Check_Kira" "talk" "broken-heart">>
</div>
<</widget>>
<<widget "kiraRideLookCard">>
<div class="combat-card companion-card kira-sex-card">
<div class="card-header sex-header intimate-header">
<span class="card-icon"><<icon "search">></span>
<span class="card-title">EYE CONTACT</span>
</div>
<div class="card-body">
<div id="kira-ride-image" class="card-image-container"></div>
<div id="kira-ride-narrative" class="sex-scene-display"></div>
<div id="kira-ride-video" class="card-video-container"></div>
<div id="kira-ride-effects" class="scene-effects"></div>
</div>
<div class="card-footer companion-card-footer">
<div class="kira-status-row">
<span class="kira-hp"><<icon "health" "medium">> <<print $companions[0].health>>/<<print $companions[0].maxHealth>></span>
<span class="kira-lust"><<icon "lust" "medium">> <<print $companions[0].lust>>%</span>
</div>
</div>
</div>
<</widget>>
<<widget "executeKiraRideLookCard">>
<<silently>>
<<set _enemy to $combat.enemies[0]>>
<<addTension "kira" 6 "" "combat">>
<<clampStat "player.lust" 30>>
<<set _enemy.stunned to true>>
<<set _enemy.stunnedTurns to 2>>
<<set $flags.playerFuckedInCombat to true>>
<<set $combat.playerJustFucked to "mounted">>
<<set _videoPath to null>>
<<playerMediaTarget>>
<<fillCombatVideoBox "kira-ride-video" "combat/ride_look_kira" _playerMediaTarget>>
<<set window._kiraRideLookData to {
enemyName: _enemy.name,
videoPath: _videoPath,
videoFormat: _videoFormat,
showVideos: $preferences && $preferences.showVideos
}>>
<</silently>>
<<run VaultUI.showCharacter("kira", "left", "worried")>>
<<script>>
setTimeout(function() {
var data = window._kiraRideLookData;
if (!data) return;
var imageEl = document.getElementById('kira-ride-image');
var narrativeEl = document.getElementById('kira-ride-narrative');
var videoEl = document.getElementById('kira-ride-video');
var effectsEl = document.getElementById('kira-ride-effects');
if (imageEl) {
imageEl.innerHTML = '';
}
if (narrativeEl) {
var html = '<p>' + data.enemyName + ' rides your cock. But you\'re looking at Kira.</p>';
html += '<p>Your eyes lock with Kira\'s while another woman fucks you.</p>';
html += '<p class="kira-speech">"You\'re— while she— are you LOOKING at me?!"</p>';
html += '<p class="player-speech">"Yes."</p>';
html += '<p>' + data.enemyName + ' bounces harder on your cock. But you don\'t break eye contact with Kira.</p>';
html += '<p class="kira-speech">"Fuck you. Just... fuck you."</p>';
html += '<p>But she\'s not looking away either. Watching you get fucked. Aroused and angry.</p>';
html += '<p>' + data.enemyName + ' cums, stunned.</p>';
narrativeEl.innerHTML = html;
}
if (effectsEl) {
effectsEl.innerHTML = '<div class="effect-row"><span class="icon"><span class="gi gi-flame"></span></span> Tension with Kira increased (+6)</div>' +
'<div class="effect-row"><span class="icon"><span class="gi gi-stunned"></span></span> Enemy is stunned post-orgasm.</div>';
}
}, 50);
<</script>>
<</widget>>
<<widget "kiraRideLookCardFlow">>
<<kiraRideLookCard>>
<<executeKiraRideLookCard>>
<div class="choice-container">
<<vchoice "Try to get up" "Combat_Standup_Attempt" "action" "strength">>
</div>
<</widget>><<silently>><<include "KiraNarratives">><</silently>>
<<widget "kiraTurnCard">>
<div class="combat-card companion-card kira-turn-card">
<div class="card-header companion-header">
<span class="card-icon"><<icon "female">></span>
<span class="card-title">KIRA'S TURN</span>
</div>
<div class="card-body">
<div class="kira-status-display"></div>
<div class="kira-action-narrative"></div>
<!-- Kira's attack clip (combat_kira_attack_hit / _miss, then _kill) -->
<div id="kira-turn-video" class="card-video-container" style="display:none"></div>
<div class="kira-result-display"></div>
<!-- what her move printed (pain/pleasure, a clothing tear): moved in by card-outbox.js -->
<div id="kira-turn-effects" class="card-status-effects"></div>
</div>
<div class="card-footer companion-card-footer">
<div class="kira-status-row">
<span class="target-hp"><<icon "health" "medium">> <span id="kira-target-hp"></span></span>
<span class="target-lust"><<icon "lust" "medium">> <span id="kira-target-lust"></span>%</span>
</div>
</div>
</div>
<</widget>>
<<widget "executeKiraTurnCard">>
<<silently>>
<<for _aroI, _aroEnemy range $combat.enemies>>
<<if _aroEnemy && _aroEnemy.health gt 0>>
<<updateArousalState _aroI>>
<</if>>
<</for>>
<<for _posI to 0; _posI lt $combat.enemies.length; _posI++>>
<<set _posEnemy to $combat.enemies[_posI]>>
<<if _posEnemy && _posEnemy.health gt 0>>
<<initEnemyPosition _posI>>
<<if $combat.enemies[_posI].position && $combat.enemies[_posI].position !== "standing">>
<<if $combat.enemies[_posI].position !== "pinned">><<tryEscapePosition _posI>><</if>>
<<updatePositionHeldTurns _posI>>
<</if>>
<</if>>
<</for>>
<<set _kiraState to "normal">>
<<set _kiraAction to {}>>
<<set _statusNarrative to "">>
<<set _actionNarrative to "">>
<<set _resultNarrative to "">>
<<set _showDamage to false>>
<<set _damageDealt to 0>>
<<set _targetName to "">>
<<set _skipTurn to false>>
<<if !$combat.companionInCombat>>
<<set _skipTurn to true>>
<<elseif $combat.kiraIncapacitated>>
<<set _kiraState to "incapacitated">>
<<set _skipTurn to true>>
<<elseif $combat.kiraStunned && $combat.kiraStunned > 0>>
<<set _kiraState to "stunned_orgasm">>
<<set _skipTurn to true>>
<<set _statusNarrative to "Kira is still trembling from her orgasm, unable to focus on the fight.">>
<<set $combat.kiraStunned -= 1>>
<<if $combat.kiraStunned <= 0>>
<<set _kiraAction.recoveredFromStun to true>>
<<set _statusNarrative += " She's starting to recover...">>
<</if>>
<<addMaleEnemyLust `random(5, 10)` "kira_stunned_orgasm">>
<<else>>
<<getCompanion $combat.companionInCombat>>
<<set _target to $combat.enemies.find(function (e) { return e && e.health > 0 && !e.beenUsed && !e.fled; }) || $combat.enemies[0]>>
<<checkTensionDistraction>>
<<set _ktCharmed to setup.kiraCharmRoll()>>
<<if $flags.tensionDistraction>>
<<set _kiraState to "distracted">>
<<set _skipTurn to true>>
<<switch $flags.tensionDistraction>>
<<case 1>>
<<set _statusNarrative to "Kira hesitates, her breath catching as arousal clouds her focus.">>
<<case 2>>
<<set _statusNarrative to "Kira's thighs press together unconsciously, the tension making it hard to concentrate.">>
<<case 3>>
<<set _statusNarrative to "A soft whimper escapes Kira as she struggles to push down the heat building inside her.">>
<<default>>
<<set _statusNarrative to "Kira's hands tremble, her body betraying her desperate need even in the middle of combat.">>
<</switch>>
<<set $flags.tensionDistraction to 0>>
<<elseif $combat.kiraDazed>>
<<set _kiraState to "dazed">>
<<set _statusNarrative to setup.combatNarrative.kira_dazed.random()>>
<<set $combat.kiraDazedTurns -= 1>>
<<if $combat.kiraDazedTurns lte 0>>
<<set $combat.kiraDazed to false>>
<<set _kiraAction.recoveredFromDaze to true>>
<</if>>
<<elseif $combat.kiraWristsBound>>
<<set _kiraState to "wrists_bound">>
<<set _statusNarrative to setup.combatNarrative.kira_wrists_bound.random()>>
<<set _kcs to setup.kiraCombatStats || {}>>
<<if random(1, 100) lte (_kcs.breakFree?.wristsBound || 30)>>
<<set $combat.kiraWristsBound to false>>
<<set _kiraAction.brokeFree to true>>
<<set _resultNarrative to setup.combatNarrative.kira_break_free_wrists.random()>>
<<if $combat.log>>
<<run $combat.log.push({type: "buff", text: "Kira broke free from wrist binds!", icon: "breaking-chain"})>>
<</if>>
<<else>>
<<addMaleEnemyLust `random(3, 5)` "escape_fail">>
<<set _kiraAction.failedEscape to true>>
<</if>>
<<elseif $combat.kiraLeashed && !_ktCharmed>>
<<set _kiraState to "leashed">>
<<set _statusNarrative to setup.combatNarrative.kira_leashed.random()>>
<<set _kcs to setup.kiraCombatStats || {}>>
<<set _leashedHit to _kcs.leashed?.hitChance || 40>>
<<set _leashedMult to _kcs.leashed?.damageMultiplier || 0.5>>
<<if _target && random(1, 100) lte Math.floor((_leashedHit - setup.enemyDefenseMod(_target)) * setup.fighterAccuracyFactor("kira"))>>
<<set _baseDmg to (_kcs.baseDamage || 2) + Math.floor($tempCompanion.combat / (_kcs.statDivisor || 5))>>
<<set _damageDealt to Math.max(1, Math.floor(_baseDmg * _leashedMult * setup.fighterDamageFactor("kira")))>>
<<set _target.health -= _damageDealt>>
<<applyEnemyDamageExpression _target>>
<<set _showDamage to true>>
<<set _targetName to _target.name>>
<<set _actionNarrative to setup.combatNarrative.kira_attack_leashed.random()>>
<<else>>
<<set _actionNarrative to setup.combatNarrative.kira_miss_leashed.random()>>
<</if>>
<<elseif $combat.kiraAnklesBound>>
<<set _kiraState to "ankles_bound">>
<<set _statusNarrative to setup.combatNarrative.kira_ankles_bound.random()>>
<<set _kcs to setup.kiraCombatStats || {}>>
<<if random(1, 100) lte (_kcs.breakFree?.anklesBound || 25)>>
<<set $combat.kiraAnklesBound to false>>
<<set $combat.kiraMovementPenalty to false>>
<<set _kiraAction.brokeFree to true>>
<<set _resultNarrative to setup.combatNarrative.kira_break_free_ankles.random()>>
<<if $combat.log>>
<<run $combat.log.push({type: "buff", text: "Kira broke free from ankle binds!", icon: "breaking-chain"})>>
<</if>>
<<else>>
<<addMaleEnemyLust `random(3, 5)` "escape_fail">>
<<set _kiraAction.failedEscape to true>>
<</if>>
<<elseif $combat.positions.kira !== "standing">>
<<set _kcs to setup.kiraCombatStats || {}>>
<<if random(1, 100) lte (_kcs.breakFree?.knockedDown || 60)>>
<<attemptStandUp "kira">>
<<set _kiraState to "recovering">>
<<set _statusNarrative to setup.combatNarrative.kira_stand_up.random()>>
<<else>>
<<set _kiraState to "knocked_down">>
<<set _statusNarrative to setup.combatNarrative.kira_knocked_down.random()>>
<<addMaleEnemyLust `random(3, 5)` "escape_fail">>
<<set _kiraAction.failedEscape to true>>
<</if>>
<<elseif _ktCharmed>>
<<set _kiraState to "charmed">>
<<set _skipTurn to true>>
<<set _statusNarrative to "Kira hesitates, still caught in that gaze, and the moment to strike slips past her.">>
<<else>>
<<set _kiraState to "attacking">>
<<if _target>>
<<set _kcs to setup.kiraCombatStats || { baseDamage: 2, statDivisor: 5, varianceMin: -1, varianceMax: 2, hitChance: 65 }>>
<<set _damage to _kcs.baseDamage + Math.floor($tempCompanion.combat / _kcs.statDivisor)>>
<<set _hitRoll to random(1, 100)>>
<<if _hitRoll lte Math.floor((_kcs.hitChance - setup.enemyDefenseMod(_target)) * setup.fighterAccuracyFactor("kira"))>>
<<set _damage to _damage + random(_kcs.varianceMin, _kcs.varianceMax)>>
<<set _damage to Math.max(1, Math.floor(_damage * setup.fighterDamageFactor("kira")))>>
<<set _target.health -= _damage>>
<<applyEnemyDamageExpression _target>>
<<set _damageDealt to _damage>>
<<set _showDamage to true>>
<<set _targetName to _target.name>>
<<set _kiraHitLog to "Kira hits " + _target.name + " for " + _damage + " damage!">>
<<logCombat _kiraHitLog "damage">>
<<set _actionNarrative to setup.combatNarrative.kira_attack.random()>>
<<fillCombatVideoBox "kira-turn-video" "combat/kira_attack_hit" _target>>
<<if _target.gender && (_target.humiliation >= 40 || (_target.clothing && (_target.clothing.titsExposed || _target.clothing.pussyExposed)))>>
<<if random(1, 100) lte (_kcs.painPleasureChance || 25)>>
<<set _kiraAction.painPleasure to true>>
<</if>>
<</if>>
<<if $flags.seductionUnlocked && random(1, 100) lte (_kcs.clothingDamageChance || 30)>>
<<set _kiraAction.clothingDamage to true>>
<<set _kiraAction.clothingTargetIndex to $combat.enemies.indexOf(_target)>>
<</if>>
<<if _target.health lte 0 && !_target.beenUsed>>
<<set _capturedTargetHealth to 0>>
<<set _capturedTargetMaxHealth to _target.maxHealth>>
<<set _capturedTargetLust to _target.lust || 0>>
<<set _targetKilled to true>>
<<set _kiraDefeatLine to "">>
<<if _target.id && setup.raiderTypeMap && setup.raiderTypeMap[_target.id]>>
<<getRaiderDefeat _target>>
<<set _kiraDefeatLine to _return>>
<</if>>
<<run setup.defeatEnemyAt($combat.enemies.indexOf(_target))>>
<<set _kiraKillLog to _target.name + " defeated!">>
<<logCombat _kiraKillLog "critical">>
<<set _kiraAction.killedTarget to true>>
<<set _resultNarrative to setup.combatNarrative.kira_kill.random()>>
<<fillCombatVideoBox "kira-turn-video" "combat/kira_attack_kill" _target>>
<<set _kiraAction.defeatLine to _kiraDefeatLine>>
<<if $combat.enemies.length === 0>>
<<set _kiraAction.allEnemiesDefeated to true>>
<</if>>
<</if>>
<<else>>
<<set _kiraMissLog to "Kira misses " + _target.name + "!">>
<<logCombat _kiraMissLog "damage">>
<<set _actionNarrative to setup.combatNarrative.kira_miss.random()>>
<<fillCombatVideoBox "kira-turn-video" "combat/kira_attack_miss" _target>>
<</if>>
<</if>>
<</if>>
<</if>>
<<if _targetKilled>>
<<set _finalHealth to _capturedTargetHealth>>
<<set _finalMaxHealth to _capturedTargetMaxHealth>>
<<set _finalLust to _capturedTargetLust>>
<<else>>
<<set _finalTarget to _target || $combat.enemies[0]>>
<<set _finalHealth to _finalTarget ? _finalTarget.health : 0>>
<<set _finalMaxHealth to _finalTarget ? _finalTarget.maxHealth : 0>>
<<set _finalLust to _finalTarget ? (_finalTarget.lust || 0) : 0>>
<</if>>
<<set _ktRef to _target || ($combat.enemies && $combat.enemies[0]) || null>>
<<set _actionNarrative to setup.fillEnemyName(_actionNarrative, _ktRef)>>
<<set _actionNarrative to _actionNarrative.replace(/\[Player\]/g, $player.name)>>
<<set _statusNarrative to setup.fillEnemyName(_statusNarrative, _ktRef)>>
<<set _statusNarrative to _statusNarrative.replace(/\[Player\]/g, $player.name)>>
<<set _resultNarrative to setup.fillEnemyName(_resultNarrative, _ktRef)>>
<<set _resultNarrative to _resultNarrative.replace(/\[Player\]/g, $player.name)>>
<<set window._kiraTurnData to {
state: _kiraState,
statusNarrative: _statusNarrative,
actionNarrative: _actionNarrative,
resultNarrative: _resultNarrative,
showDamage: _showDamage,
damageDealt: _damageDealt,
targetName: _targetName,
action: _kiraAction,
skipTurn: _skipTurn,
config: setup.kiraStatusConfigs[_kiraState] || {},
targetHealth: _finalHealth,
targetMaxHealth: _finalMaxHealth,
targetLust: _finalLust
}>>
<</silently>>
<<script>>
setTimeout(function() {
var data = window._kiraTurnData;
if (!data) return;
var statusEl = document.querySelector('.kira-status-display');
var actionEl = document.querySelector('.kira-action-narrative');
var resultEl = document.querySelector('.kira-result-display');
var hpEl = document.getElementById('kira-target-hp');
var lustEl = document.getElementById('kira-target-lust');
if (hpEl) {
var hp = (data.targetHealth !== undefined && data.targetHealth !== null) ? data.targetHealth : 0;
var maxHp = (data.targetMaxHealth !== undefined && data.targetMaxHealth !== null) ? data.targetMaxHealth : 0;
hpEl.textContent = hp + '/' + maxHp;
}
if (lustEl) {
var lust = (data.targetLust !== undefined && data.targetLust !== null) ? data.targetLust : 0;
lustEl.textContent = lust;
}
if (data.skipTurn) {
if (statusEl) {
var skipReason = data.statusNarrative || 'Kira cannot act this turn.';
var skipIcon = (data.config && data.config.icon) ? data.config.icon : 'sleep';
var skipName = (data.config && data.config.name) ? data.config.name : 'SKIPPED';
statusEl.innerHTML = '<div class="kira-status-badge status-' + (data.state || 'skip') + '">' +
'<span class="status-icon"><i class="gi gi-' + skipIcon + '"></i></span>' +
'<span class="status-name">' + skipName + '</span>' +
'</div>' +
'<p class="status-narrative">' + skipReason + '</p>';
}
return;
}
if (!statusEl) return;
if (data.config && data.config.name && data.state !== 'attacking' && data.state !== 'normal') {
statusEl.innerHTML = '<div class="kira-status-badge status-' + data.state + '">' +
'<span class="status-icon"><i class="gi gi-' + (data.config.icon || 'companion') + '"></i></span>' +
'<span class="status-name">' + data.config.name + '</span>' +
'</div>';
if (data.statusNarrative) {
statusEl.innerHTML += '<p class="status-narrative">' + data.statusNarrative + '</p>';
}
}
if (actionEl && data.actionNarrative) {
actionEl.innerHTML = '<p class="action-narrative">' + data.actionNarrative + '</p>';
}
if (resultEl) {
var resultHtml = '';
if (data.showDamage && data.damageDealt > 0) {
resultHtml += '<div class="kira-damage-result">' +
'<span class="damage-dealt">-' + data.damageDealt + '</span>' +
'<span class="damage-target"> to ' + data.targetName + '</span>' +
'</div>';
}
if (data.action && data.action.brokeFree) {
resultHtml += '<div class="kira-break-free">' +
'<span class="break-free-text">' + (data.resultNarrative || 'Kira breaks free!') + '</span>' +
'</div>';
}
if (data.action && data.action.recoveredFromDaze) {
resultHtml += '<div class="kira-recovered">' +
'<span class="recovered-text">"I\'m... I\'m okay. I can fight."</span>' +
'</div>';
}
if (data.action && data.action.killedTarget) {
resultHtml += '<div class="kira-kill">' +
'<span class="kill-text">' + (data.resultNarrative || 'The enemy falls.') + '</span>';
if (data.action.defeatLine) {
resultHtml += '<p class="enemy-defeat-dialogue">"' + data.action.defeatLine + '"</p>';
}
resultHtml += '</div>';
}
resultEl.innerHTML = resultHtml;
}
}, 50);
<</script>>
<div class="card-outbox" data-card="kira">
<<if window._kiraTurnData && window._kiraTurnData.action && window._kiraTurnData.action.painPleasure>>
<<kiraPainPleasureAttack 0 `either("scratch_kiss", "bite_suck")`>>
<</if>>
<<if window._kiraTurnData && window._kiraTurnData.action && window._kiraTurnData.action.clothingDamage>>
<<damageClothing `window._kiraTurnData.action.clothingTargetIndex` "random" `random(10, 20)`>>
<</if>>
</div>
<</widget>>
<<widget "kiraTurnCardFlow">>
<<if !$combat.companionInCombat>>
<<if $combat.useCardUI>>
<<goto "Combat_Enemy_Turn_Cards">>
<<else>>
<<goto "Combat_Enemy_Turn">>
<</if>>
<<else>>
<<kiraTurnCard>>
<<executeKiraTurnCard>>
<<set _activeEnemies to $combat.enemies.filter(function(e) { return e.health > 0 && !e.beenUsed; })>>
<<set _kiraTurnWon to (window._kiraTurnData && window._kiraTurnData.action && window._kiraTurnData.action.allEnemiesDefeated) || ($combat.enemies.length gt 0 && _activeEnemies.length === 0)>>
<div class="choice-container">
<<if _kiraTurnWon>>
<<vchoice "Continue" "Combat_Victory" "move" "map">>
<<elseif $combat.useCardUI>>
<<vchoice "Continue" "Combat_Enemy_Turn_Cards" "move" "map">>
<<else>>
<<vchoice "Continue" "Combat_Enemy_Turn" "move" "map">>
<</if>>
</div>
<</if>>
<</widget>>
<<widget "kiraUnconsciousCard">>
<div class="combat-card companion-card kira-cnc-card">
<div class="card-header cnc-header danger-header">
<span class="card-icon"><<icon "knockdown" "medium">></span>
<span class="card-title">KIRA DOWN</span>
</div>
<div class="card-body">
<div class="cnc-scene-display"></div>
<div class="cnc-narrative"></div>
<div class="cnc-warning"></div>
</div>
<div class="card-footer companion-card-footer">
<div class="kira-status-row">
<span class="kira-hp"><<icon "health" "medium">> <<print $companions[0].health>>/<<print $companions[0].maxHealth>></span>
<span class="kira-lust"><<icon "lust" "medium">> <<print $companions[0].lust>>%</span>
</div>
</div>
</div>
<</widget>>
<<widget "executeKiraUnconsciousCard">>
<<silently>>
<<checkKiraUnconscious>>
<<setKiraUnconscious>>
<<set _remainingEnemies to []>>
<<set _lustEnemy to null>>
<<if $combat.enemies && $combat.enemies.length gt 0>>
<<set _remainingEnemies to $combat.enemies.filter(e => e.health > 0)>>
<<if _remainingEnemies.length gt 0>>
<<set _lustEnemy to $combat.enemies.find(e => e.health > 0 && e.lust >= 40)>>
<</if>>
<</if>>
<<set window._kiraUnconsciousData to {
hasEnemies: _remainingEnemies.length > 0,
lustEnemy: _lustEnemy,
enemyName: _lustEnemy ? _lustEnemy.name : (_remainingEnemies[0] ? _remainingEnemies[0].name : "The enemy"),
enemyGender: _lustEnemy ? _lustEnemy.gender : (_remainingEnemies[0] ? _remainingEnemies[0].gender : "male"),
canWatchCNC: _lustEnemy && $player.corruption >= 20
}>>
<</silently>>
<<script>>
var storyClip = State.temporary.storyClip;
setTimeout(function() {
var data = window._kiraUnconsciousData;
if (!data) return;
var sceneEl = document.querySelector('.cnc-scene-display');
var narrativeEl = document.querySelector('.cnc-narrative');
var warningEl = document.querySelector('.cnc-warning');
if (sceneEl) {
sceneEl.innerHTML = '<h2>Kira Falls!</h2>';
}
if (narrativeEl) {
var html = '<p>The blow sends Kira crashing to the ground. She doesn\'t get up.</p>';
html += (storyClip === "ed0a12230876" ? '<p>You see her chest rise and fall. She\'s alive—but unconscious. Her head lolls back, mouth slack and open.</p>' : '<p>You see her chest rise and fall. She\'s alive—but unconscious. Blood trickles from a gash on her temple.</p>');
if (data.hasEnemies) {
html += (storyClip === "ed0a12230876" ? '<p>The remaining enemies eye her fallen form with predatory interest. One is already crouched beside her, a hand resting on her thigh.</p>' : '<p>The remaining enemies eye her fallen form with predatory interest.</p>');
if (data.enemyGender === "male" && data.lustEnemy) {
html += '<p class="enemy-speech">"Well, well... she won\'t be fighting back now, will she?"</p>';
}
}
narrativeEl.innerHTML = html;
}
if (warningEl) {
warningEl.innerHTML = '<p class="warning-text">Kira is unconscious and cannot fight. You must finish this battle alone or flee!</p>';
}
}, 50);
<</script>>
<</widget>>
<<widget "kiraUnconsciousCardFlow">>
<<kiraUnconsciousCard>>
<<executeKiraUnconsciousCard>>
<<run VaultUI.showCharacter("kira", "center", "unconscious")>>
<div class="choice-container">
<<if $combat.enemies && $combat.enemies.filter(e => e.health > 0 && !e.beenUsed).length gt 0>>
<<vchoice "Fight on alone!" "Combat_Actions" "action" "attack">>
<<vchoice "Grab Kira and RUN!" "Combat_Flee_With_Kira" "action" "run">>
<<set _lustEnemy to $combat.enemies.find(e => e.health > 0 && e.lust >= 40)>>
<<if _lustEnemy && $player.corruption >= 20 && !$combat.noKiraWatch>>
<<vchoice "Don't intervene... (watch)" "Combat_Kira_CNC_Watch" "intimate" "voyeur">>
<</if>>
<<else>>
<<vchoice "Check on Kira" "Combat_Victory_Kira_Unconscious" "action" "health">>
<</if>>
</div>
<</widget>><<widget "enhancedEnemySexCard">>
<<set _esxAction to _args[0]>>
<<set _esxEnemy to _esxAction.enemyRef>>
<<set _esxIdx to _esxAction.enemyIndex>>
<<if !_esxEnemy>>
<div class="combat-card enemy-card enemy-sex-card"><div class="card-header sex-header"><<icon "corruption" "medium">><span class="enemy-card-name">ENEMY</span></div></div>
<<else>>
<div class="combat-card enemy-card enemy-sex-card">
<!-- HEADER -->
<div class="card-header sex-header">
<<icon "corruption" "medium">>
<span class="enemy-card-name"><<print _esxEnemy.name.toUpperCase()>></span>
<span class="enemy-card-number">#<<print (_esxIdx + 1)>></span>
<span class="sex-label">SEXUAL INTENT</span>
</div>
<!-- VIDEO PRIMARY (placeholder) -->
<div class="card-video-primary" @id="'enemy-video-primary-' + _esxIdx">
<!-- Video injected during sex scene if applicable -->
</div>
<!-- NARRATIVE / INTENT -->
<div class="card-narrative sexual" @id="'enemy-narrative-' + _esxIdx">
<<switch _esxAction.sexIntent>>
<<case "fuck_pussy">>
<p class="explicit">Plans to fuck <<print (_esxAction.sexTarget === "kira" ? "her" : "your")>> exposed pussy...</p>
<<case "grope_tits">>
<p class="explicit">Eyes locked on exposed tits, moving to grope...</p>
<<case "grope_pussy">>
<p class="explicit">Hand reaching for exposed pussy...</p>
<<case "grope_ass">>
<p class="explicit">Moving to grab exposed ass...</p>
<<case "fuck_ass">>
<p class="explicit">Positioning behind, aiming for ass...</p>
<<case "hair_grab_force">>
<p class="explicit">Lunging to grab hair and force position...</p>
<<case "leg_sweep">>
<p class="explicit">Preparing to sweep legs, knock down...</p>
<<case "wrist_yank">>
<p class="explicit">Reaching to grab wrist, pull to knees...</p>
<<case "hip_throw">>
<p class="explicit">Setting up hip throw, slam down...</p>
<<case "belt_whip">>
<p class="explicit">Drawing belt, preparing to whip...</p>
<<case "expose_self">>
<p class="explicit"><<print _esxEnemy.name>> is fumbling with <<print (_esxEnemy.gender === "male" ? "his" : "her")>> pants, pulling <<print (_esxEnemy.gender === "male" ? "his cock" : "herself")>> out...</p>
<<case "forced_oral">>
<p class="explicit">Grabbing hair, forcing face toward cock...</p>
<<case "shove_underwear_aside">>
<p class="explicit">Frantically shoving underwear aside to reach bare skin...</p>
<<case "pants_yank">>
<p class="explicit">Grabbing waistband, yanking pants down...</p>
<<case "rip_underwear" "slice_underwear" "belt_yank_underwear">>
<p class="explicit">Reaching for underwear, tearing it away...</p>
<<case "rip_top_off" "slice_top">>
<p class="explicit">Grabbing at top, ripping it open...</p>
<<case "spit_roast">>
<p class="explicit"><<print _esxEnemy.name>> coordinates with another attacker—one in front, one behind...</p>
<<case "hold_and_strip">>
<p class="explicit">One holds her down while the other tears at her clothes...</p>
<<case "pin_down">>
<p class="explicit">Multiple attackers work together to pin her completely...</p>
<<case "ride">>
<p class="explicit">Positioning to straddle and ride...</p>
<<case "blowjob">>
<p class="explicit">Dropping to knees, eyeing your cock...</p>
<<case "handjob">>
<p class="explicit">Reaching for your exposed cock...</p>
<<case "leg_sweep_female">>
<p class="explicit">Preparing to sweep your legs...</p>
<<case "push_down_mount">>
<p class="explicit">Preparing to shove you down and mount...</p>
<<case "grab_and_straddle">>
<p class="explicit">Lunging to grab and straddle you...</p>
<<default>>
<p class="explicit">Sexual intent detected...</p>
<</switch>>
<<if _esxAction.sexTarget !== "kira" && setup.kiraInFight() && setup.combatNarrative && setup.combatNarrative.kira_jealous>>
<<set _kiraJealousReaction to setup.fillEnemyName(setup.combatNarrative.kira_jealous.random(), _esxEnemy)>>
<p class="kira-reaction kira-jealous"><<print _kiraJealousReaction>></p>
<</if>>
</div>
<!-- VIDEO SECONDARY (placeholder) -->
<div class="card-video-secondary" @id="'enemy-video-secondary-' + _esxIdx">
<!-- Secondary video if applicable -->
</div>
<!-- STATS (using shared helpers) -->
<<enemyCardStats _esxEnemy>>
<!-- ACTION LABEL -->
<div class="card-action">
<<icon "corruption" "medium">>
Sexual Action: <<print _esxAction.sexIntent.replace(/_/g, " ").toUpperFirst()>>
<span class="action-target">→ <<print (_esxAction.sexTarget === "kira" ? "KIRA" : "YOU")>></span>
</div>
<!-- INTERVENTION SECTION -->
<div class="card-intervention">
<div class="intervention-alert">
<<icon "alert">> INTERVENTION OPPORTUNITY <<icon "alert">>
</div>
<p class="intervention-text"><em>This will trigger a sex scene with intervention choices.</em></p>
</div>
</div>
<</if>>
<</widget>><<widget "enhancedEnemyStatusCard">>
<<set _escAction to _args[0]>>
<<set _escEnemy to _escAction.enemyRef>>
<<set _escIdx to _escAction.enemyIndex>>
<<if !_escEnemy>>
<div class="combat-card enemy-card enemy-status-card"><div class="card-header status-header"><<icon "alert" "medium">><span class="enemy-card-name">ENEMY</span></div></div>
<<else>>
<div @class="'combat-card enemy-card enemy-status-card' + (_escAction.actionType === 'lust_break' ? ' lust-break-card' : '')">
<!-- HEADER -->
<div class="card-header status-header">
<<icon _escAction.statusIcon "medium">>
<span class="enemy-card-name"><<print _escEnemy.name.toUpperCase()>></span>
<span class="enemy-card-number">#<<print (_escIdx + 1)>></span>
</div>
<!-- NARRATIVE / STATUS MESSAGE -->
<div class="card-narrative status">
<p class="status-message"><<print _escAction.statusMessage>></p>
<<if _escAction.actionType === "stunned" && _escAction.stunnedTurnsRemaining>>
<p class="status-duration">Stunned for <<print _escAction.stunnedTurnsRemaining>> more turn(s)</p>
<<if _escAction.stunnedTurnsRemaining === 1>>
<p class="status-recovery"><em>Will recover next turn.</em></p>
<</if>>
<</if>>
<<if _escAction.actionType === "lust_break">>
<<set _escLbFirst to ($combat.enemyActions || []).find(function (a) { return a && a.actionType === "lust_break" && a.enemyRef && a.enemyRef.health > 0; })>>
<<if !_escLbFirst || _escLbFirst.enemyIndex === _escIdx>>
<p class="lust-break-advantage"><em>Their lust is your advantage. They can't focus on anything else.</em></p>
<</if>>
<</if>>
</div>
<!-- VIDEO: status turns with a slot (setup.combatStatusVideoFolders) -->
<<set _escFolder to setup.combatStatusVideoFolders && setup.combatStatusVideoFolders[_escAction.actionType]>>
<<if _escFolder && typeof _escFolder === "object">>
<<set _escFolder to _escFolder[_escEnemy.gender === "male" ? "male" : "female"]>>
<</if>>
<<if _escFolder>>
<<set _escTarget to _escEnemy>>
<<if _escAction.actionType === "lust_break" && _escEnemy.gender === "male">>
<<set _escTarget to Object.assign({}, _escEnemy, { mediaClothing: "exposed_dick" })>>
<</if>>
<<combatActionVideo `"enemy-status-video-" + _escIdx` _escFolder _escTarget>>
<</if>>
<!-- STATS (using shared helpers) -->
<<enemyCardStats _escEnemy>>
</div>
<</if>>
<</widget>><<widget "useHerSceneCard">>
<<set _uhsTarget to $combat.enemies[$combat.currentTarget]>>
<<set _uhsConfig to setup.useHerConfig>>
<div class="combat-card player-card player-scene-card use-her-card">
<!-- HEADER -->
<div class="card-header player-card-header explicit-header">
<<icon "corruption" "medium">>
<span class="player-card-name">DOMINATION</span>
<span class="attack-name">USE HER</span>
</div>
<!-- CARD BODY -->
<div class="card-body scene-body">
<!-- Target Info Row -->
<div class="attack-info-row">
<span class="attack-target">
<<icon "target" "medium">> <<print _uhsTarget.name>>
<span class="target-state-indicator">(<<print _uhsTarget.humiliationState || "normal">>)</span>
</span>
<span class="attack-cost">
<<icon "energy" "medium">> -<<print _uhsConfig.energyCost>>
</span>
</div>
<!-- ONE video box for the whole scene. Each beat with a clip slot
(strip / position / penetration / moans / ally reaction / climax)
is queued into it by fillCombatVideoBox and plays in turn — four
stacked full-width videos were minutes of scrolling on a phone. -->
<div id="use-her-video" class="card-video-container" style="display:none"></div>
<!-- Multi-phase Narrative Container -->
<div id="use-her-narrative" class="scene-narrative-container"></div>
<!-- Effects Row -->
<div id="use-her-effects" class="scene-effects-row"></div>
<!-- Ally Fear Notice (if applicable) -->
<div id="use-her-fear" class="fear-notice-container"></div>
</div>
<!-- FOOTER -->
<div class="card-footer player-card-footer explicit-footer">
<div class="target-status-row">
<span class="target-state">
<<icon "broken" "medium">> <<print _uhsTarget.humiliationState || "normal">>
</span>
<span class="player-lust">
<<icon "lust" "medium">> <span id="use-her-player-lust"><<print $player.lust>>%</span>
</span>
</div>
</div>
</div>
<</widget>>
<<widget "executeUseHerSceneCard">>
<<silently>>
<<set _euhConfig to setup.useHerConfig>>
<<initCombatTarget>>
<<set _euhTargetIdx to _targetIndex>>
<<set _euhRemainingEnemies to $combat.enemies.length - 1>>
<<set _euhError to "">>
<<if _target.humiliationState !== "broken">>
<<set _euhError to "She's not broken enough for this!">>
<<elseif $player.energy lt _euhConfig.energyCost>>
<<set _euhError to "Not enough energy!">>
<</if>>
<<if _euhError eq "">>
<<set _negEnergyCost to -(_euhConfig.energyCost || 0)>>
<<clampStat "player.energy" _negEnergyCost 0 $player.maxEnergy>>
<<set _euhStripText to "">>
<<if _target.clothing && (!_target.clothing.titsExposed || !_target.clothing.pussyExposed)>>
<<fillCombatVideoBox "use-her-video" _euhConfig.videoFolders.strip _target>>
<<set _euhStripPool to setup.combatNarrative[_euhConfig.narrativePools.strip]>>
<<if Array.isArray(_euhStripPool) && _euhStripPool.length gt 0>>
<<set _euhStripText to _euhStripPool[random(0, _euhStripPool.length - 1)]>>
<</if>>
<<set _target.clothing.top to 0>>
<<set _target.clothing.bottom to 0>>
<<set _target.clothing.titsExposed to true>>
<<set _target.clothing.pussyExposed to true>>
<<set $combat.enemies[_euhTargetIdx].clothing to _target.clothing>>
<</if>>
<<set _euhPositionPool to setup.combatNarrative[_euhConfig.narrativePools.position]>>
<<set _euhPositionText to "">>
<<if Array.isArray(_euhPositionPool) && _euhPositionPool.length gt 0>>
<<set _euhPositionText to _euhPositionPool[random(0, _euhPositionPool.length - 1)]>>
<</if>>
<<set _euhPenPool to setup.combatNarrative[_euhConfig.narrativePools.penetration]>>
<<set _euhPenText to "">>
<<if Array.isArray(_euhPenPool) && _euhPenPool.length gt 0>>
<<set _euhPenText to _euhPenPool[random(0, _euhPenPool.length - 1)]>>
<</if>>
<<set _euhMoansPool to setup.combatNarrative[_euhConfig.narrativePools.victimMoans]>>
<<set _euhMoansText to "">>
<<if Array.isArray(_euhMoansPool) && _euhMoansPool.length gt 0>>
<<set _euhMoansText to _euhMoansPool[random(0, _euhMoansPool.length - 1)]>>
<</if>>
<<set _euhAllyText to "">>
<<set _euhFearApplied to false>>
<<if _euhRemainingEnemies gt 0>>
<<set _euhAllyPool to setup.combatNarrative[_euhConfig.narrativePools.allyReactions]>>
<<if Array.isArray(_euhAllyPool) && _euhAllyPool.length gt 0>>
<<set _euhAllyText to _euhAllyPool[random(0, _euhAllyPool.length - 1)]>>
<</if>>
<<frightenOnlookers _euhTargetIdx>>
<<set _euhFearApplied to _foResult.length gt 0>>
<</if>>
<<fillCombatVideoBox "use-her-video" _euhConfig.videoFolders.position _target>>
<<fillCombatVideoBox "use-her-video" _euhConfig.videoFolders.penetration _target>>
<<if _euhMoansText>>
<<fillCombatVideoBox "use-her-video" _euhConfig.videoFolders.victimMoans _target>>
<</if>>
<<set _euhAlly to $combat.enemies.find(function (e, i) { return i !== _euhTargetIdx && e.health > 0; })>>
<<if _euhAllyText && _euhAlly>>
<<fillCombatVideoBox "use-her-video" _euhConfig.videoFolders.allyReactions _euhAlly>>
<</if>>
<<fillCombatVideoBox "use-her-video" _euhConfig.videoFolders.climax _target>>
<<set _euhClimaxPool to setup.combatNarrative[_euhConfig.narrativePools.climax]>>
<<set _euhClimaxText to "">>
<<if Array.isArray(_euhClimaxPool) && _euhClimaxPool.length gt 0>>
<<set _euhClimaxText to _euhClimaxPool[random(0, _euhClimaxPool.length - 1)]>>
<</if>>
<<set _euhLustDrop to random(_euhConfig.playerLustDrop.min, _euhConfig.playerLustDrop.max)>>
<<set _euhOldLust to $player.lust>>
<<set $player.lust to Math.max(0, $player.lust - _euhLustDrop)>><<run setup.playerReleased()>>
<<set $player.dominance to ($player.dominance || 0) + _euhConfig.dominanceGain>>
<<if _euhConfig.stunTarget>>
<<set _target.stunned to true>>
<<set _target.stunnedTurns to _euhConfig.stunnedTurns>>
<<set $combat.enemies[_euhTargetIdx].stunned to true>>
<<set $combat.enemies[_euhTargetIdx].stunnedTurns to _euhConfig.stunnedTurns>>
<</if>>
<<if _euhConfig.markAsUsed>>
<<set _target.beenUsed to true>>
<<set $combat.enemies[_euhTargetIdx].beenUsed to true>>
<<set _target.sexUsed to true>>
<<set $combat.enemies[_euhTargetIdx].sexUsed to true>>
<<run setup.countWomanUsed($combat.enemies[_euhTargetIdx])>>
<</if>>
<<if $combat.log>>
<<run $combat.log.push({text: "Used " + _target.name + " in front of her allies!", type: "intimate"})>>
<</if>>
<</if>>
<<run window._useHerCardData = {
error: _euhError,
stripText: _euhStripText,
positionText: _euhPositionText,
penText: _euhPenText,
moansText: _euhMoansText,
allyText: _euhAllyText,
climaxText: _euhClimaxText,
lustDrop: _euhLustDrop,
domGain: _euhConfig.dominanceGain,
newLust: $player.lust,
fearApplied: _euhFearApplied,
remainingEnemies: _euhRemainingEnemies
}>>
<</silently>>
<<run setTimeout(function() {
var d = window._useHerCardData;
var narrativeEl = document.getElementById('use-her-narrative');
var effectsEl = document.getElementById('use-her-effects');
var fearEl = document.getElementById('use-her-fear');
var lustEl = document.getElementById('use-her-player-lust');
if (d.error) {
if (narrativeEl) narrativeEl.innerHTML = '<p class="combat-error">' + d.error + '</p>';
return;
}
var narrative = '';
if (d.stripText) narrative += '<p class="scene-phase strip-phase">' + d.stripText + '</p>';
if (d.positionText) narrative += '<p class="scene-phase position-phase">' + d.positionText + '</p>';
if (d.penText) narrative += '<p class="scene-phase penetration-phase">' + d.penText + '</p>';
if (d.moansText) narrative += '<p class="scene-phase moans-phase enemy-dialogue">"' + d.moansText.replace(/^"|"$/g, '') + '"</p>';
if (d.allyText) narrative += '<p class="scene-phase ally-phase">' + d.allyText + '</p>';
if (d.climaxText) narrative += '<p class="scene-phase climax-phase">' + d.climaxText + '</p>';
if (narrativeEl) narrativeEl.innerHTML = narrative;
if (effectsEl) {
effectsEl.innerHTML = '<div class="scene-effect lust-drop"><span class="effect-icon">💧</span> Your lust -' + d.lustDrop + '</div>' +
'<div class="scene-effect dom-gain"><span class="effect-icon">👑</span> Dominance +' + d.domGain + '</div>';
}
if (fearEl && d.fearApplied) {
fearEl.innerHTML = '<div class="fear-applied"><span class="effect-icon">😨</span> Remaining enemies are shaken!</div>';
}
if (lustEl) lustEl.textContent = d.newLust + '%';
}, 50)>>
<</widget>>
<<widget "useHerSceneCardFlow">>
<<silently>><<include "UseHerNarratives">><</silently>>
<<useHerSceneCard>>
<<executeUseHerSceneCard>>
<div class="choice-container">
<<if setup.combatAllSubdued()>>
<<vchoice "Victory!" "Combat_Victory" "action" "muscle">>
<<else>>
<<vchoice "Continue Fight" "Combat_Actions" "action" "attack">>
<</if>>
</div>
<</widget>>
<<widget "chokeFuckCard">>
<<set _cfTarget to $combat.enemies[$combat.currentTarget]>>
<div class="combat-card player-card player-scene-card choke-fuck-card">
<!-- HEADER -->
<div class="card-header player-card-header explicit-header intense-header">
<<icon "choking" "medium">>
<span class="player-card-name">DOMINATION</span>
<span class="attack-name">CHOKE FUCK</span>
</div>
<!-- CARD BODY -->
<div class="card-body scene-body">
<!-- Target Info Row -->
<div class="attack-info-row">
<span class="attack-target">
<<icon "target" "medium">> <<print _cfTarget.name>>
<span class="target-state-indicator">(<<print _cfTarget.humiliationState || "normal">>)</span>
</span>
<span class="attack-cost">
<<icon "energy" "medium">> -6
</span>
</div>
<!-- Video Container -->
<div id="choke-fuck-video" class="card-video-container" style="display:none"></div>
<!-- Multi-phase Narrative Container -->
<div id="choke-fuck-narrative" class="scene-narrative-container"></div>
<!-- Effects Row -->
<div id="choke-fuck-effects" class="scene-effects-row"></div>
<!-- Ally Fear Notice -->
<div id="choke-fuck-fear" class="fear-notice-container"></div>
<!-- Forced Orgasm Notice -->
<div id="choke-fuck-orgasm" class="forced-orgasm-container"></div>
</div>
<!-- FOOTER -->
<div class="card-footer player-card-footer explicit-footer">
<div class="target-status-row">
<span class="target-state">
<<icon "broken" "medium">> <<print _cfTarget.humiliationState || "normal">>
</span>
<span class="player-lust">
<<icon "lust" "medium">> <span id="choke-fuck-player-lust"><<print $player.lust>>%</span>
</span>
</div>
</div>
</div>
<</widget>>
<<widget "executeChokeFuckCard">>
<<silently>>
<<initCombatTarget>>
<<set _ecfTargetIdx to _targetIndex>>
<<set _ecfRemainingEnemies to $combat.enemies.length - 1>>
<<set _ecfError to "">>
<<if _target.humiliationState !== "broken">>
<<set _ecfError to "She's not broken enough for this!">>
<<elseif $player.energy lt 6>>
<<set _ecfError to "Not enough energy!">>
<</if>>
<<if _ecfError eq "">>
<<clampStat "player.energy" -6 0 $player.maxEnergy>>
<<set _ecfStripText to "">>
<<if _target.clothing && (!_target.clothing.titsExposed || !_target.clothing.pussyExposed)>>
<<set _ecfStripText to "You rip away her remaining clothing before wrapping your hand around her throat.">>
<<set _target.clothing.top to 0>>
<<set _target.clothing.bottom to 0>>
<<set _target.clothing.titsExposed to true>>
<<set _target.clothing.pussyExposed to true>>
<<set $combat.enemies[_ecfTargetIdx].clothing to _target.clothing>>
<</if>>
<<fillCombatVideoBox "choke-fuck-video" setup.painPleasureConfigs.choke_fuck.videoFolder _target>>
<<set _ecfGrabPool to setup.combatNarrative.choke_fuck_grab>>
<<set _ecfGrabText to "">>
<<if Array.isArray(_ecfGrabPool) && _ecfGrabPool.length gt 0>>
<<set _ecfGrabText to _ecfGrabPool[random(0, _ecfGrabPool.length - 1)]>>
<<else>>
<<set _ecfGrabText to "Your hand wraps around her throat, squeezing just enough to make her gasp.">>
<</if>>
<<set _ecfActionPool to setup.combatNarrative.choke_fuck_action>>
<<set _ecfActionText to "">>
<<if Array.isArray(_ecfActionPool) && _ecfActionPool.length gt 0>>
<<set _ecfActionText to _ecfActionPool[random(0, _ecfActionPool.length - 1)]>>
<<else>>
<<set _ecfActionText to "You thrust into her while keeping your grip on her throat, controlling every breath she takes.">>
<</if>>
<<set _ecfSoundsPool to setup.combatNarrative.choke_fuck_victim_sounds>>
<<set _ecfSoundsText to "">>
<<if Array.isArray(_ecfSoundsPool) && _ecfSoundsPool.length gt 0>>
<<set _ecfSoundsText to _ecfSoundsPool[random(0, _ecfSoundsPool.length - 1)]>>
<<else>>
<<set _ecfSoundsText to "Strangled moans escape her lips between gasping breaths.">>
<</if>>
<<set _ecfAllyText to "">>
<<set _ecfFearApplied to false>>
<<if _ecfRemainingEnemies gt 0>>
<<set _ecfAllyText to "Her allies watch in horror as you choke-fuck their friend, her face turning red, her moans strangled and desperate.">>
<<frightenOnlookers _ecfTargetIdx true>>
<<set _ecfFearApplied to _foResult.length gt 0>>
<</if>>
<<fillCombatVideoBox "choke-fuck-video" setup.chokeFuckVideoFolders.moans _target>>
<<set _ecfAlly to $combat.enemies.find(function (e, i) { return i !== _ecfTargetIdx && e.health > 0; })>>
<<if _ecfAllyText && _ecfAlly>>
<<fillCombatVideoBox "choke-fuck-video" setup.chokeFuckVideoFolders.allyReaction _ecfAlly>>
<</if>>
<<fillCombatVideoBox "choke-fuck-video" setup.chokeFuckVideoFolders.climax _target>>
<<fillCombatVideoBox "choke-fuck-video" setup.chokeFuckVideoFolders.orgasm _target>>
<<set _ecfClimaxPool to setup.combatNarrative.choke_fuck_climax>>
<<set _ecfClimaxText to "">>
<<if Array.isArray(_ecfClimaxPool) && _ecfClimaxPool.length gt 0>>
<<set _ecfClimaxText to _ecfClimaxPool[random(0, _ecfClimaxPool.length - 1)]>>
<<else>>
<<set _ecfClimaxText to "With a final, savage thrust, you finish inside her as her eyes roll back.">>
<</if>>
<<set _ecfLustDrop to 35 + random(0, 20)>>
<<set $player.lust to Math.max(0, $player.lust - _ecfLustDrop)>><<run setup.playerReleased()>>
<<set $player.dominance to ($player.dominance || 0) + 5>>
<<set _target.stunned to true>>
<<set _target.stunnedTurns to 3>>
<<set $combat.enemies[_ecfTargetIdx].stunned to true>>
<<set $combat.enemies[_ecfTargetIdx].stunnedTurns to 3>>
<<set _target.beenUsed to true>>
<<set $combat.enemies[_ecfTargetIdx].beenUsed to true>>
<<set _target.sexUsed to true>>
<<set $combat.enemies[_ecfTargetIdx].sexUsed to true>>
<<run setup.countWomanUsed($combat.enemies[_ecfTargetIdx])>>
<<set _ecfOrgasmCount to (_target.orgasmCount || 0) + 1>>
<<set _target.orgasmCount to _ecfOrgasmCount>>
<<set $combat.enemies[_ecfTargetIdx].orgasmCount to _ecfOrgasmCount>>
<<if $combat.log>>
<<set _ecfLog to "Choke-fucked " + _target.name + " — allies terrified!">>
<<run $combat.log.push({text: _ecfLog, type: "critical"})>>
<</if>>
<</if>>
<<run window._chokeFuckCardData = {
error: _ecfError,
stripText: _ecfStripText,
grabText: _ecfGrabText,
actionText: _ecfActionText,
soundsText: _ecfSoundsText,
allyText: _ecfAllyText,
climaxText: _ecfClimaxText,
lustDrop: _ecfLustDrop,
newLust: $player.lust,
fearApplied: _ecfFearApplied,
orgasmCount: _ecfOrgasmCount,
remainingEnemies: _ecfRemainingEnemies
}>>
<</silently>>
<<run setTimeout(function() {
var d = window._chokeFuckCardData;
var narrativeEl = document.getElementById('choke-fuck-narrative');
var effectsEl = document.getElementById('choke-fuck-effects');
var fearEl = document.getElementById('choke-fuck-fear');
var orgasmEl = document.getElementById('choke-fuck-orgasm');
var lustEl = document.getElementById('choke-fuck-player-lust');
if (d.error) {
if (narrativeEl) narrativeEl.innerHTML = '<p class="combat-error">' + d.error + '</p>';
return;
}
var narrative = '';
if (d.stripText) narrative += '<p class="scene-phase strip-phase">' + d.stripText + '</p>';
if (d.grabText) narrative += '<p class="scene-phase grab-phase">' + d.grabText + '</p>';
if (d.actionText) narrative += '<p class="scene-phase action-phase">' + d.actionText + '</p>';
if (d.soundsText) narrative += '<p class="scene-phase sounds-phase enemy-dialogue choked">' + d.soundsText + '</p>';
if (d.allyText) narrative += '<p class="scene-phase ally-phase">' + d.allyText + '</p>';
if (d.climaxText) narrative += '<p class="scene-phase climax-phase">' + d.climaxText + '</p>';
if (narrativeEl) narrativeEl.innerHTML = narrative;
if (effectsEl) {
effectsEl.innerHTML = '<div class="scene-effect lust-drop"><span class="effect-icon">💧</span> Your lust -' + d.lustDrop + '</div>' +
'<div class="scene-effect dom-gain"><span class="effect-icon">👑</span> Dominance +5</div>';
}
if (fearEl && d.fearApplied) {
fearEl.innerHTML = '<div class="fear-applied intense"><span class="effect-icon">😨</span> Remaining enemies are TERRIFIED!</div>';
}
if (orgasmEl) {
orgasmEl.innerHTML = '<div class="forced-orgasm-notice"><span class="effect-icon">💦</span> She came from being choked (Orgasm #' + d.orgasmCount + ')</div>';
}
if (lustEl) lustEl.textContent = d.newLust + '%';
}, 50)>>
<</widget>>
<<widget "chokeFuckCardFlow">>
<<chokeFuckCard>>
<<executeChokeFuckCard>>
<div class="choice-container">
<<if setup.combatAllSubdued()>>
<<vchoice "Victory!" "Combat_Victory" "action" "muscle">>
<<else>>
<<vchoice "Continue Fight" "Combat_Actions" "action" "attack">>
<</if>>
</div>
<</widget>>
<<widget "frightenOnlookers">>
<<silently>>
<<for _foI to 0; _foI lt $combat.enemies.length; _foI++>>
<<if _foI !== _args[0] && $combat.enemies[_foI] && $combat.enemies[_foI].health gt 0 && !$combat.enemies[_foI].beenUsed>>
<<initResistance _foI>>
<</if>>
<</for>>
<<set _foResult to setup.frightenOnlookers(_args[0], !!_args[1])>>
<<if $combat.enemies[_args[0]]>><<set $combat.enemies[_args[0]].keepTargeted to true>><</if>>
<</silently>>
<</widget>>
<<widget "usedActionCard">>
<<set _uacConfig to _args[0]>>
<<set _uacTarget to $combat.enemies[$combat.currentTarget]>>
<div class="combat-card player-card player-used-card used-action-card">
<!-- HEADER -->
<div class="card-header player-card-header explicit-header">
<<icon _uacConfig.icon "medium">>
<span class="player-card-name">USE HER</span>
<span class="attack-name"><<print _uacConfig.name>></span>
</div>
<!-- CARD BODY -->
<div class="card-body">
<!-- Target Info Row -->
<div class="attack-info-row">
<span class="attack-target">
<<icon "target" "medium">> <<print _uacTarget.name>>
</span>
<span class="attack-cost">
<<icon "energy" "medium">> -<<print _uacConfig.energyCost>>
</span>
</div>
<!-- Narrative -->
<!-- @id, not id="...<<print>>": SugarCube does not run macros inside a
plain attribute, so the id was the literal "<<print ...>>" text,
getElementById missed and the card never showed its narrative,
effects or lust. -->
<div @id="'used-action-narrative-' + _uacConfig.id" class="attack-narrative-container"></div>
<!-- Video Container (filled by fillCombatVideoBox) -->
<div @id="'used-action-video-' + _uacConfig.id" class="card-video-container" style="display:none"></div>
<!-- Effects -->
<div @id="'used-action-effects-' + _uacConfig.id" class="attack-effects-container"></div>
</div>
<!-- FOOTER -->
<div class="card-footer player-card-footer explicit-footer">
<div class="target-status-row">
<span class="target-state">
<<icon "stunned" "medium">> Stunned
</span>
<span class="player-lust">
<<icon "lust" "medium">> <span @id="'used-action-lust-' + _uacConfig.id"><<print $player.lust>>%</span>
</span>
</div>
</div>
</div>
<</widget>>
<<widget "executeUsedActionCard">>
<<silently>>
<<set _euaConfig to _args[0]>>
<<initCombatTarget>>
<<set _euaTargetIdx to _targetIndex>>
<<set _negEnergyCost to -(_euaConfig.energyCost || 0)>>
<<clampStat "player.energy" _negEnergyCost 0 $player.maxEnergy>>
<<set _euaMainPool to setup.combatNarrative[_euaConfig.narrativePool]>>
<<set _euaMainText to "">>
<<if Array.isArray(_euaMainPool) && _euaMainPool.length gt 0>>
<<set _euaMainText to _euaMainPool[random(0, _euaMainPool.length - 1)]>>
<<else>>
<<set _euaMainText to _euaConfig.fallbackText || "You use her body for your pleasure.">>
<</if>>
<<set _euaMoansPool to setup.combatNarrative.used_victim_moans>>
<<set _euaMoansText to "">>
<<if Array.isArray(_euaMoansPool) && _euaMoansPool.length gt 0>>
<<set _euaMoansText to _euaMoansPool[random(0, _euaMoansPool.length - 1)]>>
<</if>>
<<set _euaClimaxPool to setup.combatNarrative.used_climax>>
<<set _euaClimaxText to "">>
<<if Array.isArray(_euaClimaxPool) && _euaClimaxPool.length gt 0>>
<<set _euaClimaxText to _euaClimaxPool[random(0, _euaClimaxPool.length - 1)]>>
<</if>>
<<set _euaIntroText to "">>
<<if _euaConfig.exposeDick && (!$clothing || !$clothing.player || !$clothing.player.dickExposed)>>
<<set _euaIntroText to _euaConfig.introText || "">>
<<set $clothing.player.dickExposed to true>>
<</if>>
<<set _euaBareText to "">>
<<if _euaConfig.bareBelow && _target.clothing && !(_target.clothing.pussyExposed && _target.clothing.assExposed)>>
<<set _euaBareText to _euaConfig.bareText || "You drag what's left of her clothes down her legs.">>
<<set _target.clothing.bottom to 0>>
<<if typeof _target.clothing.underwear === "number">><<set _target.clothing.underwear to 0>><</if>>
<<set _target.clothing.pussyExposed to true>>
<<set _target.clothing.assExposed to true>>
<<set $combat.enemies[_euaTargetIdx].clothing to _target.clothing>>
<</if>>
<<fillCombatVideoBox `"used-action-video-" + _euaConfig.id` _euaConfig.videoFolder _target>>
<<if _euaMoansText>>
<<fillCombatVideoBox `"used-action-video-" + _euaConfig.id` setup.usedActionVideoFolders.moans _target>>
<</if>>
<<if _euaClimaxText>>
<<fillCombatVideoBox `"used-action-video-" + _euaConfig.id` setup.usedActionVideoFolders.climax _target>>
<</if>>
<<set _euaLustDrop to _euaConfig.lustDrop.base + random(0, _euaConfig.lustDrop.variance)>>
<<set $player.lust to Math.max(0, $player.lust - _euaLustDrop)>><<run setup.playerReleased()>>
<<frightenOnlookers _euaTargetIdx>>
<<set _euaOnlookers to _foResult>>
<<set _target.stunned to true>>
<<set _target.stunnedTurns to _euaConfig.stunTurns>>
<<set $combat.enemies[_euaTargetIdx].stunned to true>>
<<set $combat.enemies[_euaTargetIdx].stunnedTurns to _euaConfig.stunTurns>>
<<run window._usedActionCardData = {
id: _euaConfig.id,
introText: _euaIntroText,
bareText: _euaBareText,
mainText: _euaMainText,
moansText: _euaMoansText,
climaxText: _euaClimaxText,
lustDrop: _euaLustDrop,
newLust: $player.lust,
dickExposed: _euaConfig.exposeDick || false,
onlookers: _euaOnlookers
}>>
<</silently>>
<<run setTimeout(function() {
var d = window._usedActionCardData;
var narrativeEl = document.getElementById('used-action-narrative-' + d.id);
var effectsEl = document.getElementById('used-action-effects-' + d.id);
var lustEl = document.getElementById('used-action-lust-' + d.id);
var narrative = '';
if (d.introText) narrative += '<p class="used-intro">' + d.introText + '</p>';
if (d.bareText) narrative += '<p class="used-intro">' + d.bareText + '</p>';
if (d.mainText) narrative += '<p class="used-action explicit">' + d.mainText + '</p>';
if (d.moansText) narrative += '<p class="used-moans enemy-dialogue">' + d.moansText + '</p>';
if (d.climaxText) narrative += '<p class="used-climax explicit">' + d.climaxText + '</p>';
(d.onlookers || []).forEach(function (o) { narrative += '<p class="used-onlooker">' + o.line + '</p>'; });
if (narrativeEl) narrativeEl.innerHTML = narrative;
var effectsHtml = '<div class="used-effect lust-drop"><span class="effect-icon">💧</span> Lust -' + d.lustDrop + '</div>';
if (d.dickExposed) {
effectsHtml += '<div class="used-effect dick-out"><span class="effect-icon">🩲</span> Dick out</div>';
}
(d.onlookers || []).forEach(function (o) {
effectsHtml += '<div class="used-effect onlooker-fear"><span class="effect-icon">😨</span> ' + o.name + ': -' + o.drop + ' resistance' + (o.stacks ? ', fear x' + o.stacks : ', unafraid') + '</div>';
});
if (effectsEl) effectsEl.innerHTML = effectsHtml;
if (lustEl) lustEl.textContent = d.newLust + '%';
}, 50)>>
<</widget>>
<<widget "usedActionCardFlow">>
<<set _uacfConfig to _args[0]>>
<<usedActionCard _uacfConfig>>
<<executeUsedActionCard _uacfConfig>>
<div class="choice-container">
<<if setup.combatAllSubdued()>>
<<vchoice "Victory!" "Combat_Victory" "action" "muscle">>
<<else>>
<<vchoice "Continue Fight" "Combat_Actions" "action" "attack">>
<</if>>
</div>
<</widget>>
<<widget "initUsedActionConfigs">>
<<run setup.usedActionConfigs = {}>>
<<run setup.usedActionVideoFolders = {
moans: "combat/used_moans",
climax: "combat/used_climax"
}>>
<<run setup.chokeFuckVideoFolders = {
moans: "combat/choke_fuck_moans",
allyReaction: "combat/choke_fuck_ally_reaction",
climax: "combat/choke_fuck_climax",
orgasm: "combat/choke_fuck_orgasm"
}>>
<<run setup.usedActionConfigs.throat = {
id: "throat",
videoFolder: "combat/used_throat",
name: "THROAT FUCK",
icon: "lips",
energyCost: 4,
narrativePool: "used_throat",
fallbackText: "You thrust deep into her throat, using her mouth roughly.",
lustDrop: { base: 20, variance: 15 },
stunTurns: 1,
exposeDick: false
}>>
<<run setup.usedActionConfigs.oral = {
id: "oral",
videoFolder: "combat/used_oral",
name: "MAKE HER SUCK",
icon: "lips",
energyCost: 3,
narrativePool: "used_throat",
introText: "You pull out your cock and guide it to her waiting mouth.",
fallbackText: "She takes you into her mouth obediently.",
lustDrop: { base: 15, variance: 10 },
stunTurns: 1,
exposeDick: true
}>>
<<run setup.usedActionConfigs.fuck = {
id: "fuck",
bareBelow: true,
videoFolder: "combat/used_fuck",
name: "FUCK HER",
icon: "corruption",
energyCost: 5,
narrativePool: "used_fuck",
fallbackText: "You thrust into her, taking what you want.",
lustDrop: { base: 25, variance: 15 },
stunTurns: 2,
exposeDick: false
}>>
<<run setup.usedActionConfigs.fuck_start = {
id: "fuck_start",
bareBelow: true,
videoFolder: "combat/used_fuck_start",
name: "WHIP IT OUT & FUCK",
icon: "corruption",
energyCost: 5,
narrativePool: "used_fuck",
introText: "You free your cock and position yourself at her cunt.",
fallbackText: "You thrust into her, claiming her body.",
lustDrop: { base: 25, variance: 15 },
stunTurns: 2,
exposeDick: true
}>>
<<run setup.usedActionConfigs.anal = {
id: "anal",
bareBelow: true,
videoFolder: "combat/used_anal",
name: "TAKE HER ASS",
icon: "corruption",
energyCost: 6,
narrativePool: "used_anal",
fallbackText: "You force yourself into her tight ass.",
lustDrop: { base: 30, variance: 15 },
stunTurns: 2,
exposeDick: false
}>>
<<run setup.usedActionConfigs.missionary = {
id: "missionary",
bareBelow: true,
videoFolder: "combat/used_missionary",
name: "MISSIONARY",
icon: "heart",
energyCost: 5,
narrativePool: "used_missionary",
fallbackText: "You push her onto her back and take her face to face.",
lustDrop: { base: 25, variance: 15 },
stunTurns: 2,
exposeDick: false
}>>
<<run setup.usedActionConfigs.doggy = {
id: "doggy",
bareBelow: true,
videoFolder: "combat/used_doggy",
name: "FROM BEHIND",
icon: "corruption",
energyCost: 5,
narrativePool: "used_doggy",
fallbackText: "You take her from behind, hands gripping her hips.",
lustDrop: { base: 25, variance: 15 },
stunTurns: 2,
exposeDick: false
}>>
<<run setup.usedActionConfigs.facefuck = {
id: "facefuck",
videoFolder: "combat/used_facefuck",
name: "FACE FUCK",
icon: "lips",
energyCost: 4,
narrativePool: "used_facefuck",
fallbackText: "You grab her head and fuck her face roughly.",
lustDrop: { base: 20, variance: 15 },
stunTurns: 1,
exposeDick: false
}>>
<</widget>>
<<widget "usedThroatCardFlow">>
<<usedActionCardFlow setup.usedActionConfigs.throat>>
<</widget>>
<<widget "usedOralCardFlow">>
<<usedActionCardFlow setup.usedActionConfigs.oral>>
<</widget>>
<<widget "usedFuckCardFlow">>
<<usedActionCardFlow setup.usedActionConfigs.fuck>>
<</widget>>
<<widget "usedFuckStartCardFlow">>
<<usedActionCardFlow setup.usedActionConfigs.fuck_start>>
<</widget>>
<<widget "usedAnalCardFlow">>
<<usedActionCardFlow setup.usedActionConfigs.anal>>
<</widget>>
<<widget "usedMissionaryCardFlow">>
<<usedActionCardFlow setup.usedActionConfigs.missionary>>
<</widget>>
<<widget "usedDoggyCardFlow">>
<<usedActionCardFlow setup.usedActionConfigs.doggy>>
<</widget>>
<<widget "usedFacefuckCardFlow">>
<<usedActionCardFlow setup.usedActionConfigs.facefuck>>
<</widget>><<widget "playerAttackCard">>
<<set _pacConfig to _args[0]>>
<<set _pacTarget to $combat.enemies[$combat.currentTarget]>>
<div class="combat-card player-card player-attack-card">
<!-- HEADER -->
<div class="card-header player-attack-header">
<<if _pacConfig.icon>>
<<icon _pacConfig.icon "medium">>
<<else>>
<<icon "sword" "medium">>
<</if>>
<span class="player-card-name">YOUR ATTACK</span>
<span class="attack-name"><<print _pacConfig.name.toUpperCase()>></span>
</div>
<!-- CARD BODY -->
<div class="card-body">
<!-- Attack Info Row -->
<div class="attack-info-row">
<span class="attack-target">
<<icon "target" "medium">> <<print _pacTarget.name>><<if _pacTarget.position and _pacTarget.position neq "standing">> <span class="target-position-indicator">(<<print _pacTarget.position>>)</span><</if>>
</span>
<<if _pacConfig.energyCost gt 0>>
<span class="attack-cost">
<<icon "energy" "medium">> -<<print _pacConfig.energyCost>>
</span>
<</if>>
</div>
<!-- Narrative -->
<div id="player-attack-narrative" class="attack-narrative-container"></div>
<!-- Video Container (populated if video found, hidden otherwise) -->
<div id="player-attack-video" class="card-video-container"></div>
<!-- Damage Result -->
<div id="player-attack-damage" class="damage-result-container"></div>
<!-- Secondary Effects -->
<div id="player-attack-effects" class="attack-effects-container"></div>
</div>
<!-- FOOTER with target info -->
<div class="card-footer player-card-footer">
<div class="target-status-row">
<span class="target-hp">
<<icon "health" "medium">>
<span id="player-target-hp-display"><<print _pacTarget.health || 0>>/<<print _pacTarget.maxHealth || 0>></span>
</span>
<<if _pacTarget.lust gte 30>>
<span class="target-lust">
<<icon "lust" "medium">> <<print _pacTarget.lust || 0>>%
</span>
<</if>>
</div>
</div>
</div>
<</widget>>
<<widget "executePlayerAttackCard">>
<<set _epaConfig to _args[0]>>
<<silently>>
<<if $player.energy lt _epaConfig.energyCost>>
<<set _epaError to "Not enough energy!">>
<<else>>
<<set _negEnergyCost to -(_epaConfig.energyCost || 0)>>
<<clampStat "player.energy" _negEnergyCost 0 $player.maxEnergy>>
<<set _epaError to "">>
<</if>>
<<initCombatTarget>>
<<if !_target>>
<<set _target to {name: "Unknown", health: 0, maxHealth: 60, dodge: 0, armor: 0, gender: "female", lust: 0}>>
<<set _epaError to "No valid target!">>
<</if>>
<<set _epaTargetName to _target ? _target.name : 'Unknown'>>
<<set _epaTargetMaxHealth to (_target && _target.maxHealth !== undefined) ? _target.maxHealth : 60>>
<<set _epaBaseDamage to 5 + Math.floor(($player.strength || 10) / 2)>>
<<if _epaConfig.useWeaponBonus && $equipped && $equipped.weapon>>
<<set _epaBaseDamage += $equipped.weapon.damage>>
<</if>>
<<set _epaBaseDamage to Math.floor(_epaBaseDamage * _epaConfig.damageMultiplier)>>
<<if !_epaConfig.autoHit>>
<<set _epaHitRoll to random(1, 100)>>
<<set _epaBaseAccuracy to 70 + ($player.agility || 10) - setup.enemyDodge(_target) + _epaConfig.accuracyModifier>>
<<set _epaBaseAccuracy -= setup.enemyDefenseMod(_target)>>
<<set _epaHitChance to setup.playerStrikeChance(_epaBaseAccuracy)>>
<<else>>
<<set _epaHitRoll to 1>>
<<set _epaHitChance to 100>>
<</if>>
<<set _epaHit to (_epaHitRoll lte _epaHitChance)>>
<<set _epaGenderSuffix to setup.genderSuffix(_target.gender)>>
<<if _epaHit>>
<<set _epaDamage to _epaBaseDamage + random(_epaConfig.damageVariance[0], _epaConfig.damageVariance[1])>>
<<set _epaDamage to Math.max(1, _epaDamage - (_target.armor || 0))>>
<<if !_epaConfig.consumeCombo>>
<<buildCombo _epaConfig.attackType $combat.currentTarget>>
<<getComboBonus>>
<<set _epaDamage to Math.floor(_epaDamage * _returnComboMult)>>
<<set _epaComboUsed to 0>>
<<else>>
<<if $combat.combo && $combat.combo.count >= 2>>
<<set _epaComboMult to 1 + ($combat.combo.bonus / 100)>>
<<set _epaDamage to Math.floor(_epaDamage * _epaComboMult)>>
<<set _epaComboUsed to $combat.combo.count>>
<<else>>
<<set _epaComboUsed to 0>>
<</if>>
<</if>>
<<applyPositionDamage _epaDamage $combat.currentTarget>>
<<set _epaDamage to _posModifiedDamage>>
<<set _epaDamage to Math.max(1, Math.floor(_epaDamage * setup.fighterDamageFactor("player")))>>
<<set _target.health -= _epaDamage>>
<<applyEnemyDamageExpression _target>>
<<set _epaPositionBonus to (_posDmgMult gt 1)>>
<<set _epaPositionPct to Math.round((_posDmgMult - 1) * 100)>>
<<if _epaConfig.critThreshold gt 0>>
<<set _epaCrit to (_epaDamage gte (_epaBaseDamage + _epaConfig.critThreshold))>>
<<else>>
<<set _epaCrit to false>>
<</if>>
<<set _epaHitLogPool to setup.combatNarrative[_epaConfig.hitLogKey + _epaGenderSuffix]>>
<<set _epaHitLogText to (_epaHitLogPool ? _epaHitLogPool.random() : _epaConfig.hitLogFallback).replace("{damage}", _epaDamage)>>
<<if _epaCrit>>
<<logCombat `_epaHitLogText + " CRITICAL!"` "critical">>
<<elseif _epaComboUsed gt 0>>
<<logCombat `"FINISHER! " + _epaDamage + " damage! (" + _epaComboUsed + "x combo)"` "critical">>
<<else>>
<<logCombat _epaHitLogText "damage">>
<</if>>
<<set _epaVictory to false>>
<<set _epaKill to false>>
<<if _target.health lte 0>>
<<set _epaKill to true>>
<<set _epaKilledRef to _target>>
<<set _epaKillNarrativeKey to _epaConfig.killNarrativeKey + _epaGenderSuffix>>
<<set _epaKillNarrativePool to setup.combatNarrative[_epaKillNarrativeKey]>>
<<set _epaKillNarrative to (_epaKillNarrativePool ? _epaKillNarrativePool.random() : _epaConfig.killNarrativeFallback).replace("{enemy}", _target.name)>>
<<set _epaKillLogPool to setup.combatNarrative[_epaConfig.killLogKey]>>
<<set _defeatLog to (_epaKillLogPool ? _epaKillLogPool.random() : _epaConfig.killLogFallback).replace("{enemy}", _target.name)>>
<<logCombat _defeatLog "critical">>
<<set _epaDefeatLine to "">>
<<if _target.id && setup.raiderTypeMap && setup.raiderTypeMap[_target.id]>>
<<getRaiderDefeat _target>>
<<set _epaDefeatLine to _return>>
<</if>>
<<if !$combat.defeatedEnemies>><<set $combat.defeatedEnemies to []>><</if>>
<<run $combat.defeatedEnemies.push(clone(_target))>>
<<run $combat.enemies.splice($combat.currentTarget, 1)>>
<<if $combat.combo>>
<<set $combat.combo.target to -1>>
<</if>>
<<if $combat.currentTarget gte $combat.enemies.length>>
<<set $combat.currentTarget to Math.max(0, $combat.enemies.length - 1)>>
<</if>>
<<if $combat.enemies.length === 0>>
<<set _epaVictory to true>>
<</if>>
<</if>>
<<set _epaWeaponStatus to "">>
<<if !_epaKill && _epaConfig.useWeaponBonus>>
<<set _epaWeaponStatus to setup.weaponStatusLine(setup.applyWeaponStatuses(_target), _target)>>
<</if>>
<<else>>
<<set _epaWeaponStatus to "">>
<<set _epaDamage to 0>>
<<set _epaCrit to false>>
<<set _epaComboUsed to 0>>
<<set _epaKill to false>>
<<set _epaVictory to false>>
<<set _epaPositionBonus to false>>
<<set _epaMissLogPool to setup.combatNarrative[_epaConfig.missLogKey + _epaGenderSuffix]>>
<<set _epaMissLogText to (_epaMissLogPool ? _epaMissLogPool.random() : _epaConfig.missLogFallback)>>
<<logCombat _epaMissLogText "miss">>
<</if>>
<<set $combat.playerAttackVictory to _epaVictory>>
<<set $combat.playerAttackKill to _epaKill>>
<<set _epaTargetObj to _target>>
<<set _epaClothingDamage to 0>>
<<set _epaClothingSlot to "">>
<<set _epaJustExposed to false>>
<<if _epaHit && !_epaKill && _epaConfig.clothingDamage && _epaConfig.clothingDamage.chance gt 0>>
<<set _epaClothRoll to random(1, 100)>>
<<set _epaClothChance to _epaConfig.clothingDamage.chance>>
<<if _epaConfig.clothingDamage.critBonus && _epaCrit>>
<<set _epaClothChance to 100>>
<</if>>
<<if $flags.seductionUnlocked && _epaClothRoll lte _epaClothChance>>
<<set _epaClothingDamage to random(_epaConfig.clothingDamage.amount[0], _epaConfig.clothingDamage.amount[1])>>
<<set _epaClothingSlot to _epaConfig.clothingDamage.targetSlot>>
<<set $combat.clothingDamageDealt to _epaClothingDamage>>
<<set _epaExpTarget to $combat.enemies[$combat.currentTarget]>>
<<set _epaExpBefore to setup.enemyExposedParts(_epaExpTarget)>>
<<damageClothingWithArmor $combat.currentTarget "random" _epaClothingDamage>>
<<set _epaJustExposed to setup.enemyExposedParts(_epaExpTarget) gt _epaExpBefore>>
<</if>>
<</if>>
<<set _target to _epaTargetObj>>
<<set _epaCapturedTargetHealth to (_target && _target.health !== undefined) ? _target.health : 0>>
<<set _epaKnockdown to false>>
<<if _epaHit && !_epaKill && _epaConfig.knockdownChance gt 0 && $flags.seductionUnlocked>>
<<if random(1, 100) lte _epaConfig.knockdownChance>>
<<knockdown $combat.currentTarget "random">>
<<set _target to _epaTargetObj>>
<<set _epaKnockdown to true>>
<</if>>
<</if>>
<<if _epaConfig.consumeCombo && _epaComboUsed gt 0>>
<<set $combat.combo to { count: 0, lastAction: "", target: -1, bonus: 0 }>>
<</if>>
<<if _epaConfig.playerVulnerable>>
<<set $combat.playerVulnerable to true>>
<</if>>
<<fillCombatVideoBox "player-attack-video" `_epaHit ? _epaConfig.videoFolder : _epaConfig.videoFolderMiss` _target>>
<<if _epaKill && _epaKilledRef>>
<<fillCombatVideoBox "player-attack-video" `"combat/enemy_defeated_" + (_epaKilledRef.gender === "male" ? "male" : "female")` _epaKilledRef>>
<</if>>
<</silently>>
<<run window._epaCardData = {
error: _epaError || '',
hit: _epaHit,
hitRoll: _epaHitRoll,
hitChance: _epaHitChance,
damage: _epaDamage || 0,
crit: _epaCrit,
comboUsed: _epaComboUsed || 0,
positionBonus: _epaPositionBonus,
positionPct: _epaPositionPct || 0,
clothingDamage: _epaClothingDamage || 0,
clothingSlot: _epaClothingSlot || 'random',
justExposed: !!_epaJustExposed,
weaponStatus: _epaWeaponStatus || '',
knockdown: _epaKnockdown,
kill: _epaKill,
killNarrative: _epaKillNarrative || '',
defeatLine: _epaDefeatLine || '',
targetName: _epaTargetName,
targetHealth: _epaCapturedTargetHealth,
targetMaxHealth: _epaTargetMaxHealth,
narrativeKey: _epaConfig.narrativeKey + _epaGenderSuffix,
narrativeFallback: _epaConfig.narrativeFallback,
missNarrativeKey: _epaConfig.missNarrativeKey + _epaGenderSuffix,
missFallback: _epaConfig.missFallback,
genderSuffix: _epaGenderSuffix,
consumeCombo: _epaConfig.consumeCombo,
hitLine: (setup.combatNarrative[_epaConfig.narrativeKey + _epaGenderSuffix] || []).random(),
missLine: (setup.combatNarrative[_epaConfig.missNarrativeKey + _epaGenderSuffix] || []).random()
}>>
<<run setTimeout(function() {
var d = window._epaCardData;
var narrativeHtml = '';
var resultBadge = d.hit ? '<span class="roll-result hit">HIT!</span>' : '<span class="roll-result miss">MISS</span>';
if (d.error) {
narrativeHtml = '<p class="combat-error">' + d.error + '</p>';
} else if (d.hit) {
narrativeHtml = '<div class="attack-narrative-row"><p class="attack-hit-narrative">' + (d.hitLine || d.narrativeFallback) + '</p>' + resultBadge + '</div>';
} else {
narrativeHtml = '<div class="attack-narrative-row"><p class="attack-miss-narrative">' + (d.missLine || d.missFallback || 'Your attack misses!') + '</p>' + resultBadge + '</div>';
}
$('#player-attack-narrative').html(narrativeHtml);
}, 10)>>
<<run setTimeout(function() {
var d = window._epaCardData;
var damageHtml = '';
if (d.hit && d.damage > 0) {
var damageClass = d.crit ? 'damage-display critical' : 'damage-display';
if (d.comboUsed > 0) damageClass += ' finisher';
damageHtml = '<div class="' + damageClass + '">';
if (d.comboUsed > 0) {
damageHtml += '<span class="finisher-label">' + d.comboUsed + 'x FINISHER!</span> ';
}
damageHtml += '<span class="damage-number">-' + d.damage + '</span>';
damageHtml += '<span class="damage-type">physical</span>';
if (d.crit) damageHtml += ' <span class="crit-label">CRITICAL!</span>';
damageHtml += '</div>';
}
$('#player-attack-damage').html(damageHtml);
}, 30)>>
<<run setTimeout(function() {
var d = window._epaCardData;
var effectsHtml = '';
if (d.positionBonus) {
effectsHtml += '<div class="position-bonus-effect">';
effectsHtml += '<span class="effect-icon"><span class="gi gi-knockdown gi-medium"></span></span> ';
effectsHtml += 'POSITION BONUS! +' + d.positionPct + '% damage';
effectsHtml += '</div>';
}
if (d.weaponStatus) {
effectsHtml += '<div class="weapon-status-effect"><span class="effect-icon"><span class="gi gi-bleeding gi-medium"></span></span> ';
effectsHtml += Util.escape(String(d.weaponStatus));
effectsHtml += '</div>';
}
if (d.clothingDamage > 0) {
effectsHtml += '<div class="clothing-damage-effect">';
effectsHtml += '<span class="effect-icon"><span class="gi gi-scissors gi-medium"></span></span> ';
effectsHtml += '-' + d.clothingDamage + '% ' + d.clothingSlot + ' clothing';
if (d.justExposed) {
effectsHtml += ' <span class="exposure-alert">EXPOSED!</span>';
}
effectsHtml += '</div>';
}
if (d.knockdown) {
effectsHtml += '<div class="knockdown-effect">';
effectsHtml += '<span class="effect-icon"><span class="gi gi-knockdown gi-medium"></span></span> ';
effectsHtml += 'Knocked down!';
effectsHtml += '</div>';
}
if (d.hit && !d.consumeCombo && State.variables.combat.combo && State.variables.combat.combo.count >= 2) {
effectsHtml += '<div class="combo-built-effect">';
effectsHtml += '<span class="combo-count">' + State.variables.combat.combo.count + 'x COMBO</span>';
effectsHtml += '</div>';
}
if (d.kill) {
effectsHtml += '<div class="kill-effect">';
effectsHtml += '<span class="effect-icon"><span class="gi gi-skull gi-medium"></span></span> ';
effectsHtml += '<span class="kill-narrative">' + d.killNarrative + '</span>';
if (d.defeatLine) {
effectsHtml += '<p class="enemy-defeat-dialogue">"' + d.defeatLine + '"</p>';
}
effectsHtml += '</div>';
}
$('#player-attack-effects').html(effectsHtml);
}, 40)>>
<<run setTimeout(function() {
var d = window._epaCardData;
$('#player-target-hp-display').text(Math.max(0, d.targetHealth) + '/' + d.targetMaxHealth);
}, 50)>>
<</widget>>
<<widget "playerAttackCardFlow">>
<<set _pacfConfig to _args[0]>>
<div class="player-turn-container">
<!-- Render the card -->
<<playerAttackCard _pacfConfig>>
<!-- Execute and populate -->
<<executePlayerAttackCard _pacfConfig>>
</div>
<!-- Continue button - check for victory -->
<div class="choice-container">
<<if $combat.playerAttackVictory>>
<<vchoice "Victory!" "Combat_Victory" "move" "map">>
<<else>>
<<vchoice "Continue" "Combat_Companion_Turn" "move" "map">>
<</if>>
</div>
<</widget>>
/* -----------------------------------------------------------------------------
playerAttackPreviewCard - Preview card before confirmation
Shows attack stats without executing<<widget "playerClothingAttackCard">>
<<set _pcacConfig to _args[0]>>
<<set _pcacTarget to $combat.enemies[$combat.currentTarget]>>
<div class="combat-card player-card player-clothing-card">
<!-- HEADER -->
<div class="card-header player-clothing-header">
<<if _pcacConfig.icon>>
<<icon _pcacConfig.icon "medium">>
<<else>>
<<icon "scissors" "medium">>
<</if>>
<span class="player-card-name">STRIP ATTACK</span>
<span class="attack-name"><<print _pcacConfig.name.toUpperCase()>></span>
</div>
<!-- CARD BODY -->
<div class="card-body">
<!-- Attack Info Row -->
<div class="attack-info-row">
<span class="attack-target">
<<icon "target" "medium">> <<print _pcacTarget.name>><<if _pcacTarget.position and _pcacTarget.position neq "standing">> <span class="target-position-indicator">(<<print _pcacTarget.position>>)</span><</if>>
</span>
<span class="attack-slot">
<<if _pcacConfig.clothingSlot eq "bottom" or _pcacConfig.clothingSlot eq "pants" or _pcacConfig.clothingSlot eq "legs">><<icon "pants" "medium">><<else>><<icon "shirt" "medium">><</if>> <<print _pcacConfig.clothingSlot>>
</span>
</div>
<!-- Narrative -->
<div id="player-clothing-narrative" class="clothing-narrative-container"></div>
<!-- Video Container (populated if video found) -->
<div id="player-clothing-video" class="card-video-container"></div>
<!-- Clothing Damage Result -->
<div id="player-clothing-result" class="clothing-result-container"></div>
<!-- Effects (lust, humiliation) -->
<div id="player-clothing-effects" class="clothing-effects-container"></div>
</div>
<!-- FOOTER with target clothing status -->
<div class="card-footer player-card-footer">
<div class="target-status-row">
<span class="target-clothing">
<<if _pcacConfig.clothingSlot eq "bottom" or _pcacConfig.clothingSlot eq "pants" or _pcacConfig.clothingSlot eq "legs">><<icon "pants" "medium">><<else>><<icon "shirt" "medium">><</if>>
<span id="player-target-clothing-display">
<<if _pcacTarget.clothing>>
<<print (_pcacTarget.clothing[_pcacConfig.clothingSlot] || 0)>>%
<<else>>
0%
<</if>>
</span>
</span>
<span class="target-lust">
<<icon "lust" "medium">> <<print _pcacTarget.lust || 0>>%
</span>
</div>
</div>
</div>
<</widget>>
<<widget "executePlayerClothingAttackCard">>
<<set _epcaConfig to _args[0]>>
<<silently>>
<<initCombatTarget>>
<<if _epcaConfig.autoSuccess>>
<<set _epcaSuccess to true>>
<<set _epcaRoll to 1>>
<<set _epcaChance to 100>>
<<else>>
<<set _epcaRoll to random(1, 100)>>
<<set _epcaChance to _epcaConfig.baseChance || 70>>
<<if _epcaConfig.strengthBonus>>
<<set _epcaChance += Math.floor(($player.strength || 10) / 2)>>
<</if>>
<<set _epcaSuccess to (_epcaRoll <= _epcaChance)>>
<</if>>
<<set $combat.clothingAttackSuccess to _epcaSuccess>>
<<set _epcaTier to "miss">>
<<set _epcaClothingDamage to 0>>
<<set _epcaHpDamage to 0>>
<<set _epcaLustGain to 0>>
<<set _epcaHumiliationGain to 0>>
<<set _epcaPlayerLustGain to 0>>
<<set _epcaExposed to false>>
<<set _epcaExposureType to "">>
<<if _epcaSuccess>>
<<set _epcaClothingDamage to random(_epcaConfig.clothingDamageRange[0], _epcaConfig.clothingDamageRange[1])>>
<<if _epcaConfig.hpDamageRange>>
<<set _epcaHpDamage to Math.floor(random(_epcaConfig.hpDamageRange[0], _epcaConfig.hpDamageRange[1]) * setup.fighterDamageFactor("player"))>>
<<set _target.health -= _epcaHpDamage>>
<<applyEnemyDamageExpression _target>>
<</if>>
<<if _target.clothing>>
<<set _oldDurability to setup.clothingValue(_target.clothing[_epcaConfig.clothingSlot])>>
<<set _target.clothing[_epcaConfig.clothingSlot] to Math.max(0, _oldDurability - _epcaClothingDamage)>>
<<set _newDurability to _target.clothing[_epcaConfig.clothingSlot]>>
<<set _hasUnderwear to false>>
<<if _epcaConfig.underwearSlot && (_target.clothing[_epcaConfig.underwearSlot] || 0) > 0>>
<<set _hasUnderwear to true>>
<</if>>
<<if _newDurability <= 0 && !_hasUnderwear>>
<<set _epcaTier to "full_exposure">>
<<for _flag range _epcaConfig.exposureFlags>>
<<run _target.clothing[_flag] = true>>
<</for>>
<<set _epcaLustGain to _epcaConfig.fullExposure.enemyLust || 8>>
<<set _epcaHumiliationGain to _epcaConfig.fullExposure.humiliation || 15>>
<<set _epcaPlayerLustGain to _epcaConfig.fullExposure.playerLust || 10>>
<<set _target.lust to setup.enemyLustPlus(_target, _epcaLustGain)>>
<<run setup.addEnemyHumiliation(_target, _epcaHumiliationGain)>>
<<set $player.lust to Math.min(100, $player.lust + _epcaPlayerLustGain)>>
<<set _epcaExposed to true>>
<<set _epcaExposureType to _epcaConfig.exposureFlags[0]>>
<<if _target.isCovering>>
<<forcedStopCovering _targetIndex>>
<</if>>
<<set _exposeLog to _epcaConfig.name + " " + _target.name + "! EXPOSED! +" + _epcaHumiliationGain + " humiliation">>
<<logCombat _exposeLog "strip">>
<<elseif _newDurability <= 0 && _hasUnderwear>>
<<set _epcaTier to "underwear_only">>
<<set _target.clothing.underwearExposed to true>>
<<set _epcaHumiliationGain to 5>>
<<set _epcaPlayerLustGain to 8>>
<<run setup.addEnemyHumiliation(_target, _epcaHumiliationGain)>>
<<set $player.lust to Math.min(100, $player.lust + _epcaPlayerLustGain)>>
<<set _underwearLog to _epcaConfig.name + " " + _target.name + "! Underwear exposed!">>
<<logCombat _underwearLog "strip">>
<<elseif _newDurability <= (_epcaConfig.nearlyDestroyed?.threshold || 25)>>
<<set _epcaTier to "nearly_destroyed">>
<<set _epcaHumiliationGain to _epcaConfig.nearlyDestroyed?.humiliation || 5>>
<<set _epcaPlayerLustGain to _epcaConfig.nearlyDestroyed?.playerLust || 5>>
<<run setup.addEnemyHumiliation(_target, _epcaHumiliationGain)>>
<<set $player.lust to Math.min(100, $player.lust + _epcaPlayerLustGain)>>
<<set _tearLog to _epcaConfig.name + " " + _target.name + "! Torn badly!">>
<<logCombat _tearLog "clothing">>
<<else>>
<<set _epcaTier to "regular_damage">>
<<set _damageLog to _epcaConfig.name + " " + _target.name + "! -" + _epcaClothingDamage + "% " + _epcaConfig.clothingSlot>>
<<logCombat _damageLog "clothing">>
<</if>>
<<set $combat.clothingDamageDealt to _epcaClothingDamage>>
<<set $combat.clothingTier to _epcaTier>>
<</if>>
<<else>>
<<set _missLog to _epcaConfig.name + " missed!">>
<<logCombat _missLog "miss">>
<</if>>
<<fillCombatVideoBox "player-clothing-video" `_epcaSuccess ? _epcaConfig.videoFolder : null` _target>>
<</silently>>
<<set _epcaGenderSuffix to setup.genderSuffix(_target.gender)>>
<<run window._epcaCardData = {
clothingSlot: _epcaConfig.clothingSlot,
newDurability: _target.clothing ? (_target.clothing[_epcaConfig.clothingSlot] || 0) : 0,
targetLust: _target ? _target.lust : 0,
genderSuffix: _epcaGenderSuffix
}>>
<<capture _epcaTier, _epcaConfig, _epcaSuccess, _epcaClothingDamage, _epcaExposureType, _epcaHpDamage, _epcaLustGain, _epcaHumiliationGain, _epcaPlayerLustGain>>
<<done>><<run (function () { try {
var narrativeHtml = '';
var tier = _epcaTier;
var config = _epcaConfig;
var genderSuffix = window._epcaCardData.genderSuffix;
function getNarrative(key, fallback) {
var genderedKey = key + genderSuffix;
var n = setup.combatNarrative[genderedKey];
if (n) {
if (Array.isArray(n)) return n.random();
return n;
}
n = setup.combatNarrative[key];
if (!n) return fallback;
if (Array.isArray(n)) return n.random();
return n;
}
if (tier === 'miss') {
narrativeHtml = '<div class="clothing-narrative-row"><p class="clothing-miss-narrative">' + getNarrative(config.narrativeKey + '_miss', config.missFallback || 'They block your grab!') + '</p><span class="roll-result miss">BLOCKED!</span></div>';
} else if (tier === 'full_exposure') {
narrativeHtml = '<div class="clothing-narrative-row"><p class="clothing-expose-narrative explicit">' + getNarrative(config.fullExposure?.narrativeKey, 'You tear it completely off! Fully exposed!') + '</p><span class="roll-result hit">SUCCESS!</span></div>';
} else if (tier === 'nearly_destroyed') {
narrativeHtml = '<div class="clothing-narrative-row"><p class="clothing-tear-narrative explicit">' + getNarrative(config.nearlyDestroyed?.narrativeKey, 'You rip at it— it tears badly, barely covering anything!') + '</p><span class="roll-result hit">SUCCESS!</span></div>';
} else if (tier === 'underwear_only') {
narrativeHtml = '<div class="clothing-narrative-row"><p class="clothing-underwear-narrative explicit">' + getNarrative(config.underwearExposure?.narrativeKey, 'You tear it away— just underwear left!') + '</p><span class="roll-result hit">SUCCESS!</span></div>';
} else {
narrativeHtml = '<div class="clothing-narrative-row"><p class="clothing-damage-narrative">' + getNarrative(config.narrativeKey + '_regular', 'You grab and pull— fabric tears!') + '</p><span class="roll-result hit">SUCCESS!</span></div>';
}
$('#player-clothing-narrative').html(narrativeHtml);
} catch (e) { console.error(e); } })()>><</done>>
<<done>><<run (function () { try {
var resultHtml = '';
if (_epcaSuccess) {
resultHtml = '<div class="clothing-damage-display">';
resultHtml += '<span class="damage-icon"><span class="gi gi-scissors gi-medium"></span></span> ';
resultHtml += '-' + _epcaClothingDamage + '% ' + _epcaConfig.clothingSlot;
if (_epcaTier === 'full_exposure') {
var exposureLabel = _epcaExposureType === 'titsExposed' ? 'TITS' : _epcaExposureType === 'pussyExposed' ? 'PUSSY' : 'ASS';
resultHtml += '<div class="exposure-alert"><span class="gi gi-hazard-sign gi-medium"></span> ' + exposureLabel + ' EXPOSED!</div>';
} else if (_epcaTier === 'underwear_only') {
resultHtml += '<div class="underwear-alert"><span class="gi gi-underwear gi-medium"></span> UNDERWEAR VISIBLE!</div>';
} else if (_epcaTier === 'nearly_destroyed') {
resultHtml += '<div class="tear-alert">Barely hanging on!</div>';
}
resultHtml += '</div>';
}
$('#player-clothing-result').html(resultHtml);
} catch (e) { console.error(e); } })()>><</done>>
<<done>><<run (function () { try {
var effectsHtml = '';
if (_epcaSuccess) {
if (_epcaHpDamage > 0) {
effectsHtml += '<div class="hp-damage-display">-' + _epcaHpDamage + ' HP</div>';
}
if (_epcaLustGain > 0) {
effectsHtml += '<div class="lust-effect">';
effectsHtml += '<span class="gi gi-lust gi-medium"></span> +' + _epcaLustGain + ' enemy lust';
effectsHtml += '</div>';
}
if (_epcaHumiliationGain > 0) {
effectsHtml += '<div class="humiliation-effect">';
effectsHtml += '<span class="gi gi-shame gi-medium"></span> +' + _epcaHumiliationGain + ' humiliation';
effectsHtml += '</div>';
}
if (_epcaPlayerLustGain > 0) {
effectsHtml += '<div class="player-lust-effect">';
effectsHtml += '<span class="gi gi-high-arousal gi-medium"></span> +' + _epcaPlayerLustGain + ' your lust';
effectsHtml += '</div>';
}
}
$('#player-clothing-effects').html(effectsHtml);
var d = window._epcaCardData;
$('#player-target-clothing-display').text(d.newDurability + '%');
} catch (e) { console.error(e); } })()>><</done>>
<</capture>>
<</widget>>
<<widget "playerClothingAttackCardFlow">>
<<set _pccfConfig to _args[0]>>
<div class="player-turn-container">
<!-- Render the card -->
<<playerClothingAttackCard _pccfConfig>>
<!-- Execute and populate -->
<<executePlayerClothingAttackCard _pccfConfig>>
</div>
<!-- Continue button -->
<div class="choice-container">
<<vchoice "Continue" "Combat_Companion_Turn" "move" "map">>
</div>
<</widget>><<widget "playerDefenseCard">>
<<set _pdcConfig to _args[0]>>
<div class="combat-card player-card player-defense-card">
<!-- HEADER -->
<div class="card-header player-defense-header">
<<switch _pdcConfig.actionType>>
<<case "block">>
<<icon "block" "medium">>
<<case "parry">>
<<icon "parry" "medium">>
<<case "dodge">>
<<icon "run" "medium">>
<<case "riposte">>
<<icon "riposte" "medium">>
<<case "rest">>
<<icon "rest" "medium">>
<<default>>
<<icon "armor" "medium">>
<</switch>>
<span class="player-card-name">DEFENSE</span>
<span class="attack-name"><<print _pdcConfig.name.toUpperCase()>></span>
</div>
<!-- CARD BODY -->
<div class="card-body">
<!-- Energy Cost -->
<<if _pdcConfig.energyCost gt 0>>
<div class="attack-info-row">
<span class="attack-cost">
<<icon "energy" "medium">> -<<print _pdcConfig.energyCost>> energy
</span>
</div>
<</if>>
<!-- Narrative -->
<div id="player-defense-narrative" class="defense-narrative-container"></div>
<!-- Video Container (populated if video found) -->
<div id="player-defense-video" class="card-video-container"></div>
<!-- Position Warning -->
<div id="player-defense-position" class="defense-position-container"></div>
<!-- Stance Info -->
<div id="player-defense-info" class="defense-info-container"></div>
</div>
<!-- FOOTER -->
<div class="card-footer player-card-footer">
<div class="stance-status">
<span id="player-defense-status" class="stance-active"></span>
</div>
</div>
</div>
<</widget>>
<<widget "executePlayerDefenseCard">>
<<set _epdConfig to _args[0]>>
<<silently>>
<<executeDefensiveAction _epdConfig>>
<<set _playerPos to ($combat.positions && $combat.positions.player) || "standing">>
<<set _penaltyVar to _epdConfig.penaltyVariable>>
<<set _penalty to _penaltyVar ? ($combat[_penaltyVar] || 0) : 0>>
<<if !_defenseRefused>>
<<fillCombatVideoBox "player-defense-video" _epdConfig.videoFolder>>
<</if>>
<</silently>>
<<if !_defenseRefused>>
<<run (function (cfg, penalty) {
setTimeout(function() {
var narrativeHtml = '<p class="defense-stance-narrative">';
var pool = setup.combatNarrative[cfg.actionType + '_stance'];
if (pool) {
narrativeHtml += pool.random();
} else {
narrativeHtml += cfg.logText || ('You prepare to ' + cfg.actionType + '.');
}
narrativeHtml += '</p>';
$('#player-defense-narrative').html(narrativeHtml);
}, 10);
setTimeout(function() {
var posHtml = '';
if (penalty > 0) {
posHtml = '<div class="position-warning">';
posHtml += '<span class="gi gi-hazard-sign gi-medium"></span> Position penalty: +' + penalty + '% incoming damage';
posHtml += '</div>';
}
$('#player-defense-position').html(posHtml);
}, 20);
setTimeout(function() {
var infoHtml = '<div class="defense-info ' + cfg.actionType + '">';
var actionType = cfg.actionType;
var mechCfg = setup.defensiveMechanicsConfig || {baseBlockReduction: 50, baseDodgeBonus: 30};
if (actionType === 'block') {
var baseReduction = mechCfg.baseBlockReduction;
var totalPenalty = baseReduction + (penalty || 0);
infoHtml += '<span class="gi gi-armor gi-medium"></span> ';
infoHtml += 'Block active: Next hit deals ' + totalPenalty + '% damage';
} else if (actionType === 'parry') {
infoHtml += '<span class="gi gi-attack gi-medium"></span> ';
infoHtml += 'Parry active: If enemy misses, you counter!';
} else if (actionType === 'riposte') {
infoHtml += '<span class="gi gi-attack gi-medium"></span> ';
infoHtml += 'Riposte active: Counter-attack on enemy miss!';
} else if (actionType === 'dodge') {
var dodgeBonus = mechCfg.baseDodgeBonus;
infoHtml += '<span class="gi gi-run gi-medium"></span> ';
infoHtml += 'Dodge active: +' + dodgeBonus + '% evasion this round';
} else if (actionType === 'rest') {
infoHtml += '<span class="gi gi-rest gi-medium"></span> ';
infoHtml += 'Resting: Recover energy';
}
infoHtml += '</div>';
$('#player-defense-info').html(infoHtml);
}, 30);
setTimeout(function() {
var statusHtml = '<span class="stance-label">' + cfg.name.toUpperCase() + ' ACTIVE</span>';
$('#player-defense-status').html(statusHtml);
}, 40);
})(_epdConfig, _penalty)>>
<</if>>
<</widget>>
<<widget "playerDefenseCardFlow">>
<<set _pdfConfig to _args[0]>>
<<defenseRefusal _pdfConfig>>
<<if _defenseRefusalMsg !== "">>
<<set $combat.actionNotice to _defenseRefusalMsg>>
<<goto "Combat_Actions">>
<<else>>
<div class="player-turn-container">
<!-- Render the card -->
<<playerDefenseCard _pdfConfig>>
<!-- Execute and populate -->
<<executePlayerDefenseCard _pdfConfig>>
</div>
<!-- Continue button -->
<div class="choice-container">
<<vchoice "Continue" "Combat_Companion_Turn" "move" "map">>
</div>
<</if>>
<</widget>><<widget "playerDickOutCard">>
<<set _pdoConfig to _args[0]>>
<<initCombatTarget>>
<<set _pdoTarget to _target>>
<div class="combat-card player-card player-attack-card dick-out-card">
<!-- HEADER -->
<div class="card-header player-attack-header">
<<icon _pdoConfig.icon "medium">>
<span class="player-card-name">DOMINATION</span>
<span class="attack-name"><<print _pdoConfig.name.toUpperCase()>></span>
</div>
<!-- BODY -->
<div class="card-body">
<!-- Target Info Row -->
<div class="attack-info-row">
<span class="attack-target">
<<icon "target" "medium">> <<print _pdoTarget.name>><<if _pdoTarget.position and _pdoTarget.position neq "standing">> <span class="target-position-indicator">(<<print _pdoTarget.position>>)</span><</if>>
</span>
</div>
<!-- Narrative -->
<div id="player-do-narrative" class="narrative-container"></div>
<!-- Video Container (populated if video found) -->
<div id="player-do-video" class="card-video-container"></div>
<!-- Lust Display -->
<div id="player-do-lust" class="lust-container"></div>
<!-- Effects -->
<div id="player-do-effects" class="effects-container"></div>
<!-- Victory Check -->
<div id="player-do-victory" class="victory-container"></div>
</div>
<!-- FOOTER -->
<div class="card-footer player-card-footer">
<div class="target-status-row">
<span class="target-hp">
<<icon "health" "medium">> <<print _pdoTarget.health>>/<<print _pdoTarget.maxHealth>>
</span>
<span class="target-lust">
<<icon "high-arousal" "medium">>
<span id="player-do-target-lust"><<print _pdoTarget.lust || 0>></span>%
</span>
</div>
</div>
</div>
<</widget>>
<<widget "executePlayerDickOutCard">>
<<set _epdoConfig to _args[0]>>
<<silently>>
<<initCombatTarget>>
<<set _epdoIsExposed to true>>
<<if _epdoConfig.clothingCheck>>
<<set _epdoTargetClothing to _target.clothing || {}>>
<<if _epdoConfig.clothingCheck === "assExposed">>
<<set _epdoIsExposed to (_epdoTargetClothing.assExposed || _epdoTargetClothing.pussyExposed)>>
<<elseif _epdoConfig.clothingCheck === "pussyExposed">>
<<set _epdoIsExposed to _epdoTargetClothing.pussyExposed>>
<</if>>
<</if>>
<<if _epdoIsExposed>>
<<set _epdoPool to _epdoConfig.poolExposed>>
<<set _epdoFallback to _epdoConfig.fallbackExposed>>
<<set _epdoLustRange to _epdoConfig.lustExposed>>
<<set _epdoPlayerLustRange to _epdoConfig.playerLustExposed>>
<<else>>
<<set _epdoPool to _epdoConfig.poolClothed>>
<<set _epdoFallback to _epdoConfig.fallbackClothed>>
<<set _epdoLustRange to _epdoConfig.lustClothed>>
<<set _epdoPlayerLustRange to _epdoConfig.playerLustClothed>>
<</if>>
<<set _epdoLustGain to random(_epdoLustRange.min, _epdoLustRange.max)>>
<<set _target.lust to setup.enemyLustPlus(_target, _epdoLustGain)>>
<<if setup.SEX_ACTS.includes(_epdoConfig.actionName)>><<run setup.markEnemySexUsed(_target)>><</if>>
<<set _epdoPlayerLustGain to random(_epdoPlayerLustRange.min, _epdoPlayerLustRange.max)>>
<<set $player.lust to Math.min(100, $player.lust + _epdoPlayerLustGain)>>
<<set $player.dominance to ($player.dominance || 0) + _epdoConfig.dominance>>
<<set _epdoActionVerb to (_epdoConfig.actionName || "dick out action").replace("_", " ")>>
<<if _epdoActionVerb === "cock slap">>
<<set _epdoActionVerb to "cock-slapped">>
<<elseif _epdoActionVerb === "rub face">>
<<set _epdoActionVerb to "rubbed your cock on the face of">>
<<elseif _epdoActionVerb === "press lips">>
<<set _epdoActionVerb to "pressed your cock to the lips of">>
<<elseif _epdoActionVerb === "hotdog ass">>
<<set _epdoActionVerb to "hotdogged the ass of">>
<<elseif _epdoActionVerb === "grind behind">>
<<set _epdoActionVerb to "grinded behind">>
<</if>>
<<set _epdoLog to "You " + _epdoActionVerb + " " + _target.name + " #" + (_targetIndex + 1) + "! +" + _epdoLustGain + " lust">>
<<logCombat _epdoLog "domination">>
<<set _epdoHumiliationApplied to false>>
<<if _epdoConfig.humiliation gt 0>>
<<addHumiliation _targetIndex _epdoConfig.humiliation _epdoConfig.humiliationType>>
<<set _epdoHumiliationApplied to true>>
<</if>>
<<set _epdoVictory to false>>
<<if _epdoConfig.checkSeduceVictory && _target.lust gte _target.seduceThreshold>>
<<set _epdoVictory to true>>
<<set _target.defeated to true>>
<<set _target.beenUsed to true>>
<<set _target.sexUsed to _target.sexUsed === true || setup.SEX_ACTS.includes(_epdoConfig.actionName)>>
<<run setup.countWomanUsed(_target)>>
<<set _target.defeatType to "seduced">>
<</if>>
<<fillCombatVideoBox "player-do-video" _epdoConfig.videoFolder _target>>
<</silently>>
<<run window._epdoCardData = {
targetLust: _target ? _target.lust : 0,
targetHealth: _target ? _target.health : 0,
targetMaxHealth: _target ? _target.maxHealth : 0
}>>
<<capture _epdoPool, _epdoConfig, _epdoFallback, _epdoLustGain, _epdoPlayerLustGain, _epdoIsExposed, _epdoHumiliationApplied, _epdoVictory>>
<<done>><<run (function () { try {
var narrativeHtml = '';
var pool = setup.combatNarrative[_epdoPool];
var intensity = _epdoConfig.intensity || 'light';
narrativeHtml = '<p class="attack-narrative explicit ' + intensity + '">';
narrativeHtml += pool?.random() || _epdoFallback || 'You dominate her with your cock!';
narrativeHtml += '</p>';
$('#player-do-narrative').html(narrativeHtml);
} catch (e) { console.error(e); } })()>><</done>>
<<done>><<run (function () { try {
var lustHtml = '';
var intensity = _epdoConfig.intensity || 'light';
lustHtml = '<div class="lust-display ' + intensity + '">';
lustHtml += '<div class="damage-row lust">';
lustHtml += '<span class="damage-icon"><span class="gi gi-' + _epdoConfig.icon + ' gi-medium"></span></span>';
lustHtml += '<span class="damage-value">+' + _epdoLustGain + '</span>';
lustHtml += '<span class="damage-label"> enemy lust</span>';
lustHtml += '</div>';
lustHtml += '<div class="damage-row player-lust">';
lustHtml += '<span class="damage-icon"><span class="gi gi-high-arousal gi-medium"></span></span>';
lustHtml += '<span class="damage-value">+' + _epdoPlayerLustGain + '</span>';
lustHtml += '<span class="damage-label"> your lust</span>';
lustHtml += '</div>';
lustHtml += '</div>';
if (_epdoConfig.clothingCheck) {
lustHtml += '<div class="exposure-indicator">';
if (_epdoIsExposed) {
lustHtml += '<span class="gi gi-torn-clothing gi-medium"></span> Exposed bonus applied';
} else {
lustHtml += '<span class="gi gi-armor gi-medium"></span> Clothed (reduced effect)';
}
lustHtml += '</div>';
}
$('#player-do-lust').html(lustHtml);
} catch (e) { console.error(e); } })()>><</done>>
<<done>><<run (function () { try {
var effectsHtml = '';
if (_epdoConfig.dominance > 0) {
effectsHtml += '<div class="effect-row">';
effectsHtml += '<span class="gi gi-dominance gi-medium"></span> +' + _epdoConfig.dominance + ' dominance';
effectsHtml += '</div>';
}
if (_epdoHumiliationApplied) {
effectsHtml += '<div class="effect-row">';
effectsHtml += '<span class="gi gi-shame gi-medium"></span> +' + _epdoConfig.humiliation + ' humiliation';
effectsHtml += '</div>';
}
$('#player-do-effects').html(effectsHtml);
} catch (e) { console.error(e); } })()>><</done>>
<<done>><<run (function () { try {
var victoryHtml = '';
if (_epdoVictory) {
victoryHtml = '<div class="seduce-victory">';
victoryHtml += '<span class="gi gi-heart gi-medium"></span> ';
victoryHtml += _epdoConfig.victoryText || 'SEDUCED!';
victoryHtml += '</div>';
}
$('#player-do-victory').html(victoryHtml);
var d = window._epdoCardData;
$('#player-do-target-lust').text(d.targetLust);
} catch (e) { console.error(e); } })()>><</done>>
<</capture>>
<</widget>>
<<widget "playerDickOutCardFlow">>
<<set _pdocfConfig to _args[0]>>
<div class="player-turn-container">
<!-- Render the card -->
<<playerDickOutCard _pdocfConfig>>
<!-- Execute and populate -->
<<executePlayerDickOutCard _pdocfConfig>>
</div>
<!-- Continue button -->
<div class="choice-container">
<<vchoice "Continue" "Combat_Companion_Turn" "move" "map">>
</div>
<</widget>>
<<widget "playerPinnedCard">>
<<set _ppiConfig to _args[0]>>
<<initCombatTarget>>
<<set _ppiTarget to _target>>
<div class="combat-card player-card player-attack-card pinned-attack-card">
<div class="card-header player-attack-header">
<<icon _ppiConfig.damageIcon "medium">>
<span class="player-card-name">PINNED</span>
<span class="attack-name"><<print (_ppiConfig.name || "Pinned Action").toUpperCase()>></span>
</div>
<div class="card-body">
<!-- Target Info Row -->
<div class="attack-info-row">
<span class="attack-target">
<<icon "target" "medium">> <<print _ppiTarget.name>><<if _ppiTarget.position and _ppiTarget.position neq "standing">> <span class="target-position-indicator">(<<print _ppiTarget.position>>)</span><</if>>
</span>
</div>
<div id="player-pinned-narrative" class="card-narrative explicit">
<!-- Narrative populated by executePlayerPinnedCard -->
</div>
<div id="player-pinned-video" class="card-video-container">
<!-- Video populated by executePlayerPinnedCard (if found) -->
</div>
<div id="player-pinned-damage" class="card-damage">
<!-- Damage display populated by executePlayerPinnedCard -->
</div>
<div id="player-pinned-secondary" class="card-secondary">
<!-- Secondary effect populated by executePlayerPinnedCard -->
</div>
<div id="player-pinned-threshold" class="card-threshold">
<!-- Lust threshold reaction populated by executePlayerPinnedCard -->
</div>
<div id="player-pinned-victory" class="card-victory">
<!-- Victory message populated by executePlayerPinnedCard -->
</div>
</div>
<div class="card-footer player-card-footer">
<div class="target-status-row">
<span class="target-hp">
<<icon "health" "medium">> <<print _ppiTarget.health>>/<<print _ppiTarget.maxHealth>>
</span>
<span class="target-lust">
<<icon "lust" "medium">>
<span id="player-pinned-target-lust"><<print _ppiTarget.lust || 0>>%</span>
</span>
</div>
</div>
</div>
<</widget>>
<<widget "executePlayerPinnedCard">>
<<set _eppiConfig to _args[0]>>
<<silently>>
<<initCombatTarget>>
<<set _eppiLustDmg to random(_eppiConfig.lustDamage.min, _eppiConfig.lustDamage.max)>>
<<if _eppiConfig.painDamage>>
<<set _eppiPainDmg to Math.floor(random(_eppiConfig.painDamage.min, _eppiConfig.painDamage.max) * setup.fighterDamageFactor("player"))>>
<<else>>
<<set _eppiPainDmg to 0>>
<</if>>
<<set _target.lust to setup.enemyLustPlus(_target, _eppiLustDmg)>>
<<set $combat.enemies[_targetIndex].lust to _target.lust>>
<<if setup.SEX_ACTS.includes(_eppiConfig.actionName)>>
<<run setup.markEnemySexUsed(_target)>>
<<run setup.markEnemySexUsed($combat.enemies[_targetIndex])>>
<</if>>
<<if _eppiPainDmg gt 0>>
<<set _target.health -= _eppiPainDmg>>
<<set $combat.enemies[_targetIndex].health to _target.health>>
<<applyEnemyDamageExpression _target>>
<</if>>
<<set $player.lust to Math.min(100, $player.lust + _eppiConfig.playerLust)>>
<<set _eppiActionVerb to (_eppiConfig.actionName || "pinned action").replace("_pinned", "").replace("_", " ")>>
<<if _eppiActionVerb === "abuse tits">>
<<set _eppiActionVerb to "abused tits of">>
<<elseif _eppiActionVerb === "finger">>
<<set _eppiActionVerb to "fingered">>
<<elseif _eppiActionVerb === "grind">>
<<set _eppiActionVerb to "grinded on">>
<<elseif _eppiActionVerb === "choke">>
<<set _eppiActionVerb to "choked">>
<<elseif _eppiActionVerb === "dick out">>
<<set _eppiActionVerb to "took dick out for">>
<<elseif _eppiActionVerb === "deepthroat">>
<<set _eppiActionVerb to "deepthroated">>
<<elseif _eppiActionVerb === "fuck">>
<<set _eppiActionVerb to "fucked">>
<</if>>
<<if _eppiPainDmg gt 0>>
<<set _eppiLog to "You " + _eppiActionVerb + " " + _target.name + " #" + (_targetIndex + 1) + " (pinned)! +" + _eppiLustDmg + " lust, " + _eppiPainDmg + " damage">>
<<else>>
<<set _eppiLog to "You " + _eppiActionVerb + " " + _target.name + " #" + (_targetIndex + 1) + " (pinned)! +" + _eppiLustDmg + " lust">>
<</if>>
<<logCombat _eppiLog "domination">>
<<if setup.combatNarrative && setup.combatNarrative[_eppiConfig.narrativePool]>>
<<set _eppiNarrative to setup.combatNarrative[_eppiConfig.narrativePool].random()>>
<<else>>
<<set _eppiNarrative to "You dominate her helpless form!">>
<</if>>
<<set _eppiSecondaryTriggered to false>>
<<set _eppiSecondaryText to "">>
<<if _eppiConfig.secondaryEffect && random(1, 100) lte _eppiConfig.secondaryEffect.chance>>
<<set _eppiSecondaryTriggered to true>>
<<set _eppiSecondaryText to _eppiConfig.secondaryEffect.text>>
<<set _target.lust to setup.enemyLustPlus(_target, _eppiConfig.secondaryEffect.lustBonus)>>
<<set $combat.enemies[_targetIndex].lust to _target.lust>>
<</if>>
<<set _eppiOrgasm to false>>
<<if _eppiConfig.orgasmEffect && _target.lust gte _eppiConfig.orgasmEffect.minLust && random(1, 100) lte _eppiConfig.orgasmEffect.chance>>
<<set _eppiOrgasm to true>>
<<set _eppiStun to setup.orgasmControlConfigs && setup.orgasmControlConfigs.allow_orgasm ? setup.orgasmControlConfigs.allow_orgasm.effects.stunTurns : 2>>
<<set _target.stunned to true>>
<<set _target.stunnedTurns to Math.max(_target.stunnedTurns || 0, _eppiStun)>>
<<set _target.orgasmCount to (_target.orgasmCount || 0) + 1>>
<<set _target.lust to Math.max(0, _target.lust - random(40, 60))>>
<<set $combat.enemies[_targetIndex].stunned to true>>
<<set $combat.enemies[_targetIndex].stunnedTurns to _target.stunnedTurns>>
<<set $combat.enemies[_targetIndex].orgasmCount to _target.orgasmCount>>
<<set $combat.enemies[_targetIndex].lust to _target.lust>>
<<set _eppiSecondaryTriggered to true>>
<<set _eppiSecondaryText to (_eppiSecondaryText ? _eppiSecondaryText + " " : "") + "She cums on your fingers, too dazed to fight for " + _eppiStun + " turns.">>
<</if>>
<<set _eppiThresholdText to "">>
<<set _eppiThresholdClass to "">>
<<if _eppiConfig.lustThresholds>>
<<for _eppiThreshold range _eppiConfig.lustThresholds>>
<<if _target.lust gte _eppiThreshold.threshold>>
<<set _eppiThresholdText to _eppiThreshold.text>>
<<set _eppiThresholdClass to _eppiThreshold.cssClass || "">>
<<break>>
<</if>>
<</for>>
<</if>>
<<if _eppiConfig.specialEffect>>
<<if _eppiConfig.specialEffect.type === "dickExposed">>
<<set $clothing.player.dickExposed to true>>
<</if>>
<</if>>
<<fillCombatVideoBox "player-pinned-video" _eppiConfig.videoFolder _target>>
<<if _eppiOrgasm>><<fillCombatVideoBox "player-pinned-video" "combat/enemy_forced_orgasm_female" _target>><</if>>
<<set _eppiVictory to false>>
<<if _target.lust gte _target.seduceThreshold>>
<<set _eppiVictory to true>>
<<set _target.defeated to true>>
<<set _target.beenUsed to true>>
<<set _target.defeatType to "seduced">>
<<set $combat.enemies[_targetIndex].defeated to true>>
<<set $combat.enemies[_targetIndex].beenUsed to true>>
<<set $combat.enemies[_targetIndex].defeatType to "seduced">>
<<set _target.sexUsed to _target.sexUsed === true>>
<<set $combat.enemies[_targetIndex].sexUsed to _target.sexUsed>>
<<run setup.countWomanUsed($combat.enemies[_targetIndex])>>
<</if>>
<</silently>>
<<run window._eppiCardData = {
narrative: _eppiNarrative || '',
lustDmg: _eppiLustDmg || 0,
painDmg: _eppiPainDmg || 0,
playerLust: _eppiConfig.playerLust || 0,
damageIcon: _eppiConfig.damageIcon || 'high-arousal',
secondaryTriggered: _eppiSecondaryTriggered,
secondaryText: _eppiSecondaryText || '',
thresholdText: _eppiThresholdText || '',
thresholdClass: _eppiThresholdClass || '',
victory: _eppiVictory,
targetLust: _target ? _target.lust : 0
}>>
<<done>><<run (function () { try {
var d = window._eppiCardData;
$('#player-pinned-narrative').html(d.narrative);
var damageHtml = '<span class="damage-icon">' + setup.getIconHtml(d.damageIcon, 'medium') + '</span> ';
damageHtml += '+' + d.lustDmg + ' enemy lust';
if (d.painDmg > 0) {
damageHtml += ' | -' + d.painDmg + ' health';
}
damageHtml += ' | You +' + d.playerLust + ' lust';
$('#player-pinned-damage').html(damageHtml);
if (d.secondaryTriggered) {
$('#player-pinned-secondary').html('<p class="secondary-effect">' + d.secondaryText + '</p>');
}
if (d.thresholdText) {
$('#player-pinned-threshold').html('<p class="enemy-reaction ' + d.thresholdClass + '">' + d.thresholdText + '</p>');
}
if (d.victory) {
$('#player-pinned-victory').html('<div class="victory-message explicit">She\'s completely overwhelmed! SEDUCED!</div>');
}
$('#player-pinned-target-lust').text(d.targetLust || 0);
} catch (e) { console.error(e); } })()>><</done>>
<</widget>>
<<widget "playerPinnedCardFlow">>
<<set _ppicfConfig to _args[0]>>
<div class="player-turn-container">
<!-- Render the card -->
<<playerPinnedCard _ppicfConfig>>
<!-- Execute and populate -->
<<executePlayerPinnedCard _ppicfConfig>>
</div>
<!-- Continue button -->
<div class="choice-container">
<<vchoice "Continue" "Combat_Companion_Turn" "move" "map">>
</div>
<</widget>><<widget "playerExposeDickCard">>
<div class="combat-card player-card player-expose-card">
<!-- HEADER -->
<div class="card-header player-card-header player-expose-header">
<<icon "pants" "medium">>
<span class="player-card-name">SELF EXPOSURE</span>
<span class="attack-name">PULL OUT DICK</span>
</div>
<!-- CARD BODY -->
<div class="card-body">
<!-- Player Narrative -->
<div id="player-expose-narrative" class="expose-narrative-container"></div>
<!-- Video Container -->
<div id="player-expose-video" class="card-video-container"></div>
<!-- Enemy Reactions -->
<div id="player-expose-reactions" class="expose-reactions-container"></div>
<!-- Kira Reaction (if applicable) -->
<div id="player-expose-kira" class="expose-kira-container"></div>
<!-- Effects Summary -->
<div id="player-expose-effects" class="expose-effects-container"></div>
</div>
<!-- FOOTER with exposure status -->
<div class="card-footer player-card-footer">
<div class="target-status-row">
<span class="exposure-status">
<<icon "hazard-sign" "medium">>
<span id="player-expose-status">EXPOSED</span>
</span>
<span class="target-lust">
<<icon "lust" "medium">>
<span id="player-lust-display"><<print $player.lust || 0>>%</span>
</span>
</div>
</div>
</div>
<</widget>>
<<widget "executePlayerExposeDickCard">>
<<silently>>
<<if !$clothing>><<set $clothing to {}>><</if>>
<<if !$clothing.player>><<set $clothing.player to {}>><</if>>
<<set $clothing.player.dickOut to true>>
<<set $clothing.player.dickExposed to true>>
<<set _exposeNarrative to "You reach down and pull your cock free, letting it hang heavy between your legs.">>
<<if setup.combatNarrative && setup.combatNarrative.player_pull_out>>
<<set _pool to setup.combatNarrative.player_pull_out>>
<<if Array.isArray(_pool) && _pool.length gt 0>>
<<set _exposeNarrative to _pool[random(0, _pool.length - 1)]>>
<<elseif typeof _pool === "string">>
<<set _exposeNarrative to _pool>>
<</if>>
<</if>>
<<set _enemyReactions to []>>
<<set _totalLustGained to 0>>
<<set _totalHumiliationGained to 0>>
<<for _i, _e range $combat.enemies>>
<<if _e.gender === "female" && _e.health gt 0>>
<<set _e.seenPlayerDick to true>>
<<set $combat.enemies[_i].seenPlayerDick to true>>
<<set _eLust to _e.lust || 0>>
<<set _reaction to {}>>
<<set _reaction.name to _e.name>>
<<if _eLust gte 50>>
<<set _reaction.type to "aroused">>
<<set _reaction.text to "Her eyes lock onto your cock. Her thighs press together involuntarily.">>
<<set _reaction.lustGain to 10>>
<<set _reaction.humiliationGain to 0>>
<<if setup.combatNarrative && setup.combatNarrative.enemy_sees_dick_aroused>>
<<set _pool to setup.combatNarrative.enemy_sees_dick_aroused>>
<<if Array.isArray(_pool) && _pool.length gt 0>>
<<set _reaction.text to _pool[random(0, _pool.length - 1)]>>
<</if>>
<</if>>
<<else>>
<<set _reaction.type to "intimidated">>
<<set _reaction.text to "Her eyes drop to your cock and widen. She swallows nervously.">>
<<set _reaction.lustGain to 5>>
<<set _reaction.humiliationGain to 5>>
<<if setup.combatNarrative && setup.combatNarrative.enemy_sees_dick_intimidated>>
<<set _pool to setup.combatNarrative.enemy_sees_dick_intimidated>>
<<if Array.isArray(_pool) && _pool.length gt 0>>
<<set _reaction.text to _pool[random(0, _pool.length - 1)]>>
<</if>>
<</if>>
<</if>>
<<set _e.lust to setup.enemyLustPlus(_e, _reaction.lustGain)>>
<<set $combat.enemies[_i].lust to _e.lust>>
<<set _reaction.newLust to _e.lust>>
<<if _reaction.humiliationGain gt 0>>
<<run setup.addEnemyHumiliation($combat.enemies[_i], _reaction.humiliationGain)>>
<<set _e.humiliation to $combat.enemies[_i].humiliation>>
<</if>>
<<set _totalLustGained += _reaction.lustGain>>
<<set _totalHumiliationGained += _reaction.humiliationGain>>
<<run _enemyReactions.push(_reaction)>>
<</if>>
<</for>>
<<set _kiraReaction to null>>
<<if $companions && $companions[0] && $combat.allies && $combat.allies.includes("kira")>>
<<set _kiraReaction to {}>>
<<set _kiraReaction.tensionGain to 8>>
<<set _kiraReaction.text to "Kira's cheeks flush as she catches sight of your exposed cock. She quickly looks away, but not before you notice her lingering gaze.">>
<<set $companions[0].tension to Math.min(100, ($companions[0].tension || 0) + 8)>>
<</if>>
<<if $combat.log>>
<<run $combat.log.push({
text: "You expose yourself! " + _enemyReactions.length + " enemies react.",
type: "intimidate"
})>>
<</if>>
<<playerMediaTarget>>
<<fillCombatVideoBox "player-expose-video" "combat/player_expose" _playerMediaTarget>>
<<run window._pedCardData = {
narrative: _exposeNarrative,
reactions: _enemyReactions,
kiraReaction: _kiraReaction,
totalLustGained: _totalLustGained,
totalHumiliationGained: _totalHumiliationGained,
playerLust: $player.lust || 0
}>>
<</silently>>
<<run setTimeout(function() {
var d = window._pedCardData;
$('#player-expose-narrative').html('<div class="expose-narrative-row"><p class="expose-hit-narrative">' + d.narrative + '</p></div>');
var reactionsHtml = '';
for (var i = 0; i < d.reactions.length; i++) {
var r = d.reactions[i];
var reactionClass = r.type === 'aroused' ? 'reaction-aroused' : 'reaction-intimidated';
reactionsHtml += '<div class="enemy-reaction-item ' + reactionClass + '">';
reactionsHtml += '<div class="reaction-header"><span class="enemy-name">' + r.name + '</span>';
reactionsHtml += '<span class="reaction-type ' + r.type + '">' + r.type.toUpperCase() + '</span></div>';
reactionsHtml += '<p class="reaction-text">' + r.text + '</p>';
reactionsHtml += '<div class="reaction-effects">';
reactionsHtml += '<span class="lust-effect"><span class="gi gi-lust gi-medium"></span> +' + r.lustGain + ' lust (' + r.newLust + '%)</span>';
if (r.humiliationGain > 0) {
reactionsHtml += '<span class="humiliation-effect"><span class="gi gi-submission gi-medium"></span> +' + r.humiliationGain + ' humiliation</span>';
}
reactionsHtml += '</div></div>';
}
$('#player-expose-reactions').html(reactionsHtml);
if (d.kiraReaction) {
var kiraHtml = '<div class="kira-reaction-item">';
kiraHtml += '<div class="reaction-header"><span class="ally-name">Kira</span>';
kiraHtml += '<span class="reaction-type flustered">FLUSTERED</span></div>';
kiraHtml += '<p class="reaction-text">' + d.kiraReaction.text + '</p>';
kiraHtml += '<div class="reaction-effects">';
kiraHtml += '<span class="tension-effect"><span class="gi gi-high-arousal gi-medium"></span> +' + d.kiraReaction.tensionGain + ' tension</span>';
kiraHtml += '</div></div>';
$('#player-expose-kira').html(kiraHtml);
}
if (d.totalLustGained > 0 || d.totalHumiliationGained > 0) {
var effectsHtml = '<div class="effects-summary">';
if (d.totalLustGained > 0) {
effectsHtml += '<span class="total-effect lust-total"><span class="gi gi-lust gi-medium"></span> Total: +' + d.totalLustGained + ' enemy lust</span>';
}
if (d.totalHumiliationGained > 0) {
effectsHtml += '<span class="total-effect humiliation-total"><span class="gi gi-submission gi-medium"></span> Total: +' + d.totalHumiliationGained + ' humiliation</span>';
}
effectsHtml += '</div>';
$('#player-expose-effects').html(effectsHtml);
}
}, 50)>>
<</widget>>
<<widget "playerExposeDickCardFlow">>
<div class="player-turn-container">
<!-- Render the card -->
<<playerExposeDickCard>>
<!-- Execute and populate -->
<<executePlayerExposeDickCard>>
</div>
<!-- Continue button -->
<div class="choice-container">
<<vchoice "Continue" "Combat_Companion_Turn" "move" "map">>
</div>
<</widget>>
<<widget "playerFlauntCard">>
<div class="combat-card player-card player-flaunt-card">
<!-- HEADER -->
<div class="card-header player-card-header player-flaunt-header">
<<icon "seduce" "medium">>
<span class="player-card-name">DISTRACTION</span>
<span class="attack-name">FLAUNT IT</span>
</div>
<!-- CARD BODY -->
<div class="card-body">
<!-- Player Narrative -->
<div id="player-flaunt-narrative" class="flaunt-narrative-container"></div>
<!-- Video Container -->
<div id="player-flaunt-video" class="card-video-container"></div>
<!-- Enemy Reactions -->
<div id="player-flaunt-reactions" class="flaunt-reactions-container"></div>
<!-- Effects Summary -->
<div id="player-flaunt-effects" class="flaunt-effects-container"></div>
</div>
<!-- FOOTER with status -->
<div class="card-footer player-card-footer">
<div class="target-status-row">
<span class="debuff-status">
<<icon "accuracy-down" "medium">>
<span id="player-flaunt-debuff">ENEMIES DISTRACTED</span>
</span>
<span class="target-lust">
<<icon "lust" "medium">>
<span id="player-flaunt-lust-total">+0 total lust</span>
</span>
</div>
</div>
</div>
<</widget>>
<<widget "executePlayerFlauntCard">>
<<silently>>
<<set _canFlaunt to ($clothing && $clothing.player && ($clothing.player.dickOut || $clothing.player.dickExposed))>>
<<if _canFlaunt>>
<<set _flauntNarrative to "You stroke your cock slowly, making them watch every inch.">>
<<if setup.combatNarrative && setup.combatNarrative.player_flaunt>>
<<set _pool to setup.combatNarrative.player_flaunt>>
<<if Array.isArray(_pool) && _pool.length gt 0>>
<<set _flauntNarrative to _pool[random(0, _pool.length - 1)]>>
<<elseif typeof _pool === "string">>
<<set _flauntNarrative to _pool>>
<</if>>
<</if>>
<<set _enemyReactions to []>>
<<set _totalLustGained to 0>>
<<set _enemiesDistracted to 0>>
<<for _i, _e range $combat.enemies>>
<<if _e.gender === "female" && _e.health gt 0>>
<<set _e.flauntedThisTurn to true>>
<<set _e.flauntDistracted to true>>
<<set $combat.enemies[_i].flauntedThisTurn to true>>
<<set $combat.enemies[_i].flauntDistracted to true>>
<<if _e.combatExpression !== "fearful" && _e.combatExpression !== "defiant">>
<<setEnemyExpression _e "seductive" 1>>
<</if>>
<<set _reaction to {}>>
<<set _reaction.name to _e.name>>
<<set _reaction.lustGain to 15>>
<<set _reaction.accuracyPenalty to 10>>
<<set _reaction.text to "She's completely distracted by your display, her guard dropping.">>
<<if setup.combatNarrative && setup.combatNarrative.enemy_flaunt_distracted>>
<<set _pool to setup.combatNarrative.enemy_flaunt_distracted>>
<<if Array.isArray(_pool) && _pool.length gt 0>>
<<set _reaction.text to _pool[random(0, _pool.length - 1)]>>
<</if>>
<</if>>
<<set _e.lust to setup.enemyLustPlus(_e, _reaction.lustGain)>>
<<set $combat.enemies[_i].lust to _e.lust>>
<<set _reaction.newLust to _e.lust>>
<<updateArousalState _i>>
<<set _totalLustGained += _reaction.lustGain>>
<<set _enemiesDistracted += 1>>
<<run _enemyReactions.push(_reaction)>>
<</if>>
<</for>>
<<if $combat.log>>
<<run $combat.log.push({
text: "You flaunt yourself! " + _enemiesDistracted + " enemies distracted.",
type: "intimidate"
})>>
<</if>>
<<playerMediaTarget>>
<<fillCombatVideoBox "player-flaunt-video" "combat/player_flaunt" _playerMediaTarget>>
<<run window._pfcCardData = {
narrative: _flauntNarrative,
reactions: _enemyReactions,
totalLustGained: _totalLustGained,
enemiesDistracted: _enemiesDistracted
}>>
<<else>>
<<fillCombatVideoBox "player-flaunt-video" null>>
<<run window._pfcCardData = {
narrative: "You need to expose yourself first!",
reactions: [],
totalLustGained: 0,
enemiesDistracted: 0
}>>
<</if>>
<</silently>>
<<run setTimeout(function() {
var d = window._pfcCardData;
$('#player-flaunt-narrative').html('<div class="flaunt-narrative-row"><p class="flaunt-hit-narrative">' + d.narrative + '</p></div>');
var reactionsHtml = '';
for (var i = 0; i < d.reactions.length; i++) {
var r = d.reactions[i];
reactionsHtml += '<div class="enemy-reaction-item reaction-distracted">';
reactionsHtml += '<div class="reaction-header"><span class="enemy-name">' + r.name + '</span>';
reactionsHtml += '<span class="reaction-type distracted">DISTRACTED</span></div>';
reactionsHtml += '<p class="reaction-text">' + r.text + '</p>';
reactionsHtml += '<div class="reaction-effects">';
reactionsHtml += '<span class="lust-effect"><span class="gi gi-lust gi-medium"></span> +' + r.lustGain + ' lust (' + r.newLust + '%)</span>';
reactionsHtml += '<span class="accuracy-effect"><span class="gi gi-accuracy-down gi-medium"></span> -' + r.accuracyPenalty + '% accuracy</span>';
reactionsHtml += '</div></div>';
}
$('#player-flaunt-reactions').html(reactionsHtml);
if (d.enemiesDistracted > 0) {
var effectsHtml = '<div class="effects-summary">';
effectsHtml += '<span class="total-effect lust-total"><span class="gi gi-lust gi-medium"></span> Total: +' + d.totalLustGained + ' enemy lust</span>';
effectsHtml += '<span class="total-effect debuff-total"><span class="gi gi-accuracy-down gi-medium"></span> ' + d.enemiesDistracted + ' enemies at -10% accuracy</span>';
effectsHtml += '</div>';
$('#player-flaunt-effects').html(effectsHtml);
}
$('#player-flaunt-lust-total').text('+' + d.totalLustGained + ' total lust');
}, 50)>>
<</widget>>
<<widget "playerFlauntCardFlow">>
<div class="player-turn-container">
<!-- Render the card -->
<<playerFlauntCard>>
<!-- Execute and populate -->
<<executePlayerFlauntCard>>
</div>
<!-- Continue button -->
<div class="choice-container">
<<vchoice "Continue" "Combat_Companion_Turn" "move" "map">>
</div>
<</widget>>
/* -----------------------------------------------------------------------------
playerStrategicStripBottomCard - Renders the strip bottom card with placeholders
/* -----------------------------------------------------------------------------
executePlayerStrategicStripBottomCard - Execute strip bottom and populate placeholders
/* -----------------------------------------------------------------------------
playerStrategicStripBottomCardFlow - Complete flow for strip bottom action<<widget "playerRestCard">>
<div class="combat-card player-card player-rest-card">
<!-- HEADER -->
<div class="card-header player-card-header player-defense-header">
<<icon "rest" "medium">>
<span class="player-card-name">RECOVERY</span>
<span class="attack-name">REST</span>
</div>
<!-- CARD BODY -->
<div class="card-body">
<!-- Narrative -->
<div id="player-rest-narrative" class="attack-narrative-container"></div>
<div id="player-rest-video" class="card-video-container" style="display:none"></div>
<!-- Energy Recovery Display -->
<div id="player-rest-effects" class="attack-effects-container"></div>
<!-- Warning -->
<div id="player-rest-warning" class="defense-warning-container"></div>
</div>
<!-- FOOTER with player energy -->
<div class="card-footer player-card-footer">
<div class="player-status-row">
<span class="player-energy">
<<icon "energy" "medium">>
<span id="player-rest-energy-display"><<print $player.energy>>/<<print $player.maxEnergy || 100>></span>
</span>
</div>
</div>
</div>
<</widget>>
<<widget "executePlayerRestCard">>
<<silently>>
<<set _playerPos to ($combat.positions && $combat.positions.player) || "standing">>
<<set _blockedPositions to []>>
<<set _canRest to true>>
<<if _blockedPositions.includes(_playerPos)>>
<<set _canRest to false>>
<<set _errorMsg to "Cannot rest from this position!">>
<</if>>
<<if _canRest>>
<<set _energyRecovered to random(12, 15)>>
<<set _oldEnergy to $player.energy>>
<<set $player.energy to Math.min($player.maxEnergy || 100, $player.energy + _energyRecovered)>>
<<set _newEnergy to $player.energy>>
<<set $combat.energyRecovered to _energyRecovered>>
<<set $combat.resting to true>>
<<set $combat.playerVulnerable to true>>
<<set _restNarrative to "You take a moment to catch your breath and steady yourself.">>
<<if setup.combatNarrative && setup.combatNarrative.rest_action>>
<<set _pool to setup.combatNarrative.rest_action>>
<<if Array.isArray(_pool) && _pool.length gt 0>>
<<set _restNarrative to _pool[random(0, _pool.length - 1)]>>
<</if>>
<</if>>
<<if $combat.log>>
<<run $combat.log.push({
text: "You catch your breath, recovering " + _energyRecovered + " energy.",
type: "recovery"
})>>
<</if>>
<<run window._pRestCardData = {
canRest: true,
narrative: _restNarrative,
energyRecovered: _energyRecovered,
newEnergy: _newEnergy,
maxEnergy: $player.maxEnergy || 100
}>>
<<else>>
<<run window._pRestCardData = {
canRest: false,
errorMsg: _errorMsg
}>>
<</if>>
<<playerMediaTarget>>
<<fillCombatVideoBox "player-rest-video" "combat/player_rest" _playerMediaTarget>>
<</silently>>
<<run setTimeout(function() {
var d = window._pRestCardData;
if (!d.canRest) {
$('#player-rest-narrative').html('<div class="combat-error">' + d.errorMsg + '</div>');
return;
}
$('#player-rest-narrative').html('<div class="rest-narrative-row"><p class="rest-narrative">' + d.narrative + '</p></div>');
var effectsHtml = '<div class="rest-effects-row">';
effectsHtml += '<div class="energy-recovered">';
effectsHtml += '<span class="gi gi-energy gi-medium"></span> +' + d.energyRecovered + ' Energy';
effectsHtml += '</div>';
effectsHtml += '</div>';
$('#player-rest-effects').html(effectsHtml);
var warningHtml = '<div class="defense-info rest-warning">';
warningHtml += '<span class="gi gi-danger gi-medium"></span> ';
warningHtml += 'VULNERABLE: Enemies have +30 hit chance this turn (resting +20, off-balance +10)!';
warningHtml += '</div>';
$('#player-rest-warning').html(warningHtml);
$('#player-rest-energy-display').text(d.newEnergy + '/' + d.maxEnergy);
}, 50)>>
<</widget>>
<<widget "playerRestCardFlow">>
<<silently>><<include "DefensiveActionNarratives">><</silently>>
<div class="player-turn-container">
<!-- Render the card -->
<<playerRestCard>>
<!-- Execute and populate -->
<<executePlayerRestCard>>
</div>
<!-- Continue button -->
<div class="choice-container">
<<vchoice "Continue" "Combat_Companion_Turn" "move" "map">>
</div>
<</widget>>
<<widget "playerForceBegCard">>
<<set _pfbTarget to $combat.enemies[$combat.currentTarget]>>
<div class="combat-card player-card player-domination-card player-force-beg-card">
<!-- HEADER -->
<div class="card-header player-card-header player-domination-header">
<<icon "broken-heart" "medium">>
<span class="player-card-name">DOMINATION</span>
<span class="attack-name">FORCE BEG</span>
</div>
<!-- CARD BODY -->
<div class="card-body">
<!-- Target Info Row -->
<div class="attack-info-row">
<span class="attack-target">
<<icon "target" "medium">> <<print _pfbTarget.name>><<if _pfbTarget.position and _pfbTarget.position neq "standing">> <span class="target-position-indicator">(<<print _pfbTarget.position>>)</span><</if>>
</span>
</div>
<!-- Narrative -->
<div id="player-force-beg-narrative" class="attack-narrative-container"></div>
<!-- Video Container -->
<div id="player-force-beg-video" class="card-video-container"></div>
<!-- Effects -->
<div id="player-force-beg-effects" class="attack-effects-container"></div>
</div>
<!-- FOOTER with target info -->
<div class="card-footer player-card-footer">
<div class="target-status-row">
<span class="target-humiliation">
<<icon "flushed" "medium">>
<span id="player-force-beg-humil"><<print _pfbTarget.humiliation || 0>>%</span>
</span>
<span class="target-resistance">
<<icon "shield" "medium">>
<span id="player-force-beg-resist"><<print _pfbTarget.resistance || 100>></span>
</span>
</div>
</div>
</div>
<</widget>>
<<widget "executePlayerForceBegCard">>
<<silently>>
<<set _config to setup.dominationConfigs.force_beg>>
<<set _fbIdx to $combat.currentTarget || 0>>
<<set _enemy to $combat.enemies[_fbIdx]>>
<<if _enemy>>
<<initResistance _fbIdx>>
<<set _genderSuffix to setup.genderSuffix(_enemy.gender, "bare")>>
<<set _begNarrative to _config.fallbackText[_genderSuffix]>>
<<set _poolKey to _config.narrativePools[_genderSuffix]>>
<<if setup.combatNarrative && setup.combatNarrative[_poolKey]>>
<<set _pool to setup.combatNarrative[_poolKey]>>
<<if Array.isArray(_pool) && _pool.length gt 0>>
<<set _begNarrative to _pool[random(0, _pool.length - 1)]>>
<<elseif typeof _pool === "string">>
<<set _begNarrative to _pool>>
<</if>>
<</if>>
<<set _humGain to _config.effects.humiliation>>
<<set _resistChange to _config.effects.resistance>>
<<addHumiliation _fbIdx _humGain "forced_beg">>
<<addResistance _fbIdx _resistChange>>
<<set _newHumil to $combat.enemies[_fbIdx].humiliation || 0>>
<<set _newResist to $combat.enemies[_fbIdx].resistance || 0>>
<<if _config.effects.setHasBegged>>
<<set _enemy.hasBegged to true>>
<<set $combat.enemies[_fbIdx].hasBegged to true>>
<</if>>
<<fillCombatVideoBox "player-force-beg-video" `_config.videoFolders ? _config.videoFolders[_genderSuffix] : null` _enemy>>
<<if $combat.log>>
<<run $combat.log.push({
text: _enemy.name + " " + _config.logText,
type: _config.logType
})>>
<</if>>
<<run window._pForceBegCardData = {
narrative: _begNarrative,
humGain: _humGain,
resistChange: _resistChange,
newHumil: _newHumil,
newResist: _newResist,
enemyName: _enemy.name
}>>
<<else>>
<<run window._pForceBegCardData = {
narrative: "No valid target.",
humGain: 0,
resistChange: 0,
newHumil: 0,
newResist: 0,
enemyName: "Unknown"
}>>
<</if>>
<</silently>>
<<run setTimeout(function() {
var d = window._pForceBegCardData;
$('#player-force-beg-narrative').html('<div class="domination-narrative-row"><p class="beg-narrative">' + d.narrative + '</p></div>');
var effectsHtml = '<div class="domination-effects-row">';
effectsHtml += '<div class="humiliation-gain">';
effectsHtml += '<span class="gi gi-broken-heart gi-medium"></span> +' + d.humGain + ' Humiliation';
effectsHtml += '</div>';
effectsHtml += '<div class="resistance-loss">';
effectsHtml += '<span class="gi gi-broken-shield gi-medium"></span> ' + d.resistChange + ' Resistance';
effectsHtml += '</div>';
effectsHtml += '</div>';
$('#player-force-beg-effects').html(effectsHtml);
$('#player-force-beg-humil').text(d.newHumil + '%');
$('#player-force-beg-resist').text(d.newResist);
}, 50)>>
<</widget>>
<<widget "playerForceBegCardFlow">>
<<silently>><<include "DominationNarratives">><</silently>>
<<initCombatTarget>>
<div class="player-turn-container">
<!-- Render the card -->
<<playerForceBegCard>>
<!-- Execute and populate -->
<<executePlayerForceBegCard>>
</div>
<!-- Continue button -->
<div class="choice-container">
<<vchoice "Continue" "Combat_Companion_Turn" "move" "map">>
</div>
<</widget>><<widget "playerPainPleasureCard">>
<<set _pppConfig to _args[0]>>
<<initCombatTarget>>
<<set _pppTarget to _target>>
<div class="combat-card player-card player-attack-card pain-pleasure-card">
<!-- HEADER -->
<div class="card-header player-attack-header">
<<if _pppConfig.icon>>
<<icon _pppConfig.icon "medium">>
<<else>>
<<icon "slap" "medium">>
<</if>>
<span class="player-card-name">PAIN & PLEASURE</span>
<span class="attack-name"><<print _pppConfig.name.toUpperCase()>></span>
</div>
<!-- BODY -->
<div class="card-body">
<!-- Target Info Row -->
<div class="attack-info-row">
<span class="attack-target">
<<icon "target" "medium">> <<print _pppTarget.name>><<if _pppTarget.position and _pppTarget.position neq "standing">> <span class="target-position-indicator">(<<print _pppTarget.position>>)</span><</if>>
</span>
</div>
<!-- Requirements Check -->
<div id="player-pp-requirements" class="requirements-container"></div>
<!-- Narrative -->
<div id="player-pp-narrative" class="narrative-container"></div>
<!-- Video Container (populated if video found) -->
<div id="player-pp-video" class="card-video-container"></div>
<!-- Damage Display -->
<div id="player-pp-damage" class="damage-container"></div>
<!-- Exposure Bonus -->
<div id="player-pp-exposure" class="exposure-container"></div>
<!-- Effects -->
<div id="player-pp-effects" class="effects-container"></div>
</div>
<!-- FOOTER -->
<div class="card-footer player-card-footer">
<div class="target-status-row">
<span class="target-hp">
<<icon "health" "medium">> <<print _pppTarget.health>>/<<print _pppTarget.maxHealth>>
</span>
<span class="target-lust">
<<icon "high-arousal" "medium">>
<span id="player-pp-target-lust"><<print _pppTarget.lust || 0>></span>%
</span>
</div>
</div>
</div>
<</widget>>
<<widget "executePlayerPainPleasureCard">>
<<set _epppConfig to _args[0]>>
<<silently>>
<<initCombatTarget>>
<<set _epppGenderOk to (_target && _target.gender === "female")>>
<<set _epppReqMet to true>>
<<set _epppBlockReason to "">>
<<if _epppConfig.requirements>>
<<if _epppConfig.requirements.playerDickOut && (!$clothing.player || (!$clothing.player.dickOut && !$clothing.player.dickExposed))>>
<<set _epppReqMet to false>>
<<set _epppBlockReason to "Your dick must be out!">>
<</if>>
<<if _epppConfig.requirements.enemyPussyExposed && (!_target.clothing || !_target.clothing.pussyExposed)>>
<<set _epppReqMet to false>>
<<set _epppBlockReason to "Her pussy must be exposed!">>
<</if>>
<</if>>
<<set _epppCanAttack to (_epppGenderOk && _epppReqMet)>>
<<if _epppCanAttack>>
<<initPainPleasure _targetIndex>>
<<set _epppPainDmg to random(_epppConfig.painDamage.min, _epppConfig.painDamage.max)>>
<<set _epppLustDmg to random(_epppConfig.lustDamage.min, _epppConfig.lustDamage.max)>>
<<set _epppExposureApplied to false>>
<<set _epppExposureBonus to 0>>
<<if _epppConfig.clothingCheck && _epppConfig.exposedBonus>>
<<if _epppConfig.clothingCheck === "titsExposed" && _target.clothing && _target.clothing.titsExposed>>
<<set _epppExposureApplied to true>>
<<set _epppExposureBonus to _epppConfig.exposedBonus.lustBonus>>
<<set _epppLustDmg += _epppExposureBonus>>
<<elseif _epppConfig.clothingCheck === "pussyExposed" && _target.clothing && _target.clothing.pussyExposed>>
<<set _epppExposureApplied to true>>
<<set _epppExposureBonus to _epppConfig.exposedBonus.lustBonus>>
<<set _epppLustDmg += _epppExposureBonus>>
<</if>>
<</if>>
<<buildCombo _epppConfig.comboType _targetIndex>>
<<set _epppPainDmg to Math.floor(_epppPainDmg * setup.fighterDamageFactor("player"))>>
<<applyMixedDamage _targetIndex _epppPainDmg _epppLustDmg _epppConfig.actionType>>
<<set _epppActionVerb to (_epppConfig.actionName || "pain pleasure").replace("_", " ")>>
<<if _epppActionVerb === "hair pull grind">>
<<set _epppActionVerb to "hair pulled and grinded on">>
<<elseif _epppActionVerb === "slap grope tits">>
<<set _epppActionVerb to "slapped and groped tits of">>
<<elseif _epppActionVerb === "slap grope ass">>
<<set _epppActionVerb to "slapped and groped ass of">>
<<elseif _epppActionVerb === "bite lick neck">>
<<set _epppActionVerb to "bit and licked neck of">>
<<elseif _epppActionVerb === "choke fuck">>
<<set _epppActionVerb to "choked and fucked">>
<</if>>
<<set _epppLog to "You " + _epppActionVerb + " " + _target.name + " #" + (_targetIndex + 1) + "! " + _epppPainDmg + " damage, +" + _epppLustDmg + " lust">>
<<logCombat _epppLog "mixed">>
<<set _epppHumiliationApplied to false>>
<<if _epppConfig.humiliation gt 0>>
<<addHumiliation _targetIndex _epppConfig.humiliation _epppConfig.actionName>>
<<set _epppHumiliationApplied to true>>
<</if>>
<<set _epppWeltApplied to false>>
<<set _epppMasochismGain to 0>>
<<set _epppResistanceChange to 0>>
<<if _epppConfig.specialEffects>>
<<for _epppEffect range _epppConfig.specialEffects>>
<<if typeof _epppEffect === "string">>
<<if _epppEffect === "humiliationWelt">>
<<humiliationWelt _targetIndex>>
<<set _epppWeltApplied to true>>
<</if>>
<<else>>
<<if _epppEffect.widget === "increaseMasochism">>
<<increaseMasochism _targetIndex _epppEffect.args[0]>>
<<set _epppMasochismGain to _epppEffect.args[0]>>
<<elseif _epppEffect.widget === "addResistance">>
<<addResistance _targetIndex _epppEffect.args[0]>>
<<set _epppResistanceChange to _epppEffect.args[0]>>
<</if>>
<</if>>
<</for>>
<</if>>
<<fillCombatVideoBox "player-pp-video" _epppConfig.videoFolder _target>>
<</if>>
<</silently>>
<<run window._epppCardData = {
targetLust: _target ? _target.lust : 0,
targetHealth: _target ? _target.health : 0,
targetMaxHealth: _target ? _target.maxHealth : 0,
canAttack: _epppCanAttack
}>>
<<capture _epppGenderOk, _epppReqMet, _epppBlockReason, _epppConfig, _epppCanAttack, _epppPainDmg, _epppLustDmg, _epppExposureApplied, _epppExposureBonus, _epppHumiliationApplied, _epppWeltApplied, _epppMasochismGain, _epppResistanceChange>>
<<done>><<run (function () { try {
var reqHtml = '';
if (!_epppGenderOk) {
reqHtml = '<div class="action-blocked">';
reqHtml += '<span class="gi gi-blocked gi-medium"></span> ';
reqHtml += 'This action only works on female enemies.';
reqHtml += '</div>';
} else if (!_epppReqMet) {
reqHtml = '<div class="action-blocked">';
reqHtml += '<span class="gi gi-blocked gi-medium"></span> ';
reqHtml += _epppBlockReason || _epppConfig.blockedMessage || 'Requirements not met.';
reqHtml += '</div>';
}
$('#player-pp-requirements').html(reqHtml);
} catch (e) { console.error(e); } })()>><</done>>
<<done>><<run (function () { try {
var narrativeHtml = '';
if (_epppCanAttack) {
var pool = setup.combatNarrative[_epppConfig.narrativePool];
narrativeHtml = '<p class="attack-narrative explicit">';
narrativeHtml += pool?.random() || _epppConfig.fallbackNarrative || 'You attack with pain and pleasure!';
narrativeHtml += '</p>';
}
$('#player-pp-narrative').html(narrativeHtml);
} catch (e) { console.error(e); } })()>><</done>>
<<done>><<run (function () { try {
var damageHtml = '';
if (_epppCanAttack) {
damageHtml = '<div class="mixed-damage-display">';
damageHtml += '<div class="damage-row">';
damageHtml += '<span class="damage-icon"><span class="gi gi-attack gi-medium"></span></span>';
damageHtml += '<span class="damage-value">' + _epppPainDmg + '</span>';
damageHtml += '<span class="damage-label"> damage</span>';
damageHtml += '</div>';
damageHtml += '<div class="damage-row lust">';
damageHtml += '<span class="damage-icon"><span class="gi gi-high-arousal gi-medium"></span></span>';
damageHtml += '<span class="damage-value">+' + _epppLustDmg + '</span>';
damageHtml += '<span class="damage-label"> enemy lust</span>';
damageHtml += '</div>';
damageHtml += '</div>';
}
$('#player-pp-damage').html(damageHtml);
} catch (e) { console.error(e); } })()>><</done>>
<<done>><<run (function () { try {
var exposureHtml = '';
if (_epppCanAttack && _epppExposureApplied) {
var bodyPart = _epppConfig.clothingCheck === 'titsExposed' ? 'tits' : 'pussy';
exposureHtml = '<div class="exposure-bonus">';
exposureHtml += '<span class="gi gi-' + (bodyPart === 'tits' ? 'breasts' : 'lust') + ' gi-medium"></span> ';
exposureHtml += 'Exposed ' + bodyPart + ' bonus: +' + _epppExposureBonus + ' lust';
exposureHtml += '</div>';
}
$('#player-pp-exposure').html(exposureHtml);
} catch (e) { console.error(e); } })()>><</done>>
<<done>><<run (function () { try {
var effectsHtml = '';
if (_epppCanAttack) {
if (_epppHumiliationApplied) {
effectsHtml += '<div class="effect-row">';
effectsHtml += '<span class="gi gi-shame gi-medium"></span> +' + _epppConfig.humiliation + ' humiliation';
effectsHtml += '</div>';
}
if (_epppWeltApplied) {
effectsHtml += '<div class="effect-row welt">';
effectsHtml += '<span class="gi gi-slap gi-medium"></span> Red welt left on skin!';
effectsHtml += '</div>';
}
if (_epppMasochismGain > 0) {
effectsHtml += '<div class="effect-row masochism">';
effectsHtml += '<span class="gi gi-pain gi-medium"></span> +' + _epppMasochismGain + ' masochism awakened';
effectsHtml += '</div>';
}
if (_epppResistanceChange !== 0) {
effectsHtml += '<div class="effect-row resistance">';
effectsHtml += '<span class="gi gi-will gi-medium"></span> ' + _epppResistanceChange + ' resistance';
effectsHtml += '</div>';
}
if ($combat.combo && $combat.combo.count > 1) {
effectsHtml += '<div class="effect-row combo">';
effectsHtml += '<span class="gi gi-combo gi-medium"></span> Combo x' + $combat.combo.count + '!';
effectsHtml += '</div>';
}
}
$('#player-pp-effects').html(effectsHtml);
var d = window._epppCardData;
if (d.canAttack) {
$('#player-pp-target-lust').text(d.targetLust);
}
} catch (e) { console.error(e); } })()>><</done>>
<</capture>>
<</widget>>
<<widget "playerPainPleasureCardFlow">>
<<set _pppcfConfig to _args[0]>>
<div class="player-turn-container">
<!-- Render the card -->
<<playerPainPleasureCard _pppcfConfig>>
<!-- Execute and populate -->
<<executePlayerPainPleasureCard _pppcfConfig>>
</div>
<!-- Continue button -->
<div class="choice-container">
<<vchoice "Continue" "Combat_Companion_Turn" "move" "map">>
</div>
<</widget>><<widget "playerBreakWillCard">>
<<set _pbwTarget to $combat.enemies[$combat.currentTarget]>>
<div class="combat-card player-card player-domination-card player-break-will-card">
<!-- HEADER -->
<div class="card-header player-card-header player-domination-header">
<<icon "intimidation" "medium">>
<span class="player-card-name">DOMINATION</span>
<span class="attack-name">BREAK WILL</span>
</div>
<!-- CARD BODY -->
<div class="card-body">
<!-- Attack Info Row -->
<div class="attack-info-row">
<span class="attack-target">
<<icon "target" "medium">> <<print _pbwTarget.name>><<if _pbwTarget.position and _pbwTarget.position neq "standing">> <span class="target-position-indicator">(<<print _pbwTarget.position>>)</span><</if>>
</span>
</div>
<!-- Narrative -->
<div id="player-break-will-narrative" class="domination-narrative-container"></div>
<!-- Video Container -->
<div id="player-break-will-video" class="card-video-container" style="display:none"></div>
<!-- Resistance Damage -->
<div id="player-break-will-result" class="domination-result-container"></div>
<!-- Secondary Effects -->
<div id="player-break-will-effects" class="domination-effects-container"></div>
</div>
<!-- FOOTER with target status -->
<div class="card-footer player-card-footer">
<div class="target-status-row">
<span class="target-resistance">
<<icon "shield" "medium">>
<span id="player-break-will-resist"><<print _pbwTarget.resistance || 100>></span> resist
</span>
<span class="target-lust">
<<icon "lust" "medium">>
<span id="player-break-will-lust"><<print _pbwTarget.lust || 0>>%</span>
</span>
</div>
</div>
</div>
<</widget>>
<<widget "executePlayerBreakWillCard">>
<<silently>>
<<set _config to setup.dominationConfigs.break_will>>
<<set _abwIdx to $combat.currentTarget || 0>>
<<set _enemy to $combat.enemies[_abwIdx]>>
<<if _enemy>>
<<initResistance _abwIdx>>
<<set _genderSuffix to setup.genderSuffix(_enemy.gender, "bare")>>
<<set _resDmg to _config.baseResistanceDamage>>
<<set _bonusBreakdown to []>>
<<set _exposureBonus to 0>>
<<if _enemy.clothing && _enemy.clothing.titsExposed && _enemy.clothing.pussyExposed>>
<<set _exposureBonus to _config.exposureBonus.both>>
<<run _bonusBreakdown.push({type: "exposure", value: _exposureBonus, text: "Fully Exposed"})>>
<<elseif _enemy.clothing && (_enemy.clothing.titsExposed || _enemy.clothing.pussyExposed)>>
<<set _exposureBonus to _config.exposureBonus.either>>
<<run _bonusBreakdown.push({type: "exposure", value: _exposureBonus, text: "Partially Exposed"})>>
<</if>>
<<set _resDmg += _exposureBonus>>
<<set _posBonus to 0>>
<<if _enemy.position>>
<<set _posBonus to _config.positionBonus[_enemy.position] || _config.positionBonus.standing>>
<<if _posBonus gt 0>>
<<run _bonusBreakdown.push({type: "position", value: _posBonus, text: _enemy.position})>>
<</if>>
<</if>>
<<set _resDmg += _posBonus>>
<<set _lustBonusVal to 0>>
<<if _enemy.lust && _enemy.lust >= _config.lustBonus.threshold>>
<<set _lustBonusVal to Math.floor(_enemy.lust / 20) * _config.lustBonus.perTwentyLust>>
<<if _lustBonusVal gt 0>>
<<run _bonusBreakdown.push({type: "lust", value: _lustBonusVal, text: "High Lust"})>>
<</if>>
<</if>>
<<set _resDmg += _lustBonusVal>>
<<set _domNarrative to _config.fallbackText[_genderSuffix]>>
<<set _poolKey to _config.narrativePools[_genderSuffix]>>
<<if setup.combatNarrative && setup.combatNarrative[_poolKey]>>
<<set _pool to setup.combatNarrative[_poolKey]>>
<<if Array.isArray(_pool) && _pool.length gt 0>>
<<set _domNarrative to _pool[random(0, _pool.length - 1)]>>
<<elseif typeof _pool === "string">>
<<set _domNarrative to _pool>>
<</if>>
<</if>>
<<set _oldResist to _enemy.resistance>>
<<addResistance _abwIdx `-_resDmg`>>
<<set _newResist to $combat.enemies[_abwIdx].resistance>>
<<set _lustGain to _config.effects.enemyLust>>
<<set _humilGain to _config.effects.addHumiliation>>
<<if _enemy.lust !== undefined>>
<<set _enemy.lust to setup.enemyLustPlus(_enemy, _lustGain)>>
<<set $combat.enemies[_abwIdx].lust to _enemy.lust>>
<<updateArousalState _abwIdx>>
<</if>>
<<addHumiliation _abwIdx _humilGain "break_will">>
<<set _newLust to $combat.enemies[_abwIdx].lust || 0>>
<<set _enemy.resistanceBreaks to (_enemy.resistanceBreaks || 0) + 1>>
<<set $combat.enemies[_abwIdx].resistanceBreaks to _enemy.resistanceBreaks>>
<<if $combat.log>>
<<run $combat.log.push({
text: "Breaking " + _enemy.name + "'s will! -" + _resDmg + " resistance",
type: "domination"
})>>
<</if>>
<<fillCombatVideoBox "player-break-will-video" _config.videoFolders[_genderSuffix] _enemy>>
<<run window._pbwCardData = {
narrative: _domNarrative,
resDmg: _resDmg,
baseDmg: _config.baseResistanceDamage,
bonuses: _bonusBreakdown,
oldResist: _oldResist,
newResist: _newResist,
lustGain: _lustGain,
humilGain: _humilGain,
newLust: _newLust,
enemyName: _enemy.name
}>>
<<else>>
<<fillCombatVideoBox "player-break-will-video" null>>
<<run window._pbwCardData = {
narrative: "Target is not valid for this attack.",
resDmg: 0,
baseDmg: 0,
bonuses: [],
oldResist: 0,
newResist: 0,
lustGain: 0,
humilGain: 0,
newLust: 0,
enemyName: "Unknown"
}>>
<</if>>
<</silently>>
<<run setTimeout(function() {
var d = window._pbwCardData;
$('#player-break-will-narrative').html('<div class="domination-narrative-row"><p class="domination-hit-narrative">' + d.narrative + '</p></div>');
var resultHtml = '<div class="resistance-damage-row">';
resultHtml += '<div class="resistance-main"><span class="gi gi-broken-shield gi-medium"></span> -' + d.resDmg + ' Resistance</div>';
if (d.bonuses.length > 0) {
resultHtml += '<div class="damage-breakdown">';
resultHtml += '<span class="breakdown-base">' + d.baseDmg + ' base</span>';
for (var i = 0; i < d.bonuses.length; i++) {
var b = d.bonuses[i];
resultHtml += '<span class="breakdown-bonus">+' + b.value + ' (' + b.text + ')</span>';
}
resultHtml += '</div>';
}
resultHtml += '</div>';
$('#player-break-will-result').html(resultHtml);
var effectsHtml = '<div class="secondary-effects-row">';
effectsHtml += '<span class="effect-item lust-effect"><span class="gi gi-lust gi-medium"></span> +' + d.lustGain + ' lust</span>';
effectsHtml += '<span class="effect-item humil-effect"><span class="gi gi-flushed gi-medium"></span> +' + d.humilGain + ' humiliation</span>';
effectsHtml += '</div>';
$('#player-break-will-effects').html(effectsHtml);
$('#player-break-will-resist').text(d.newResist);
$('#player-break-will-lust').text(d.newLust + '%');
}, 50)>>
<</widget>>
<<widget "playerBreakWillCardFlow">>
<<silently>><<include "DominationNarratives">><</silently>>
<<initCombatTarget>>
<div class="player-turn-container">
<!-- Render the card -->
<<playerBreakWillCard>>
<!-- Execute and populate -->
<<executePlayerBreakWillCard>>
</div>
<!-- Continue button -->
<div class="choice-container">
<<vchoice "Continue" "Combat_Companion_Turn" "move" "map">>
</div>
<</widget>>
<<widget "playerIntimidateCard">>
<<set _target to $combat.enemies[$combat.currentTarget] || $combat.enemies[0]>>
<<set _config to setup.dominationConfigs.intimidate>>
<div class="combat-card player-card player-intimidate-card">
<div class="card-header player-card-header player-intimidate-header">
<<icon "afraid" "medium">>
<span class="player-card-name">DOMINATION</span>
<span class="attack-name">INTIMIDATE</span>
</div>
<div class="card-body">
<!-- Target info -->
<div class="card-target-info">
<span class="target-name"><<print _target.name>></span>
<span class="target-position"><<print _target.position || "standing">></span>
</div>
<!-- Narrative placeholder -->
<div id="player-intimidate-narrative" class="intimidate-narrative-container">
<em>Intimidating...</em>
</div>
<!-- Video (filled on success via fillCombatVideoBox) -->
<div id="player-intimidate-video" class="card-video-container" style="display:none"></div>
<!-- Success/Failure result placeholder -->
<div id="player-intimidate-result" class="intimidate-result-container"></div>
<!-- Status effect placeholder -->
<div id="player-intimidate-status" class="intimidate-status-container"></div>
</div>
<div class="card-footer player-card-footer">
<span class="target-hp"><<icon "health" "medium">> <<print _target.health>></span>
<span class="target-status" id="player-intimidate-target-status"><<icon "skull" "medium">> Normal</span>
<span class="attack-cost"><<icon "energy" "medium">> -<<print _config.energyCost>></span>
</div>
</div>
<</widget>>
<<widget "executePlayerIntimidateCard">>
<<silently>>
<<set _target to $combat.enemies[$combat.currentTarget] || $combat.enemies[0]>>
<<set _config to setup.dominationConfigs.intimidate>>
<<set _negEnergyCost to -_config.energyCost>>
<<clampStat "player.energy" _negEnergyCost 0 $player.maxEnergy>>
<<set _successChance to _config.baseChance>>
<<set _playerStat to $player[_config.statModifier.player] || 0>>
<<set _enemyStat to _target[_config.statModifier.enemy] || 10>>
<<set _successChance += _playerStat>>
<<set _successChance -= _enemyStat>>
<<set _hasArmorBonus to $combat.armorEffects && $combat.armorEffects.intimidation>>
<<if _hasArmorBonus>>
<<set _successChance += _config.armorBonus>>
<</if>>
<<set _roll to random(1, 100)>>
<<set _success to (_roll lte _successChance)>>
<<if _success>>
<<applyStatus _target "fear">>
<<logCombat _config.logSuccess "damage">>
<<else>>
<<logCombat _config.logFailure "damage">>
<</if>>
<<if _success>>
<<set _narrativePool to setup.combatNarrative.intimidate_success || []>>
<<else>>
<<set _narrativePool to setup.combatNarrative.intimidate_failure || []>>
<</if>>
<<if _narrativePool.length gt 0>>
<<set _narrative to _narrativePool[random(0, _narrativePool.length - 1)]>>
<<else>>
<<set _narrative to _success ? "Your intimidation works!" : "They resist your intimidation.">>
<</if>>
<<subPronouns _narrative _target>>
<<set _narrative to _subText>>
<<run window._intimidateCardData = {
narrative: _narrative,
targetName: _target.name,
success: _success,
roll: _roll,
successChance: _successChance,
playerStat: _playerStat,
enemyStat: _enemyStat,
hasArmorBonus: _hasArmorBonus,
armorBonus: _config.armorBonus,
duration: _config.onSuccess.duration
}>>
<<fillCombatVideoBox "player-intimidate-video" `_success ? _config.videoFolder : _config.videoFolderFail` _target>>
<</silently>>
<<run setTimeout(function() {
var d = window._intimidateCardData;
$('#player-intimidate-narrative').html('<p>' + d.narrative + '</p>');
var resultHtml = '';
if (d.success) {
resultHtml = '<div class="intimidate-success">';
resultHtml += '<span class="gi gi-afraid gi-medium"></span>';
resultHtml += '<span class="result-text">TERRIFIED!</span>';
resultHtml += '</div>';
resultHtml += '<div class="intimidate-chance">Rolled ' + d.roll + ' vs ' + d.successChance + '% chance</div>';
} else {
resultHtml = '<div class="intimidate-failure">';
resultHtml += '<span class="gi gi-blocked gi-medium"></span>';
resultHtml += '<span class="result-text">RESISTED</span>';
resultHtml += '</div>';
resultHtml += '<div class="intimidate-chance">Rolled ' + d.roll + ' vs ' + d.successChance + '% chance</div>';
}
resultHtml += '<div class="chance-breakdown">';
resultHtml += '<span class="breakdown-item">Base: 40%</span>';
if (d.playerStat > 0) {
resultHtml += '<span class="breakdown-item bonus">+' + d.playerStat + '% (Dominance)</span>';
}
if (d.enemyStat > 0) {
resultHtml += '<span class="breakdown-item penalty">-' + d.enemyStat + '% (Enemy Will)</span>';
}
if (d.hasArmorBonus) {
resultHtml += '<span class="breakdown-item bonus">+' + d.armorBonus + '% (Armor)</span>';
}
resultHtml += '</div>';
$('#player-intimidate-result').html(resultHtml);
var statusHtml = '';
if (d.success) {
statusHtml = '<div class="fear-applied-alert">';
statusHtml += '<span class="gi gi-afraid gi-medium"></span>';
statusHtml += '<span>FEAR applied for ' + d.duration + ' rounds!</span>';
statusHtml += '</div>';
statusHtml += '<p class="effect-explanation">Terrified enemies may skip their turn or flee.</p>';
$('#player-intimidate-target-status').html('<span class="gi gi-afraid gi-medium"></span> <span style="color:#ff6600">TERRIFIED</span>');
}
$('#player-intimidate-status').html(statusHtml);
}, 50)>>
<</widget>>
<<widget "playerIntimidateCardFlow">>
<<silently>><<include "DominationNarratives">><</silently>>
<<initCombatTarget>>
<<set _config to setup.dominationConfigs.intimidate>>
<<if $player.energy lt _config.energyCost>>
<div class="combat-error">
Not enough energy! (Need <<print _config.energyCost>> energy)
</div>
<div class="choice-container">
<<vchoice "Back" "Combat_Actions" "move" "back">>
</div>
<<else>>
<div class="player-turn-container">
<!-- Render the card -->
<<playerIntimidateCard>>
<!-- Execute and populate -->
<<executePlayerIntimidateCard>>
</div>
<div class="choice-container">
<<vchoice "Continue" "Combat_Companion_Turn" "move" "map">>
</div>
<</if>>
<</widget>>
<<widget "playerDarkPulseCard">>
<<set _config to setup.supernaturalConfigs.dark_pulse>>
<<set _enemyCount to $combat.enemies.length>>
<div class="combat-card player-card player-dark-pulse-card">
<div class="card-header player-card-header player-dark-pulse-header">
<<icon "supernatural" "medium">>
<span class="player-card-name">DARK POWER</span>
<span class="attack-name">DARK PULSE</span>
</div>
<div class="card-body">
<!-- AoE Target info -->
<div class="card-target-info aoe-target">
<span class="aoe-indicator"><<icon "aoe" "medium">> ALL ENEMIES</span>
<span class="enemy-count">(<<print _enemyCount>> target<<if _enemyCount gt 1>>s<</if>>)</span>
</div>
<!-- Narrative placeholder -->
<div id="player-dark-pulse-narrative" class="dark-pulse-narrative-container">
<em>Channeling dark energy...</em>
</div>
<!-- Video (filled via fillCombatVideoBox) -->
<div id="player-dark-pulse-video" class="card-video-container" style="display:none"></div>
<!-- Damage to each enemy placeholder -->
<div id="player-dark-pulse-results" class="dark-pulse-results-container"></div>
<!-- Victory/deaths placeholder -->
<div id="player-dark-pulse-deaths" class="dark-pulse-deaths-container"></div>
<!-- Corruption gain placeholder -->
<div id="player-dark-pulse-corruption" class="dark-pulse-corruption-container"></div>
</div>
<div class="card-footer player-card-footer">
<span class="player-corruption"><<icon "corruption" "medium">> <span id="player-dark-pulse-corr"><<print $player.corruption>></span></span>
<span class="attack-cost"><<icon "energy" "medium">> -<<print _config.energyCost>></span>
</div>
</div>
<</widget>>
<<widget "executePlayerDarkPulseCard">>
<<silently>>
<<set _config to setup.supernaturalConfigs.dark_pulse>>
<<set _negEnergyCost to -_config.energyCost>>
<<clampStat "player.energy" _negEnergyCost 0 $player.maxEnergy>>
<<set _baseDamage to _config.baseDamage>>
<<set _corruptionBonus to Math.floor($player.corruption / _config.corruptionScaling)>>
<<set _damage to Math.max(1, Math.floor((_baseDamage + _corruptionBonus) * setup.fighterDamageFactor("player")))>>
<<set _narrativePool to setup.combatNarrative.dark_pulse || []>>
<<if _narrativePool.length gt 0>>
<<set _narrative to _narrativePool[random(0, _narrativePool.length - 1)]>>
<<else>>
<<set _narrative to _config.fallbackText>>
<</if>>
<<set _dpTarget to $combat.enemies[$combat.currentTarget || 0] || $combat.enemies[0]>>
<<fillCombatVideoBox "player-dark-pulse-video" _config.videoFolder _dpTarget>>
<<set _results to []>>
<<set _kills to []>>
<<for _i, _enemy range $combat.enemies>>
<<if _enemy.health gt 0>>
<<set _oldHp to _enemy.health>>
<<set _enemy.health -= _damage>>
<<applyEnemyDamageExpression _enemy>>
<<set _isDead to (_enemy.health lte 0)>>
<<if _isDead>>
<<set _kills.push(_enemy.name)>>
<</if>>
<<run _results.push({
name: _enemy.name,
oldHp: _oldHp,
newHp: Math.max(0, _enemy.health),
damage: _damage,
isDead: _isDead
})>>
<</if>>
<</for>>
<<run setup.removeDefeatedEnemies()>>
<<set _victory to ($combat.enemies.length === 0)>>
<<set _oldCorruption to $player.corruption>>
<<addCorruption _config.corruptionGain>>
<<set _newCorruption to $player.corruption>>
<<set _logMsg to "Dark Pulse! " + _damage + " damage to all enemies">>
<<logCombat _logMsg "critical">>
<<run window._darkPulseCardData = {
narrative: _narrative,
damage: _damage,
baseDamage: _baseDamage,
corruptionBonus: _corruptionBonus,
results: _results,
kills: _kills,
victory: _victory,
oldCorruption: _oldCorruption,
newCorruption: _newCorruption,
deathText: _config.deathText
}>>
<</silently>>
<<run setTimeout(function() {
var d = window._darkPulseCardData;
$('#player-dark-pulse-narrative').html('<p>' + d.narrative + '</p>');
var resultsHtml = '<div class="damage-display-header">';
resultsHtml += '<span class="gi gi-supernatural gi-medium"></span>';
resultsHtml += '<span class="total-damage">' + d.damage + ' damage to each</span>';
resultsHtml += '</div>';
if (d.corruptionBonus > 0) {
resultsHtml += '<div class="damage-breakdown">';
resultsHtml += '<span class="breakdown-item">Base: ' + d.baseDamage + '</span>';
resultsHtml += '<span class="breakdown-item bonus">+' + d.corruptionBonus + ' (Corruption)</span>';
resultsHtml += '</div>';
}
resultsHtml += '<div class="enemy-damage-list">';
for (var i = 0; i < d.results.length; i++) {
var r = d.results[i];
var deadClass = r.isDead ? ' enemy-dead' : '';
resultsHtml += '<div class="enemy-damage-item' + deadClass + '">';
resultsHtml += '<span class="enemy-name">' + r.name + '</span>';
resultsHtml += '<span class="damage-taken">-' + r.damage + '</span>';
resultsHtml += '<span class="hp-result">' + r.newHp + '/' + r.oldHp + '</span>';
if (r.isDead) {
resultsHtml += '<span class="death-marker">DEAD</span>';
}
resultsHtml += '</div>';
}
resultsHtml += '</div>';
$('#player-dark-pulse-results').html(resultsHtml);
var deathsHtml = '';
if (d.kills.length > 0) {
for (var j = 0; j < d.kills.length; j++) {
deathsHtml += '<div class="kill-notification">';
deathsHtml += '<span class="gi gi-skull gi-medium"></span>';
deathsHtml += '<span>' + d.kills[j] + ' ' + d.deathText + '</span>';
deathsHtml += '</div>';
}
}
if (d.victory) {
deathsHtml += '<div class="victory-notification">';
deathsHtml += '<span class="gi gi-trophy gi-medium"></span>';
deathsHtml += '<span>ALL ENEMIES DEFEATED!</span>';
deathsHtml += '</div>';
}
$('#player-dark-pulse-deaths').html(deathsHtml);
var corrHtml = '<div class="corruption-gain">';
corrHtml += '<span class="gi gi-corruption gi-medium"></span>';
corrHtml += '<span>+1 Corruption (' + d.oldCorruption + ' → ' + d.newCorruption + ')</span>';
corrHtml += '</div>';
$('#player-dark-pulse-corruption').html(corrHtml);
$('#player-dark-pulse-corr').text(d.newCorruption);
}, 50)>>
<</widget>>
<<widget "playerDarkPulseCardFlow">>
<<silently>><<include "SupernaturalNarratives">><</silently>>
<<set _config to setup.supernaturalConfigs.dark_pulse>>
<<if $player.energy lt _config.energyCost>>
<div class="combat-error">
Not enough energy! (Need <<print _config.energyCost>> energy)
</div>
<div class="choice-container">
<<vchoice "Back" "Combat_Actions" "move" "back">>
</div>
<<else>>
<div class="player-turn-container">
<!-- Render the card -->
<<playerDarkPulseCard>>
<!-- Execute and populate -->
<<executePlayerDarkPulseCard>>
</div>
<<if $combat.enemies.length === 0>>
<div class="choice-container">
<<vchoice "Victory!" "Combat_Victory" "special" "trophy">>
</div>
<<else>>
<div class="choice-container">
<<vchoice "Continue" "Combat_Companion_Turn" "move" "map">>
</div>
<</if>>
<</if>>
<</widget>><<widget "playerSeductionCard">>
<<set _pscConfig to _args[0]>>
<<set _pscTarget to $combat.enemies[$combat.currentTarget]>>
<div class="combat-card player-card player-seduce-card">
<!-- HEADER -->
<div class="card-header player-seduce-header">
<<switch _pscConfig.actionType>>
<<case "grope">>
<<icon "hand" "medium">>
<<case "fondle">>
<<icon "hand" "medium">>
<<case "grind">>
<<icon "high-arousal" "medium">>
<<case "kiss">>
<<icon "lust" "medium">>
<<case "spank">>
<<icon "slap" "medium">>
<<default>>
<<icon "high-arousal" "medium">>
<</switch>>
<span class="player-card-name">SEDUCTION</span>
<span class="attack-name"><<print _pscConfig.name.toUpperCase()>></span>
</div>
<!-- CARD BODY -->
<div class="card-body">
<!-- Attack Info Row -->
<div class="attack-info-row">
<span class="attack-target">
<<icon "target" "medium">> <<print _pscTarget.name>><<if _pscTarget.position and _pscTarget.position neq "standing">> <span class="target-position-indicator">(<<print _pscTarget.position>>)</span><</if>>
</span>
<<if _pscConfig.bodyPart>>
<span class="body-part">
<<icon "body" "medium">> <<print _pscConfig.bodyPart>>
</span>
<</if>>
</div>
<!-- Narrative -->
<div id="player-seduce-narrative" class="seduce-narrative-container"></div>
<!-- Video Container (populated if video found) -->
<div id="player-seduce-video" class="card-video-container"></div>
<!-- Lust Damage Result -->
<div id="player-seduce-result" class="seduce-result-container"></div>
<!-- Secondary Effects -->
<div id="player-seduce-effects" class="seduce-effects-container"></div>
</div>
<!-- FOOTER with target status -->
<div class="card-footer player-card-footer">
<div class="target-status-row">
<span class="target-hp">
<<icon "health" "medium">> <<print _pscTarget.health>>/<<print _pscTarget.maxHealth>>
</span>
<span class="target-lust">
<<icon "lust" "medium">>
<span id="player-target-lust-display"><<print _pscTarget.lust || 0>>%</span>
</span>
</div>
</div>
</div>
<</widget>>
<<widget "executePlayerSeductionCard">>
<<set _epsConfig to _args[0]>>
<<silently>>
<<executeExploitAction _epsConfig>>
<<initCombatTarget>>
<<if $combat.exploitSuccess && _epsConfig.humiliationType>>
<<switch _epsConfig.humiliationType>>
<<case "grope">>
<<humiliationGrope $combat.currentTarget>>
<<case "grope_pussy">>
<<addHumiliation $combat.currentTarget 15 "grope_pussy">>
<<case "slap">>
<<humiliationSlap $combat.currentTarget>>
<<case "spank">>
<<humiliationSlap $combat.currentTarget>>
<<case "force_position">>
<<humiliationForcePosition $combat.currentTarget>>
<<case "finger">>
<<addHumiliation $combat.currentTarget 12 "finger">>
<<case "oral">>
<<addHumiliation $combat.currentTarget 15 "oral">>
<<case "spread">>
<<addHumiliation $combat.currentTarget 18 "spread">>
<<default>>
<<addHumiliation $combat.currentTarget 10 _epsConfig.humiliationType>>
<</switch>>
<</if>>
<<if $combat.exploitSuccess && $combat.exploitWelt>>
<<humiliationWelt $combat.currentTarget>>
<</if>>
<<set _epsCustomPositionBonus to false>>
<<set _epsCustomPositionNarrative to "">>
<<if $combat.exploitSuccess && _epsConfig.positionBonus>>
<<set _targetPos to _target.position || "standing">>
<<if _epsConfig.positionBonus.positions && _epsConfig.positionBonus.positions.includes(_targetPos)>>
<<set _epsCustomPositionBonus to true>>
<<set _epsCustomPositionNarrative to _epsConfig.positionBonus.narrative || "Position advantage!">>
<<if _epsConfig.positionBonus.lustBonus>>
<<set _target.lust to setup.enemyLustPlus(_target, _epsConfig.positionBonus.lustBonus)>>
<</if>>
<</if>>
<</if>>
<<set _epsSuccess to $combat.exploitSuccess>>
<<set _epsResisted to $combat.exploitResisted>>
<<set _epsLustDamage to $combat.exploitLustDamage || 0>>
<<set _epsPainDamage to $combat.exploitPainDamage || 0>>
<<set _epsPositionBonus to $combat.positionBonusApplied>>
<<set _epsPositionPct to $combat.positionBonusPct || 0>>
<<set _epsStunned to $combat.exploitStunned>>
<<set _epsWelt to $combat.exploitWelt>>
<<set _epsSecondary to $combat.exploitSecondaryEffect>>
<<set _epsPlayerLustGain to _epsConfig.playerLustGain || 0>>
<<set _targetLust to _target.lust || 0>>
<<if _targetLust >= 90>>
<<set _epsLustTier to "high">>
<<elseif _targetLust >= 70>>
<<set _epsLustTier to "mid">>
<<else>>
<<set _epsLustTier to "low">>
<</if>>
<<fillCombatVideoBox "player-seduce-video" `_epsSuccess ? _epsConfig.videoFolder : null` _target>>
<</silently>>
<<run window._epsCardData = {
targetLust: _targetLust,
targetHealth: _target.health,
targetMaxHealth: _target.maxHealth,
lustTier: _epsLustTier
}>>
<<capture _epsConfig, _epsSuccess, _epsSecondary, _epsLustDamage, _epsPainDamage, _epsPositionBonus, _epsPositionPct, _epsCustomPositionBonus, _epsCustomPositionNarrative, _epsStunned, _epsWelt, _epsPlayerLustGain>>
<<done>><<run (function () { try {
var narrativeHtml = '';
var config = _epsConfig;
var success = _epsSuccess;
var resultBadge = success ? '<span class="roll-result hit">SUCCESS!</span>' : '<span class="roll-result miss">RESISTED!</span>';
if (!success) {
var resistKey = config.narrativeKey + '_resist';
var resistPool = setup.combatNarrative[resistKey];
narrativeHtml = '<div class="seduce-narrative-row"><p class="seduce-resist-narrative">';
narrativeHtml += (Array.isArray(resistPool) ? resistPool.random() : resistPool) || config.resistFallback || 'She breaks free before you can act!';
narrativeHtml += '</p>' + resultBadge + '</div>';
} else {
var hitKey = config.narrativeKey + '_hit';
var hitPool = setup.combatNarrative[hitKey];
narrativeHtml = '<div class="seduce-narrative-row"><p class="seduce-hit-narrative explicit">';
narrativeHtml += (Array.isArray(hitPool) ? hitPool.random() : hitPool) || config.hitFallback || 'You successfully ' + config.actionType + ' her ' + config.bodyPart + '!';
narrativeHtml += '</p>' + resultBadge + '</div>';
if (_epsSecondary && config.secondaryEffect?.narrative) {
var secondaryNarrative = config.secondaryEffect.narrative;
var secondaryPool = setup.combatNarrative[secondaryNarrative];
narrativeHtml += '<p class="seduce-secondary-narrative explicit">';
narrativeHtml += (Array.isArray(secondaryPool) ? secondaryPool.random() : secondaryPool) || secondaryNarrative;
narrativeHtml += '</p>';
}
var lustTier = window._epsCardData.lustTier || 'low';
var tierKey = config.narrativeKey + '_lust_' + lustTier;
var tierPool = setup.combatNarrative[tierKey];
if (tierPool) {
var tierClass = lustTier === 'high' ? 'lust-high' : '';
narrativeHtml += '<p class="seduce-reaction-narrative explicit ' + tierClass + '">';
narrativeHtml += Array.isArray(tierPool) ? tierPool.random() : tierPool;
narrativeHtml += '</p>';
}
}
$('#player-seduce-narrative').html(narrativeHtml);
} catch (e) { console.error(e); } })()>><</done>>
<<done>><<run (function () { try {
var resultHtml = '';
if (_epsSuccess) {
resultHtml = '<div class="lust-damage-display">';
resultHtml += '<span class="lust-icon"><span class="gi gi-high-arousal gi-medium"></span></span> ';
resultHtml += '<span class="lust-number">+' + _epsLustDamage + '</span>';
resultHtml += '<span class="damage-type">enemy lust</span>';
resultHtml += '</div>';
if (_epsPainDamage > 0) {
resultHtml += '<div class="pain-damage-display">';
resultHtml += '<span class="damage-icon"><span class="gi gi-attack gi-medium"></span></span> ';
resultHtml += '<span class="damage-number">-' + _epsPainDamage + '</span>';
resultHtml += '<span class="damage-type">HP</span>';
resultHtml += '</div>';
}
}
$('#player-seduce-result').html(resultHtml);
} catch (e) { console.error(e); } })()>><</done>>
<<done>><<run (function () { try {
var effectsHtml = '';
if (_epsSuccess) {
if (_epsPositionBonus) {
effectsHtml += '<div class="position-bonus-effect">';
effectsHtml += '<span class="effect-icon"><span class="gi gi-knockdown gi-medium"></span></span> ';
effectsHtml += 'POSITION BONUS! +' + _epsPositionPct + '% lust';
effectsHtml += '</div>';
}
if (_epsCustomPositionBonus) {
effectsHtml += '<div class="custom-position-bonus-effect">';
effectsHtml += '<span class="effect-icon"><span class="gi gi-pinned gi-medium"></span></span> ';
effectsHtml += _epsCustomPositionNarrative;
if (_epsConfig.positionBonus?.lustBonus) {
effectsHtml += ' (+' + _epsConfig.positionBonus.lustBonus + ' lust)';
}
effectsHtml += '</div>';
}
if (_epsSecondary && _epsConfig.secondaryEffect?.lustBonus) {
effectsHtml += '<div class="secondary-lust-effect">';
effectsHtml += '<span class="effect-icon"><span class="gi gi-lust gi-medium"></span></span> ';
effectsHtml += '+' + _epsConfig.secondaryEffect.lustBonus + ' bonus lust';
effectsHtml += '</div>';
}
if (_epsStunned) {
effectsHtml += '<div class="stun-effect">';
effectsHtml += '<span class="effect-icon"><span class="gi gi-stunned gi-medium"></span></span> ';
effectsHtml += 'STUNNED!';
effectsHtml += '</div>';
}
if (_epsWelt) {
effectsHtml += '<div class="welt-effect">';
effectsHtml += '<span class="effect-icon"><span class="gi gi-slap gi-medium"></span></span> ';
effectsHtml += 'Red handprint left!';
effectsHtml += '</div>';
}
if (_epsPlayerLustGain > 0) {
effectsHtml += '<div class="player-lust-effect">';
effectsHtml += '<span class="gi gi-high-arousal gi-medium"></span> +' + _epsPlayerLustGain + ' your lust';
effectsHtml += '</div>';
}
if (window._epsCardData.targetLust >= 90) {
effectsHtml += '<div class="lust-threshold-effect">';
effectsHtml += '<span class="effect-icon"><span class="gi gi-hazard-sign gi-medium"></span></span> ';
effectsHtml += 'NEAR BREAKING! Ready for takedown!';
effectsHtml += '</div>';
}
}
$('#player-seduce-effects').html(effectsHtml);
var d = window._epsCardData;
$('#player-target-lust-display').text(d.targetLust + '%');
} catch (e) { console.error(e); } })()>><</done>>
<</capture>>
<</widget>>
<<widget "playerSeductionCardFlow">>
<<set _pscfConfig to _args[0]>>
<div class="player-turn-container">
<!-- Render the card -->
<<playerSeductionCard _pscfConfig>>
<!-- Execute and populate -->
<<executePlayerSeductionCard _pscfConfig>>
</div>
<!-- Continue button -->
<div class="choice-container">
<<vchoice "Continue" "Combat_Companion_Turn" "move" "map">>
</div>
<</widget>><<widget "playerTakedownCard">>
<<set _ptcConfig to _args[0]>>
<<initCombatTarget>>
<<set _ptcTarget to _target>>
<div class="combat-card player-card player-attack-card takedown-card">
<!-- HEADER -->
<div class="card-header player-attack-header takedown-header">
<<if _ptcConfig.successIcon>>
<<icon _ptcConfig.successIcon "medium">>
<<else>>
<<icon "leg-sweep" "medium">>
<</if>>
<span class="player-card-name">TAKEDOWN</span>
<span class="attack-name"><<print _ptcConfig.name.toUpperCase()>></span>
</div>
<!-- BODY -->
<div class="card-body">
<!-- Target Info Row -->
<div class="attack-info-row">
<span class="attack-target">
<<icon "target" "medium">> <<print _ptcTarget.name>><<if _ptcTarget.position and _ptcTarget.position neq "standing">> <span class="target-position-indicator">(<<print _ptcTarget.position>>)</span><</if>>
</span>
</div>
<!-- Narrative -->
<div id="player-takedown-narrative" class="takedown-narrative-container"></div>
<!-- Video Container (populated if video found) -->
<div id="player-takedown-video" class="card-video-container"></div>
<!-- Position Change Result -->
<div id="player-takedown-result" class="takedown-result-container"></div>
<!-- Exposure Bonuses -->
<div id="player-takedown-exposure" class="takedown-exposure-container"></div>
<!-- Effects -->
<div id="player-takedown-effects" class="takedown-effects-container"></div>
</div>
<!-- FOOTER -->
<div class="card-footer player-card-footer">
<div class="target-status-row">
<span class="target-position">
<<icon "knockdown" "medium">>
<span id="player-target-position-display"><<print _ptcTarget.position || "standing">></span>
</span>
<span class="target-hp">
<<icon "health" "medium">> <<print _ptcTarget.health>>/<<print _ptcTarget.maxHealth>>
</span>
</div>
</div>
</div>
<</widget>>
<<widget "executePlayerTakedownCard">>
<<set _eptcConfig to _args[0]>>
<<silently>>
<<executeTakedown _eptcConfig>>
<<initCombatTarget>>
<<if $combat.takedownSuccess>>
<<if _eptcConfig.setEnemyPinned>>
<<addHumiliation $combat.currentTarget 20 "pinned">>
<<else>>
<<humiliationForcePosition $combat.currentTarget>>
<</if>>
<</if>>
<<set _eptcSuccess to $combat.takedownSuccess>>
<<set _eptcRoll to $combat.lastTakedownRoll>>
<<set _eptcChance to $combat.lastTakedownChance>>
<<set _eptcNewPosition to _eptcConfig.targetPosition>>
<<set _eptcDickExposed to ($clothing.player && $clothing.player.dickExposed)>>
<<set _eptcTitsExposed to (_target.clothing && _target.clothing.titsExposed)>>
<<set _eptcPussyExposed to (_target.clothing && _target.clothing.pussyExposed)>>
<<set _eptcExposureLust to 0>>
<<set _eptcPussyDickCombo to false>>
<<set _eptcBottomDamageBonus to false>>
<<if _eptcSuccess>>
<<if _eptcDickExposed && _eptcNewPosition === "kneeling">>
<<set _target.lust to setup.enemyLustPlus(_target, 10)>>
<<set _eptcExposureLust += 10>>
<</if>>
<<if _eptcTitsExposed && _eptcNewPosition === "prone_back">>
<<set $player.lust to Math.min(100, $player.lust + 8)>>
<</if>>
<<if _eptcTitsExposed && _eptcNewPosition === "pinned">>
<<set $player.lust to Math.min(100, $player.lust + 10)>>
<</if>>
<<if _eptcPussyExposed && _eptcDickExposed && _eptcNewPosition === "pinned">>
<<set $player.lust to Math.min(100, $player.lust + 18)>>
<<set _target.lust to setup.enemyLustPlus(_target, 25)>>
<<set _eptcPussyDickCombo to true>>
<<elseif _eptcPussyExposed>>
<<if _eptcNewPosition === "prone_back">>
<<set $player.lust to Math.min(100, $player.lust + 12)>>
<<elseif _eptcNewPosition === "prone_front">>
<<set $player.lust to Math.min(100, $player.lust + 15)>>
<<elseif _eptcNewPosition === "bent_over">>
<<set $player.lust to Math.min(100, $player.lust + 18)>>
<<set _target.lust to setup.enemyLustPlus(_target, 15)>>
<</if>>
<</if>>
<<if _eptcNewPosition === "bent_over" && !_eptcPussyExposed>>
<<if _target.clothing && _target.clothing.bottomDamage >= 50>>
<<set $player.lust to Math.min(100, $player.lust + 10)>>
<<set _eptcBottomDamageBonus to true>>
<</if>>
<</if>>
<</if>>
<<fillCombatVideoBox "player-takedown-video" `_eptcSuccess ? _eptcConfig.videoFolder : null` _target>>
<</silently>>
<<run window._eptcCardData = {
success: _eptcSuccess,
newPosition: _eptcNewPosition,
currentPosition: _target ? _target.position : 'standing',
targetHealth: _target ? _target.health : 0,
targetMaxHealth: _target ? _target.maxHealth : 0
}>>
<<capture _eptcConfig, _eptcSuccess, _eptcNewPosition, _eptcDickExposed, _eptcTitsExposed, _eptcPussyDickCombo, _eptcPussyExposed, _eptcBottomDamageBonus>>
<<done>><<run (function () { try {
var narrativeHtml = '';
var config = _eptcConfig;
var resultBadge = _eptcSuccess ? '<span class="roll-result hit">SUCCESS!</span>' : '<span class="roll-result miss">RESISTED!</span>';
if (_eptcSuccess) {
var hitKey = config.successNarrativeKey;
var hitPool = setup.combatNarrative[hitKey];
narrativeHtml = '<div class="takedown-narrative-row"><p class="takedown-hit-narrative explicit">';
narrativeHtml += hitPool?.random() || config.hitFallback || 'You force her into position!';
narrativeHtml += '</p>' + resultBadge + '</div>';
} else {
var resistPool = setup.combatNarrative['takedown_resist'];
narrativeHtml = '<div class="takedown-narrative-row"><p class="takedown-resist-narrative">';
narrativeHtml += resistPool?.random() || config.resistFallback || 'She breaks free before you can take her down!';
narrativeHtml += '</p>' + resultBadge + '</div>';
}
$('#player-takedown-narrative').html(narrativeHtml);
} catch (e) { console.error(e); } })()>><</done>>
<<done>><<run (function () { try {
var resultHtml = '';
if (_eptcSuccess) {
var posName = _eptcNewPosition;
if (posName === 'prone_front') posName = 'FACE DOWN';
else if (posName === 'prone_back') posName = 'ON HER BACK';
else if (posName === 'bent_over') posName = 'BENT OVER';
else if (posName === 'kneeling') posName = 'ON HER KNEES';
else if (posName === 'pinned') posName = 'PINNED DOWN';
else posName = posName.toUpperCase();
resultHtml = '<div class="position-change-display success">';
resultHtml += '<span class="position-icon"><span class="gi gi-' + (_eptcConfig.successIcon || 'knockdown') + ' gi-medium"></span></span> ';
resultHtml += '<span class="position-text">Forced ' + posName + '!</span>';
resultHtml += '</div>';
if (_eptcConfig.enemyLustGain > 0) {
resultHtml += '<div class="lust-gain-display">';
resultHtml += '<span class="lust-icon"><span class="gi gi-high-arousal gi-medium"></span></span> ';
resultHtml += '<span class="lust-number">+' + _eptcConfig.enemyLustGain + '</span>';
resultHtml += '<span class="lust-type"> enemy lust</span>';
resultHtml += '</div>';
}
} else {
resultHtml = '<div class="position-change-display failure">';
resultHtml += '<span class="position-icon"><span class="gi gi-dodge gi-medium"></span></span> ';
resultHtml += '<span class="position-text">Still ' + (window._eptcCardData.currentPosition || 'standing') + '</span>';
resultHtml += '</div>';
}
$('#player-takedown-result').html(resultHtml);
} catch (e) { console.error(e); } })()>><</done>>
<<done>><<run (function () { try {
var exposureHtml = '';
if (_eptcSuccess) {
if (_eptcDickExposed && _eptcNewPosition === 'kneeling') {
exposureHtml += '<div class="exposure-bonus dick-exposed">';
exposureHtml += '<span class="gi gi-dick gi-medium"></span> ';
exposureHtml += 'Your cock at face level! +10 enemy lust';
exposureHtml += '</div>';
}
if (_eptcTitsExposed && _eptcNewPosition === 'prone_back') {
exposureHtml += '<div class="exposure-bonus tits-exposed">';
exposureHtml += '<span class="gi gi-breasts gi-medium"></span> ';
exposureHtml += 'Her bare tits heave! +8 your lust';
exposureHtml += '</div>';
}
if (_eptcTitsExposed && _eptcNewPosition === 'pinned') {
exposureHtml += '<div class="exposure-bonus tits-exposed">';
exposureHtml += '<span class="gi gi-breasts gi-medium"></span> ';
exposureHtml += 'Her tits press against you! +10 your lust';
exposureHtml += '</div>';
}
if (_eptcPussyDickCombo) {
exposureHtml += '<div class="exposure-bonus pussy-dick-combo">';
exposureHtml += '<span class="gi gi-lust gi-medium"></span> ';
exposureHtml += 'Your cock presses against her bare pussy! +18 your lust, +25 enemy lust';
exposureHtml += '</div>';
} else if (_eptcPussyExposed) {
if (_eptcNewPosition === 'prone_back') {
exposureHtml += '<div class="exposure-bonus pussy-exposed">';
exposureHtml += '<span class="gi gi-lust gi-medium"></span> ';
exposureHtml += 'Spread open beneath you! +12 your lust';
exposureHtml += '</div>';
} else if (_eptcNewPosition === 'prone_front') {
exposureHtml += '<div class="exposure-bonus pussy-exposed">';
exposureHtml += '<span class="gi gi-lust gi-medium"></span> ';
exposureHtml += 'Her holes perfectly presented! +15 your lust';
exposureHtml += '</div>';
} else if (_eptcNewPosition === 'bent_over') {
exposureHtml += '<div class="exposure-bonus pussy-exposed">';
exposureHtml += '<span class="gi gi-lust gi-medium"></span> ';
exposureHtml += 'Her wet pussy glistens! +18 your lust, +15 enemy lust';
exposureHtml += '</div>';
}
}
if (_eptcBottomDamageBonus) {
exposureHtml += '<div class="exposure-bonus bottom-damage">';
exposureHtml += '<span class="gi gi-torn-clothing gi-medium"></span> ';
exposureHtml += 'Torn clothing barely covers her! +10 your lust';
exposureHtml += '</div>';
}
}
$('#player-takedown-exposure').html(exposureHtml);
} catch (e) { console.error(e); } })()>><</done>>
<<done>><<run (function () { try {
var effectsHtml = '';
if (_eptcSuccess) {
if (_eptcConfig.playerLustGain > 0) {
effectsHtml += '<div class="player-lust-effect">';
effectsHtml += '<span class="gi gi-high-arousal gi-medium"></span> +' + _eptcConfig.playerLustGain + ' your lust';
effectsHtml += '</div>';
}
if (_eptcConfig.dominanceGain > 0) {
effectsHtml += '<div class="dominance-effect">';
effectsHtml += '<span class="gi gi-dominance gi-medium"></span> +' + _eptcConfig.dominanceGain + ' dominance';
effectsHtml += '</div>';
}
effectsHtml += '<div class="humiliation-effect">';
effectsHtml += '<span class="gi gi-shame gi-medium"></span> Position humiliation applied';
effectsHtml += '</div>';
if (_eptcConfig.setEnemyPinned) {
effectsHtml += '<div class="pinned-effect">';
effectsHtml += '<span class="effect-icon"><span class="gi gi-pinned gi-medium"></span></span> ';
effectsHtml += 'ENEMY PINNED! New actions unlocked!';
effectsHtml += '</div>';
}
}
$('#player-takedown-effects').html(effectsHtml);
var d = window._eptcCardData;
var newPos = d.success ? d.newPosition : d.currentPosition;
$('#player-target-position-display').text(newPos);
} catch (e) { console.error(e); } })()>><</done>>
<</capture>>
<</widget>>
<<widget "playerTakedownCardFlow">>
<<set _ptcfConfig to _args[0]>>
<div class="player-turn-container">
<!-- Render the card -->
<<playerTakedownCard _ptcfConfig>>
<!-- Execute and populate -->
<<executePlayerTakedownCard _ptcfConfig>>
</div>
<!-- Continue button -->
<div class="choice-container">
<<vchoice "Continue" "Combat_Companion_Turn" "move" "map">>
</div>
<</widget>><<widget "selectEnemyAttackType">>
<<set _enemy to _args[0]>>
<<set _target to _args[1]>>
<<set _targetClothing to _args[2]>>
<<set _attackType to "strike">>
<<set _weaponNarrativeText to "">>
<<if _enemy.weapon === "fists" || !_enemy.weapon>>
<<set _roll to random(1, 100)>>
<<if _roll <= 33>>
<<set _attackType to "punch_face">>
<<elseif _roll <= 66>>
<<set _attackType to "punch_gut">>
<<elseif _roll <= 83>>
<<set _attackType to "grapple">>
<<else>>
<<set _attackType to "kick_leg">>
<</if>>
<<elseif _enemy.weapon === "rusty_pipe">>
<<set _eIdx to $combat.enemies.indexOf(_enemy)>>
<<selectWeaponEscalationAttack _eIdx _target>>
<<if _escalationAttack && _escalationAttack !== "basic">>
<<set _attackType to "pipe_" + _escalationAttack>>
<<set _weaponNarrativeText to _escalationNarrative>>
<<else>>
<<set _roll to random(1, 100)>>
<<if _roll <= 40>>
<<set _attackType to "pipe_swing_high">>
<<elseif _roll <= 80>>
<<set _attackType to "pipe_swing_low">>
<<else>>
<<set _attackType to "overhead_smash">>
<</if>>
<</if>>
<<elseif _enemy.weapon === "leather_belt">>
<<set _eIdx to $combat.enemies.indexOf(_enemy)>>
<<selectWeaponEscalationAttack _eIdx _target>>
<<if _escalationAttack && _escalationAttack !== "basic">>
<<set _attackType to "belt_" + _escalationAttack>>
<<set _weaponNarrativeText to _escalationNarrative>>
<<else>>
<<set _isDamaged to (_targetClothing && (_targetClothing.topIntegrity < 100 || _targetClothing.bottomIntegrity < 100 || _targetClothing.topExposed || _targetClothing.bottomExposed))>>
<<set _roll to random(1, 100)>>
<<if _isDamaged && _roll <= 60>>
<<set _attackType to "belt_whip">>
<<else>>
<<set _attackType to "strike_clothed">>
<</if>>
<</if>>
<<elseif _enemy.weapon === "combat knife">>
<<set _eIdx to $combat.enemies.indexOf(_enemy)>>
<<selectWeaponEscalationAttack _eIdx _target>>
<<if _escalationAttack && _escalationAttack !== "basic">>
<<set _attackType to "knife_" + _escalationAttack>>
<<set _weaponNarrativeText to _escalationNarrative>>
<<else>>
<<set _roll to random(1, 100)>>
<<if _roll <= 40>>
<<set _attackType to "knife_slash_torso">>
<<elseif _roll <= 70>>
<<set _attackType to "knife_slash_limb">>
<<elseif _roll <= 85 && _enemy && _enemy.lust >= 40>>
<<set _attackType to "rip_top">>
<<elseif _roll <= 100 && _enemy && _enemy.lust >= 40>>
<<set _attackType to "rip_bottom">>
<<else>>
<<if random(1, 2) === 1>>
<<set _attackType to "knife_slash_torso">>
<<else>>
<<set _attackType to "knife_slash_limb">>
<</if>>
<</if>>
<</if>>
<<elseif _enemy.weapon === "baseball_bat">>
<<set _eIdx to $combat.enemies.indexOf(_enemy)>>
<<selectWeaponEscalationAttack _eIdx _target>>
<<if _escalationAttack && _escalationAttack !== "basic">>
<<set _attackType to "bat_" + _escalationAttack>>
<<set _weaponNarrativeText to _escalationNarrative>>
<<else>>
<<set _roll to random(1, 100)>>
<<if _roll <= 50>>
<<set _attackType to "bat_swing_torso">>
<<elseif _roll <= 80>>
<<set _attackType to "bat_swing_legs">>
<<else>>
<<set _attackType to "bat_overhead">>
<</if>>
<</if>>
<<elseif _enemy.weapon === "chain">>
<<set _eIdx to $combat.enemies.indexOf(_enemy)>>
<<selectWeaponEscalationAttack _eIdx _target>>
<<if _escalationAttack && _escalationAttack !== "basic">>
<<set _attackType to "chain_" + _escalationAttack>>
<<set _weaponNarrativeText to _escalationNarrative>>
<<else>>
<<set _roll to random(1, 100)>>
<<if _roll <= 40>>
<<set _attackType to "chain_swing">>
<<elseif _roll <= 70>>
<<set _attackType to "chain_wrap">>
<<else>>
<<set _attackType to "chain_choke">>
<</if>>
<</if>>
<<elseif _enemy.weapon === "machete">>
<<set _roll to random(1, 100)>>
<<if _roll <= 60>>
<<set _attackType to "machete_slash">>
<<elseif _roll <= 85>>
<<set _attackType to "machete_chop">>
<<else>>
<<set _attackType to "clothes_cut">>
<</if>>
<<elseif _enemy.weapon === "riding_crop">>
<<set _eIdx to $combat.enemies.indexOf(_enemy)>>
<<selectWeaponEscalationAttack _eIdx _target>>
<<if _escalationAttack && _escalationAttack !== "basic">>
<<set _attackType to "crop_" + _escalationAttack>>
<<set _weaponNarrativeText to _escalationNarrative>>
<<else>>
<<set _roll to random(1, 100)>>
<<if _targetClothing && _targetClothing.titsExposed && _roll <= 35>>
<<set _attackType to "crop_tits">>
<<elseif _targetClothing && _targetClothing.pussyExposed && _roll <= 60>>
<<set _attackType to "crop_pussy">>
<<elseif _targetClothing && _targetClothing.assExposed && _roll <= 80>>
<<set _attackType to "crop_ass">>
<<else>>
<<set _attackType to "crop_strike">>
<</if>>
<</if>>
<<elseif _enemy.weapon === "rope">>
<<set _eIdx to $combat.enemies.indexOf(_enemy)>>
<<selectWeaponEscalationAttack _eIdx _target>>
<<if _escalationAttack && _escalationAttack !== "basic">>
<<set _attackType to "rope_" + _escalationAttack>>
<<set _weaponNarrativeText to _escalationNarrative>>
<<else>>
<<set _roll to random(1, 100)>>
<<if _roll <= 30>>
<<set _attackType to "rope_lash">>
<<elseif _roll <= 70>>
<<set _attackType to "rope_bind_wrists">>
<<else>>
<<set _attackType to "rope_bind_ankles">>
<</if>>
<</if>>
<<elseif _enemy.weapon === "rusty_shiv">>
<<set _eIdx to $combat.enemies.indexOf(_enemy)>>
<<selectWeaponEscalationAttack _eIdx _target>>
<<if _escalationAttack && _escalationAttack !== "basic">>
<<set _attackType to "shiv_" + _escalationAttack>>
<<set _weaponNarrativeText to _escalationNarrative>>
<<else>>
<<set _roll to random(1, 100)>>
<<if _roll <= 50>>
<<set _attackType to "shiv_jab">>
<<elseif _roll <= 80>>
<<set _attackType to "shiv_slash">>
<<else>>
<<set _attackType to "wild_swing">>
<</if>>
<</if>>
<<elseif _enemy.weapon === "thorn_whip">>
<<set _roll to random(1, 100)>>
<<if _roll <= 40>>
<<set _attackType to "whip_crack">>
<<elseif _roll <= 70>>
<<set _attackType to "whip_wrap">>
<<else>>
<<set _attackType to "thorn_lash">>
<</if>>
<<elseif _enemy.weapon === "shock_prod">>
<<set _roll to random(1, 100)>>
<<if _roll <= 50>>
<<set _attackType to "prod_jab">>
<<elseif _roll <= 80>>
<<set _attackType to "stun_touch">>
<<else>>
<<set _attackType to "arc_discharge">>
<</if>>
<<elseif _enemy.weapon === "razor_claws">>
<<set _roll to random(1, 100)>>
<<if _roll <= 40>>
<<set _attackType to "claw_swipe">>
<<elseif _roll <= 70>>
<<set _attackType to "double_slash">>
<<else>>
<<set _attackType to "pounce_maul">>
<</if>>
<<elseif _enemy.weapon === "seductive_claws">>
<<set _roll to random(1, 100)>>
<<if _roll <= 40>>
<<set _attackType to "caress_slash">>
<<elseif _roll <= 70>>
<<set _attackType to "draining_touch">>
<<else>>
<<set _attackType to "embrace_drain">>
<</if>>
<<elseif _enemy.weapon === "ethereal_touch">>
<<set _roll to random(1, 100)>>
<<if _roll <= 50>>
<<set _attackType to "lust_caress">>
<<elseif _roll <= 80>>
<<set _attackType to "phase_touch">>
<<else>>
<<set _attackType to "desire_burst">>
<</if>>
<<elseif _enemy.weapon === "phantasmal_grasp">>
<<set _roll to random(1, 100)>>
<<if _roll <= 40>>
<<set _attackType to "shadow_touch">>
<<elseif _roll <= 70>>
<<set _attackType to "nightmare_grab">>
<<else>>
<<set _attackType to "desire_embrace">>
<</if>>
<<elseif _enemy.weapon === "desire_tendrils">>
<<set _roll to random(1, 100)>>
<<if _roll <= 30>>
<<set _attackType to "tendril_lash">>
<<elseif _roll <= 60>>
<<set _attackType to "tendril_bind">>
<<elseif _roll <= 80>>
<<set _attackType to "essence_siphon">>
<<else>>
<<set _attackType to "overwhelming_desire">>
<</if>>
<<else>>
<<set _attackType to "strike">>
<</if>>
<<if _enemy && _enemy.lust && _enemy.lust >= 70 && random(1, 100) <= 40>>
<<if _target === "kira">>
<<if _targetClothing.pussyExposed>>
<<set _attackType to "grope_pussy">>
<<elseif _targetClothing.titsExposed>>
<<set _attackType to "grope_tits">>
<<elseif _targetClothing.assExposed>>
<<set _attackType to "grope_ass">>
<</if>>
<<elseif _target === "player">>
<<if _targetClothing.dickExposed && _enemy.gender === "female">>
<<set _attackType to "grope_dick">>
<</if>>
<</if>>
<</if>>
<</widget>><<set setup.tierConfig to setup.tierConfig || {}>>
<<set setup.tierConfig.dayScalingEnabled to false>>
<<set setup.tierConfig.defaultTier to "standard">>
<<set setup.tierConfig.customChances to null>>
<<set setup.enemyTiers to setup.enemyTiers || {}>>
<<set setup.enemyTiers.standard to {
tierName: "Standard",
tierPrefix: "",
healthMod: 1.0,
damageMod: 1.0,
dodgeMod: 1.0,
armorMod: 1.0,
lustResistanceMod: 1.0,
seduceThresholdMod: 1.0,
aggressionMod: 1.0,
xpMod: 1.0,
lootMod: 1.0,
extraAbilities: [],
abilityUpgrades: {},
canUseSexActions: true,
sexActionChanceMod: 1.0
}>>
<<set setup.enemyTiers.elite to {
tierName: "Elite",
tierPrefix: "Elite ",
healthMod: 1.5,
damageMod: 1.3,
dodgeMod: 1.2,
armorMod: 1.3,
lustResistanceMod: 1.4,
seduceThresholdMod: 1.2,
aggressionMod: 1.2,
xpMod: 2.0,
lootMod: 1.5,
extraAbilities: ["power_strike"],
abilityUpgrades: {
dirty_fighting: "dirty_fighting_plus",
rope_bind: "rope_bind_quick"
},
canUseSexActions: true,
sexActionChanceMod: 1.2
}>>
<<set setup.enemyTiers.champion to {
tierName: "Champion",
tierPrefix: "Champion ",
healthMod: 2.0,
damageMod: 1.5,
dodgeMod: 1.5,
armorMod: 1.5,
lustResistanceMod: 1.8,
seduceThresholdMod: 1.5,
aggressionMod: 1.3,
xpMod: 3.0,
lootMod: 2.0,
extraAbilities: ["power_strike", "battle_cry"],
abilityUpgrades: {
dirty_fighting: "dirty_fighting_plus",
rope_bind: "rope_bind_master",
chain_swing: "chain_swing_brutal"
},
canUseSexActions: true,
sexActionChanceMod: 1.4
}>>
<<set setup.enemyTiers.boss to {
tierName: "Boss",
tierPrefix: "",
healthMod: 3.0,
damageMod: 1.8,
dodgeMod: 1.8,
armorMod: 2.0,
lustResistanceMod: 2.0,
seduceThresholdMod: 2.0,
aggressionMod: 1.5,
xpMod: 5.0,
lootMod: 3.0,
extraAbilities: ["power_strike", "battle_cry", "intimidate"],
abilityUpgrades: {
dirty_fighting: "dirty_fighting_master",
rope_bind: "rope_bind_master",
chain_swing: "chain_swing_brutal",
seduction: "seduction_irresistible"
},
canUseSexActions: true,
sexActionChanceMod: 1.5
}>>
<<set setup.enemyTiers.minion to {
tierName: "Minion",
tierPrefix: "",
healthMod: 0.6,
damageMod: 0.7,
dodgeMod: 0.8,
armorMod: 0.5,
lustResistanceMod: 0.6,
seduceThresholdMod: 0.7,
aggressionMod: 0.8,
xpMod: 0.5,
lootMod: 0.5,
extraAbilities: [],
abilityUpgrades: {},
removeAbilities: true,
canUseSexActions: false,
sexActionChanceMod: 0.5
}>>
<<widget "applyTierToEnemy">>
<<silently>>
<<set _template to _args[0]>>
<<set _tierName to _args[1] || "standard">>
<<set _tier to setup.enemyTiers[_tierName] || setup.enemyTiers.standard>>
<<set _enemy to {
id: _template.id,
name: (_tier.tierPrefix || "") + _template.name,
properName: _template.properName === true ? true : undefined,
class: _template.class,
tier: _tierName,
tierData: _tier,
gender: _template.gender,
visualGroup: _template.visualGroup || null,
visualPerformer: _template.visualPerformer || null,
health: Math.round(_template.baseHealth * _tier.healthMod),
maxHealth: Math.round(_template.baseHealth * _tier.healthMod),
damage: Math.round(_template.baseDamage * _tier.damageMod),
dodge: Math.round(_template.baseDodge * _tier.dodgeMod),
armor: Math.round((_template.baseArmor || 0) * _tier.armorMod),
lustResistance: Math.round((_template.baseLustResistance || 20) * _tier.lustResistanceMod),
seduceThreshold: Math.round((_template.baseSeduceThreshold || 60) * _tier.seduceThresholdMod),
aggression: Math.round((_template.aggression || 50) * _tier.aggressionMod),
lust: _template.lust || 0,
maxLust: _template.maxLust || 100,
position: "standing",
stunned: false,
stunnedTurns: 0,
bound: false,
weapon: _template.weapon || null,
clothing: clone(_template.clothing || {}),
xp: Math.round((_template.baseXp || 10) * _tier.xpMod),
loot: {}
}>>
<<if _template.baseLoot>>
<<for _lootType, _lootRange range _template.baseLoot>>
<<if Array.isArray(_lootRange)>>
<<set _enemy.loot[_lootType] to [
Math.round(_lootRange[0] * _tier.lootMod),
Math.round(_lootRange[1] * _tier.lootMod)
]>>
<<else>>
<<set _enemy.loot[_lootType] to Math.round(_lootRange * _tier.lootMod)>>
<</if>>
<</for>>
<</if>>
<<set _enemy.abilities to []>>
<<if !_tier.removeAbilities && _template.baseAbilities>>
<<for _ability range _template.baseAbilities>>
<<if _tier.abilityUpgrades && _tier.abilityUpgrades[_ability]>>
<<run _enemy.abilities.push(_tier.abilityUpgrades[_ability])>>
<<else>>
<<run _enemy.abilities.push(_ability)>>
<</if>>
<</for>>
<</if>>
<<if _tier.extraAbilities && _tier.extraAbilities.length gt 0>>
<<for _extraAbility range _tier.extraAbilities>>
<<if !_enemy.abilities.includes(_extraAbility)>>
<<run _enemy.abilities.push(_extraAbility)>>
<</if>>
<</for>>
<</if>>
<<set _enemy.maxLust to setup.enemyMaxLust(_enemy)>>
<<set _enemy.canUseSexActions to _tier.canUseSexActions>>
<<set _enemy.sexActionChanceMod to _tier.sexActionChanceMod || 1.0>>
<<if _template.taunt>><<set _enemy.taunt to _template.taunt>><</if>>
<<if _template.defeat>><<set _enemy.defeat to _template.defeat>><</if>>
<<if _template.seduced>><<set _enemy.seduced to _template.seduced>><</if>>
<<if _template.phases>><<set _enemy.phases to clone(_template.phases)>><</if>>
<<if _template.isBoss>><<set _enemy.isBoss to true>><</if>>
<<set _return to _enemy>>
<</silently>>
<</widget>>
<<widget "getTierForDay">>
<<silently>>
<<set _day to _args[0] || $time.day || 1>>
<<set _baseChance to _args[1] || 0>>
<<if !setup.tierConfig || !setup.tierConfig.dayScalingEnabled>>
<<set _return to (setup.tierConfig && setup.tierConfig.defaultTier) || "standard">>
<<else>>
<<if _day >= 6>>
<<set _roll to random(1, 100) + _baseChance>>
<<if _roll >= 80>>
<<set _return to "champion">>
<<elseif _roll >= 40>>
<<set _return to "elite">>
<<else>>
<<set _return to "standard">>
<</if>>
<<elseif _day >= 4>>
<<set _roll to random(1, 100) + _baseChance>>
<<if _roll >= 90>>
<<set _return to "champion">>
<<elseif _roll >= 40>>
<<set _return to "elite">>
<<else>>
<<set _return to "standard">>
<</if>>
<<elseif _day >= 2>>
<<set _roll to random(1, 100) + _baseChance>>
<<if _roll >= 70>>
<<set _return to "elite">>
<<else>>
<<set _return to "standard">>
<</if>>
<<else>>
<<set _roll to random(1, 100) + _baseChance>>
<<if _roll >= 90>>
<<set _return to "elite">>
<<else>>
<<set _return to "standard">>
<</if>>
<</if>>
<</if>>
<</silently>>
<</widget>><<include "Combat_Enemy_Turn">><<silently>>
<<set setup.enemyPositionConfigs to {}>>
<<set setup.enemyPositionConfigs.standing to {
id: "standing",
name: "Standing",
icon: "muscle",
defenseClass: "position-normal",
tooltip: "Dodges as usual",
blockMod: 0,
parryMod: 0,
canParry: true,
canRiposte: true
}>>
<<set setup.enemyPositionConfigs.kneeling to {
id: "kneeling",
name: "On Knees",
icon: "kneeling",
defenseClass: "position-vulnerable",
tooltip: "Dodges 20% less: easier to hit",
blockMod: -20,
parryMod: -25,
canParry: true,
canRiposte: false
}>>
<<set setup.enemyPositionConfigs.prone_front to {
id: "prone_front",
name: "Face Down",
icon: "prone",
defenseClass: "position-danger",
tooltip: "Dodges 50% less: easier to hit",
blockMod: -50,
parryMod: 0,
canParry: false,
canRiposte: false
}>>
<<set setup.enemyPositionConfigs.prone_back to {
id: "prone_back",
name: "On Back",
icon: "prone",
defenseClass: "position-danger",
tooltip: "Dodges 50% less: easier to hit",
blockMod: -50,
parryMod: 0,
canParry: false,
canRiposte: false
}>>
<<set setup.enemyPositionConfigs.bent_over to {
id: "bent_over",
name: "Bent Over",
icon: "bent-over",
defenseClass: "position-danger",
tooltip: "Dodges 40% less: easier to hit",
blockMod: -40,
parryMod: 0,
canParry: false,
canRiposte: false
}>>
<<set setup.enemyPositionConfigs.pinned to {
id: "pinned",
name: "PINNED",
icon: "pinned",
defenseClass: "position-critical",
tooltip: "Can't dodge; can only struggle to get free",
blockMod: -100,
parryMod: 0,
canParry: false,
canRiposte: false
}>>
<<set setup.enemyPositionLogs to {
worsen: {
kneeling: {
female: "{name} forced to her knees!",
male: "{name} forced to his knees!"
},
prone_front: {
female: "{name} shoved face-down!",
male: "{name} shoved face-down!"
},
prone_back: {
female: "{name} knocked onto her back!",
male: "{name} knocked onto his back!"
},
bent_over: {
female: "{name} bent over!",
male: "{name} bent over!"
},
pinned: {
female: "{name} pinned down!",
male: "{name} pinned down!"
}
},
escape: {
kneeling: {
female: "{name} struggles to her feet!",
male: "{name} struggles to his feet!"
},
prone_front: {
female: "{name} scrambles up!",
male: "{name} scrambles up!"
},
prone_back: {
female: "{name} rolls to her feet!",
male: "{name} rolls to his feet!"
},
bent_over: {
female: "{name} straightens up!",
male: "{name} straightens up!"
},
pinned: {
female: "{name} breaks free!",
male: "{name} breaks free!"
}
},
takedown: {
kneeling: {
female: "{name} dropped to her knees!",
male: "{name} dropped to his knees!"
},
prone_front: {
female: "{name} taken down face-first!",
male: "{name} taken down face-first!"
},
prone_back: {
female: "{name} thrown onto her back!",
male: "{name} thrown onto his back!"
},
bent_over: {
female: "{name} forced bent over!",
male: "{name} forced bent over!"
},
pinned: {
female: "{name} completely pinned!",
male: "{name} completely pinned!"
}
}
}>>
<</silently>>
<<widget "logEnemyPositionChange">>
<<set _lepIdx to _args[0] || $combat.currentTarget || 0>>
<<set _lepEnemy to $combat.enemies[_lepIdx]>>
<<set _lepPosition to _args[1] || _lepEnemy.position>>
<<set _lepType to _args[2] || "worsen">>
<<if _lepEnemy && _lepPosition && setup.enemyPositionLogs>>
<<set _lepGender to (_lepEnemy.gender === "female") ? "female" : "male">>
<<set _lepMsgTemplate to setup.enemyPositionLogs[_lepType]?.[_lepPosition]?.[_lepGender]>>
<<if _lepMsgTemplate>>
<<set _lepMsg to _lepMsgTemplate.replace("{name}", _lepEnemy.name)>>
<<set _lepIcon to setup.enemyPositionConfigs?.[_lepPosition]?.icon || "hazard-sign">>
<<if $combat.log>>
<<run $combat.log.push({
type: "tactical",
text: _lepMsg,
icon: _lepIcon
})>>
<</if>>
<</if>>
<</if>>
<</widget>>
/* =============================================================================
INIT WIDGET<<widget "initEnemySexDecisionConfig">>
<<set setup.enemySexConfig = {
stripping: {
underwear: {
chance: 80,
lustMin: 30,
description: "Rip/slice underwear when exposed"
},
topFinish: {
chance: 80,
lustMin: 30,
description: "Rip top off / slice bra when top is weak"
},
pantsYank: {
chance: 80,
lustMin: 30,
description: "Yank pants down when bottom is weak"
}
},
positioning: {
exposed: {
chance: 80,
lustMin: 30,
description: "Hair grab, leg sweep, wrist yank, hip throw when exposed and standing"
},
titsOnly: {
chance: 80,
lustMin: 70,
description: "Force position when only tits exposed (high lust)"
}
},
sexActs: {
fuckPussy: {
chance: 80,
lustMin: 0,
description: "Fuck pussy when in vulnerable position (prone/bent over/pinned)"
},
fuckAss: {
chance: 80,
lustMin: 0,
description: "Fuck ass when prone_front or bent_over"
},
forcedOral: {
chance: 80,
lustMin: 30,
description: "Forced oral when kneeling"
},
gropePussy: {
chance: 80,
lustMin: 0,
description: "Grope exposed pussy"
},
gropeAss: {
chance: 80,
lustMin: 0,
description: "Grope exposed ass"
},
gropeTits: {
chance: 100,
lustMin: 0,
description: "Grope exposed tits (fallback - always happens)"
},
assSlap: {
chance: 80,
lustMin: 0,
description: "Quick humiliation slap on exposed ass"
},
gropeOpportunity: {
chance: 50,
lustMin: 0,
description: "Something of hers is bare and he can't take her yet: he gropes it before he goes on stripping or taking her down (owner Q25 = B, 2026-10-03: groping more often than sex)"
}
},
weapons: {
beltWhip: {
chance: 80,
lustMin: 0,
description: "Belt whip humiliation when tits or ass exposed"
},
chainChoke: {
chance: 80,
lustMin: 30,
description: "Chain choke or bind"
},
ridingCrop: {
chance: 80,
lustMin: 0,
description: "Riding crop attacks on exposed areas"
},
ropeBind: {
chance: 80,
lustMin: 30,
description: "Rope bind wrists/ankles or leash"
}
},
combos: {
whipCombo: {
chance: 80,
lustMin: 30,
description: "Follow-up after belt/crop hit"
},
grabCombo: {
chance: 80,
lustMin: 0,
description: "Sexual follow-up after grab/position"
},
stunCombo: {
chance: 80,
lustMin: 0,
description: "Attack when Kira has 3+ welts (stunned)"
},
boundCombo: {
chance: 80,
lustMin: 30,
description: "Attack when wrists are bound"
},
leashedCombo: {
chance: 80,
lustMin: 30,
description: "Pull into position using leash"
},
anklesBoundCombo: {
chance: 80,
lustMin: 0,
description: "Easy target when ankles bound"
}
}
}>>
<</widget>><<widget "initMaleAssaultConfig">>
<<set setup.maleAssaultConfig to {
lustThresholds: {
patient: { max: 49, stripChance: 0 },
eager: { min: 50, max: 69, stripChance: 45 },
urgent: { min: 70, max: 89, stripChance: 60 },
desperate: { min: 90, stripChance: 80, canShoveUnderwearAside: true }
},
positionMods: {
standing: {
stripChance: 0,
stripDamage: 0,
stripTargets: ["top", "bottom"],
sexActions: ["grope_tits", "grope_ass", "grope_pussy"]
},
kneeling: {
stripChance: 15,
stripDamage: 25,
stripTargets: ["top"],
sexActions: ["forced_oral", "grope_tits"]
},
bent_over: {
stripChance: 25,
stripDamage: 40,
stripTargets: ["bottom", "underwear"],
sexActions: ["fuck_pussy", "fuck_ass", "grope_ass"]
},
prone_back: {
stripChance: 30,
stripDamage: 50,
stripTargets: ["any"],
sexActions: ["fuck_pussy", "mount", "grope_tits", "grope_pussy", "grope_ass"]
},
prone_front: {
stripChance: 20,
stripDamage: 35,
stripTargets: ["bottom", "underwear"],
sexActions: ["fuck_ass", "fuck_pussy"]
},
pinned: {
stripChance: 40,
stripDamage: 75,
stripTargets: ["any"],
sexActions: ["all"]
}
},
boundMods: {
wristsBound: { stripChance: 20, stripDamage: 30 },
anklesBound: { stripChance: 10, stripDamage: 15 },
bothBound: { stripChance: 40, stripDamage: 50 },
leashed: { stripChance: 15, stripDamage: 20 }
},
weaponMods: {
knife: { stripChance: 25, stripDamage: 40, canInstantExpose: true, dropOnExpose: true },
belt: { stripChance: 15, stripDamage: 20, underwearBonus: 20, dropOnExpose: false },
chain: { stripChance: 10, stripDamage: 15, canBindAndStrip: true, dropOnExpose: false },
crop: { stripChance: 5, stripDamage: 10, positionForce: true, dropOnExpose: false },
rope: { stripChance: 0, stripDamage: 5, boundBonus: 40, dropOnExpose: false },
pipe: { stripChance: 5, stripDamage: 10, dropOnExpose: true },
fists: { stripChance: 0, stripDamage: 0, dropOnExpose: false }
},
kiraLustMods: {
calm: { max: 39, stripResist: 0, desc: "Fighting hard" },
aroused: { min: 40, max: 59, stripResist: 5, desc: "Slightly distracted" },
distracted: { min: 60, max: 79, stripResist: 15, desc: "Distracted by arousal" },
overwhelmed: { min: 80, stripResist: 25, desc: "Too aroused to resist" }
},
exposedDebuffs: {
accuracy: -15,
defense: -10,
speed: -5
},
frustration: {
lustBonus: 10,
stripDamageBonus: 20,
duration: 1
},
failedStripTaunt: {
chance: 40,
damageThreshold: 15,
enrageChance: 50,
lustBonus: 15,
damageBonus: 20,
duration: 2
},
knockdownCombos: {
leg_sweep: { stripBonus: 30, sexBonus: 20, duration: 1 },
hip_throw: { stripBonus: 40, sexBonus: 30, duration: 1 },
hair_grab_force: { stripBonus: 25, sexBonus: 25, duration: 1 },
wrist_yank: { stripBonus: 20, sexBonus: 15, duration: 1 },
stun: { stripBonus: 50, sexBonus: 40, duration: 0 }
},
cooperation: {
holdAndStrip: { stripBonus: 50, guaranteed: true, requiresHold: true },
forceAndFuck: { sexBonus: 40, requiresPosition: true },
spitRoast: { requiresProne: true, requiresTwoMales: true },
pinDown: { fullAccess: true, accuracyBonus: 30, groupTakedown: { pinDown: 50, hipThrow: 50 } }
},
clothingStates: {
intact: { min: 76, max: 100 },
damaged: { min: 51, max: 75 },
revealing: { min: 26, max: 50 },
destroyed: { min: 0, max: 25 }
},
maleArousalIcons: {
normal: { min: 0, max: 29, icon: null, tooltip: null },
aroused: { min: 30, max: 59, icon: "high-arousal", tooltip: "Visibly Aroused - hard cock showing", cssClass: "male-aroused" },
intent: { min: 60, max: 89, icon: "eye-target", tooltip: "Sexual Intent - targeting Kira", cssClass: "sexual-intent" },
desperate: { min: 90, icon: "desperate", tooltip: "Desperate (lust 90+): +25% to his moves on Kira, 80% strip chance, shoves torn panties aside", cssClass: "male-desperate" },
exposed: { icon: "hazard-sign", tooltip: "Cock Out - ready to assault Kira; -15 accuracy, +10 to hit him", cssClass: "male-exposed" }
}
}>>
<</widget>>
<<widget "applyExposedDebuffs">>
<<set _idx to _args[0]>>
<<set _enemy to $combat.enemies[_idx]>>
<<if _enemy && _enemy.clothing && _enemy.clothing.dickExposed>>
<<run setup.applyExposedDebuffs(_enemy)>>
<</if>>
<</widget>>
<<widget "enemyExposeSelf">>
<<set _idx to _args[0]>>
<<set _displayNarrative to (_args[1] !== false)>>
<<set _enemy to $combat.enemies[_idx]>>
<<set _exposeResult to { success: false, droppedWeapon: null, narrative: null }>>
<<if _enemy && _enemy.gender === "male">>
<<if !_enemy.clothing>>
<<set _enemy.clothing to { dickExposed: false }>>
<</if>>
<<if !$combat.enemies[_idx].clothing>>
<<set $combat.enemies[_idx].clothing to { dickExposed: false }>>
<</if>>
<<set _enemy.clothing.dickExposed to true>>
<<set $combat.enemies[_idx].clothing.dickExposed to true>>
<<set _weaponCfg to setup.maleAssaultConfig.weaponMods>>
<<set _weaponKey to "fists">>
<<if _enemy.weapon>>
<<switch _enemy.weapon>>
<<case "combat knife" "rusty_shiv">><<set _weaponKey to "knife">>
<<case "leather_belt">><<set _weaponKey to "belt">>
<<case "chain">><<set _weaponKey to "chain">>
<<case "riding_crop" "whip">><<set _weaponKey to "crop">>
<<case "pipe">><<set _weaponKey to "pipe">>
<</switch>>
<<if _weaponCfg[_weaponKey] && _weaponCfg[_weaponKey].dropOnExpose>>
<<set _exposeResult.droppedWeapon to _enemy.weapon>>
<<set _enemy.weapon to null>>
<<set _enemy.weaponDropped to true>>
<</if>>
<</if>>
<<set $combat.enemies[_idx] to _enemy>>
<<applyExposedDebuffs _idx>>
<<if _enemy.lust >= 90>>
<<set _exposeResult.narrative to "male_expose_desperate">>
<<else>>
<<set _exposeResult.narrative to "male_expose_eager">>
<</if>>
<<if _exposeResult.droppedWeapon>>
<<set _exposeResult.narrative to "male_expose_weapon_drop">>
<</if>>
<<set _exposeResult.success to true>>
<<if _displayNarrative>>
<<displayMaleExpose _exposeResult>>
<<checkAndDisplayFirstTime "see_dick">>
<</if>>
<</if>>
<</widget>>
<<widget "enemyStripAttempt">>
<<set _enemy to _args[0]>>
<<set _cfg to setup.maleAssaultConfig>>
<<set _c to $clothing.kira>>
<<set _pos to $combat.positions.kira || "standing">>
<<set _stripResult to {
shouldStrip: false,
target: null,
action: null,
successChance: 0,
damage: 0,
narrative: null,
modifiers: {}
}>>
<<set _lustThresholds to _cfg.lustThresholds>>
<<set _enemyLust to _enemy.lust || 0>>
<<if _enemyLust < 50>>
<<set _baseStripChance to 0>>
<<elseif _enemyLust < 70>>
<<set _baseStripChance to _lustThresholds.eager.stripChance>>
<<elseif _enemyLust < 90>>
<<set _baseStripChance to _lustThresholds.urgent.stripChance>>
<<else>>
<<set _baseStripChance to _lustThresholds.desperate.stripChance>>
<</if>>
<<if _baseStripChance <= 0>>
<<else>>
<<set _posCfg to _cfg.positionMods[_pos] || _cfg.positionMods.standing>>
<<set _posChanceMod to _posCfg.stripChance || 0>>
<<set _posDamageMod to _posCfg.stripDamage || 0>>
<<set _validTargets to _posCfg.stripTargets || ["top", "bottom"]>>
<<set _boundMod to 0>>
<<set _boundDamageMod to 0>>
<<if $combat.kiraWristsBound>>
<<set _boundMod to _boundMod + _cfg.boundMods.wristsBound.stripChance>>
<<set _boundDamageMod to _boundDamageMod + _cfg.boundMods.wristsBound.stripDamage>>
<</if>>
<<if $combat.kiraAnklesBound>>
<<set _boundMod to _boundMod + _cfg.boundMods.anklesBound.stripChance>>
<<set _boundDamageMod to _boundDamageMod + _cfg.boundMods.anklesBound.stripDamage>>
<</if>>
<<if $combat.kiraLeashed>>
<<set _boundMod to _boundMod + _cfg.boundMods.leashed.stripChance>>
<<set _boundDamageMod to _boundDamageMod + _cfg.boundMods.leashed.stripDamage>>
<</if>>
<<set _weaponMod to 0>>
<<set _weaponDamageMod to 0>>
<<set _weaponType to "hands">>
<<if _enemy.weapon>>
<<switch _enemy.weapon>>
<<case "combat knife" "rusty_shiv">>
<<set _weaponMod to _cfg.weaponMods.knife.stripChance>>
<<set _weaponDamageMod to _cfg.weaponMods.knife.stripDamage>>
<<set _weaponType to "knife">>
<<case "leather_belt">>
<<set _weaponMod to _cfg.weaponMods.belt.stripChance>>
<<set _weaponDamageMod to _cfg.weaponMods.belt.stripDamage>>
<<set _weaponType to "belt">>
<<case "chain">>
<<set _weaponMod to _cfg.weaponMods.chain.stripChance>>
<<set _weaponDamageMod to _cfg.weaponMods.chain.stripDamage>>
<<set _weaponType to "chain">>
<<case "riding_crop" "whip">>
<<set _weaponMod to _cfg.weaponMods.crop.stripChance>>
<<set _weaponDamageMod to _cfg.weaponMods.crop.stripDamage>>
<<set _weaponType to "crop">>
<</switch>>
<</if>>
<<set _kiraLust to ($companions[0] && $companions[0].lust) || 0>>
<<set _kiraLustMod to 0>>
<<if _kiraLust >= 80>>
<<set _kiraLustMod to _cfg.kiraLustMods.overwhelmed.stripResist>>
<<elseif _kiraLust >= 60>>
<<set _kiraLustMod to _cfg.kiraLustMods.distracted.stripResist>>
<<elseif _kiraLust >= 40>>
<<set _kiraLustMod to _cfg.kiraLustMods.aroused.stripResist>>
<</if>>
<<set _totalChanceMod to _posChanceMod + _boundMod + _weaponMod + _kiraLustMod>>
<<set _totalDamageMod to _posDamageMod + _boundDamageMod + _weaponDamageMod + setup.frustrationStripBonus(_enemy)>>
<<set _finalChance to Math.min(95, _baseStripChance + _totalChanceMod)>>
<<set _baseDamage to 25>>
<<set _finalDamage to Math.min(100, _baseDamage + _totalDamageMod)>>
<<set _stripResult.modifiers to {
base: _baseStripChance,
position: _posChanceMod,
bound: _boundMod,
weapon: _weaponMod,
kiraLust: _kiraLustMod,
total: _finalChance
}>>
<<set _targetPriority to []>>
<<set _underwearAvailable to (_c.bottom <= 0 && _c.underwear > 0 && !_c.pussyExposed)>>
<<set _bottomAvailable to (_c.bottom > 0 && !_c.pussyExposed)>>
<<set _topAvailable to (_c.top > 0 && !_c.titsExposed)>>
<<if _validTargets.includes("any")>>
<<if _underwearAvailable>><<run _targetPriority.push("underwear")>><</if>>
<<if _bottomAvailable>><<run _targetPriority.push("bottom")>><</if>>
<<if _topAvailable>><<run _targetPriority.push("top")>><</if>>
<<else>>
<<if _validTargets.includes("underwear") && _underwearAvailable>>
<<run _targetPriority.push("underwear")>>
<</if>>
<<if _validTargets.includes("bottom") && _bottomAvailable>>
<<run _targetPriority.push("bottom")>>
<</if>>
<<if _validTargets.includes("top") && _topAvailable>>
<<run _targetPriority.push("top")>>
<</if>>
<</if>>
<<if _targetPriority.length > 0>>
<<set _stripResult.target to _targetPriority[0]>>
<<set _stripResult.shouldStrip to true>>
<<set _stripResult.successChance to _finalChance>>
<<set _stripResult.damage to _finalDamage>>
<<switch _stripResult.target>>
<<case "underwear">>
<<if _weaponType === "knife">>
<<set _stripResult.action to "slice_underwear">>
<<set _stripResult.narrative to "strip_knife_underwear">>
<<elseif _weaponType === "belt">>
<<set _stripResult.action to "belt_yank_underwear">>
<<set _stripResult.narrative to "strip_belt_underwear">>
<<else>>
<<set _stripResult.action to "rip_underwear">>
<<set _stripResult.narrative to "strip_" + _pos + "_underwear">>
<</if>>
<<case "bottom">>
<<if _weaponType === "knife">>
<<set _stripResult.action to "slice_pants">>
<<set _stripResult.narrative to "strip_knife_bottom">>
<<elseif _weaponType === "belt">>
<<set _stripResult.action to "belt_yank_pants">>
<<set _stripResult.narrative to "strip_belt_bottom">>
<<else>>
<<set _stripResult.action to "pants_yank">>
<<set _stripResult.narrative to "strip_" + _pos + "_bottom">>
<</if>>
<<case "top">>
<<if _weaponType === "knife">>
<<set _stripResult.action to "slice_top">>
<<set _stripResult.narrative to "strip_knife_top">>
<<else>>
<<set _stripResult.action to "rip_top_off">>
<<set _stripResult.narrative to "strip_" + _pos + "_top">>
<</if>>
<</switch>>
<</if>>
<</if>>
<</widget>>
<<widget "executeStripAttempt">>
<<set _result to _args[0]>>
<<set _esaEnemy to _args[1] || null>>
<<set _stripSuccess to false>>
<<set _clothingDestroyed to false>>
<<if _result && _result.shouldStrip && _result.target>>
<<set _roll to random(1, 100)>>
<<if _roll <= _result.successChance>>
<<set _stripSuccess to true>>
<<displayStripNarrative _esaEnemy _result.target true>>
<<switch _result.target>>
<<case "top">>
<<set $clothing.kira.top to Math.max(0, $clothing.kira.top - _result.damage)>>
<<if $clothing.kira.top <= 0>>
<<set $clothing.kira.titsExposed to true>>
<<set _clothingDestroyed to true>>
<<displayExposureReaction "tits">>
<</if>>
<<case "bottom">>
<<set $clothing.kira.bottom to Math.max(0, $clothing.kira.bottom - _result.damage)>>
<<if $clothing.kira.bottom <= 0>>
<<set $clothing.kira.underwearExposed to true>>
<<set _clothingDestroyed to true>>
<<displayExposureReaction "underwear">>
<</if>>
<<case "underwear">>
<<set $clothing.kira.underwear to Math.max(0, $clothing.kira.underwear - _result.damage)>>
<<if $clothing.kira.underwear <= 0>>
<<set $clothing.kira.pussyExposed to true>>
<<set $clothing.kira.assExposed to true>>
<<set _clothingDestroyed to true>>
<<displayExposureReaction "pussy">>
<</if>>
<</switch>>
<<else>>
<<displayStripNarrative _esaEnemy _result.target false>>
<</if>>
<</if>>
<</widget>>
<<widget "checkCooperation">>
<<set _coopResult to {
canCoop: false,
coopType: null,
helperIdx: -1,
narrativeKey: null
}>>
<<set _cfg to setup.maleAssaultConfig.cooperation>>
<<set _aliveEnemies to []>>
<<for _i, _e range $combat.enemies>>
<<if setup.enemyCanHelpNow(_e)>>
<<run _aliveEnemies.push({idx: _i, enemy: _e})>>
<</if>>
<</for>>
<<if _aliveEnemies.length >= 2>>
<<set _maleCount to 0>>
<<set _holdingEnemy to null>>
<<set _holdingIdx to -1>>
<<for _data range _aliveEnemies>>
<<if _data.enemy.gender === "male">>
<<set _maleCount to _maleCount + 1>>
<</if>>
<<if setup.enemyHoldsKira(_data.enemy)>>
<<set _holdingEnemy to _data.enemy>>
<<set _holdingIdx to _data.idx>>
<</if>>
<</for>>
<<if _holdingEnemy && _cfg.holdAndStrip>>
<<set _coopResult.canCoop to true>>
<<set _coopResult.coopType to "hold_and_strip">>
<<set _coopResult.helperIdx to _holdingIdx>>
<<set _coopResult.narrativeKey to "coop_hold_and_strip">>
<<set _coopResult.stripBonus to _cfg.holdAndStrip.stripBonus>>
<<set _coopResult.guaranteed to _cfg.holdAndStrip.guaranteed>>
<<elseif _maleCount >= 2 && _cfg.spitRoast && ["prone_back", "prone_front", "kneeling"].includes($combat.positions.kira || "standing")>>
<<set _coopResult.canCoop to true>>
<<set _coopResult.coopType to "spit_roast">>
<<set _coopResult.narrativeKey to "coop_spit_roast_start">>
<<elseif _aliveEnemies.length >= 2 && _cfg.pinDown>>
<<set _coopResult.canCoop to true>>
<<set _coopResult.coopType to "pin_down">>
<<set _coopResult.narrativeKey to "coop_pin_down">>
<<set _coopResult.accuracyBonus to _cfg.pinDown.accuracyBonus>>
<</if>>
<</if>>
<</widget>>
<<widget "getMaleAssaultNarrative">>
<<set _maPoolKey to _args[0]>>
<<set _maFallback to _args[1] || "">>
<<set _maNarrative to "">>
<<if setup.maleAssaultNarrative && setup.maleAssaultNarrative[_maPoolKey]>>
<<set _pool to setup.maleAssaultNarrative[_maPoolKey]>>
<<if Array.isArray(_pool) && _pool.length > 0>>
<<set _maNarrative to _pool[random(0, _pool.length - 1)]>>
<<elseif typeof _pool === "string">>
<<set _maNarrative to _pool>>
<</if>>
<</if>>
<<if _maNarrative === "">>
<<set _maNarrative to _maFallback>>
<</if>>
<</widget>>
<<widget "displayStripNarrative">>
<<set _dsnEnemy to _args[0]>>
<<set _dsnTarget to _args[1] || "bottom">>
<<set _dsnSuccess to _args[2] !== false>>
<<set _pos to $combat.positions.kira || "standing">>
<<if _dsnSuccess>>
<<set _poolKey to null>>
<<set _fallbackNarrative to "He tears at her clothing.">>
<<if _dsnEnemy && _dsnEnemy.weapon>>
<<switch _dsnEnemy.weapon>>
<<case "combat knife" "rusty_shiv">>
<<set _poolKey to "strip_knife_" + _dsnTarget>>
<<set _fallbackNarrative to "The knife slices through her clothing.">>
<<case "leather_belt">>
<<if _dsnTarget === "bottom" || _dsnTarget === "underwear">>
<<set _poolKey to "strip_belt_" + _dsnTarget>>
<<set _fallbackNarrative to "The belt hooks and tears her clothing away.">>
<</if>>
<</switch>>
<</if>>
<<if !_poolKey>>
<<if _pos === "prone_back">>
<<set _poolKey to "strip_prone_back_" + _dsnTarget>>
<<elseif _pos === "prone_front">>
<<set _poolKey to "strip_prone_front_" + _dsnTarget>>
<<elseif _pos === "prone">>
<<set _poolKey to "strip_prone_" + _dsnTarget>>
<<elseif _pos === "pinned">>
<<set _poolKey to "strip_pinned_" + _dsnTarget>>
<<elseif _pos === "bent_over">>
<<set _poolKey to "strip_bent_over_" + _dsnTarget>>
<<elseif _pos === "kneeling">>
<<set _poolKey to "strip_kneeling_" + _dsnTarget>>
<<else>>
<<set _poolKey to "strip_standing_" + _dsnTarget>>
<</if>>
<</if>>
<<getMaleAssaultNarrative _poolKey "">>
<<if _maNarrative === "">>
<<if _pos === "pinned">>
<<getMaleAssaultNarrative "strip_pinned" _fallbackNarrative>>
<<else>>
<<set _maNarrative to _fallbackNarrative>>
<</if>>
<</if>>
<div class="strip-narrative"><<print _maNarrative>></div>
<<else>>
<<checkFailedStripTaunt _dsnEnemy>>
<</if>>
<</widget>>
<<widget "displayExposureReaction">>
<<set _derPart to _args[0]>>
<<set _poolKey to null>>
<<switch _derPart>>
<<case "tits" "chest" "top">>
<<set _poolKey to "tits_now_exposed">>
<<case "pussy" "vagina" "cunt">>
<<set _poolKey to "pussy_now_exposed">>
<<case "underwear" "panties">>
<<set _poolKey to "underwear_now_exposed">>
<</switch>>
<<if _poolKey>>
<<getMaleAssaultNarrative _poolKey "">>
<<if _maNarrative !== "">>
<div class="exposure-narrative"><<print _maNarrative>></div>
<</if>>
<</if>>
<</widget>>
<<widget "displayMaleExpose">>
<<set _dmeResult to _args[0]>>
<<if _dmeResult && _dmeResult.success>>
<<set _exposePool to _dmeResult.narrative || "male_expose_eager">>
<<getMaleAssaultNarrative _exposePool "He pulls out his cock.">>
<div class="male-expose-narrative"><<print _maNarrative>></div>
<</if>>
<</widget>>
<<widget "checkAndDisplayFirstTime">>
<<set _cdftEvent to _args[0]>>
<<if !$combat.kiraFirsts>>
<<set $combat.kiraFirsts to {
seenDick: false,
pussyTouched: false,
penetrated: false,
oralUsed: false
}>>
<</if>>
<<set _poolKey to null>>
<<set _shouldDisplay to false>>
<<switch _cdftEvent>>
<<case "see_dick">>
<<if !$combat.kiraFirsts.seenDick>>
<<set $combat.kiraFirsts.seenDick to true>>
<<set _poolKey to "kira_first_see_enemy_dick">>
<<set _shouldDisplay to true>>
<</if>>
<<case "pussy_touch">>
<<if !$combat.kiraFirsts.pussyTouched>>
<<set $combat.kiraFirsts.pussyTouched to true>>
<<set _poolKey to "kira_first_pussy_touch">>
<<set _shouldDisplay to true>>
<</if>>
<<case "penetration">>
<<if !$combat.kiraFirsts.penetrated>>
<<set $combat.kiraFirsts.penetrated to true>>
<<set _poolKey to "kira_first_penetration_attempt">>
<<set _shouldDisplay to true>>
<</if>>
<<case "oral">>
<<if !$combat.kiraFirsts.oralUsed>>
<<set $combat.kiraFirsts.oralUsed to true>>
<<set _poolKey to "kira_first_oral">>
<<set _shouldDisplay to true>>
<</if>>
<</switch>>
<<if _shouldDisplay && _poolKey>>
<<getMaleAssaultNarrative _poolKey "">>
<<if _maNarrative !== "">>
<div class="first-time-reaction"><<print _maNarrative>></div>
<</if>>
<</if>>
<</widget>>
<<widget "displayCooperationNarrative">>
<<set _dcnResult to _args[0]>>
<<if _dcnResult && _dcnResult.canCoop && _dcnResult.narrativeKey>>
<<getMaleAssaultNarrative _dcnResult.narrativeKey "">>
<<if _maNarrative !== "">>
<div class="cooperation-narrative"><<print _maNarrative>></div>
<</if>>
<</if>>
<</widget>>
<<widget "checkFailedStripTaunt">>
<<set _cftEnemy to _args[0]>>
<<set _cftDamage to Number(_args[1]) || 0>>
<<set _cftCfg to setup.assaultCfg("failedStripTaunt")>>
<<set _pos to $combat.positions.kira || "standing">>
<<set _canTaunt to (_pos === "standing" || _pos === "kneeling") && !$combat.kiraMouthOccupied && _cftDamage < (_cftCfg.damageThreshold || 15)>>
<<if _canTaunt && random(1, 100) <= (_cftCfg.chance || 40)>>
<<getMaleAssaultNarrative "strip_fail_taunt" "'That all you got?'">>
<div class="kira-taunt"><<print _maNarrative>></div>
<<if _cftEnemy && random(1, 100) <= (_cftCfg.enrageChance || 50)>>
<<getMaleAssaultNarrative "enemy_enraged_by_taunt" "His face reddens with anger.">>
<div class="enemy-enraged"><<print _maNarrative>></div>
<<run setup.enrageEnemy(_cftEnemy)>>
<div class="enemy-enraged-effect"><<print _cftEnemy.name>>: <<print setup.enrageText(_cftEnemy)>></div>
<</if>>
<</if>>
<</widget>><<widget "initEncounterPools">>
<<silently>>
<<run setup.encounterPools = {
"default": {
templates: [
"grunt", "scout", "brute", "blade",
"slaver", "binder", "chain", "machete",
"huntress", "vixen", "whip", "amazon",
"binder_f", "chain_f", "temptress", "slaver_f",
"angharad", "cheedo", "dag", "toast"
],
maleWeight: 0.5, femaleWeight: 0.5,
tierBias: null, eliteBonusChance: 0,
visualGroupWeights: null,
encounterTypeWeights: null
},
"raider_camp": {
templates: null, maleWeight: 0.4, femaleWeight: 0.6,
visualGroupWeights: {
predatory: 0.30, feral: 0.25,
leader: 0.10, grunt: 0.10, calculating: 0.10,
brute: 0.05, elite: 0.05, queen: 0.05
},
tierBias: null, eliteBonusChance: 0,
encounterTypeWeights: null
},
"convoy": {
templates: null, maleWeight: 0.65, femaleWeight: 0.35,
visualGroupWeights: {
grunt: 0.30, calculating: 0.25,
leader: 0.10, brute: 0.10, predatory: 0.10,
feral: 0.05, elite: 0.05, queen: 0.05
},
tierBias: null, eliteBonusChance: 0,
encounterTypeWeights: null
},
"_region_central": {
templates: null, maleWeight: 0.5, femaleWeight: 0.5,
visualGroupWeights: null,
tierBias: null, eliteBonusChance: 0,
encounterTypeWeights: null
},
"_region_western": {
templates: null, maleWeight: 0.55, femaleWeight: 0.45,
visualGroupWeights: {
grunt: 0.20, calculating: 0.20,
feral: 0.15, predatory: 0.15,
leader: 0.10, brute: 0.10,
elite: 0.05, queen: 0.05
},
tierBias: null, eliteBonusChance: 0,
encounterTypeWeights: null
},
"_region_eastern": {
templates: null, maleWeight: 0.5, femaleWeight: 0.5,
visualGroupWeights: {
calculating: 0.22, leader: 0.18,
predatory: 0.15, feral: 0.12,
grunt: 0.12, brute: 0.10,
elite: 0.06, queen: 0.05
},
tierBias: null, eliteBonusChance: 0,
encounterTypeWeights: null
},
"_region_northern": {
templates: null, maleWeight: 0.6, femaleWeight: 0.4,
visualGroupWeights: {
calculating: 0.20, brute: 0.18, leader: 0.18,
grunt: 0.15, predatory: 0.10, feral: 0.08,
elite: 0.06, queen: 0.05
},
tierBias: null, eliteBonusChance: 0,
encounterTypeWeights: null
},
"_region_southern": {
templates: null, maleWeight: 0.55, femaleWeight: 0.45,
visualGroupWeights: {
feral: 0.22, brute: 0.20,
leader: 0.15, predatory: 0.12,
calculating: 0.10, grunt: 0.10,
elite: 0.06, queen: 0.05
},
tierBias: null, eliteBonusChance: 0,
encounterTypeWeights: null
},
"_terrain_forest": {
templates: null, maleWeight: 0.45, femaleWeight: 0.55,
visualGroupWeights: {
feral: 0.25, predatory: 0.20,
grunt: 0.12, calculating: 0.12, brute: 0.10, leader: 0.10,
elite: 0.06, queen: 0.05
},
tierBias: null, eliteBonusChance: 0,
encounterTypeWeights: null
},
"_terrain_reclaimed": {
templates: null, maleWeight: 0.5, femaleWeight: 0.5,
visualGroupWeights: null,
tierBias: null, eliteBonusChance: 0,
encounterTypeWeights: null
},
"_terrain_urban": {
templates: null, maleWeight: 0.6, femaleWeight: 0.4,
visualGroupWeights: {
calculating: 0.22, brute: 0.20, leader: 0.18,
grunt: 0.15, predatory: 0.10, feral: 0.08,
elite: 0.04, queen: 0.03
},
tierBias: null, eliteBonusChance: 0,
encounterTypeWeights: null
},
"_terrain_ruins": {
templates: null, maleWeight: 0.55, femaleWeight: 0.45,
visualGroupWeights: {
feral: 0.25, grunt: 0.22,
predatory: 0.15, calculating: 0.12, brute: 0.10, leader: 0.08,
elite: 0.04, queen: 0.04
},
tierBias: null, eliteBonusChance: 0,
encounterTypeWeights: null
},
"_terrain_highway": {
templates: null, maleWeight: 0.6, femaleWeight: 0.4,
visualGroupWeights: {
grunt: 0.28, calculating: 0.22,
leader: 0.12, brute: 0.10, predatory: 0.10, feral: 0.08,
elite: 0.05, queen: 0.05
},
tierBias: null, eliteBonusChance: 0,
encounterTypeWeights: null
}
}>>
<<run setup.encounterPoolFallback = setup.encounterPools.default>>
<<validateEncounterPools>>
<</silently>>
<</widget>>
<<widget "validateEncounterPools">>
<<silently>>
<<for _poolKey, _pool range setup.encounterPools>>
<<if !_pool>>
<<run console.error('[encounter-pools] ERROR: pool "' + _poolKey + '" is null/undefined')>>
<<elseif _pool.templates !== null && _pool.templates !== undefined>>
<<if !Array.isArray(_pool.templates)>>
<<run console.error('[encounter-pools] ERROR: pool "' + _poolKey + '" templates is not an array or null')>>
<<elseif _pool.templates.length === 0>>
<<run console.warn('[encounter-pools] WARN: pool "' + _poolKey + '" has empty templates array')>>
<<else>>
<<for _vepKey range _pool.templates>>
<<if !setup.raiderTemplates || !setup.raiderTemplates[_vepKey]>>
<<run console.error('[encounter-pools] ERROR: pool "' + _poolKey + '" references unknown template "' + _vepKey + '"')>>
<</if>>
<</for>>
<</if>>
<</if>>
<<if _pool && _pool.visualGroupWeights !== null && _pool.visualGroupWeights !== undefined>>
<<if typeof _pool.visualGroupWeights !== "object" || Array.isArray(_pool.visualGroupWeights)>>
<<run console.error('[encounter-pools] ERROR: pool "' + _poolKey + '" visualGroupWeights must be an object or null')>>
<<else>>
<<for _vgwKey, _vgwVal range _pool.visualGroupWeights>>
<<if typeof _vgwVal !== "number" || _vgwVal lt 0>>
<<run console.error('[encounter-pools] ERROR: pool "' + _poolKey + '" visualGroupWeights["' + _vgwKey + '"] must be a non-negative number, got ' + _vgwVal)>>
<</if>>
<</for>>
<</if>>
<</if>>
<</for>>
<</silently>>
<</widget>>
<<widget "resolveEncounterPool">>
<<silently>>
<<set _repReqId to _args[0] || null>>
<<set _repPool to null>>
<<if _repReqId && setup.encounterPools[_repReqId]>>
<<set _repPool to setup.encounterPools[_repReqId]>>
<<elseif State.variables.journey && State.variables.journey.active !== false && State.variables.journey.currentPool && setup.encounterPools[State.variables.journey.currentPool]>>
<<set _repPool to setup.encounterPools[State.variables.journey.currentPool]>>
<<elseif State.variables.currentLocation && setup.encounterPools[State.variables.currentLocation]>>
<<set _repPool to setup.encounterPools[State.variables.currentLocation]>>
<<elseif State.variables.journey && State.variables.journey.currentSegment && State.variables.journey.currentSegment.region && setup.encounterPools["_region_" + State.variables.journey.currentSegment.region]>>
<<set _repPool to setup.encounterPools["_region_" + State.variables.journey.currentSegment.region]>>
<<elseif State.variables.journey && State.variables.journey.currentSegment && State.variables.journey.currentSegment.terrain && setup.encounterPools["_terrain_" + State.variables.journey.currentSegment.terrain]>>
<<set _repPool to setup.encounterPools["_terrain_" + State.variables.journey.currentSegment.terrain]>>
<</if>>
<<if !_repPool>>
<<set _repPool to setup.encounterPoolFallback>>
<</if>>
<<set _return to _repPool>>
<</silently>>
<</widget>>
<<widget "filterPoolByGender">>
<<silently>>
<<set _fpgPool to _args[0]>>
<<set _fpgGender to _args[1]>>
<<set _fpgTemplates to _fpgPool.templates || setup.encounterPoolFallback.templates>>
<<set _return to _fpgTemplates.filter(function(t) {
var tmpl = setup.raiderTemplates[t];
return tmpl && tmpl.gender === _fpgGender;
})>>
<</silently>>
<</widget>><<widget "initRaiderConfig">>
<<run setup.raiderTemplates = {
grunt: {
id: "raider_grunt",
name: "Raider",
class: "Grunt",
type: "human",
defaultTier: "standard",
gender: "male",
baseHealth: 40,
baseDamage: 8,
baseDodge: 15,
baseArmor: 0,
baseLustResistance: 30,
baseSeduceThreshold: 50,
aggression: 80,
lust: 0,
maxLust: 100,
weapon: "rusty_pipe",
baseAbilities: [],
statusImmunities: [],
isHuman: true,
clothing: { dickExposed: false },
baseLoot: { scrap: [5, 15], food: [0, 2] },
lootItems: ["scrap metal", "dirty water", "bandage", "sewing kit"],
lootChance: 0.5,
baseXp: 15,
nameStyle: "generated",
visualGroup: "grunt"
},
scout: {
id: "raider_scout",
name: "Raider Scout",
class: "Scout",
type: "human",
defaultTier: "minion",
gender: "male",
baseHealth: 25,
baseDamage: 6,
baseDodge: 35,
baseArmor: 0,
baseLustResistance: 20,
baseSeduceThreshold: 40,
aggression: 60,
lust: 0,
maxLust: 100,
weapon: "combat knife",
baseAbilities: ["quick_strike"],
statusImmunities: [],
isHuman: true,
clothing: { dickExposed: false },
baseLoot: { scrap: [3, 10] },
lootItems: ["dirty water", "raider gear", "sewing kit"],
lootChance: 0.4,
baseXp: 10,
nameStyle: "generated",
visualGroup: "grunt"
},
brute: {
id: "raider_brute",
name: "Raider Brute",
class: "Brute",
type: "human",
defaultTier: "elite",
gender: "male",
baseHealth: 70,
baseDamage: 15,
baseDodge: 5,
baseArmor: 2,
baseLustResistance: 50,
baseSeduceThreshold: 70,
aggression: 90,
lust: 0,
maxLust: 100,
weapon: "baseball_bat",
baseAbilities: ["heavy_strike", "intimidate"],
statusImmunities: ["stun"],
isHuman: true,
clothing: { dickExposed: false },
baseLoot: { scrap: [10, 25], medical: [0, 1] },
lootItems: ["scrap metal", "raider gear", "stimpack", "sewing kit"],
lootChance: 0.6,
baseXp: 25,
nameStyle: "generated",
visualGroup: "brute"
},
slaver: {
id: "raider_slaver",
name: "Raider Slaver",
class: "Slaver",
type: "human",
defaultTier: "standard",
gender: "male",
baseHealth: 45,
baseDamage: 7,
baseDodge: 20,
baseArmor: 0,
baseLustResistance: 25,
baseSeduceThreshold: 55,
aggression: 75,
lust: 0,
maxLust: 100,
weapon: "leather_belt",
baseAbilities: ["dirty_fighting"],
statusImmunities: [],
isHuman: true,
clothing: { dickExposed: false },
baseLoot: { scrap: [5, 12] },
lootItems: ["rope", "scrap cloth", "dirty water", "sewing kit"],
lootChance: 0.5,
baseXp: 18,
nameStyle: "generated",
visualGroup: "calculating"
},
binder: {
id: "raider_binder",
name: "Raider Binder",
class: "Binder",
type: "human",
defaultTier: "standard",
gender: "male",
baseHealth: 35,
baseDamage: 6,
baseDodge: 25,
baseArmor: 0,
baseLustResistance: 20,
baseSeduceThreshold: 45,
aggression: 65,
lust: 0,
maxLust: 100,
weapon: "rope",
baseAbilities: ["rope_bind"],
statusImmunities: [],
isHuman: true,
clothing: { dickExposed: false },
baseLoot: { scrap: [4, 10] },
lootItems: ["rope", "dirty water", "bandage", "sewing kit"],
lootChance: 0.5,
baseXp: 16,
nameStyle: "generated",
visualGroup: "grunt"
},
chain: {
id: "raider_chain",
name: "Chain Raider",
class: "Chain",
type: "human",
defaultTier: "standard",
gender: "male",
baseHealth: 50,
baseDamage: 10,
baseDodge: 15,
baseArmor: 1,
baseLustResistance: 35,
baseSeduceThreshold: 60,
aggression: 85,
lust: 0,
maxLust: 100,
weapon: "chain",
baseAbilities: ["chain_swing", "intimidate"],
statusImmunities: [],
isHuman: true,
clothing: { dickExposed: false },
baseLoot: { scrap: [8, 18] },
lootItems: ["scrap metal", "stimpack", "sewing kit"],
lootChance: 0.5,
baseXp: 20,
nameStyle: "generated",
visualGroup: "brute"
},
machete: {
id: "raider_machete",
name: "Machete Raider",
class: "Machete",
type: "human",
defaultTier: "elite",
gender: "male",
baseHealth: 55,
baseDamage: 14,
baseDodge: 20,
baseArmor: 0,
baseLustResistance: 40,
baseSeduceThreshold: 65,
aggression: 90,
lust: 0,
maxLust: 100,
weapon: "machete",
baseAbilities: ["quick_strike", "dirty_fighting"],
statusImmunities: [],
isHuman: true,
clothing: { dickExposed: false },
baseLoot: { scrap: [10, 20] },
lootItems: ["raider gear", "bandage", "dirty water", "sewing kit"],
lootChance: 0.6,
baseXp: 22,
nameStyle: "generated",
visualGroup: "brute"
},
blade: {
id: "raider_blade",
name: "Blade Raider",
class: "Blade",
type: "human",
defaultTier: "elite",
gender: "male",
baseHealth: 45,
baseDamage: 12,
baseDodge: 30,
baseArmor: 0,
baseLustResistance: 35,
baseSeduceThreshold: 55,
aggression: 85,
lust: 0,
maxLust: 100,
weapon: "dual_knives",
baseAbilities: ["quick_strike", "flurry"],
statusImmunities: [],
isHuman: true,
clothing: { dickExposed: false },
baseLoot: { scrap: [8, 16] },
lootItems: ["combat knife", "raider gear", "bandage", "sewing kit"],
lootChance: 0.55,
baseXp: 20,
nameStyle: "generated",
visualGroup: "calculating"
},
leader: {
id: "raider_leader",
name: "Raider Captain",
class: "Leader",
type: "human",
defaultTier: "champion",
gender: "male",
baseHealth: 100,
baseDamage: 18,
baseDodge: 25,
baseArmor: 3,
baseLustResistance: 60,
baseSeduceThreshold: 80,
aggression: 75,
lust: 0,
maxLust: 100,
weapon: "quality_weapon",
baseAbilities: ["rally_troops", "dirty_fighting", "power_strike"],
statusImmunities: ["fear"],
isHuman: true,
clothing: { dickExposed: false },
baseLoot: { scrap: [20, 40], medical: [1, 3] },
lootItems: ["combat knife", "raider scraps", "weapon part", "sewing kit"],
lootChance: 0.8,
baseXp: 50,
nameStyle: "generated",
visualGroup: "leader"
},
huntress: {
id: "raider_huntress",
name: "Raider Huntress",
class: "Huntress",
type: "human",
defaultTier: "standard",
gender: "female",
baseHealth: 35,
baseDamage: 9,
baseDodge: 25,
baseArmor: 0,
baseLustResistance: 25,
baseSeduceThreshold: 45,
aggression: 70,
lust: 0,
maxLust: 100,
weapon: "combat knife",
baseAbilities: ["quick_strike", "dirty_fighting"],
statusImmunities: [],
isHuman: true,
clothing: {top: 50, bottom: 50, underwear: 0, titsExposed: false, pussyExposed: false, assExposed: false},
baseLoot: { scrap: [5, 12] },
lootItems: ["raider gear", "scrap cloth", "dirty water", "sewing kit"],
lootChance: 0.5,
baseXp: 18,
nameStyle: "generated",
visualGroup: "feral"
},
vixen: {
id: "raider_vixen",
name: "Raider Vixen",
class: "Vixen",
type: "human",
defaultTier: "standard",
gender: "female",
baseHealth: 30,
baseDamage: 7,
baseDodge: 30,
baseArmor: 0,
baseLustResistance: 15,
baseSeduceThreshold: 35,
aggression: 60,
lust: 20,
maxLust: 100,
weapon: "fists",
baseAbilities: ["dirty_fighting", "seductive_taunt"],
statusImmunities: [],
isHuman: true,
clothing: {top: 40, bottom: 40, underwear: 0, titsExposed: false, pussyExposed: false, assExposed: false},
baseLoot: { scrap: [3, 8] },
lootItems: ["dirty water", "stimpack", "sewing kit"],
lootChance: 0.4,
baseXp: 15,
nameStyle: "generated",
visualGroup: "predatory"
},
whip: {
id: "raider_whip",
name: "Whip Raider",
class: "Whip",
type: "human",
defaultTier: "standard",
gender: "female",
baseHealth: 32,
baseDamage: 8,
baseDodge: 25,
baseArmor: 0,
baseLustResistance: 30,
baseSeduceThreshold: 50,
aggression: 70,
lust: 0,
maxLust: 100,
weapon: "leather_belt",
baseAbilities: ["dirty_fighting"],
statusImmunities: [],
isHuman: true,
clothing: {top: 60, bottom: 50, underwear: 0, titsExposed: false, pussyExposed: false, assExposed: false},
baseLoot: { scrap: [4, 10] },
lootItems: ["scrap cloth", "dirty water", "bandage", "sewing kit"],
lootChance: 0.5,
baseXp: 17,
nameStyle: "generated",
visualGroup: "feral"
},
amazon: {
id: "raider_amazon",
name: "Raider Amazon",
class: "Amazon",
type: "human",
defaultTier: "elite",
gender: "female",
baseHealth: 55,
baseDamage: 12,
baseDodge: 20,
baseArmor: 1,
baseLustResistance: 40,
baseSeduceThreshold: 60,
aggression: 85,
lust: 0,
maxLust: 100,
weapon: "machete",
baseAbilities: ["heavy_strike", "intimidate"],
statusImmunities: [],
isHuman: true,
clothing: {top: 70, bottom: 60, underwear: 0, titsExposed: false, pussyExposed: false, assExposed: false},
baseLoot: { scrap: [10, 22], medical: [0, 1] },
lootItems: ["raider gear", "stimpack", "scrap cloth", "sewing kit"],
lootChance: 0.6,
baseXp: 24,
nameStyle: "generated",
visualGroup: "elite"
},
binder_f: {
id: "raider_binder_f",
name: "Raider Binder",
class: "Binder",
type: "human",
defaultTier: "standard",
gender: "female",
baseHealth: 30,
baseDamage: 6,
baseDodge: 28,
baseArmor: 0,
baseLustResistance: 20,
baseSeduceThreshold: 40,
aggression: 65,
lust: 10,
maxLust: 100,
weapon: "rope",
baseAbilities: ["rope_bind"],
statusImmunities: [],
isHuman: true,
clothing: {top: 50, bottom: 45, underwear: 0, titsExposed: false, pussyExposed: false, assExposed: false},
baseLoot: { scrap: [3, 9] },
lootItems: ["rope", "dirty water", "bandage", "sewing kit"],
lootChance: 0.5,
baseXp: 16,
nameStyle: "generated",
visualGroup: "feral"
},
chain_f: {
id: "raider_chain_f",
name: "Chain Raider",
class: "Chain",
type: "human",
defaultTier: "standard",
gender: "female",
baseHealth: 38,
baseDamage: 9,
baseDodge: 20,
baseArmor: 0,
baseLustResistance: 30,
baseSeduceThreshold: 50,
aggression: 75,
lust: 0,
maxLust: 100,
weapon: "chain",
baseAbilities: ["chain_swing", "intimidate"],
statusImmunities: [],
isHuman: true,
clothing: {top: 55, bottom: 50, underwear: 0, titsExposed: false, pussyExposed: false, assExposed: false},
baseLoot: { scrap: [6, 14] },
lootItems: ["scrap metal", "dirty water", "sewing kit"],
lootChance: 0.5,
baseXp: 19,
nameStyle: "generated",
visualGroup: "elite"
},
temptress: {
id: "raider_temptress",
name: "Raider Temptress",
class: "Temptress",
type: "human",
defaultTier: "elite",
gender: "female",
baseHealth: 40,
baseDamage: 8,
baseDodge: 30,
baseArmor: 0,
baseLustResistance: 10,
baseSeduceThreshold: 30,
aggression: 55,
lust: 30,
maxLust: 100,
weapon: "combat knife",
baseAbilities: ["seductive_taunt", "dirty_fighting"],
statusImmunities: [],
isHuman: true,
dealsLustDamage: true,
lustDamage: 10,
clothing: {top: 30, bottom: 30, underwear: 0, titsExposed: false, pussyExposed: false, assExposed: false},
baseLoot: { scrap: [6, 15] },
lootItems: ["stimpack", "dirty water", "scrap cloth", "sewing kit"],
lootChance: 0.5,
baseXp: 22,
nameStyle: "generated",
visualGroup: "predatory"
},
slaver_f: {
id: "raider_slaver_f",
name: "Raider Mistress",
class: "Slaver",
type: "human",
defaultTier: "elite",
gender: "female",
baseHealth: 45,
baseDamage: 9,
baseDodge: 22,
baseArmor: 0,
baseLustResistance: 35,
baseSeduceThreshold: 55,
aggression: 70,
lust: 15,
maxLust: 100,
weapon: "riding_crop",
baseAbilities: ["intimidate", "dirty_fighting"],
statusImmunities: [],
isHuman: true,
clothing: {top: 60, bottom: 55, underwear: 0, titsExposed: false, pussyExposed: false, assExposed: false},
baseLoot: { scrap: [8, 18] },
lootItems: ["rope", "scrap cloth", "stimpack", "sewing kit"],
lootChance: 0.6,
baseXp: 23,
nameStyle: "generated",
visualGroup: "predatory"
},
queen: {
id: "raider_queen",
name: "Raider Queen",
class: "Queen",
type: "human",
defaultTier: "champion",
gender: "female",
baseHealth: 85,
baseDamage: 16,
baseDodge: 30,
baseArmor: 2,
baseLustResistance: 45,
baseSeduceThreshold: 70,
aggression: 65,
lust: 0,
maxLust: 100,
weapon: "riding_crop",
baseAbilities: ["rally_troops", "dirty_fighting", "seductive_taunt"],
statusImmunities: ["fear"],
isHuman: true,
clothing: {top: 80, bottom: 70, underwear: 0, titsExposed: false, pussyExposed: false, assExposed: false},
baseLoot: { scrap: [25, 50], medical: [2, 4] },
lootItems: ["combat knife", "trade goods", "weapon part", "sewing kit"],
lootChance: 0.8,
baseXp: 55,
nameStyle: "generated",
visualGroup: "queen"
},
angharad: {
id: "raider_angharad",
nameStyle: "generated",
class: "Vixen",
type: "human",
defaultTier: "standard",
gender: "female",
baseHealth: 30, baseDamage: 7, baseDodge: 30, baseArmor: 0,
baseLustResistance: 15, baseSeduceThreshold: 35,
aggression: 60, lust: 20, maxLust: 100,
weapon: "fists",
baseAbilities: ["dirty_fighting", "seductive_taunt"],
statusImmunities: [],
isHuman: true,
clothing: {top: 100, bottom: 100, underwear: 100, titsExposed: false, pussyExposed: false, assExposed: false},
baseLoot: { scrap: [3, 8] },
lootItems: ["dirty water", "stimpack", "sewing kit"],
lootChance: 0.4,
baseXp: 15,
visualGroup: "predatory",
visualPerformer: "angharad"
},
cheedo: {
id: "raider_cheedo",
nameStyle: "generated",
class: "Vixen",
type: "human",
defaultTier: "standard",
gender: "female",
baseHealth: 30, baseDamage: 7, baseDodge: 30, baseArmor: 0,
baseLustResistance: 15, baseSeduceThreshold: 35,
aggression: 60, lust: 20, maxLust: 100,
weapon: "fists",
baseAbilities: ["dirty_fighting", "seductive_taunt"],
statusImmunities: [],
isHuman: true,
clothing: {top: 100, bottom: 100, underwear: 100, titsExposed: false, pussyExposed: false, assExposed: false},
baseLoot: { scrap: [3, 8] },
lootItems: ["dirty water", "stimpack", "sewing kit"],
lootChance: 0.4,
baseXp: 15,
visualGroup: "predatory",
visualPerformer: "cheedo"
},
dag: {
id: "raider_dag",
nameStyle: "generated",
class: "Vixen",
type: "human",
defaultTier: "standard",
gender: "female",
baseHealth: 30, baseDamage: 7, baseDodge: 30, baseArmor: 0,
baseLustResistance: 15, baseSeduceThreshold: 35,
aggression: 60, lust: 20, maxLust: 100,
weapon: "fists",
baseAbilities: ["dirty_fighting", "seductive_taunt"],
statusImmunities: [],
isHuman: true,
clothing: {top: 100, bottom: 100, underwear: 100, titsExposed: false, pussyExposed: false, assExposed: false},
baseLoot: { scrap: [3, 8] },
lootItems: ["dirty water", "stimpack", "sewing kit"],
lootChance: 0.4,
baseXp: 15,
visualGroup: "predatory",
visualPerformer: "dag"
},
toast: {
id: "raider_toast",
nameStyle: "generated",
class: "Vixen",
type: "human",
defaultTier: "standard",
gender: "female",
baseHealth: 30, baseDamage: 7, baseDodge: 30, baseArmor: 0,
baseLustResistance: 15, baseSeduceThreshold: 35,
aggression: 60, lust: 20, maxLust: 100,
weapon: "fists",
baseAbilities: ["dirty_fighting", "seductive_taunt"],
statusImmunities: [],
isHuman: true,
clothing: {top: 100, bottom: 100, underwear: 100, titsExposed: false, pussyExposed: false, assExposed: false},
baseLoot: { scrap: [3, 8] },
lootItems: ["dirty water", "stimpack", "sewing kit"],
lootChance: 0.4,
baseXp: 15,
visualGroup: "predatory",
visualPerformer: "toast"
},
immortan_joe: {
id: "raider_immortan_joe",
name: "Halgrim the Cinder-King",
properName: true,
class: "Warlord",
type: "human",
defaultTier: "champion",
gender: "male",
baseHealth: 200, baseDamage: 23, baseDodge: 25, baseArmor: 5,
baseLustResistance: 80, baseSeduceThreshold: 95,
aggression: 90, lust: 0, maxLust: 100,
weapon: "quality_weapon",
baseAbilities: ["rally_troops", "dirty_fighting", "power_strike"],
statusImmunities: ["fear", "seduce"],
isHuman: true,
clothing: { dickExposed: false },
baseLoot: { scrap: [40, 80], medical: [2, 5] },
lootItems: ["combat knife", "raider scraps", "weapon part", "trade goods"],
lootChance: 1.0,
baseXp: 100,
visualGroup: "leader",
visualPerformer: "immortan-joe"
},
people_eater: {
id: "raider_people_eater",
name: "Vorrek the Glutton",
properName: true,
class: "Warlord",
type: "human",
defaultTier: "champion",
gender: "male",
baseHealth: 180, baseDamage: 22, baseDodge: 20, baseArmor: 5,
baseLustResistance: 70, baseSeduceThreshold: 90,
aggression: 80, lust: 0, maxLust: 100,
weapon: "quality_weapon",
baseAbilities: ["rally_troops", "dirty_fighting", "power_strike"],
statusImmunities: ["fear"],
isHuman: true,
clothing: { dickExposed: false },
baseLoot: { scrap: [40, 70], medical: [2, 4] },
lootItems: ["combat knife", "raider scraps", "weapon part"],
lootChance: 1.0,
baseXp: 90,
visualGroup: "leader",
visualPerformer: "people-eater"
},
bullet_farmer: {
id: "raider_bullet_farmer",
name: "Drael Ash-King",
properName: true,
class: "Warlord",
type: "human",
defaultTier: "champion",
gender: "male",
baseHealth: 150, baseDamage: 24, baseDodge: 22, baseArmor: 4,
baseLustResistance: 70, baseSeduceThreshold: 88,
aggression: 95, lust: 0, maxLust: 100,
weapon: "quality_weapon",
baseAbilities: ["rally_troops", "dirty_fighting", "power_strike"],
statusImmunities: ["fear"],
isHuman: true,
clothing: { dickExposed: false },
baseLoot: { scrap: [35, 65], medical: [1, 4] },
lootItems: ["combat knife", "raider scraps", "weapon part"],
lootChance: 1.0,
baseXp: 85,
visualGroup: "leader",
visualPerformer: "bullet-farmer"
}
}>>
<<run setup.raiderFallback = {
id: "raider_unknown",
name: "Raider",
class: "Unknown",
type: "human",
defaultTier: "standard",
gender: "male",
baseHealth: 30,
baseDamage: 6,
baseDodge: 10,
baseArmor: 0,
baseLustResistance: 25,
baseSeduceThreshold: 50,
aggression: 70,
lust: 0,
maxLust: 100,
weapon: "rusty_pipe",
baseAbilities: [],
statusImmunities: [],
isHuman: true,
clothing: { dickExposed: false },
baseLoot: { scrap: [3, 10] },
lootItems: ["scrap metal", "dirty water", "sewing kit"],
lootChance: 0.4,
baseXp: 10
}>>
<<run setup.raiderTypeMap = {
"grunt": "grunt",
"scout": "scout",
"brute": "brute",
"slaver": "slaver",
"binder": "binder",
"chain": "chain",
"machete": "machete",
"blade": "blade",
"leader": "leader",
"huntress": "huntress",
"vixen": "vixen",
"whip": "whip",
"amazon": "amazon",
"binder_f": "binder_f",
"chain_f": "chain_f",
"temptress": "temptress",
"slaver_f": "slaver_f",
"mistress": "slaver_f",
"queen": "queen",
"raider": "grunt",
"raider_grunt": "grunt",
"raider_scout": "scout",
"raider_brute": "brute",
"raider_slaver": "slaver",
"raider_binder": "binder",
"raider_chain": "chain",
"raider_machete": "machete",
"raider_blade": "blade",
"raider_leader": "leader",
"raider_huntress": "huntress",
"raider_vixen": "vixen",
"raider_whip": "whip",
"raider_amazon": "amazon",
"raider_binder_f": "binder_f",
"raider_chain_f": "chain_f",
"raider_temptress": "temptress",
"raider_slaver_f": "slaver_f",
"raider_mistress": "slaver_f",
"raider_queen": "queen",
}>>
<<run setup.raiderRaces = ["white", "black", "asian", "latina"]>>
<<run setup.raiderRaceWeights = [0.4, 0.25, 0.2, 0.15]>>
<<run setup.assignRace = function() {
var races = setup.raiderRaces;
var weights = setup.raiderRaceWeights;
var total = weights.reduce(function(a, b) { return a + b; }, 0);
var roll = Math.random() * total;
for (var i = 0; i < races.length; i++) {
roll -= weights[i];
if (roll <= 0) return races[i];
}
return "white";
}>>
<</widget>>
<<widget "getRaiderTemplate">>
<<set _rKey to _args[0]>>
<<set _rTemplate to null>>
<<if setup.raiderTemplates && setup.raiderTemplates[_rKey]>>
<<set _rTemplate to clone(setup.raiderTemplates[_rKey])>>
<<elseif setup.raiderTypeMap && setup.raiderTypeMap[_rKey]>>
<<set _rTypeKey to setup.raiderTypeMap[_rKey]>>
<<if setup.raiderTemplates[_rTypeKey]>>
<<set _rTemplate to clone(setup.raiderTemplates[_rTypeKey])>>
<</if>>
<</if>>
<<if !_rTemplate>>
<<set _rTemplate to clone(setup.raiderFallback)>>
<</if>>
<<set _return to _rTemplate>>
<</widget>>
<<widget "createRaider">>
<<silently>>
<<set _raiderType to _args[0]>>
<<set _tierOverride to _args[1] || null>>
<<getRaiderTemplate _raiderType>>
<<set _template to _return>>
<<set _tier to _tierOverride || _template.defaultTier || "standard">>
<<applyTierToEnemy _template _tier>>
<<set _enemy to _return>>
<<set _enemy.combatExpression to "hostile">>
<<set _enemy.type to _template.type>>
<<set _enemy.isHuman to _template.isHuman>>
<<set _enemy.race to setup.assignRace()>>
<<if _template.statusImmunities>><<set _enemy.statusImmunities to clone(_template.statusImmunities)>><</if>>
<<if _template.lootItems>><<set _enemy.lootItems to clone(_template.lootItems)>><</if>>
<<if _template.lootChance>><<set _enemy.lootChance to _template.lootChance>><</if>>
<<if _template.dealsLustDamage>>
<<set _enemy.dealsLustDamage to true>>
<<set _enemy.lustDamage to _template.lustDamage || 10>>
<</if>>
<<if _template.nameStyle === "generated" || !_template.name>>
<<generateRaiderName _enemy>>
<<if _enemy.tierData && _enemy.tierData.tierPrefix>>
<<set _enemy.name to _enemy.tierData.tierPrefix + _enemy.name>>
<</if>>
<</if>>
<<set _return to _enemy>>
<</silently>>
<</widget>><<widget "generateRaiderName">>
<<set _grnEnemy to _args[0]>>
<<if _grnEnemy && _grnEnemy.visualGroup && _grnEnemy.gender>>
<<if !State.temporary.usedNamesThisEncounter || !(State.temporary.usedNamesThisEncounter instanceof Set)>>
<<set State.temporary.usedNamesThisEncounter to new Set()>>
<</if>>
<<set _grnFirst to setup.pickRaiderFirstName(_grnEnemy.gender, _grnEnemy.visualGroup, State.temporary.usedNamesThisEncounter)>>
<<if _grnFirst>>
<<set _grnEpithet to setup.pickRaiderEpithet(_grnEnemy.gender, _grnEnemy.visualGroup)>>
<<if _grnEpithet>>
<<set _grnEnemy.name to _grnFirst + " " + _grnEpithet>>
<<else>>
<<set _grnEnemy.name to _grnFirst>>
<</if>>
<<set _grnEnemy.properName to true>>
<</if>>
<</if>>
<</widget>><<set setup.raiderNarrative to setup.raiderNarrative || {}>>
<<set setup.raiderNarrative.grunt_taunt to [
"Fresh meat!",
"Hold still, bitch!",
"Gonna break you!",
"You're dead meat!",
"Come here!",
"Fight's over soon!"
]>>
<<set setup.raiderNarrative.scout_taunt to [
"You're not getting away!",
"Too slow, sweetheart.",
"I've been watching you for miles.",
"You won't even see me coming.",
"Quick hands, quicker knife.",
"Tracked you all the way here."
]>>
<<set setup.raiderNarrative.brute_taunt to [
"CRUSH YOU!",
"CRUSH!",
"Brute SMASH!",
"Little girl. Break easy.",
"Come. Brute hungry.",
"Heh. Heh. Heh."
]>>
<<set setup.raiderNarrative.slaver_taunt to [
"You'll fetch a good price...",
"You'll fetch a fine price.",
"I've broken harder than you.",
"Submit now. It'll hurt less.",
"Already counting the coin you'll bring.",
"Kneel, and this ends quick."
]>>
<<set setup.raiderNarrative.binder_taunt to [
"Hold still and this won't hurt...",
"Hold still, this'll be easier.",
"I've got just the knot for you.",
"Rope never lies. Neither does submission.",
"Struggle all you want. It only tightens.",
"Bound is beautiful."
]>>
<<set setup.raiderNarrative.chain_taunt to [
"I'll wrap you up nice and tight!",
"Hear that rattle? That's your future.",
"Chain doesn't care how tough you are.",
"Gonna wrap you up nice and tight.",
"Metal kisses leave the best marks.",
"Clank, clank, clank. Music to my ears."
]>>
<<set setup.raiderNarrative.machete_taunt to [
"I'll carve you up real nice!",
"One wrong move and I start cutting.",
"Blade's thirsty.",
"I like it when they bleed a little.",
"Hold still or lose something.",
"Sharp enough to shave with. Or other things."
]>>
<<set setup.raiderNarrative.blade_taunt to [
"I'll cut you to ribbons!",
"Too fast for you.",
"Dance with my blades.",
"Quick death or slow? Your choice.",
"Two knives, twice the pain."
]>>
<<set setup.raiderNarrative.leader_taunt to [
"You've made a grave mistake.",
"I didn't get here by losing.",
"My men will tear you apart.",
"Kneel or die. Simple choice.",
"You face the captain now."
]>>
<<set setup.raiderNarrative.covenant_huntress_taunt to [
"The Lady wants you breathing, vault boy. She never said unbruised.",
"Your face is on a board at the Grove. Not a good likeness.",
"The more you run, the longer the walk home on a rope.",
"Drop it, sweetheart. You're worth more to us on your knees.",
"We've tracked you since the stream. You walk like a vault boy."
]>>
<<set setup.raiderNarrative.huntress_taunt to [
"Another fool to gut.",
"Tracked you for miles. You never noticed.",
"Quick and clean, or slow and painful. Your choice.",
"I've taken down bigger prey than you.",
"Stop struggling. You're already caught.",
"Hunters don't let their catches escape."
]>>
<<set setup.raiderNarrative.vixen_taunt to [
"Come here, handsome...",
"Aw, you're cute when you're trying.",
"Play with me?",
"This is gonna be FUN.",
"Don't worry, I'll be gentle. Maybe.",
"Ooh, I like the feisty ones."
]>>
<<set setup.raiderNarrative.whip_taunt to [
"I'll make you scream...",
"On your knees. NOW.",
"I'm going to enjoy breaking you.",
"Scream for me, pet.",
"Pain is just the beginning.",
"You'll learn to thank me for the marks."
]>>
<<set setup.raiderNarrative.amazon_taunt to [
"I'll crush you beneath me!",
"Men are weak. Prove me wrong.",
"I've broken warriors twice your size.",
"Strength is everything. You have none.",
"Kneel before a true fighter.",
"Your defeat was inevitable."
]>>
<<set setup.raiderNarrative.binder_f_taunt to [
"Hold still, I want to tie you up...",
"Stay still, this'll be beautiful.",
"Rope art requires a canvas.",
"Bound men are obedient men.",
"The knots I have planned for you...",
"Helpless is my favorite look on a man."
]>>
<<set setup.raiderNarrative.chain_f_taunt to [
"I'll wrap this around your throat!",
"Chains suit you.",
"Cold steel for a cold world.",
"Rattle rattle, pretty man.",
"I'll wrap you up tight.",
"Metal never lies."
]>>
<<set setup.raiderNarrative.temptress_taunt to [
"Why fight when we could have fun?",
"Why fight when we could fuck?",
"I can smell your desire.",
"Give in. It feels so good to give in.",
"Your cock is already begging for me.",
"Resistance is so... tiresome."
]>>
<<set setup.raiderNarrative.slaver_f_taunt to [
"Kneel before me, slave!",
"You'll make a fine pet.",
"I've trained hundreds. You'll break like the rest.",
"Kneel now and save yourself suffering.",
"Premium cock for the markets.",
"Your will is irrelevant."
]>>
<<set setup.raiderNarrative.queen_taunt to [
"Kneel before your queen.",
"You face royalty. Act like it.",
"My kingdom, my rules.",
"Peasants don't get to fight back.",
"I'll add you to my collection."
]>>
<<set setup.raiderNarrative.grunt_defeat to [
"You'll... regret this...",
"The others... will find you...",
"Ugh... stronger than... expected...",
"Impossible...",
"No... can't be..."
]>>
<<set setup.raiderNarrative.scout_defeat to [
"Too... fast...",
"Should've... stayed hidden...",
"Can't... escape...",
"You're... quicker...",
"Damn it..."
]>>
<<set setup.raiderNarrative.brute_defeat to [
"Impossible...",
"Brute... not lose...",
"Little... too strong...",
"How...?",
"Ungh..."
]>>
<<set setup.raiderNarrative.slaver_defeat to [
"The boss... won't like this...",
"You'd have... sold well...",
"Wasted... merchandise...",
"Others... will collect...",
"This isn't... over..."
]>>
<<set setup.raiderNarrative.binder_defeat to [
"Should've... tied you first...",
"The ropes... failed me...",
"Should've... been faster...",
"Damn... knots...",
"Wasn't... tight enough..."
]>>
<<set setup.raiderNarrative.chain_defeat to [
"Damn... chains...",
"Metal... failed me...",
"Should've... hit harder...",
"Chains... weren't enough...",
"Ungh..."
]>>
<<set setup.raiderNarrative.machete_defeat to [
"You're... fast...",
"Should've... cut deeper...",
"Blade... wasn't enough...",
"Damn... you...",
"Next time..."
]>>
<<set setup.raiderNarrative.blade_defeat to [
"Too... slow...",
"My blades... failed...",
"Should've... been faster...",
"Ungh...",
"Damn it..."
]>>
<<set setup.raiderNarrative.leader_defeat to [
"This isn't... over...",
"My men... will avenge me...",
"You've made... an enemy...",
"The war... continues...",
"Stronger... than expected..."
]>>
<<set setup.raiderNarrative.covenant_huntress_defeat to [
"Damn you... the Lady... will send more...",
"Should've... brought the rifle down...",
"Go on... run... we know every road you take...",
"Your face... is still on the board...",
"Ungh... she'll hear about this..."
]>>
<<set setup.raiderNarrative.huntress_defeat to [
"Damn you...",
"Should've... been more careful...",
"The prey... won...",
"Underestimated... you...",
"Hunt's... not over..."
]>>
<<set setup.raiderNarrative.vixen_defeat to [
"Nngh... not bad...",
"Okay... you win...",
"Not... fair...",
"Mmm... impressive...",
"Fine... this time..."
]>>
<<set setup.raiderNarrative.whip_defeat to [
"You... bastard...",
"Should've... broken you first...",
"This isn't... over...",
"You'll... pay...",
"Damn... you..."
]>>
<<set setup.raiderNarrative.amazon_defeat to [
"Stronger... than you look...",
"A worthy... opponent...",
"Not... possible...",
"You've... earned this...",
"Impressive..."
]>>
<<set setup.raiderNarrative.binder_f_defeat to [
"Should've... bound you first...",
"The ropes... weren't enough...",
"Damn... you...",
"Next time... I'll tie tighter...",
"Ungh..."
]>>
<<set setup.raiderNarrative.chain_f_defeat to [
"Damn... you...",
"Chains... failed me...",
"Should've... wrapped tighter...",
"Metal... wasn't enough...",
"Ungh..."
]>>
<<set setup.raiderNarrative.temptress_defeat to [
"Mmm... you win this time...",
"Resistant... aren't you...",
"You'll... give in eventually...",
"Impressive... willpower...",
"Fine... for now..."
]>>
<<set setup.raiderNarrative.slaver_f_defeat to [
"You... dare...",
"Should've... broken you faster...",
"This isn't... over...",
"You'll... regret this...",
"Damn... you..."
]>>
<<set setup.raiderNarrative.queen_defeat to [
"This... changes nothing...",
"A queen... doesn't kneel...",
"You've made... an enemy...",
"My kingdom... will avenge me...",
"This isn't... over..."
]>>
<<set setup.raiderNarrative.covenant_huntress_seduced to [
"Mmm... the Lady never said we couldn't play with you first...",
"Fine... call it a down payment on your bounty...",
"Damn you... come here, then...",
"Nobody tells the Lady about this. Nobody."
]>>
<<set setup.raiderNarrative.huntress_seduced to [
"Mmm... maybe you're worth keeping alive...",
"Fine... you've earned it...",
"A hunter knows when to surrender...",
"You've caught me. Now claim your prize."
]>>
<<set setup.raiderNarrative.vixen_seduced to [
"Mmm, I knew you wanted me...",
"Finally... come here...",
"I've been waiting for this...",
"Yes... give it to me..."
]>>
<<set setup.raiderNarrative.whip_seduced to [
"Mmm, you like it rough too?",
"Fine... YOU can be on top...",
"Earn the right to dominate me...",
"Show me what you've got..."
]>>
<<set setup.raiderNarrative.amazon_seduced to [
"You've earned a reward, warrior...",
"A strong mate. Acceptable.",
"Prove your worth between my thighs...",
"Strong enough to take an amazon..."
]>>
<<set setup.raiderNarrative.binder_f_seduced to [
"Tie ME up instead? ...okay.",
"Fine... your turn to bind me...",
"Show me what it feels like...",
"Make me helpless..."
]>>
<<set setup.raiderNarrative.chain_f_seduced to [
"Chain me up instead? ...kinky.",
"Cold metal on my skin... yes...",
"Make me YOUR prisoner...",
"Wrap me in chains..."
]>>
<<set setup.raiderNarrative.temptress_seduced to [
"Finally... come here...",
"I knew you'd give in...",
"Take what you want...",
"Yes... claim me..."
]>>
<<set setup.raiderNarrative.slaver_f_seduced to [
"Perhaps YOU should be the master...",
"Fine... I'll submit. This once.",
"Show me what a real master can do...",
"Make me YOUR slave..."
]>>
<<set setup.raiderNarrative.queen_seduced to [
"Oh? You think you can handle a queen? Prove it.",
"A queen chooses her consort. You'll do.",
"Earn the right to serve me intimately...",
"Impress me..."
]>>
<<set setup.raiderNarrative.grunt_hit_kira to [
"The grunt swings wildly— his pipe crashes into Kira!",
"He attacks with brute force, no technique, just raw violence!",
"A savage swing connects, sending Kira stumbling!",
"He hammers at her with his rusty pipe, grunting with effort!"
]>>
<<set setup.raiderNarrative.grunt_hit_kira_exposed to [
"He stares at her exposed body, momentarily stunned. 'Holy shit...'",
"His eyes lock onto her tits. The next swing is slower, distracted.",
"He's drooling at her naked flesh. 'Gonna have fun with you.'",
"His attack falters as he ogles her. 'Boss said we could keep the pretty ones.'"
]>>
<<set setup.raiderNarrative.grunt_high_lust to [
"He's breathing hard, cock visibly straining. 'Need... need to fuck...'",
"Drool runs down his chin. He's past thinking, just hungry.",
"'Gonna... gonna put it in you,' he pants, barely coherent.",
"He grabs at his crotch, rutting the air. Animal instinct taking over."
]>>
<<set setup.raiderNarrative.grunt_extreme to [
"'Gonna fuck all your holes!' he snarls, cock out and throbbing.",
"He's lost all pretense of fighting. Just grabbing, groping, rutting.",
"'Fill you up! Breed you!' he grunts, slamming against her.",
"Pure animal now. Grunting, thrusting, desperate to mount."
]>>
<<set setup.raiderNarrative.scout_hit_kira to [
"He darts in, knife flashing— a quick slice across her arm!",
"Fast as a snake, he strikes and retreats before she can counter!",
"His blade finds flesh with surgical precision!",
"He's everywhere at once, knife catching her from unexpected angles!"
]>>
<<set setup.raiderNarrative.scout_hit_kira_exposed to [
"'Nice view,' he smirks, knife tracing the air near her nipple.",
"He circles her exposed body like a predator. 'Very nice.'",
"'Bet the others would pay good to see this,' he leers.",
"His knife traces along her bare thigh. 'Hold still now...'"
]>>
<<set setup.raiderNarrative.scout_high_lust to [
"'Fuck fighting. I want a taste,' he hisses, licking his lips.",
"He's circling closer, knife forgotten, eyes on her body.",
"'Been on the road too long. Need this,' he breathes.",
"His quick movements become predatory, hunting, not fighting."
]>>
<<set setup.raiderNarrative.scout_extreme to [
"'Gonna pin you down and fuck you raw,' he snarls, knife at her throat.",
"He tackles her with surprising strength. 'Scream for me.'",
"'I like 'em struggling,' he pants, forcing her legs apart.",
"Quick hands tear at her remaining clothes. 'Mine. All mine.'"
]>>
<<set setup.raiderNarrative.brute_hit_kira to [
"The massive bat CRASHES down with bone-shattering force!",
"He swings like he's chopping wood— the impact is devastating!",
"CRACK! The bat connects, nearly lifting her off her feet!",
"He puts his entire massive body behind the swing!"
]>>
<<set setup.raiderNarrative.brute_hit_kira_exposed to [
"He stops mid-swing, staring at her tits. 'Pretty...'",
"'Soft,' he rumbles, reaching for her with a massive hand.",
"He drops the bat, more interested in grabbing her naked flesh.",
"'Brute like,' he grunts, pawing at her exposed body."
]>>
<<set setup.raiderNarrative.brute_high_lust to [
"'BRUTE NEED FUCK!' he roars, cock impossibly huge and hard.",
"He's done fighting. Just grabbing, lifting, positioning her.",
"'Put... put it IN,' he grunts, rutting against her.",
"His massive hands grab her hips, pulling her toward his monster cock."
]>>
<<set setup.raiderNarrative.brute_extreme to [
"'BREED!' he roars, impaling her on his massive shaft!",
"He lifts her like a doll, slamming her down on his cock!",
"'ALL HOLES!' he grunts, using her body like a toy.",
"He fucks with devastating force, each thrust shaking the ground!"
]>>
<<set setup.raiderNarrative.slaver_hit_kira to [
"CRACK! His belt lashes across her back like a whip!",
"He strikes with practiced precision— this isn't his first slave.",
"The belt wraps around her thigh, yanking her off-balance!",
"'That's for resistance,' he states coldly, belt cracking again."
]>>
<<set setup.raiderNarrative.slaver_hit_kira_exposed to [
"'Premium merchandise,' he notes clinically, eyeing her body.",
"He traces the belt across her bare tits. 'Untrained, but valuable.'",
"'Buyers pay extra for marks in the right places,' he warns.",
"His belt kisses her exposed ass. 'Learning your place yet?'"
]>>
<<set setup.raiderNarrative.slaver_high_lust to [
"'I'll sample the goods before selling,' he decides, loosening his pants.",
"Professional demeanor cracking. 'Can't resist... testing the merchandise.'",
"'Every hole gets inspected,' he breathes, cock in hand.",
"He circles her like livestock at auction. 'Quality inspection time.'"
]>>
<<set setup.raiderNarrative.slaver_extreme to [
"'I'm keeping this one,' he snarls, mounting her roughly. 'Personal use.'",
"He fucks her with cold efficiency. 'Breaking you in for training.'",
"'Every hole belongs to me now,' he states, using her systematically.",
"'You'll learn to beg for my cock,' he promises, pounding harder."
]>>
<<set setup.raiderNarrative.slaver_ultra_extreme to [
"'Breeding stock,' he grunts, pumping cum deep inside her. 'My breeding stock.'",
"He switches holes methodically. 'Mouth, cunt, ass. All mine now.'",
"'I'm going to ruin you for anyone else,' he snarls, fucking her raw.",
"'Gape those holes wide. Show me what I own,' he demands savagely."
]>>
<<set setup.raiderNarrative.binder_hit_kira to [
"The rope whips around, catching her wrist!",
"He lashes out, the coiled rope striking like a flail!",
"Hemp burns across her skin as he yanks the rope tight!",
"He's trying to snare her limbs, bind her down!"
]>>
<<set setup.raiderNarrative.binder_hit_kira_exposed to [
"'Mmm, rope marks would look perfect on those tits,' he muses.",
"He traces the rope between her legs. 'Crotch rope next.'",
"'Bound and exposed. My favorite combination.'",
"The rope drags across her bare nipples. 'Sensitive?'"
]>>
<<set setup.raiderNarrative.binder_high_lust to [
"'Need you tied down. Need to use you,' he pants, cock straining.",
"He's wrapping rope around her frantically. 'Can't wait. Can't wait.'",
"'Fuck first, then proper bindings,' he decides, mounting her.",
"Rough hands and rougher rope. He's losing control."
]>>
<<set setup.raiderNarrative.binder_extreme to [
"'Hogtied and fucked,' he snarls, pounding into her bound form.",
"She's completely immobilized, and he's using every hole.",
"'Scream into the gag while I breed you,' he commands.",
"He fucks her while adjusting knots, ensuring she can't escape."
]>>
<<set setup.raiderNarrative.chain_hit_kira to [
"CLANG! The heavy chain crashes into her with brutal force!",
"Metal links wrap around her arm, biting deep!",
"He swings the chain overhead, bringing it down like a hammer!",
"The chain catches her legs, nearly taking her down!"
]>>
<<set setup.raiderNarrative.chain_hit_kira_exposed to [
"'Cold steel on warm flesh,' he grins, dragging the chain across her tits.",
"Metal links press between her legs. 'Like that?'",
"'Gonna chain you up nice and pretty,' he promises, eyeing her body.",
"He wraps the chain around her waist, pulling her close."
]>>
<<set setup.raiderNarrative.chain_high_lust to [
"'Chain around your throat while I fuck you,' he pants.",
"He's wrapping her in metal, cock pressed against her. 'Can't stop.'",
"'Gonna breed you in chains,' he snarls, mounting her.",
"Cold metal and hot flesh. He's losing himself to lust."
]>>
<<set setup.raiderNarrative.chain_extreme to [
"'Chained up and bred like an animal,' he grunts, thrusting savagely.",
"Metal bites into her skin as he pounds every hole.",
"'Scream against the chain gag,' he demands, fucking harder.",
"She's wrapped in chains, completely immobilized as he uses her."
]>>
<<set setup.raiderNarrative.machete_hit_kira to [
"The machete whistles through the air, biting into flesh!",
"He hacks with savage abandon, blade seeking blood!",
"Steel opens a gash across her arm!",
"He chops and slashes with brutal efficiency!"
]>>
<<set setup.raiderNarrative.machete_hit_kira_exposed to [
"'Stay still,' he warns, tracing the blade around her nipple.",
"Cold steel slides across her bare stomach. 'So pretty. So vulnerable.'",
"'I could carve my name on you,' he threatens, blade at her throat.",
"The flat of the machete presses against her pussy. 'Behave.'"
]>>
<<set setup.raiderNarrative.machete_high_lust to [
"'Blade at your throat while I fuck you,' he pants, cock out.",
"He holds her at knifepoint, other hand groping frantically.",
"'Don't move. Or do. I like watching you squirm,' he snarls.",
"The machete presses to her neck as he forces himself inside."
]>>
<<set setup.raiderNarrative.machete_extreme to [
"'Blade stays at your throat while I ruin every hole,' he snarls.",
"He fucks her with the machete pressed to her chest. 'Stay. Still.'",
"'One twitch and I cut. Now take my cock,' he demands.",
"Metal kisses her skin with each savage thrust."
]>>
<<set setup.raiderNarrative.huntress_hit_player to [
"She strikes with deadly precision, knife finding its mark!",
"A calculated slash— she's been doing this a long time.",
"Her blade dances, opening cuts with surgical accuracy!",
"She moves like a predator, each strike efficient and lethal."
]>>
<<set setup.raiderNarrative.huntress_hit_player_exposed to [
"'Well, well,' she smirks, eyeing your exposed cock. 'Nice trophy.'",
"Her knife traces near your shaft. 'Hold very, very still.'",
"'I usually mount my catches on the wall,' she purrs. 'This might be different.'",
"She circles your exposed body appraisingly. 'Quality specimen.'"
]>>
<<set setup.raiderNarrative.huntress_high_lust to [
"'Fuck the hunt. I want my prize NOW,' she pants, grabbing your cock.",
"Professional demeanor cracking. 'Need... need to ride you.'",
"She tackles you with hunter's instinct, mounting immediately.",
"'My catch. My cock. MINE,' she snarls, impaling herself."
]>>
<<set setup.raiderNarrative.huntress_extreme to [
"'I'm going to milk every drop from you,' she snarls, riding hard.",
"She fucks with predatory intensity, taking what she wants.",
"'Breed me, prey. Fill me up,' she demands, grinding down.",
"'I'm keeping you. Personal fucktoy,' she growls, bouncing faster."
]>>
<<set setup.raiderNarrative.huntress_ultra_extreme to [
"'Every load goes inside me,' she demands, milking your cock ruthlessly.",
"She rides until you're drained, then keeps going. 'More. Give me MORE.'",
"'Your cock belongs to me now. Forever,' she snarls, cumming on your shaft.",
"'Breeding stock. That's all you are,' she pants, forcing another orgasm from you."
]>>
<<set setup.raiderNarrative.vixen_hit_player to [
"She slaps you playfully— but hard. 'Tag!'",
"Dancing around your guard, she lands a stinging hit!",
"She giggles as her fist connects. 'Oops!'",
"'Boop!' She taps your nose, then REALLY hits you."
]>>
<<set setup.raiderNarrative.vixen_hit_player_exposed to [
"'Ooh, someone's happy to see me!' she giggles, eyeing your cock.",
"She pokes at your exposed shaft playfully. 'Boing boing!'",
"'Is that for ME?' she asks with exaggerated innocence.",
"She traces a finger down your chest to your cock. 'Present for Vixen?'"
]>>
<<set setup.raiderNarrative.vixen_high_lust to [
"'Okay, playtime's OVER,' she pants, grabbing your cock greedily.",
"'I want it I want it I WANT IT,' she whines, mounting you.",
"Playfulness turns desperate. 'Need your cock NOW.'",
"'Gimme gimme gimme!' she demands, bouncing on your shaft."
]>>
<<set setup.raiderNarrative.vixen_extreme to [
"'Fuck me fuck me FUCK ME!' she squeals, riding wildly.",
"She's insatiable, grinding and bouncing without rhythm or control.",
"'MORE! Harder! Fill me UP!' she screams, nails raking your chest.",
"'CUM IN ME!' she shrieks, pussy clenching desperately."
]>>
<<set setup.raiderNarrative.vixen_ultra_extreme to [
"'BREED ME BREED ME BREED ME!' she screams, going feral on your cock.",
"She's completely lost to lust, fucking like an animal in heat.",
"'More cum! Need MORE CUM!' she howls, milking you relentlessly.",
"'Never stop! NEVER STOP FUCKING ME!' she wails, orgasming continuously."
]>>
<<set setup.raiderNarrative.whip_hit_player to [
"CRACK! Her belt bites deep across your back!",
"She lashes with expert precision, each strike deliberate!",
"'Count them,' she commands as the belt falls again!",
"The leather leaves a perfect welt. She admires her work."
]>>
<<set setup.raiderNarrative.whip_hit_player_exposed to [
"'Oh, a target,' she purrs, eyeing your exposed cock.",
"The belt tip traces along your shaft. 'Should I?'",
"'Pain and pleasure,' she murmurs, flicking the belt at your cock.",
"'Beg me not to,' she smiles. Then strikes anyway."
]>>
<<set setup.raiderNarrative.whip_high_lust to [
"'Fuck me while I whip you,' she demands, mounting roughly.",
"She rides you while bringing the belt down on your chest.",
"'Pain makes the pleasure better,' she pants, striking and fucking.",
"Crack-thrust-crack-thrust. She's in heaven."
]>>
<<set setup.raiderNarrative.whip_extreme to [
"'Scream for me while I milk your cock,' she snarls, belt flashing.",
"She fucks savagely, each thrust punctuated by a lash.",
"'CUM while I hurt you,' she demands, belt and pussy working together.",
"'My pain slut. My cock. MINE,' she howls, cumming as she whips."
]>>
<<set setup.raiderNarrative.whip_ultra_extreme to [
"'Break for me. Cum and scream and BREAK,' she snarls, riding through orgasms.",
"The belt never stops. Neither does her pussy. You're overwhelmed.",
"'Fill me while you bleed,' she demands, lost to sadistic pleasure.",
"'Forever my toy. Forever my cock,' she screams, marking you permanently."
]>>
<<set setup.raiderNarrative.amazon_hit_player to [
"Her machete cleaves through your guard with terrifying power!",
"She strikes like a goddess of war, each blow devastating!",
"Raw strength sends you reeling from the impact!",
"She fights with the power of someone who's never lost."
]>>
<<set setup.raiderNarrative.amazon_hit_player_exposed to [
"'Impressive,' she admits, eyeing your cock. 'But I've had bigger.'",
"'At least ONE part of you has potential,' she smirks.",
"She grabs your shaft appraisingly. 'Adequate breeding stock.'",
"'You'll serve my needs,' she decides, grip tightening."
]>>
<<set setup.raiderNarrative.amazon_high_lust to [
"'You've earned the right to fuck me,' she declares, mounting you.",
"She takes what she wants with warrior strength, riding hard.",
"'Prove your worth,' she demands, using your cock ruthlessly.",
"She fucks like she fights— dominant, powerful, overwhelming."
]>>
<<set setup.raiderNarrative.amazon_extreme to [
"'Breed me, weakling. Give me your seed,' she demands, crushing you beneath her.",
"She fucks with savage intensity, using your body completely.",
"'Every drop. Inside me. NOW,' she commands, pussy clenching like a vice.",
"'You exist to fill me,' she snarls, milking your cock mercilessly."
]>>
<<set setup.raiderNarrative.amazon_ultra_extreme to [
"'My breeding slave,' she snarls, forcing orgasm after orgasm from you.",
"She uses your cock until you're empty, then demands more.",
"'Weak men exist to serve strong women,' she pants, still riding.",
"'Your seed belongs to me. ALL of it,' she roars, cumming on your shaft."
]>>
<<set setup.raiderNarrative.temptress_hit_player to [
"Her touch sends sparks of unwanted pleasure through you!",
"She caresses as much as she strikes, confusing pain and arousal!",
"Every contact with her skin makes you harder!",
"She fights with sensuality, every movement designed to arouse."
]>>
<<set setup.raiderNarrative.temptress_hit_player_exposed to [
"'There it is,' she purrs, stroking your exposed cock. 'My prize.'",
"Her fingers dance along your shaft. 'So eager.'",
"'Your body already surrendered,' she breathes, teasing you.",
"'Let me take care of this,' she offers, grip tightening."
]>>
<<set setup.raiderNarrative.temptress_high_lust to [
"'Finally,' she moans, mounting you in one smooth motion.",
"She doesn't ask. She takes. Your cock disappears inside her.",
"'I've been WAITING for this,' she purrs, beginning to ride.",
"'Give me everything,' she breathes, pussy gripping tight."
]>>
<<set setup.raiderNarrative.temptress_extreme to [
"'Drown in me,' she moans, fucking you into oblivion.",
"She milks your cock with supernatural skill, draining your will.",
"'Cum. Cum. Keep cumming,' she demands, overwhelming your senses.",
"'You're MINE now,' she gasps, riding through your orgasms."
]>>
<<set setup.raiderNarrative.temptress_ultra_extreme to [
"'Lose yourself in my pussy,' she snarls, fucking your mind blank.",
"She breaks you with pleasure, riding until you're nothing but cock.",
"'Worship me. Breed me. BELONG to me,' she demands, cumming endlessly.",
"'Forever my cock slave,' she screams, draining everything you have."
]>>
<<set setup.raiderNarrative.slaver_f_hit_player to [
"CRACK! Her riding crop strikes with professional precision!",
"She marks you methodically, each welt deliberate.",
"'Discipline,' she states coldly, crop falling again.",
"The crop leaves perfect parallel lines. She's done this before."
]>>
<<set setup.raiderNarrative.slaver_f_hit_player_exposed to [
"'Quality merchandise,' she notes, examining your cock clinically.",
"Her crop taps your shaft. 'Responsive. Good.'",
"'This will sell well,' she murmurs, stroking you appraisingly.",
"'Pre-sale inspection,' she announces, gripping firmly."
]>>
<<set setup.raiderNarrative.slaver_f_high_lust to [
"'I'm sampling the goods,' she decides, mounting professionally.",
"Even fucking, she maintains control. Testing, not enjoying.",
"'Quality test,' she pants, riding with clinical efficiency.",
"But her mask slips. 'Fuck... better than expected...'"
]>>
<<set setup.raiderNarrative.slaver_f_extreme to [
"'Personal use item,' she snarls, losing professional composure. 'MINE.'",
"She fucks with desperate hunger, forgetting her training.",
"'Breed me. Fill me. I don't care about the markets,' she gasps.",
"'Never selling this cock,' she screams, cumming hard."
]>>
<<set setup.raiderNarrative.slaver_f_ultra_extreme to [
"'MY cock. MY cum. MY breeding stud,' she howls, riding relentlessly.",
"All pretense of professionalism gone. Just feral need.",
"'Pump me full. Ruin me for other cocks,' she demands.",
"'Property rights,' she snarls. 'You're MY property now.'"
]>>
<<set setup.raiderNarrative.binder_f_hit_player to [
"The rope lashes across your skin, burning!",
"She's wrapping you up, binding limb by limb!",
"Hemp bites into your wrists as she cinches tight!",
"Every strike binds you further into her web!"
]>>
<<set setup.raiderNarrative.binder_f_hit_player_exposed to [
"'That needs binding too,' she purrs, eyeing your cock.",
"Rope wraps around your shaft. 'Cock bondage is an art.'",
"'Bound and exposed. Perfect,' she breathes.",
"She ties elaborate knots around your balls. 'Mine now.'"
]>>
<<set setup.raiderNarrative.binder_f_high_lust to [
"'Bound cock inside me,' she demands, mounting your tied form.",
"She rides your rope-wrapped shaft, friction driving her wild.",
"'Can't move. Can't escape. Just take it,' she pants.",
"You're helpless as she uses your bound body for pleasure."
]>>
<<set setup.raiderNarrative.binder_f_extreme to [
"'Cum in me while you can't move,' she snarls, fucking your bound form.",
"She milks your tied cock ruthlessly, savoring your helplessness.",
"'Breed me, toy. You have no choice,' she demands.",
"'Tied up and MILKED,' she screams, cumming on your shaft."
]>>
<<set setup.raiderNarrative.chain_f_hit_player to [
"Her chain whips around, metal biting deep!",
"CLANG! Links crash into you with devastating force!",
"She swings the chain like a dancer, lethal grace!",
"Metal wraps around your limb, yanking you off-balance!"
]>>
<<set setup.raiderNarrative.chain_f_hit_player_exposed to [
"'Chain around your cock,' she muses. 'Interesting.'",
"Cold metal wraps your shaft. She tugs experimentally.",
"'Leashed,' she grins, chain connected to your balls.",
"'My chain, my cock,' she purrs, pulling you closer."
]>>
<<set setup.raiderNarrative.chain_f_high_lust to [
"'Chained cock inside me NOW,' she demands, mounting roughly.",
"She fucks you while holding your chain leash tight.",
"'Pull against the chain while you cum,' she pants.",
"Metal bites as she rides, pain and pleasure mixing."
]>>
<<set setup.raiderNarrative.chain_f_extreme to [
"'Chained breeding toy,' she snarls, riding savagely.",
"She yanks the chain while milking your cock, overwhelmed.",
"'Fill me while the metal bites,' she screams.",
"'MINE,' she howls, cumming as chains rattle."
]>>
<<set setup.raiderNarrative.male_taunt_fallback to [
"You're dead meat!",
"Come here!",
"You won't escape!",
"Fresh meat!",
"Fight's over!"
]>>
<<set setup.raiderNarrative.female_taunt_fallback to [
"Come here, handsome.",
"Ready to play?",
"Don't run away...",
"This'll be fun.",
"You're mine now."
]>>
<<set setup.raiderNarrative.defeat_fallback to [
"Ugh...",
"No...",
"You... win...",
"Damn... you...",
"This isn't... over..."
]>>
<<set setup.raiderNarrative.seduced_fallback to [
"Finally... come here...",
"Fine... you win...",
"Show me what you've got...",
"Take what you want..."
]>><<widget "getRaiderTaunt">>
<<set _enemy to _args[0]>>
<<set _id to (_enemy && _enemy.id) ? _enemy.id : "raider">>
<<set _type to (_enemy && _enemy.narrativeType) ? _enemy.narrativeType : _id.replace("raider_", "")>>
<<set _tauntPool to setup.raiderNarrative[_type + "_taunt"]>>
<<if _tauntPool && _tauntPool.length gt 0>>
<<set _return to _tauntPool.random()>>
<<else>>
<<if _enemy.gender === "female">>
<<set _return to setup.raiderNarrative.female_taunt_fallback.random()>>
<<else>>
<<set _return to setup.raiderNarrative.male_taunt_fallback.random()>>
<</if>>
<</if>>
<</widget>>
<<widget "getRaiderDefeat">>
<<set _enemy to _args[0]>>
<<set _id to (_enemy && _enemy.id) ? _enemy.id : "raider">>
<<set _type to (_enemy && _enemy.narrativeType) ? _enemy.narrativeType : _id.replace("raider_", "")>>
<<set _defeatPool to setup.raiderNarrative[_type + "_defeat"]>>
<<if _defeatPool && _defeatPool.length gt 0>>
<<set _return to _defeatPool.random()>>
<<else>>
<<set _return to setup.raiderNarrative.defeat_fallback.random()>>
<</if>>
<</widget>>
<<widget "getRaiderSeduced">>
<<set _enemy to _args[0]>>
<<set _id to (_enemy && _enemy.id) ? _enemy.id : "raider">>
<<set _type to (_enemy && _enemy.narrativeType) ? _enemy.narrativeType : _id.replace("raider_", "")>>
<<set _seducedPool to setup.raiderNarrative[_type + "_seduced"]>>
<<if _seducedPool && _seducedPool.length gt 0>>
<<set _return to _seducedPool.random()>>
<<else>>
<<set _return to setup.raiderNarrative.seduced_fallback.random()>>
<</if>>
<</widget>>
<<widget "getRaiderHitKiraNarrative">>
<<set _enemy to _args[0]>>
<<set _id to (_enemy && _enemy.id) ? _enemy.id : "raider">>
<<set _lust to (_enemy && _enemy.lust) ? _enemy.lust : 0>>
<<set _isExposed to ($clothing && $clothing.kira && ($clothing.kira.titsExposed || $clothing.kira.pussyExposed))>>
<<set _type to _id.replace("raider_", "")>>
<<set _pool to null>>
<<if _lust >= 90 && setup.raiderNarrative[_type + "_ultra_extreme"]>>
<<set _pool to setup.raiderNarrative[_type + "_ultra_extreme"]>>
<<elseif _lust >= 75 && setup.raiderNarrative[_type + "_extreme"]>>
<<set _pool to setup.raiderNarrative[_type + "_extreme"]>>
<<elseif _lust >= 50 && setup.raiderNarrative[_type + "_high_lust"]>>
<<set _pool to setup.raiderNarrative[_type + "_high_lust"]>>
<<elseif _isExposed && setup.raiderNarrative[_type + "_hit_kira_exposed"]>>
<<set _pool to setup.raiderNarrative[_type + "_hit_kira_exposed"]>>
<<elseif setup.raiderNarrative[_type + "_hit_kira"]>>
<<set _pool to setup.raiderNarrative[_type + "_hit_kira"]>>
<</if>>
<<if _pool && _pool.length gt 0>>
<<set _return to _pool.random()>>
<<else>>
<<set _return to "">>
<</if>>
<</widget>>
<<widget "getRaiderHitPlayerNarrative">>
<<set _enemy to _args[0]>>
<<set _id to (_enemy && _enemy.id) ? _enemy.id : "raider">>
<<set _lust to (_enemy && _enemy.lust) ? _enemy.lust : 0>>
<<set _isExposed to ($clothing && $clothing.player && $clothing.player.dickExposed)>>
<<set _type to _id.replace("raider_", "")>>
<<set _pool to null>>
<<if _lust >= 90 && setup.raiderNarrative[_type + "_ultra_extreme"]>>
<<set _pool to setup.raiderNarrative[_type + "_ultra_extreme"]>>
<<elseif _lust >= 75 && setup.raiderNarrative[_type + "_extreme"]>>
<<set _pool to setup.raiderNarrative[_type + "_extreme"]>>
<<elseif _lust >= 50 && setup.raiderNarrative[_type + "_high_lust"]>>
<<set _pool to setup.raiderNarrative[_type + "_high_lust"]>>
<<elseif _isExposed && setup.raiderNarrative[_type + "_hit_player_exposed"]>>
<<set _pool to setup.raiderNarrative[_type + "_hit_player_exposed"]>>
<<elseif setup.raiderNarrative[_type + "_hit_player"]>>
<<set _pool to setup.raiderNarrative[_type + "_hit_player"]>>
<</if>>
<<if _pool && _pool.length gt 0>>
<<set _return to _pool.random()>>
<<else>>
<<set _return to "">>
<</if>>
<</widget>><<widget "kiraAssailant">>
<<set _kaIdx to ($combat.pendingSexAction && $combat.pendingSexAction.enemyIndex !== undefined) ? $combat.pendingSexAction.enemyIndex : -1>>
<<set _enemy to $combat.enemies[_kaIdx] || $combat.enemies[$combat.currentTarget] || $combat.enemies[0]>>
<<set _currentEnemyIndex to Math.max(0, $combat.enemies.indexOf(_enemy))>>
<</widget>>
<<widget "interventionChoices">>
<<set _watchPassage to _args[0]>>
<<if _watchPassage === undefined>><<set _watchPassage to "Combat_Watch_Grope">><</if>>
<<set _showWatch to (_args[1] !== false && _watchPassage !== "")>>
<<set _playerPos to $combat.positions.player || "standing">>
<<set _isStunned to setup.playerIsStunned()>>
<<set _isProne to (_playerPos === "prone_back" || _playerPos === "prone_stomach")>>
<<set _isKneeling to (_playerPos === "kneeling")>>
<<set _pullBlock to setup.playerActionBlock("Combat_Intervene_Pull")>>
<div class="choice-container">
<<if _isStunned>>
<p class="stunned-warning">You're still stunned!</p>
<<if _showWatch && $extremeContent.dubcon>>
<<vchoice "Watch helplessly..." _watchPassage "intimate" "search">>
<<else>>
<<vchoice "Try to recover..." "Combat_Actions" "move" "map">>
<</if>>
<<elseif _isProne>>
<p class="position-warning">You're on the ground!</p>
<<vchoice "Try to get up and attack" "Combat_Attack_Distracted" "action" "attack">>
<<vchoice "Shout from the ground" "Combat_Shout_Protect" "action" "talk">>
<<if _showWatch && $extremeContent.dubcon>>
<<vchoice "Watch from the ground..." _watchPassage "intimate" "search">>
<</if>>
<<elseif _isKneeling>>
<<vchoice "Lunge from knees!" "Combat_Attack_Distracted" "action" "attack">>
<<if _pullBlock>><div class="action-blocked">Pull him off her! (_pullBlock)</div><<else>><<vchoice "Pull him off her!" "Combat_Intervene_Pull" "action" "strength">><</if>>
<<vchoice `"\"Get your hands off her!\""` "Combat_Shout_Protect" "action" "talk">>
<<if _showWatch && $extremeContent.dubcon>>
<<vchoice "Watch from below..." _watchPassage "intimate" "search">>
<</if>>
<<else>>
<<vchoice "Attack while distracted!" "Combat_Attack_Distracted" "action" "attack">>
<<if _pullBlock>><div class="action-blocked">Pull him off her! (_pullBlock)</div><<else>><<vchoice "Pull him off her!" "Combat_Intervene_Pull" "action" "strength">><</if>>
<<vchoice `"\"Get your hands off her!\""` "Combat_Shout_Protect" "action" "talk">>
<<if _showWatch && $extremeContent.dubcon>>
<<vchoice "Watch for a moment..." _watchPassage "intimate" "search">>
<</if>>
<</if>>
</div>
<</widget>><<set _currentEnemyIndex to ($combat.pendingSexAction && $combat.pendingSexAction.enemyIndex !== undefined) ? $combat.pendingSexAction.enemyIndex : 0>>
<<set _enemy to $combat.enemies[_currentEnemyIndex]>>
<<set _intent to ($combat.pendingSexAction && $combat.pendingSexAction.intent) ? $combat.pendingSexAction.intent : null>>
<<if !_enemy>>
<<goto "Combat_Actions">>
<<else>>
<<setPronouns _enemy>>
<<if _intent>>
<<set _c to $clothing.kira>>
<<set _pos to $combat.positions.kira>>
<<switch _intent>>
<<case "fuck_pussy">>
<<kiraAssaultVideo _intent _p>>
<<if _p.hasCock>>
<p class="explicit"><<print _enemy.name>> moves toward Kira's exposed pussy, already pulling <<print _p.his>> cock out.</p>
<<say "Kira" "No— get away from me!">>
She struggles, but <<if _pos === "pinned">>she's pinned down<<else>>she's too dazed to stop <<print _p.him>><</if>>.
<<say _enemy.name "Hold still, bitch. This won't take long.">>
<<interventionChoices "Combat_Watch_Kira_Fucked">>
<<else>>
<p class="explicit"><<print _enemy.name>> moves toward Kira's exposed pussy, fingers extended.</p>
<<say "Kira" "No— get away from me!">>
She struggles, but <<if _pos === "pinned">>she's pinned down<<else>>she's too dazed to stop <<print _p.him>><</if>>.
<<say _enemy.name "Let's see how wet you are, bitch.">>
<<interventionChoices "Combat_Watch_Kira_Fingered">>
<</if>>
<<case "shove_underwear_aside">>
<<set $clothing.kira.underwear to 0>>
<<set $clothing.kira.pussyExposed to true>>
<<kiraAssaultVideo "fuck_pussy" _p>>
<<getMaleAssaultNarrative "shove_underwear_aside" "He shoves her panties aside.">>
<p class="explicit"><<print _maNarrative>></p>
<<say "Kira" "No— not like this!">>
She struggles, but <<if _pos === "pinned">>she's pinned down<<else>>she's too dazed to stop <<print _p.him>><</if>>.
<<say _enemy.name "Hold still, bitch. This won't take long.">>
<<interventionChoices "Combat_Watch_Kira_Fucked">>
<<case "grope_tits">>
<<kiraAssaultVideo _intent _p>>
<<set _gropeCfg to setup.kiraSexConfig.grope>>
<<if $combat.kiraInRefractory>>
<p class="explicit"><<print _enemy.name>> lunges for Kira's exposed tits, grabbing them roughly.</p>
<<trackPostOrgasmAttack "grope">>
<<addKiraLust _gropeCfg.titsRefractory.kiraLust>>
<<else>>
<p class="explicit"><<print _enemy.name>> lunges for Kira's exposed tits, grabbing them roughly.</p>
<<say "Kira" "Hey— hands OFF!">>
<<print _p.He>> squeezes her tits hard, pinching her nipples.
<<addKiraLust _gropeCfg.tits.kiraLust>>
<</if>>
<<if !$combat.kiraEffects>><<set $combat.kiraEffects to {}>><</if>>
<<set $combat.kiraEffects.groped to 2>>
<<logCombat `_enemy.name + " groped Kira's tits!"` "humiliation">>
<<addMaleEnemyLust `random(10, 12)` "grope_tits">>
<<interventionChoices "Combat_Watch_Grope">>
<<case "grope_pussy">>
<<kiraAssaultVideo _intent _p>>
<<set _gropeCfg to setup.kiraSexConfig.grope>>
<<if $combat.kiraInRefractory>>
<p class="explicit"><<print _enemy.name>> shoves <<print _p.his>> hand between Kira's legs, fingers finding her exposed pussy.</p>
<<trackPostOrgasmAttack "finger">>
<<addKiraLust _gropeCfg.pussyRefractory.kiraLust>>
<<else>>
<p class="explicit"><<print _enemy.name>> shoves <<print _p.his>> hand between Kira's legs, fingers finding her exposed pussy.</p>
<<say "Kira" "NO! Get your— ahh!">>
<<print _p.He>> pushes <<print _p.his>> fingers inside roughly. She gasps, body betraying her.
<<addKiraLust _gropeCfg.pussy.kiraLust>>
<</if>>
<<addMaleEnemyLust `random(12, 15)` "grope_pussy">>
<<interventionChoices "Combat_Watch_Grope">>
<<case "grope_ass">>
<<kiraAssaultVideo _intent _p>>
<<set _gropeCfg to setup.kiraSexConfig.grope>>
<<if $combat.kiraInRefractory>>
<p class="explicit"><<print _enemy.name>> grabs Kira's exposed ass, squeezing the firm cheeks.</p>
<<trackPostOrgasmAttack "grope">>
<<addKiraLust _gropeCfg.ass.kiraLust>>
<<else>>
<p class="explicit"><<print _enemy.name>> grabs Kira's exposed ass, squeezing the firm cheeks.</p>
<<say "Kira" "Hey! Hands off my—">>
<<print _p.He>> spreads her cheeks, fingers probing between them.
<<say "Kira" "Don't you DARE—!">>
<<addKiraLust _gropeCfg.ass.kiraLust>>
<</if>>
<<if !$combat.kiraEffects>><<set $combat.kiraEffects to {}>><</if>>
<<set $combat.kiraEffects.groped to 2>>
<<logCombat `_enemy.name + " groped Kira's ass!"` "humiliation">>
<<addMaleEnemyLust `random(10, 12)` "grope_ass">>
<<interventionChoices "Combat_Watch_Grope">>
<<case "fuck_ass">>
<<kiraAssaultVideo _intent _p>>
<<if _p.hasCock>>
<p class="explicit"><<print _enemy.name>> positions <<print _p.himself>> behind Kira's raised ass, cock in hand.</p>
<<say "Kira" `"Not— not THERE! " + $player.name + "!"`>>
<<say _enemy.name "Tight little ass like this? Can't resist.">>
<<interventionChoices "Combat_Watch_Kira_Anal">>
<<else>>
<p class="explicit"><<print _enemy.name>> positions <<print _p.himself>> behind Kira's raised ass, fingers probing.</p>
<<say "Kira" `"Not— not THERE! " + $player.name + "!"`>>
<<say _enemy.name "Let's see how tight you really are.">>
<<interventionChoices "Combat_Watch_Kira_Anal_Finger">>
<</if>>
<<case "hair_grab_force">>
<p class="explicit"><<print _enemy.name>> lunges forward and grabs a fistful of Kira's hair!</p>
<<say "Kira" "OW! Let GO!">>
<<print _p.He>> yanks hard, forcing her head down while <<print _p.his>> other hand shoves her back.
<<set _cfg to setup.kiraSexConfig.positioning.hairGrab>>
<<set _resistRoll to random(1, 100)>>
<<if _resistRoll lte _cfg.resistDC>>
<<kiraAssaultVideo _intent _p "resist">>
Kira twists and breaks free, stumbling away.
<<say "Kira" `"You " + _p.bastard + "!"`>>
<<set _enemy.sexIntent to null>>
<div class="choice-container">
<<vchoice "Continue fighting" "Combat_Actions" "move" "map">>
</div>
<<else>>
<<kiraAssaultVideo _intent _p>>
<<print _p.He>> forces her down— face against the ground, ass up in the air.
<<set $combat.positions.kira to "bent_over">>
<<set $combat.lastAttackWasGrab to true>>
<<addKiraLust _cfg.kiraLust>>
<<addMaleEnemyLust `random(8, 12)` "hair_grab">>
<<logKiraPositionChange "bent_over" "hair_grab_force">>
<<run setup.applyKnockdownCombo(_enemy, "hair_grab_force")>>
<<run setup.markHoldingKira(_enemy)>>
<<say "Kira" "No— let me UP!">>
<<say _enemy.name "That's better. Nice and accessible.">>
<<interventionChoices "" false>>
<</if>>
<<case "leg_sweep">>
<<set _cfg to setup.kiraSexConfig.positioning.legSweep>>
<p class="explicit"><<print _enemy.name>> drops low and sweeps Kira's legs out from under her!</p>
<<set _resistRoll to random(1, 100)>>
<<if _resistRoll lte _cfg.resistDC>>
<<kiraAssaultVideo _intent _p "resist">>
Kira jumps over the sweep, landing in a fighting stance.
<<say "Kira" "Nice try, asshole!">>
<<set _enemy.sexIntent to null>>
<div class="choice-container">
<<vchoice "Continue fighting" "Combat_Actions" "move" "map">>
</div>
<<else>>
<<kiraAssaultVideo _intent _p>>
Kira crashes down hard, landing on her back with her legs splayed!
<<set $combat.positions.kira to "prone_back">>
<<set $combat.lastAttackWasGrab to true>>
<<damageKira `random(3, 6)`>>
<<addKiraLust _cfg.kiraLust>>
<<addMaleEnemyLust `random(8, 10)` "leg_sweep">>
<<logKiraPositionChange "prone_back" "leg_sweep">>
<<run setup.applyKnockdownCombo(_enemy, "leg_sweep")>>
<<say "Kira" "Ugh—!">>
<<if $clothing.kira.pussyExposed>>
<p class="explicit">Her legs are spread wide, pussy completely exposed and vulnerable.</p>
<<modifyCurrentEnemyLust 15>>
<</if>>
<<say _enemy.name "Down you go, bitch.">>
<div class="choice-container">
<<vchoice `"Attack before " + _p.he + " can mount her!"` "Combat_Attack_Distracted" "action" "attack">>
<<vchoice "Help Kira up" "Combat_Help_Kira_Up" "action" "strength">>
</div>
<</if>>
<<case "wrist_yank">>
<<set _cfg to setup.kiraSexConfig.positioning.wristYank>>
<p class="explicit"><<print _enemy.name>> grabs Kira's wrist and YANKS hard!</p>
<<set _resistRoll to random(1, 100)>>
<<if _resistRoll lte _cfg.resistDC>>
<<kiraAssaultVideo _intent _p "resist">>
Kira twists her arm free and shoves <<print _p.him>> back.
<<say "Kira" "Get OFF me!">>
<<set _enemy.sexIntent to null>>
<div class="choice-container">
<<vchoice "Continue fighting" "Combat_Actions" "move" "map">>
</div>
<<else>>
<<kiraAssaultVideo _intent _p>>
She's yanked off-balance, crashing down to her knees!
<<set $combat.positions.kira to "kneeling">>
<<set $combat.lastAttackWasGrab to true>>
<<addKiraLust _cfg.kiraLust>>
<<addMaleEnemyLust `random(8, 12)` "wrist_yank">>
<<logKiraPositionChange "kneeling" "wrist_yank">>
<<run setup.applyKnockdownCombo(_enemy, "wrist_yank")>>
<<run setup.markHoldingKira(_enemy)>>
<<say "Kira" "Shit—!">>
<<print _p.He>> keeps hold of her wrist, controlling her.
<<say _enemy.name "On your knees where you belong.">>
<<interventionChoices "" false>>
<</if>>
<<case "hip_throw">>
<<set _cfg to setup.kiraSexConfig.positioning.hipThrow>>
<p class="explicit"><<print _enemy.name>> grabs Kira's hip and wrist, pivoting for a throw!</p>
<<set _resistRoll to random(1, 100)>>
<<if _resistRoll lte _cfg.resistDC>>
<<kiraAssaultVideo _intent _p "resist">>
Kira shifts her weight and breaks <<print _p.his>> grip, shoving <<print _p.him>> away.
<<say "Kira" "Not happening!">>
<<set _enemy.sexIntent to null>>
<div class="choice-container">
<<vchoice "Continue fighting" "Combat_Actions" "move" "map">>
</div>
<<else>>
<<kiraAssaultVideo _intent _p>>
<<print _p.He>> hip-throws her HARD! Kira slams onto her back, legs splaying from the impact!
<<set $combat.positions.kira to "prone_back">>
<<set $combat.lastAttackWasGrab to true>>
<<damageKira `random(5, 10)`>>
<<addKiraLust _cfg.kiraLust>>
<<addMaleEnemyLust `random(10, 12)` "hip_throw">>
<<logKiraPositionChange "prone_back" "hip_throw">>
<<run setup.applyKnockdownCombo(_enemy, "hip_throw")>>
<<say "Kira" "AAHH—!">>
<p class="explicit">She's spread out beneath <<print _p.him>>, completely vulnerable. Her legs are wide apart from the throw.</p>
<<if $clothing.kira.pussyExposed>>
<<modifyCurrentEnemyLust 20>>
<<say _enemy.name "Now THAT'S a pretty sight.">>
<</if>>
<<interventionChoices "Combat_Watch_Mount_Attempt">>
<</if>>
<<case "belt_whip">>
<p class="explicit"><<print _enemy.name>> yanks <<print _p.his>> belt free with a sharp CRACK!</p>
<<say _enemy.name "Let's see how you like this, bitch.">>
The leather belt whistles through the air—
<<set _hitRoll to random(1, 100)>>
<<if _hitRoll lte 75>>
<<kiraAssaultVideo _intent _p>>
<<set _targetArea to either("back", "thighs", "ass", "tits")>>
<<switch _targetArea>>
<<case "back">>
CRACK! The belt lashes across Kira's back, leaving a red welt!
<<set _dmg to -random(3, 6)>>
<<clampStat "companions[0].health" _dmg 0 100>>
<<case "thighs">>
SNAP! The belt bites into her thighs, stinging exposed skin!
<<set _dmg to -random(2, 5)>>
<<clampStat "companions[0].health" _dmg 0 100>>
<<if $clothing.kira.bottom > 0>>
<<damageClothing "kira" "bottom" 15>>
<</if>>
<<case "ass">>
<<if $combat.kiraInRefractory>>
<<trackPostOrgasmAttack "crop_ass">>
<<else>>
CRACK! The belt slaps her ass hard enough to leave a welt!
<</if>>
<<set _dmg to -random(2, 4)>>
<<clampStat "companions[0].health" _dmg 0 100>>
<<addKiraLust setup.kiraSexConfig.grope.slap.kiraLust>>
<<case "tits">>
<<if $combat.kiraInRefractory>>
<<trackPostOrgasmAttack "crop_tits">>
<<else>>
SNAP! The leather catches her exposed tit, making her scream!
<</if>>
<<set _dmg to -random(4, 7)>>
<<clampStat "companions[0].health" _dmg 0 100>>
<<addKiraLust setup.kiraSexConfig.crop.general.kiraLust>>
<</switch>>
<<if $companions[0].health lt 1>><<set $companions[0].health to 1>><</if>>
<<set $companions[0].health to setup.kiraFloorHealth($companions[0].health)>>
<<if $companions[0].health <= 1 && $combat && $combat.active>>
<<set $combat.kiraIncapacitated to true>>
<</if>>
<<say "Kira" "AAHH! You BASTARD!">>
<<if !$combat.kiraEffects>><<set $combat.kiraEffects to {}>><</if>>
<<set $combat.kiraEffects.welted to 4>>
<<logCombat `_enemy.name + " whipped Kira with belt! Red welts forming."` "humiliation">>
<<addKiraLust setup.kiraSexConfig.grope.slap.kiraLust>>
<<modifyCurrentEnemyLust 10>>
<<set $combat.lastAttackWasWhip to true>>
<<say _enemy.name "Scream louder. I like it.">>
<<else>>
<<kiraAssaultVideo _intent _p "resist">>
Kira dodges aside and the belt misses!
<<say "Kira" "Missed, asshole!">>
<</if>>
<<interventionChoices "" false>>
<<case "pants_yank" "belt_yank_pants">>
<<set _cfg to setup.kiraSexConfig.strip.pantsPull>>
<p class="explicit"><<print _enemy.name>> grabs the waistband of Kira's damaged pants!</p>
<<say "Kira" "NO— don't—!">>
<<set _resistRoll to random(1, 100)>>
<<if _resistRoll lte setup.stripResistDC(_cfg.resistDC, _enemy)>>
<<kiraAssaultVideo _intent _p "resist">>
Kira twists away, clutching her pants!
<<say "Kira" "Get your hands OFF!">>
<<set _enemy.sexIntent to null>>
<<checkFailedStripTaunt _enemy 0>>
<div class="choice-container">
<<vchoice "Continue fighting" "Combat_Actions" "move" "map">>
</div>
<<else>>
<<kiraAssaultVideo _intent _p>>
<<print _p.He>> YANKS hard! Her pants tear away, falling to her ankles!
<<set $clothing.kira.bottom to 0>>
<<set _hadUnderwear to ($clothing.kira.underwear > 0)>>
<<if _hadUnderwear>>
<<set $clothing.kira.underwear to 0>>
<</if>>
<<set $clothing.kira.pussyExposed to true>>
<<set $clothing.kira.assExposed to true>>
<<set $clothing.kira.underwearExposed to false>>
<<if _hadUnderwear>>
<p class="explicit">Her panties come down with her pants— pussy and ass completely exposed! She stumbles, clothes tangled around her ankles.</p>
<<else>>
<p class="explicit">Her pussy is completely exposed now. She stumbles, pants tangled around her feet.</p>
<</if>>
<<say _enemy.name "There we go! Much better view.">>
<<set _lustBonus to (_hadUnderwear ? 35 : 25)>>
<<modifyCurrentEnemyLust _lustBonus>>
<<addKiraLust _cfg.kiraLust>>
<<set _watchPlayerLust to setup.playerWatchConfig.stripped.playerLust || 0>>
<<clampStat "player.lust" _watchPlayerLust>>
<<say "Kira" "You— you fucking—!">>
<<set $combat.kiraMovementPenalty to true>>
<div class="choice-container">
<<vchoice `"Attack " + _p.him + " NOW!"` "Combat_Attack_Distracted" "action" "attack">>
<<vchoice "Help Kira kick off the pants" "Combat_Help_Kick_Pants" "action" "strength">>
</div>
<</if>>
<<case "rip_underwear">>
<<set _cfg to setup.kiraSexConfig.strip.underwearRip>>
<p class="explicit"><<print _enemy.name>> grabs the waistband of Kira's panties!</p>
<<say "Kira" "NO! Don't you dare—!">>
<<set _resistRoll to random(1, 100)>>
<<if _resistRoll lte setup.stripResistDC(_cfg.resistDC, _enemy)>>
<<kiraAssaultVideo _intent _p "resist">>
Kira clamps her thighs together and twists away!
<<say "Kira" "Get your filthy hands off me!">>
<<set _enemy.sexIntent to null>>
<<checkFailedStripTaunt _enemy 0>>
<div class="choice-container">
<<vchoice "Continue fighting" "Combat_Actions" "move" "map">>
</div>
<<else>>
<<kiraAssaultVideo _intent _p>>
<<print _p.He>> RIPS her panties off in one brutal motion!
<<set $clothing.kira.underwear to 0>>
<<set $clothing.kira.pussyExposed to true>>
<<set $clothing.kira.underwearExposed to false>>
<p class="explicit">Her bare pussy is completely exposed! The ruined panties dangle from <<print _p.his>> fist like a trophy.</p>
<<say _enemy.name "Fucking FINALLY. Look at that tight cunt.">>
<<modifyCurrentEnemyLust 30>>
<<addKiraLust _cfg.kiraLust>>
<<set $player.lust to Math.min(100, $player.lust + 15)>>
<<say "Kira" "No— don't look at me...">>
<<interventionChoices "" false>>
<</if>>
<<case "slice_underwear">>
<<set _cfg to setup.kiraSexConfig.strip.knifeSlice>>
<p class="explicit"><<print _enemy.name>> brings <<print _p.his>> knife to Kira's exposed panties!</p>
<<say "Kira" "DON'T— be careful with that!">>
<<set _resistRoll to random(1, 100)>>
<<if _resistRoll lte setup.stripResistDC(_cfg.resistDC, _enemy)>>
<<kiraAssaultVideo _intent _p "resist">>
Kira jerks away just as the blade catches fabric! A thin cut appears on her hip but her panties hold.
<<damageKira 2>>
<<say "Kira" "You almost cut me, you psycho!">>
<<set _enemy.sexIntent to null>>
<<checkFailedStripTaunt _enemy 0>>
<div class="choice-container">
<<vchoice "Continue fighting" "Combat_Actions" "move" "map">>
</div>
<<else>>
<<kiraAssaultVideo _intent _p>>
The knife slices through the thin fabric easily! Her panties fall away in pieces!
<<set $clothing.kira.underwear to 0>>
<<set $clothing.kira.pussyExposed to true>>
<<set $clothing.kira.underwearExposed to false>>
<p class="explicit">Her bare pussy is exposed! The knife traced dangerously close to her most sensitive flesh.</p>
<<say _enemy.name "There. Much easier access now.">>
<<modifyCurrentEnemyLust 35>>
<<addKiraLust _cfg.kiraLust>>
<<set $player.lust to Math.min(100, $player.lust + 15)>>
<<say "Kira" "You— you could have—!">>
<<interventionChoices "" false>>
<</if>>
<<case "belt_yank_underwear">>
<<set _cfg to setup.kiraSexConfig.strip.beltYank>>
<p class="explicit"><<print _enemy.name>> hooks <<print _p.his>> belt buckle under Kira's panties!</p>
<<say "Kira" "What are you— NO!">>
<<set _resistRoll to random(1, 100)>>
<<if _resistRoll lte setup.stripResistDC(_cfg.resistDC, _enemy)>>
<<kiraAssaultVideo _intent _p "resist">>
Kira grabs the belt and wrenches it away!
<<say "Kira" "Nice try, asshole!">>
<<set _enemy.sexIntent to null>>
<<checkFailedStripTaunt _enemy 0>>
<div class="choice-container">
<<vchoice "Continue fighting" "Combat_Actions" "move" "map">>
</div>
<<else>>
<<kiraAssaultVideo _intent _p>>
<<print _p.He>> YANKS the belt! Her panties tear away, caught on the buckle!
<<set $clothing.kira.underwear to 0>>
<<set $clothing.kira.pussyExposed to true>>
<<set $clothing.kira.underwearExposed to false>>
<p class="explicit">Her bare pussy springs into view! Her ruined panties hang from <<print _p.his>> belt like a trophy.</p>
<<say _enemy.name "I love that trick. Works every time.">>
<<modifyCurrentEnemyLust 30>>
<<addKiraLust _cfg.kiraLust>>
<<set $player.lust to Math.min(100, $player.lust + 12)>>
<<say "Kira" "You fucking pervert!">>
<<interventionChoices "" false>>
<</if>>
<<case "rip_top_off">>
<<set _cfg to setup.kiraSexConfig.strip.topRip>>
<p class="explicit"><<print _enemy.name>> grabs what's left of Kira's damaged top!</p>
<<say "Kira" "No— leave it!">>
<<set _resistRoll to random(1, 100)>>
<<if _resistRoll lte setup.stripResistDC(_cfg.resistDC, _enemy)>>
<<kiraAssaultVideo _intent _p "resist">>
Kira clutches her top, holding it together!
<<say "Kira" "Keep your hands OFF!">>
<<set _enemy.sexIntent to null>>
<<checkFailedStripTaunt _enemy 0>>
<div class="choice-container">
<<vchoice "Continue fighting" "Combat_Actions" "move" "map">>
</div>
<<else>>
<<kiraAssaultVideo _intent _p>>
<<print _p.He>> TEARS her top away completely! Buttons fly, fabric rips!
<<set $clothing.kira.top to 0>>
<<set $clothing.kira.titsExposed to true>>
<p class="explicit">Her tits bounce free! Perfect, round, nipples already hard from the fight.</p>
<<say _enemy.name "THERE they are! Fucking gorgeous.">>
<<modifyCurrentEnemyLust 25>>
<<addKiraLust _cfg.kiraLust>>
<<set $player.lust to Math.min(100, $player.lust + 10)>>
<<say "Kira" "Stop STARING!">>
<<interventionChoices "" false>>
<</if>>
<<case "slice_top">>
<<set _cfg to setup.kiraSexConfig.strip.knifeSlice>>
<p class="explicit"><<print _enemy.name>> brings <<print _p.his>> knife to Kira's shirt!</p>
<<say "Kira" "DON'T—!">>
<<set _resistRoll to random(1, 100)>>
<<if _resistRoll lte setup.stripResistDC(_cfg.resistDC + 3, _enemy)>>
<<kiraAssaultVideo _intent _p "resist">>
Kira throws herself backward! The knife misses!
<<say "Kira" "Missed, asshole!">>
<<set _enemy.sexIntent to null>>
<<checkFailedStripTaunt _enemy 0>>
<div class="choice-container">
<<vchoice "Continue fighting" "Combat_Actions" "move" "map">>
</div>
<<else>>
<<kiraAssaultVideo _intent _p>>
A quick slash! Her shirt falls open, fabric parting!
<<set $clothing.kira.top to 0>>
<<set $clothing.kira.titsExposed to true>>
<p class="explicit">Her tits spill free, the ruined shirt hanging open!</p>
<<say _enemy.name "Much better. Those are too nice to hide.">>
<<modifyCurrentEnemyLust 30>>
<<addKiraLust _cfg.kiraLust>>
<<set $player.lust to Math.min(100, $player.lust + 12)>>
<<say "Kira" "I'll shove that knife up your—!">>
<<interventionChoices "" false>>
<</if>>
<<case "forced_oral">>
<<set _cfg to setup.kiraSexConfig.sexActs.forcedOral>>
<<if _p.hasCock>>
<p class="explicit"><<print _enemy.name>> grabs a fistful of Kira's hair, pulling her face toward <<print _p.his>> crotch!</p>
<<say "Kira" "NO! Get away from—mmph!">>
<<print _p.He>>'s already pulling <<print _p.his>> cock out with <<print _p.his>> other hand.
<<set _resistRoll to random(1, 100)>>
<<if _resistRoll lte _cfg.resistDC>>
<<kiraAssaultVideo _intent _p "resist">>
Kira bites down on <<print _p.his>> hand! <<print _p.He>> yelps and releases her!
<<say _enemy.name "FUCK! You bitch!">>
<<set _enemy.health -= setup.kiraSexConfig.resistSuccess.bite.damage>>
<<applyEnemyDamageExpression _enemy>>
<<say "Kira" "Try that again and I'll bite something ELSE off!">>
<<set _enemy.sexIntent to null>>
<div class="choice-container">
<<vchoice "Continue fighting" "Combat_Actions" "move" "map">>
</div>
<<else>>
<<kiraAssaultVideo _intent _p>>
<<print _p.He>> forces <<print _p.his>> cock between her lips!
<<say _enemy.name "That's it. Suck it, bitch.">>
<p class="explicit">Kira gags as <<print _p.he>> thrusts into her mouth, hand fisted in her hair.</p>
<<addKiraLust _cfg.kiraLust>>
<<modifyCurrentEnemyLust 30>>
<<interventionChoices "Combat_Watch_Forced_Oral">>
<</if>>
<<else>>
<<set _enemy.sexIntent to null>>
<div class="choice-container">
<<vchoice "Continue fighting" "Combat_Actions" "move" "map">>
</div>
<</if>>
<<case "ass_slap">>
<<kiraAssaultVideo _intent _p>>
<p class="explicit"><<print _enemy.name>> reaches out and SLAPS Kira's bare ass!</p>
SMACK!
<<if $combat.kiraInRefractory>>
<<trackPostOrgasmAttack "grope">>
<<else>>
<<say "Kira" "HEY!">>
A red handprint blooms on her cheek.
<</if>>
<<if !$combat.kiraEffects>><<set $combat.kiraEffects to {}>><</if>>
<<set $combat.kiraEffects.slapped to 3>>
<<logCombat `_enemy.name + " slapped Kira's ass! Red handprint visible."` "humiliation">>
<<addKiraLust setup.kiraSexConfig.grope.slap.kiraLust>>
<<modifyCurrentEnemyLust 8>>
<<say _enemy.name "Nice ass. Can't wait to use it.">>
<<say "Kira" "Touch me again and I'll cut your hand off!">>
<<set _enemy.sexIntent to null>>
<div class="choice-container">
<<vchoice "Continue fighting" "Combat_Actions" "move" "map">>
</div>
<<case "chain_choke">>
<<set _cfg to setup.kiraSexConfig.positioning.chainPull>>
<p class="explicit"><<print _enemy.name>> whips the chain around Kira's neck!</p>
The metal links clatter and tighten around her throat.
<<say "Kira" "Gkk—!">>
<<set _resistRoll to random(1, 100)>>
<<if _resistRoll lte _cfg.resistDC>>
<<kiraAssaultVideo _intent _p "resist">>
Kira grabs the chain and yanks hard, pulling it loose!
<<say "Kira" "//cough// Not... that easy!">>
<<set _enemy.sexIntent to null>>
<div class="choice-container">
<<vchoice "Continue fighting" "Combat_Actions" "move" "map">>
</div>
<<else>>
<<kiraAssaultVideo _intent _p>>
<<print _p.He>> PULLS, forcing her down to her knees!
<<set $combat.positions.kira to "kneeling">>
<<logKiraPositionChange "kneeling" "chain_choke">>
<<set $combat.kiraChoked to 3>>
<<logCombat `_enemy.name + " choked Kira with chain! She's gasping for air."` "humiliation">>
<<say _enemy.name "That's it. On your knees where you belong.">>
<p class="explicit">Kira gasps for air, the chain still tight around her neck. <<print _p.He>> holds it like a leash.</p>
<<addKiraLust _cfg.kiraLust>>
<<modifyCurrentEnemyLust 15>>
<div class="choice-container">
<<vchoice `"Attack while " + _p.he + "'s holding the chain!"` "Combat_Attack_Distracted" "action" "attack">>
<<vchoice "Try to free Kira from the chain" "Combat_Free_Chain" "action" "strength">>
</div>
<</if>>
<<case "chain_bind">>
<<set _cfg to setup.kiraSexConfig.positioning.chokeHold>>
<p class="explicit"><<print _enemy.name>> grabs Kira's wrists and starts wrapping the chain around them!</p>
<<say "Kira" "Get OFF—!">>
<<set _resistRoll to random(1, 100)>>
<<if _resistRoll lte _cfg.resistDC>>
<<kiraAssaultVideo _intent _p "resist">>
Kira twists free before <<print _p.he>> can finish wrapping!
<<say "Kira" "Nice try, asshole!">>
<<set _enemy.sexIntent to null>>
<div class="choice-container">
<<vchoice "Continue fighting" "Combat_Actions" "move" "map">>
</div>
<<else>>
<<kiraAssaultVideo _intent _p>>
<<print _p.He>> locks the chain tight! Her wrists are bound together!
<<set $combat.kiraWristsBound to true>>
<<say _enemy.name "There we go. Can't fight back now, can you?">>
<p class="explicit">Kira struggles against the chain, but it's wrapped too tight. Her arms are useless.</p>
<<addKiraLust _cfg.kiraLust>>
<<modifyCurrentEnemyLust 12>>
<div class="choice-container">
<<vchoice `"Attack " + _p.him + " NOW!"` "Combat_Intervene_Attack" "action" "attack">>
<<vchoice "Try to unwrap Kira's chains" "Combat_Free_Wrists" "action" "strength">>
</div>
<</if>>
<<case "crop_pussy">>
<<kiraAssaultVideo _intent _p>>
<p class="explicit"><<print _enemy.name>> raises the riding crop and SLAPS it between Kira's legs!</p>
CRACK!
<<set _cropCfg to setup.kiraSexConfig.crop>>
<<if $combat.kiraInRefractory>>
<<trackPostOrgasmAttack "crop_pussy">>
<<addKiraLust _cropCfg.pussy.kiraLust>>
<<damageKira 2>>
<<else>>
<<say "Kira" "AAHH!">>
<p class="explicit">Kira's whole body jerks from the stinging impact on her exposed pussy.</p>
<<addKiraLust _cropCfg.pussy.kiraLust>>
<<damageKira 2>>
<</if>>
<<modifyCurrentEnemyLust 20>>
<<set $combat.lastAttackWasWhip to true>>
<<if !$combat.kiraEffects>><<set $combat.kiraEffects to {}>><</if>>
<<set $combat.kiraEffects.welted to 4>>
<<logCombat `_enemy.name + " cropped Kira's pussy! Welts forming."` "humiliation">>
<<say _enemy.name "Sensitive there, aren't you? Let's try again...">>
<<print _p.He>> raises the crop again.
<div class="choice-container">
<<vchoice "Grab the crop!" "Combat_Grab_Crop" "action" "agility">>
<<vchoice `"Attack " + _p.him + "!"` "Combat_Intervene_Attack" "action" "attack">>
</div>
<<case "crop_tits">>
<<kiraAssaultVideo _intent _p>>
<p class="explicit"><<print _enemy.name>> flicks the riding crop across Kira's exposed nipples!</p>
SNAP! SNAP!
<<set _cropCfg to setup.kiraSexConfig.crop>>
<<if $combat.kiraInRefractory>>
<<trackPostOrgasmAttack "crop_tits">>
<<addKiraLust _cropCfg.tits.kiraLust>>
<<else>>
<<say "Kira" "Nngh—!">>
<p class="explicit">Red welts bloom on her breasts. Her nipples harden involuntarily from the stinging pain.</p>
<<addKiraLust _cropCfg.tits.kiraLust>>
<</if>>
<<modifyCurrentEnemyLust 18>>
<<set $combat.lastAttackWasWhip to true>>
<<if !$combat.kiraEffects>><<set $combat.kiraEffects to {}>><</if>>
<<set $combat.kiraEffects.welted to 4>>
<<logCombat `_enemy.name + " cropped Kira's tits! Red welts on her breasts."` "humiliation">>
<<say _enemy.name "Look at those nipples. You like this, don't you?">>
<<say "Kira" "F-fuck you!">>
<<set _enemy.sexIntent to null>>
<div class="choice-container">
<<vchoice "Continue fighting" "Combat_Actions" "move" "map">>
</div>
<<case "crop_ass">>
<<kiraAssaultVideo _intent _p>>
<p class="explicit"><<print _enemy.name>> brings the riding crop down hard on Kira's bare ass!</p>
CRACK! CRACK! CRACK!
<<set _cropCfg to setup.kiraSexConfig.crop>>
<<if $combat.kiraInRefractory>>
<<trackPostOrgasmAttack "crop_ass">>
<<addKiraLust _cropCfg.ass.kiraLust>>
<<else>>
<<say "Kira" "AH! Stop—!">>
<p class="explicit">Three red welts stripe across her ass cheeks.</p>
<<addKiraLust _cropCfg.ass.kiraLust>>
<</if>>
<<modifyCurrentEnemyLust 15>>
<<set $combat.lastAttackWasWhip to true>>
<<if !$combat.kiraEffects>><<set $combat.kiraEffects to {}>><</if>>
<<set $combat.kiraEffects.welted to 4>>
<<logCombat `_enemy.name + " cropped Kira's ass! Welts striping her cheeks."` "humiliation">>
<<say _enemy.name "Count them. Or I'll start over.">>
<<say "Kira" "Go to hell!">>
CRACK! Another strike.
<<set _enemy.sexIntent to null>>
<div class="choice-container">
<<vchoice "Continue fighting" "Combat_Actions" "move" "map">>
</div>
<<case "rope_bind_wrists">>
<p class="explicit"><<print _enemy.name>> lunges and grabs Kira's wrists, pulling out a length of rope!</p>
<<say "Kira" "No— let GO!">>
<<set _cfg to setup.kiraSexConfig.positioning.ropeWrists>>
<<set _resistRoll to random(1, 100)>>
<<if _resistRoll lte _cfg.resistDC>>
<<kiraAssaultVideo _intent _p "resist">>
Kira kicks <<print _p.him>> hard and pulls her arms free!
<<say "Kira" "Not happening!">>
<<set _enemy.health -= _cfg.resistDamage>>
<<applyEnemyDamageExpression _enemy>>
<<set _enemy.sexIntent to null>>
<div class="choice-container">
<<vchoice "Continue fighting" "Combat_Actions" "move" "map">>
</div>
<<else>>
<<kiraAssaultVideo _intent _p>>
<<print _p.He>> forces her wrists together and wraps the rope tight!
<<set $combat.kiraWristsBound to true>>
<<say _enemy.name "There. All trussed up like a present.">>
<p class="explicit">Kira's wrists are bound in front of her. She can barely move her arms.</p>
<<addKiraLust _cfg.kiraLust>>
<<modifyCurrentEnemyLust 12>>
<div class="choice-container">
<<vchoice `"Attack while " + _p.he + "'s close!"` "Combat_Intervene_Attack" "action" "attack">>
<<vchoice "Try to cut Kira's bonds" "Combat_Cut_Rope" "action" "agility">>
</div>
<</if>>
<<case "rope_bind_ankles">>
<p class="explicit"><<print _enemy.name>> dives for Kira's legs with the rope!</p>
<<say "Kira" "Get away from—!">>
<<set _cfg to setup.kiraSexConfig.positioning.ropeAnkles>>
<<set _resistRoll to random(1, 100)>>
<<if _resistRoll lte _cfg.resistDC>>
<<kiraAssaultVideo _intent _p "resist">>
Kira kicks <<print _p.him>> square in the face before <<print _p.he>> can grab her!
<<say "Kira" "Nice try!">>
<<set _enemy.health -= _cfg.resistDamage>>
<<applyEnemyDamageExpression _enemy>>
<<set _enemy.stunned to true>>
<<set _enemy.stunnedTurns to 1>>
<<set _enemy.sexIntent to null>>
<div class="choice-container">
<<vchoice "Continue fighting" "Combat_Actions" "move" "map">>
</div>
<<else>>
<<kiraAssaultVideo _intent _p>>
<<print _p.He>> wraps the rope around her ankles and yanks tight!
<<set $combat.kiraAnklesBound to true>>
<<set $combat.kiraMovementPenalty to true>>
Kira crashes down!
<<set $combat.positions.kira to "prone_front">>
<<logKiraPositionChange "prone_front" "rope_bind_ankles">>
<<say _enemy.name "Down you go!">>
<p class="explicit">Kira struggles on the ground, ankles bound together. She can't stand or run.</p>
<<addKiraLust _cfg.kiraLust>>
<<modifyCurrentEnemyLust 15>>
<div class="choice-container">
<<vchoice `"Attack " + _p.him + " before more!"` "Combat_Intervene_Attack" "action" "attack">>
<<vchoice "Help Kira up" "Combat_Help_Bound_Kira" "action" "strength">>
</div>
<</if>>
<<case "rope_leash">>
<p class="explicit"><<print _enemy.name>> loops the rope around Kira's neck!</p>
<<say "Kira" "Wha— NO!">>
<<set _cfg to setup.kiraSexConfig.positioning.ropeLeash>>
<<set _resistRoll to random(1, 100)>>
<<if _resistRoll lte _cfg.resistDC>>
<<kiraAssaultVideo _intent _p "resist">>
Kira ducks and slips free before <<print _p.he>> can tighten it!
<<say "Kira" "Fuck OFF!">>
<<set _enemy.sexIntent to null>>
<div class="choice-container">
<<vchoice "Continue fighting" "Combat_Actions" "move" "map">>
</div>
<<else>>
<<kiraAssaultVideo _intent _p>>
<<print _p.He>> pulls it tight like a leash!
<<set $combat.kiraLeashed to true>>
<<say _enemy.name "Good girl. Now heel.">>
<p class="explicit">Kira gasps as the rope tightens around her throat. <<print _p.He>> holds the other end, controlling her completely.</p>
<<addKiraLust _cfg.kiraLust>>
<<modifyCurrentEnemyLust 18>>
<<print _p.He>> yanks the rope, pulling her toward <<print _p.him>>.
<div class="choice-container">
<<vchoice "Cut the rope!" "Combat_Cut_Leash" "action" "agility">>
<<vchoice `"Attack " + _p.him + "!"` "Combat_Intervene_Attack" "action" "attack">>
</div>
<</if>>
<<case "leash_pull_kneel">>
<<kiraAssaultVideo _intent _p>>
<p class="explicit"><<print _enemy.name>> grips the rope leash and YANKS downward!</p>
<<say "Kira" "Gkk—!">>
The rope bites into her throat as <<print _p.he>> forces her down.
<<set $combat.positions.kira to "kneeling">>
<<logKiraPositionChange "kneeling" "leash_pull_kneel">>
<<say _enemy.name "On your knees, slut. You know what comes next.">>
<<if _p.hasCock>>
<p class="explicit">Kira gasps for air on her knees, the leash still tight around her neck. <<print _p.He>>'s already pulling <<print _p.his>> cock out.</p>
<<else>>
<p class="explicit">Kira gasps for air on her knees, the leash still tight around her neck. <<print _p.He>> looms over her.</p>
<</if>>
<<addKiraLust setup.kiraSexConfig.positioning.ropeLeash.kiraLust>>
<<modifyCurrentEnemyLust 20>>
<div class="choice-container">
<<vchoice "Cut the leash NOW!" "Combat_Cut_Leash" "action" "agility">>
<<vchoice `"Attack " + _p.him + "!"` "Combat_Intervene_Attack" "action" "attack">>
<<if $extremeContent.dubcon && _p.hasCock>>
<<vchoice "Watch..." "Combat_Watch_Forced_Oral" "intimate" "search">>
<</if>>
</div>
<<case "leash_choke">>
<<kiraAssaultVideo _intent _p>>
<p class="explicit"><<print _enemy.name>> tightens the rope around Kira's neck while <<print _p.his>> other hand gropes her!</p>
<<say "Kira" "Can't... breathe...">>
<<set _grope to either("tits", "ass", "pussy")>>
<<set _gropeCfg to setup.kiraSexConfig.grope>>
<<if $combat.kiraInRefractory>>
<<switch _grope>>
<<case "tits">>
<<trackPostOrgasmAttack "grope">>
<<addKiraLust _gropeCfg.titsRefractory.kiraLust>>
<<case "ass">>
<<trackPostOrgasmAttack "grope">>
<<addKiraLust _gropeCfg.ass.kiraLust>>
<<case "pussy">>
<<trackPostOrgasmAttack "finger">>
<<addKiraLust _gropeCfg.pussy.kiraLust>>
<</switch>>
<<else>>
<<switch _grope>>
<<case "tits">>
<<print _p.His>> hand squeezes her tits roughly while the rope cuts off her air.
<<addKiraLust _gropeCfg.tits.kiraLust>>
<<case "ass">>
<<print _p.He>> gropes her ass, fingers digging into her flesh as she chokes.
<<addKiraLust _gropeCfg.ass.kiraLust>>
<<case "pussy">>
<<print _p.His>> fingers push between her legs, rubbing her pussy while she gasps.
<<addKiraLust _gropeCfg.pussy.kiraLust>>
<</switch>>
<</if>>
<<modifyCurrentEnemyLust 15>>
<<say _enemy.name "You like that? Being used while you can't even breathe?">>
Kira's face is turning red. She needs air.
<div class="choice-container">
<<vchoice "Cut the rope!" "Combat_Cut_Leash" "action" "agility">>
<<vchoice `"Attack " + _p.him + "!"` "Combat_Intervene_Attack" "action" "attack">>
</div>
<<case "expose_self">>
<<if _p.hasCock>>
<<enemyExposeSelf _currentEnemyIndex false>>
<<set _enemy to $combat.enemies[_currentEnemyIndex]>>
<<if _exposeResult.success>>
<<kiraAssaultVideo _intent _p>>
<<if _exposeResult.droppedWeapon>>
<p class="explicit"><<print _enemy.name>> drops <<print _p.his>> <<print _exposeResult.droppedWeapon>> and starts undoing <<print _p.his>> pants, eyes locked on Kira.</p>
<<say _enemy.name "Won't be needing this. Just need my cock.">>
<<elseif _enemy.lust >= 90>>
<p class="explicit"><<print _enemy.name>> frantically tears at <<print _p.his>> pants, desperate to get <<print _p.his>> cock out. <<print _p.He>>'s rock hard and throbbing.</p>
<<say _enemy.name "Can't wait anymore. Need to fuck you NOW.">>
<<else>>
<p class="explicit"><<print _enemy.name>> slowly pulls <<print _p.his>> cock out, stroking it as <<print _p.he>> leers at Kira.</p>
<<say _enemy.name "See this? It's going inside you soon.">>
<</if>>
<<checkAndDisplayFirstTime "see_dick">>
<<say "Kira" "Shit... this is bad.">>
<<modifyCurrentEnemyLust 5>>
<<set _enemy.sexIntent to null>>
<<set $combat.enemies[_currentEnemyIndex] to _enemy>>
<div class="choice-container">
<<vchoice "Continue fighting" "Combat_Actions" "action" "attack">>
</div>
<<else>>
<<print _enemy.name>> fumbles with <<print _p.his>> pants but can't get them undone in time.
<<set _enemy.sexIntent to null>>
<<set $combat.enemies[_currentEnemyIndex] to _enemy>>
<div class="choice-container">
<<vchoice "Continue" "Combat_Actions" "action" "attack">>
</div>
<</if>>
<<else>>
<<set _enemy.sexIntent to "grope_tits">>
<<set $combat.enemies[_currentEnemyIndex] to _enemy>>
<<goto "Combat_Enemy_Sex_Kira_Check">>
<</if>>
<<case "spit_roast">>
<<kiraMediaTarget>>
<<combatActionVideo "coop-spit-roast-video" "combat/coop_spit_roast" _kiraMediaTarget>>
<p class="explicit"><<print _enemy.name>> and another raider move in sync. One grabs Kira's hair, forcing her head down, while the other positions behind her.</p>
<<say "Kira" "No—not both—PLEASE!">>
<p class="explicit">They thrust together, filling her from both ends. Kira can only make muffled sounds around the cock in her mouth.</p>
<<checkAndDisplayFirstTime "penetration">>
<<checkAndDisplayFirstTime "oral">>
<<addKiraLust 15>>
<<modifyCurrentEnemyLust 10>>
<<set $combat.kiraSexState to "spit_roast">>
<<set $combat.positions.kira to "prone_front">>
<<interventionChoices "Combat_Watch_Kira_Fucked">>
<<case "hold_and_strip">>
<<kiraMediaTarget>>
<<enemyStripAttempt _enemy>>
<<set _holdStrips to !!(_stripResult && _stripResult.shouldStrip)>>
<<combatActionVideo "coop-hold-and-strip-video" `_holdStrips ? setup.reviewedClipFolder("combat/coop_hold_and_strip", _stripResult.target) : "combat/kira_groped_tits"` _kiraMediaTarget>>
<<if _holdStrips>>
<p class="explicit">While one raider pins Kira's arms, <<print _enemy.name>> tears at her remaining clothing.</p>
<<else>>
<p class="explicit">While one raider pins Kira's arms, <<print _enemy.name>> gets <<print _p.his>> hands all over her, squeezing her tits hard.</p>
<</if>>
<<if _holdStrips>>
<<set _stripResult.successChance to 100>>
<<executeStripAttempt _stripResult _enemy>>
<</if>>
<<say "Kira" "Let go of me!">>
<<modifyCurrentEnemyLust 5>>
<<interventionChoices "Combat_Watch_Kira_Stripped">>
<<case "pin_down">>
<<kiraMediaTarget>>
<<combatActionVideo "coop-pin-down-video" `setup.reviewedClipFolder("combat/coop_pin_down")` _kiraMediaTarget>>
<p class="explicit">Multiple raiders grab Kira, forcing her to the ground and pinning her completely.</p>
<<set $combat.positions.kira to "pinned">>
<<set $combat.kiraWristsBound to true>>
<<logCombat `"Kira is pinned: their plain attacks on her get +" + ((_enemy.coopData && _enemy.coopData.accuracyBonus) || 30) + " to hit."` "tactical">>
<<say "Kira" "Get OFF me!">>
<<modifyCurrentEnemyLust 8>>
<<interventionChoices "Combat_Watch_Grope">>
<<default>>
<<run console.warn("[KIRA-SEX] Unknown sex intent:", _intent)>>
<p><<print _enemy.name>> makes a move toward Kira, but hesitates...</p>
<<say "Kira" "What are you—?">>
<p>The moment passes. Combat continues.</p>
<div class="choice-container">
<<vchoice "Continue" "Combat_Actions" "move" "map">>
</div>
<</switch>>
<</if>>
<</if>><<set _toVictory to false>>
<<kiraAssailant>>
<<setPronouns _enemy>>
<<set _playerPos to $combat.positions.player || "standing">>
<<if setup.playerIsStunned()>>
You try to move but your body won't cooperate. Still dazed from the blow.
<<set _failVariant to random(1, 3)>>
<<if _failVariant === 1>>
You watch helplessly as <<print _p.he>> continues with Kira.
<<elseif _failVariant === 2>>
Your legs give out. You can only watch.
<<else>>
The world spins. By the time it stops, it's too late.
<</if>>
<div class="choice-container">
<<vchoice "Continue" `_toVictory ? "Combat_Victory" : "Combat_Actions"` "move" "map">>
</div>
<<elseif _playerPos === "prone_back" || _playerPos === "prone_stomach">>
You try to lunge from the ground!
<<set _standRoll to random(1, 20) + Math.floor(($player.agility || 10) / 3)>>
<<if _standRoll >= 14>>
You scramble up and charge, but the awkward recovery costs you accuracy.
<<set $combat.positions.player to "standing">>
<<set _positionPenalty to 20>>
<<else>>
You can't get up fast enough! <<print _p.He>> kicks you back down before you can reach <<print _p.him>>.
<<set _kickDmg to -random(3, 6)>>
<<clampStat "player.health" _kickDmg 0 100>>
<<say _enemy.name "Stay DOWN!">>
<div class="choice-container">
<<vchoice "Continue" `_toVictory ? "Combat_Victory" : "Combat_Actions"` "move" "map">>
</div>
<</if>>
<<elseif _playerPos === "kneeling">>
You lunge from your knees, putting yourself at a disadvantage!
<<set _positionPenalty to 10>>
<<else>>
You lunge forward with desperate fury!
<<set _positionPenalty to 0>>
<</if>>
<<if !setup.playerIsStunned() && (!(_playerPos === "prone_back" || _playerPos === "prone_stomach") || (_standRoll >= 14))>>
<<set _hitRoll to random(1, 100)>>
<<set _baseAccuracy to 70 + Math.floor(($player.agility || 10) / 2)>>
<<set _adrenalineBonus to 10>>
<<if !_positionPenalty>><<set _positionPenalty to 0>><</if>>
<<set _hitChance to setup.playerStrikeChance(_baseAccuracy + _adrenalineBonus - _positionPenalty - setup.enemyDefenseMod(_enemy))>>
<<if _hitRoll lte _hitChance>>
<<set _baseDamage to 5 + Math.floor(($player.strength || 10) / 2)>>
<<if $equipped && $equipped.weapon>>
<<set _baseDamage += $equipped.weapon.damage>>
<</if>>
<<set _damageRoll to random(5, 12)>>
<<set _damage to Math.max(1, Math.floor((_baseDamage + _damageRoll) * setup.fighterDamageFactor("player")))>>
<<set _enemy.health -= _damage>>
<<applyEnemyDamageExpression _enemy>>
<<combatActionVideo "intervene-attack-video" "combat/intervene_attack" _enemy>>
<div class="combat-hit-effect">
Your blade connects! <span class="damage-number">-<<print _damage>></span>
</div>
<<set _ivWeaponStatus to setup.weaponStatusLine(setup.applyWeaponStatuses(_enemy), _enemy)>>
<<if _ivWeaponStatus>><div class="weapon-status-effect"><<print _ivWeaponStatus>></div><</if>>
<<print _enemy.name>> staggers back, releasing Kira.
<<say "Kira" "Thanks. Now let's kill this fucker.">>
<<set _enemy.sexIntent to null>>
<<addMaleEnemyLust 10 "denial">>
<<if _enemy.health lte 0>>
<<set _deadIndex to $combat.enemies.indexOf(_enemy)>>
<<if !$combat.defeatedEnemies>><<set $combat.defeatedEnemies to []>><</if>>
<<run $combat.defeatedEnemies.push(clone(_enemy))>>
<<run $combat.enemies.splice(_deadIndex, 1)>>
<<print setup.enemyRef(_enemy, true)>> falls dead.
<<if $combat.enemies.length === 0>>
<<set _toVictory to true>>
<</if>>
<</if>>
<<relationChange "kira" "trust" 2>>
<<else>>
<div class="combat-miss-effect">
<<print _p.He>> sees you coming and sidesteps!
</div>
<<say _enemy.name "You want some too? Get in line!">>
<<print _p.He>> shoves Kira aside, turning to face you.
<<set _enemy.sexIntent to null>>
<<addMaleEnemyLust 10 "denial">>
<<say "Kira" `"Dammit! At least " + _p.he + "'s off me."`>>
<<relationChange "kira" "trust" 1>>
<</if>>
<div class="choice-container">
<<vchoice "Continue" `_toVictory ? "Combat_Victory" : "Combat_Actions"` "move" "map">>
</div>
<</if>><<kiraAssailant>>
<<setPronouns _enemy>>
<<set _playerPos to $combat.positions.player || "standing">>
<<if setup.playerIsStunned()>>
You try to move but your body won't cooperate. Still dazed.
<<set _failVar to random(1, 2)>>
<<if _failVar === 1>>
You can only watch helplessly.
<<else>>
Your arms don't respond in time.
<</if>>
<div class="choice-container">
<<vchoice "Continue" "Combat_Actions" "move" "map">>
</div>
<<elseif _playerPos === "prone_back" || _playerPos === "prone_stomach">>
You try to get up to help Kira but you're too slow!
<<set _standRoll to random(1, 20) + Math.floor(($player.agility || 10) / 3)>>
<<if _standRoll >= 12>>
You scramble to your feet and grab <<print _enemy.name>>.
<<set $combat.positions.player to "standing">>
You grab <<print _p.him>> and YANK <<print _p.him>> off Kira.
<<say $player.name "Get your hands off her!">>
Kira scrambles away, adjusting what's left of her clothes.
<<say "Kira" "Thanks.">>
<<relationChange "kira" "trust" 2>>
<<addMaleEnemyLust 10 "denial">>
<<print _enemy.name>> snarls, turning <<print _p.his>> attention to you.
<<else>>
You can't get up fast enough. <<print _p.He>> kicks you back down.
<<set _kickDmg to -random(2, 5)>>
<<clampStat "player.health" _kickDmg 0 100>>
<<say _enemy.name "Stay out of this!">>
<</if>>
<div class="choice-container">
<<vchoice "Continue" "Combat_Actions" "move" "map">>
</div>
<<elseif _playerPos === "kneeling">>
You lunge from your knees and grab <<print _p.him>>!
<<set _pullRoll to random(1, 20) + Math.floor(($player.strength || 10) / 3)>>
<<if _pullRoll >= 10>>
You manage to yank <<print _p.him>> off Kira despite your awkward position.
Kira scrambles away, adjusting what's left of her clothes.
<<say "Kira" "Thanks.">>
<<relationChange "kira" "trust" 2>>
<<addMaleEnemyLust 10 "denial">>
<<print _enemy.name>> snarls, turning <<print _p.his>> attention to you.
<<else>>
<<print _p.He>> shoves you away easily from your kneeling position.
<<clampStat "player.health" -2 0 100>>
<<say _enemy.name "Get off me!">>
<</if>>
<div class="choice-container">
<<vchoice "Continue" "Combat_Actions" "move" "map">>
</div>
<<else>>
You grab <<print _enemy.name>> and YANK <<print _p.him>> off Kira.
<<say $player.name "Get your hands off her!">>
Kira scrambles away, adjusting what's left of her clothes.
<<say "Kira" "Thanks.">>
<<relationChange "kira" "trust" 2>>
<<addMaleEnemyLust 10 "denial">>
<<print _enemy.name>> snarls, turning <<print _p.his>> attention to you.
<div class="choice-container">
<<vchoice "Continue fighting" "Combat_Actions" "move" "map">>
</div>
<</if>><<kiraHelpUpCardFlow>><<kiraAssailant>>
<<setPronouns _enemy>>
<<set _playerPos to $combat.positions.player || "standing">>
<<if setup.playerIsStunned()>>
You try to help Kira but you're still too dazed to move.
<<say "Kira" "I'm tangled— help!">>
You can only watch as she struggles with her ruined pants.
<div class="choice-container">
<<vchoice "Continue" "Combat_Actions" "move" "map">>
</div>
<<elseif _playerPos === "prone_back" || _playerPos === "prone_stomach">>
You crawl over to Kira.
<<say $player.name "Hold still— I've got you!">>
From the ground, you help her kick the ruined pants off her legs.
<<set $combat.kiraMovementPenalty to false>>
<<say "Kira" "Thanks. I can move again.">>
She's fully exposed now, but at least she won't trip.
<<relationChange "kira" "trust" 1>>
<<say _enemy.name "Nice view! Thanks for helping strip her!">>
<<modifyCurrentEnemyLust 10>>
<div class="choice-container">
<<vchoice "Continue fighting" "Combat_Actions" "move" "map">>
</div>
<<else>>
You rush over and kneel beside Kira.
<<say $player.name "Hold still— I've got you!">>
You quickly help her kick the ruined pants off her legs, freeing her movement.
<<set $combat.kiraMovementPenalty to false>>
<<say "Kira" "Thanks. I can move again.">>
She's fully exposed now, but at least she won't trip.
<<relationChange "kira" "trust" 1>>
<<say _enemy.name "Nice view! Thanks for helping strip her!">>
<<modifyCurrentEnemyLust 10>>
<div class="choice-container">
<<vchoice "Continue fighting" "Combat_Actions" "move" "map">>
</div>
<</if>><<set $combat.kiraWatched to true>>
<<kiraAssailant>>
<<setPronouns _enemy>>
<<set _watchCfg to setup.playerWatchConfig.forcedOral>>
You watch, frozen... or is it something else?
<<set _watchLust to _watchCfg.playerLust || 0>>
<<clampStat "player.lust" _watchLust>>
The raider grips Kira's hair tighter, fucking her mouth with brutal thrusts.
<<kiraActionVideo "kira-watch-forced-oral-video" "combat/kira_forced_oral">>
<<say _enemy.name "That's it... take it all, bitch.">>
<p class="explicit">Kira gags and chokes, tears streaming down her face. Drool runs down her chin as <<print _p.he>> uses her throat.</p>
<<if $combat.kiraInRefractory>>
<<trackPostOrgasmAttack "fuck">>
<</if>>
<<addKiraLust setup.kiraSexConfig.sexActs.forcedOral.kiraLust>>
<<modifyCurrentEnemyLust 25>>
<<relationChange "kira" "trust" `setup.kiraUseTrust(-1)`>>
<<relationChange "kira" "affection" `setup.kiraUseAffection(-2)`>>
<<addMaleEnemyLust `random(15, 18)` "forced_oral">>
<<set _cums to random(1, 100)>>
<<if _cums lte 40>>
<<print _p.He>> grunts and pulls out, cumming across Kira's face!
<<say _enemy.name "Fuck yeah!">>
<p class="explicit">Thick ropes of cum splatter across her cheeks and lips.</p>
<<set _enemy.lust to 0>>
<<set $combat.enemies[_currentEnemyIndex].lust to 0>>
<<set _enemy.stunned to true>>
<<set _enemy.stunnedTurns to 2>>
Kira spits and wipes her face, seething.
<<say "Kira" "You... fucking... PIG!">>
<<set $combat.kiraDazed to true>>
<<set $combat.kiraDazedTurns to 1>>
<<else>>
<<print _p.He>> pulls out, panting.
<<say _enemy.name "Gonna save the rest for your other hole.">>
Kira coughs and gasps for air.
<<say "Kira" "I'll kill you... I swear...">>
<</if>>
<div class="choice-container">
<<vchoice `"Attack " + _p.him + " NOW!"` "Combat_Attack_Distracted" "action" "attack">>
<<vchoice "Help Kira up" "Combat_Help_Kira_Up" "action" "strength">>
</div><<set $combat.kiraWatched to true>>
<<kiraAssailant>>
<<setPronouns _enemy>>
<<set _watchCfg to setup.playerWatchConfig.mountAttempt>>
You hesitate, watching...
<<storyVideo "story/combat_kira_watched_fucked/mount_attempt">>
<<if _storyFamily is "sf_cg_combat_kira_watched_fucked_04">>The raider has Kira bent face-down across a splintered tabletop, cheek mashed flat to the wood, eyes open and swimming, fingers twitching by her mouth. <<print _p.His>> hand is already on her ass.<<else>>The raider moves between Kira's spread legs, already fumbling with <<print _p.his>> pants.<</if>>
<<if setup.kiraAllowsUse()>>
<<say "Kira" `"Get your fucking hands off— " + $player.name + "... watch. Watch him try."`>>
<<else>>
<<say "Kira" `$player.name + "?! HELP ME!"`>>
<</if>>
<<set _watchLust to _watchCfg.playerLust || 0>>
<<clampStat "player.lust" _watchLust>>
She struggles but she's dazed from the throw. <<print _p.He>>'s got her pinned.
<<if $clothing.kira.pussyExposed>>
<<say _enemy.name "Gonna enjoy this.">>
<div class="choice-container">
<<vchoice "INTERVENE NOW!" "Combat_Intervene_Attack" "action" "attack">>
<<vchoice "Keep watching..." "Combat_Watch_Kira_Fucked" "intimate" "search">>
</div>
<<else>>
<<if _storyFamily is "sf_cg_combat_kira_watched_fucked_04">><<print _p.He>> hooks her waistband and drags her pants down over her ass.<<else>><<print _p.He>> grabs her pants, trying to yank them down.<</if>>
<div class="choice-container">
<<vchoice `"Stop " + _p.him + " before " + _p.he + " strips her!"` "Combat_Intervene_Attack" "action" "attack">>
<<vchoice `"Let " + _p.him + " continue..."` "Combat_Watch_Kira_Stripped" "intimate" "search">>
</div>
<</if>>
<<relationChange "kira" "trust" `setup.kiraUseTrust(-1)`>><<set $combat.kiraWatched to true>>
<<storyVideo "story/combat_kira_watched_fucked/kira_stripped">>
<<kiraStrippedCardFlow>><<set _toVictory to false>>
<<kiraAssailant>>
<<setPronouns _enemy>>
<<set _playerPos to $combat.positions.player || "standing">>
<<set _onKira to setup.kiraWithYou() && previous() !== "Combat_Enemy_Sex_Player_Check">>
<<set _adStunned to !!setup.playerIsStunned()>>
<<if _adStunned>>
You try to move but your body won't cooperate. Still dazed from before.
<<say $player.name "Come on... move...">>
<<if _onKira>>
You can only watch helplessly as <<print _p.he>> continues with Kira.
<<say "Kira" `$player.name + "! Are you okay?!"`>>
<<else>>
You can only sway on your feet while <<print _p.he>> circles you, grinning, taking <<print _p.his>> time.
<</if>>
<div class="choice-container">
<<vchoice "Continue" `_toVictory ? "Combat_Victory" : "Combat_Actions"` "move" "map">>
</div>
<<elseif _playerPos === "prone_back" || _playerPos === "prone_stomach">>
You try to lunge from the ground but you're too slow!
<<set _standRoll to random(1, 20) + Math.floor(($player.agility || 10) / 3)>>
<<if _standRoll >= 12>>
You scramble to your feet and charge!
<<set $combat.positions.player to "standing">>
<<set _positionPenalty to 15>>
<<else>>
You can't get up fast enough. <<print _p.He>> sees you coming and kicks you back down.
<<clampStat "player.health" -3 0 100>>
<div class="combat-hit-effect">
<span class="damage-number">-3</span>
</div>
<<say _enemy.name "Stay DOWN!">>
<<if _onKira>>
<<print _p.He>> goes back to groping Kira.
<<else>>
<<print _p.He>> plants a boot on your chest and laughs down at you.
<</if>>
<div class="choice-container">
<<vchoice "Continue" `_toVictory ? "Combat_Victory" : "Combat_Actions"` "move" "map">>
</div>
<</if>>
<<elseif _playerPos === "kneeling">>
You lunge from your knees, putting yourself at a disadvantage.
<<set _positionPenalty to 10>>
<<else>>
<<if _onKira>>
While <<print _p.he>>'s distracted with Kira, you strike!
<<else>>
While <<print _p.he>>'s still off-balance, you strike!
<</if>>
<<set _positionPenalty to 0>>
<</if>>
<<if !_adStunned && (!(_playerPos === "prone_back" || _playerPos === "prone_stomach") || $combat.positions.player === "standing")>>
<<set _hitRoll to random(1, 100)>>
<<set _baseAccuracy to 70 + Math.floor(($player.agility || 10) / 2)>>
<<set _distractedBonus to 20>>
<<set _positionPenalty to _positionPenalty || 0>>
<<set _hitChance to setup.playerStrikeChance(_baseAccuracy + _distractedBonus - _positionPenalty - setup.enemyDefenseMod(_enemy))>>
<<if _hitRoll lte _hitChance>>
<<set _baseDamage to 5 + Math.floor(($player.strength || 10) / 2)>>
<<if $equipped && $equipped.weapon>>
<<set _baseDamage += $equipped.weapon.damage>>
<</if>>
<<set _damageRoll to random(3, 8)>>
<<set _distractedDamageBonus to random(5, 10)>>
<<set _damage to Math.max(1, Math.floor((_baseDamage + _damageRoll + _distractedDamageBonus) * setup.fighterDamageFactor("player")))>>
<<set _enemy.health -= _damage>>
<<applyEnemyDamageExpression _enemy>>
<<combatActionVideo "attack-distracted-video" "combat/attack_distracted" _enemy>>
<div class="combat-hit-effect">
Perfect opening! <span class="damage-number critical">-<<print _damage>></span>
<span class="hit-bonus">(<<print "+" + _distractedDamageBonus>> distracted bonus)</span>
</div>
<<set _ivWeaponStatus to setup.weaponStatusLine(setup.applyWeaponStatuses(_enemy), _enemy)>>
<<if _ivWeaponStatus>><div class="weapon-status-effect"><<print _ivWeaponStatus>></div><</if>>
<<if _enemy.health lte 0>>
<<set _deadIndex to $combat.enemies.indexOf(_enemy)>>
<<if !$combat.defeatedEnemies>><<set $combat.defeatedEnemies to []>><</if>>
<<run $combat.defeatedEnemies.push(clone(_enemy))>>
<<run $combat.enemies.splice(_deadIndex, 1)>>
<<print _p.He>> falls, dead before <<print _p.he>> hits the ground.
<<if $combat.enemies.length === 0>>
<<set _toVictory to true>>
<</if>>
<<else>>
<<if _onKira>>
<<print _enemy.name>> staggers, releasing Kira to face you.
<<else>>
<<print setup.fillEnemyName("[Enemy] staggers back and squares up to you, spitting blood.", _enemy)>>
<</if>>
<<set _enemy.sexIntent to null>>
<</if>>
<<if _onKira>><<relationChange "kira" "trust" 1>><</if>>
<<else>>
<div class="combat-miss-effect">
You lunge but <<print _p.he>> twists aside at the last moment!
</div>
<<say _enemy.name "Nice try, fucker!">>
<<if _onKira>>
<<print _p.He>> shoves Kira aside to face you properly.
<<else>>
<<print _p.He>> plants <<print _p.his>> feet and squares up to you properly.
<</if>>
<<set _enemy.sexIntent to null>>
<<if _onKira>><<relationChange "kira" "trust" 2>><</if>>
<</if>>
<div class="choice-container">
<<vchoice "Continue" `_toVictory ? "Combat_Victory" : "Combat_Actions"` "move" "map">>
</div>
<</if>><<set _toVictory to false>>
<<kiraAssailant>>
<<setPronouns _enemy>>
<<if setup.playerIsStunned()>>
You try to shout but you're still dazed. The words come out slurred and weak.
<<say $player.name "Get... hands... off...">>
<<print _p.He>> doesn't even look at you. Kira is on her own.
<<say "Kira" `$player.name + "?! Are you okay?!"`>>
<div class="choice-container">
<<vchoice "Continue" `_toVictory ? "Combat_Victory" : "Combat_Actions"` "move" "map">>
</div>
<<else>>
<<say $player.name "Get your HANDS off her!">>
<<set _shoutRoll to random(1, 20) + Math.floor(($player.charm || 10) / 3)>>
<<set _enemyFocus to 10 + Math.floor((_enemy.lust || 0) / 20)>>
<<if _enemy.lust >= 60>>
<<set _enemyFocus += 3>>
<</if>>
<<if _shoutRoll >= _enemyFocus>>
<<print _enemy.name>> hesitates, looking at you. That's all Kira needs.
She drives her blade into <<print _p.his>> side.
<<set _damage to random(8, 15)>>
<<set _enemy.health -= _damage>>
<<applyEnemyDamageExpression _enemy>>
<div class="combat-hit-effect">
<span class="damage-number">-<<print _damage>></span> (Kira's counterattack)
</div>
<<if _enemy.health <= 0>>
<<set _deadIndex to $combat.enemies.indexOf(_enemy)>>
<<if !$combat.defeatedEnemies>><<set $combat.defeatedEnemies to []>><</if>>
<<run $combat.defeatedEnemies.push(clone(_enemy))>>
<<run $combat.enemies.splice(_deadIndex, 1)>>
<<print _p.He>> crumples, killed by <<print _p.his>> own distraction.
<<if $combat.enemies.length === 0>>
<<set _toVictory to true>>
<</if>>
<<else>>
<<say "Kira" "I can handle myself. But thanks.">>
<<set _enemy.sexIntent to null>>
<</if>>
<<relationChange "kira" "affection" 1>>
<<relationChange "kira" "trust" 1>>
<<else>>
<<set _failType to random(1, 3)>>
<<if _failType === 1>>
<<print _p.He>> laughs without even looking at you.
<<say _enemy.name "Shut the fuck up and wait your turn!">>
<<print _p.He>> continues groping Kira, ignoring your threat completely.
<<say "Kira" "That... didn't work...">>
<<addKiraLust setup.kiraSexConfig.positioning.wristYank.kiraLust>>
<<elseif _failType === 2>>
<<print _p.He>> glances at you, unimpressed.
<<say _enemy.name "Make me.">>
<<print _p.He>> squeezes Kira harder, eyes locked on yours. A challenge.
<<say "Kira" "Little help here?!">>
<<addKiraLust setup.kiraSexConfig.grope.tits.kiraLust>>
<<else>>
<<print _p.He>> uses Kira as a shield, pulling her in front of <<print _p.him>>.
<<say _enemy.name "Try anything and she gets hurt first.">>
<<say "Kira" "Great. Now I'm a hostage.">>
<<relationChange "kira" "trust" -1>>
<</if>>
<</if>>
<div class="choice-container">
<<vchoice "Continue" `_toVictory ? "Combat_Victory" : "Combat_Actions"` "move" "map">>
</div>
<</if>><<set $combat.kiraWatched to true>>
<<kiraAssailant>>
<<setPronouns _enemy>>
<<set _watchCfg to setup.playerWatchConfig.grope>>
<<set _wgIntent to ($combat.pendingSexAction && $combat.pendingSexAction.intent) || "">>
<<if _wgIntent === "grope_pussy">>
You watch for a moment. <<print _p.He>>'s got <<print _p.his>> fingers buried between her legs, rough and possessive.
<<kiraActionVideo "kira-watch-grope-video" "combat/kira_groped_pussy">>
<<elseif _wgIntent === "grope_ass">>
You watch for a moment. <<print _p.He>>'s kneading her ass, fingers digging into her cheeks, rough and possessive.
<<kiraActionVideo "kira-watch-grope-video" "combat/kira_groped_ass">>
<<else>>
You watch for a moment. <<print _p.He>>'s squeezing her tits, rough and possessive.
<<kiraActionVideo "kira-watch-grope-video" "combat/kira_groped_tits">>
<</if>>
<<if setup.kiraAllowsUse()>>
<<say "Kira" "You're watching. ...Fuck. Don't stop.">>
Her face is red to the throat, and it isn't shame.
<<else>>
<<say "Kira" "Are you— are you WATCHING?!">>
Her face is red. Anger. Shame. And something else.
<</if>>
<<addKiraLust _watchCfg.kiraLust>>
<<set _watchLust to _watchCfg.playerLust || 0>>
<<clampStat "player.lust" _watchLust>>
<<if setup.kiraAllowsUse()>>
After a few seconds <<print _enemy.name>> gets greedy and stops watching you, and you make <<print _p.him>> pay for it. It's still a fight.
<<else>>
After a few seconds, you attack <<print _enemy.name>>, ending it.
<</if>>
<<set $flags.watchedKiraGetGroped to true>>
<div class="choice-container">
<<vchoice "Continue fighting" "Combat_Actions" "move" "map">>
</div><<set $combat.kiraWatched to true>>
<<kiraAssailant>>
<<setPronouns _enemy>>
<<set _watchCfg to setup.playerWatchConfig.fingered>>
You watch, frozen in place. She's running her fingers over Kira's exposed pussy.
<<kiraActionVideo "kira-watch-fingered-video" "combat/kira_groped_pussy">>
<<if setup.kiraAllowsUse()>>
<<say "Kira" "You're going to watch? ...Fuck. Yes. Watch her do it.">>
<<else>>
<<say "Kira" "Are you— you're just going to WATCH?!">>
<</if>>
<<print _p.He>> slides a finger inside, and Kira gasps despite herself.
<<say _enemy.name "She's getting wet. Can you see that from there?">>
<<if setup.kiraAllowsUse()>>
Her face burns. You're watching her get fingered by another woman, and she wants you to.
<<else>>
Her face burns with shame. You're watching her get fingered by another woman.
<</if>>
<<addKiraLust _watchCfg.kiraLust>>
<<set _watchLust to _watchCfg.playerLust || 0>>
<<clampStat "player.lust" _watchLust>>
After a few moments, you snap out of it and attack <<print _enemy.name>>.
<<set $flags.watchedKiraGetFingered to true>>
<div class="choice-container">
<<vchoice "Continue fighting" "Combat_Actions" "move" "map">>
</div><<set $combat.kiraWatched to true>>
<<kiraAssailant>>
<<setPronouns _enemy>>
<<set _watchCfg to setup.playerWatchConfig.analFinger>>
You watch helplessly as <<print _p.he>> probes Kira's exposed ass.
<<kiraActionVideo "kira-watch-anal-finger-video" "combat/kira_groped_ass">>
<<if setup.kiraAllowsUse()>>
<<say "Kira" `$player.name + "... fuck— look what " + _p.he + "'s doing to me."`>>
<<else>>
<<say "Kira" `$player.name + "! Don't just— STAND there!"`>>
<</if>>
<<print _p.He>> pushes a finger inside, making Kira yelp.
<<say _enemy.name "So tight back here. Never been used?">>
Kira squirms, trying to pull away, but <<print _p.he>>'s got her pinned.
<<addKiraLust _watchCfg.kiraLust>>
<<set _watchLust to _watchCfg.playerLust || 0>>
<<clampStat "player.lust" _watchLust>>
<<if setup.kiraAllowsUse()>>
<<print _p.He>> looks up to grin at you over Kira's ass, and that's <<print _p.his>> mistake. You go in.
<<else>>
The sight breaks the spell. You charge in to stop it.
<</if>>
<<set $flags.watchedKiraGetAnalFingered to true>>
<div class="choice-container">
<<vchoice "Continue fighting" "Combat_Actions" "move" "map">>
</div><<kiraAssailant>>
<<setPronouns _enemy>>
You rush in, grabbing for the chain!
<<set _strCheck to random(1, 20) + Math.floor(($player.strength || 10) / 3)>>
<<if _strCheck >= 12>>
<<kiraMediaTarget>>
<<combatActionVideo "player-frees-kira-video" "combat/player_frees_kira" _kiraMediaTarget>>
You yank the chain from <<print _p.his>> grip!
<<say $player.name "Got it!">>
The chain clatters to the ground. Kira gasps for breath.
<<say "Kira" "//cough// Thanks...">>
<<set $combat.positions.kira to "standing">>
<<relationChange "kira" "trust" 2>>
<div class="choice-container">
<<vchoice "Continue fighting" "Combat_Actions" "move" "map">>
</div>
<<else>>
<<print _p.He>> holds tight! You can't pry it loose!
<<say _enemy.name "Fuck off! She's mine!">>
<<print _p.He>> kicks you back.
<<clampStat "player.health" -4 0 100>>
<div class="combat-hit-effect">
<span class="damage-number">-4</span>
</div>
<div class="choice-container">
<<vchoice "Continue fighting" "Combat_Actions" "move" "map">>
</div>
<</if>><<kiraAssailant>>
<<setPronouns _enemy>>
You rush to Kira, working at the chains around her wrists!
<<set _agiCheck to random(1, 20) + Math.floor(($player.agility || 10) / 3)>>
<<if _agiCheck >= 11>>
<<kiraMediaTarget>>
<<combatActionVideo "player-frees-kira-video" "combat/player_frees_kira" _kiraMediaTarget>>
You find the weak point and unwrap the chains!
<<say $player.name "There! You're free!">>
<<set $combat.kiraWristsBound to false>>
<<if $combat.log>>
<<run $combat.log.push({type: "buff", text: "Freed Kira's wrists!", icon: "breaking-chain"})>>
<</if>>
Kira flexes her wrists, grabbing her weapon again.
<<say "Kira" `"About time. Let's kill this " + _p.bastard + "."`>>
<<relationChange "kira" "trust" 1>>
<<else>>
The chains are wrapped too tight! You can't get them loose!
<<say "Kira" `"Hurry! " + _p.He + "'s coming back!"`>>
<<print _enemy.name>> is moving toward you again.
<</if>>
<div class="choice-container">
<<vchoice "Continue fighting" "Combat_Actions" "move" "map">>
</div><<kiraAssailant>>
<<setPronouns _enemy>>
You lunge for the crop as <<print _p.he>> raises it!
<<set _agiCheck to random(1, 20) + Math.floor(($player.agility || 10) / 3)>>
<<if _agiCheck >= 13>>
<<kiraMediaTarget>>
<<combatActionVideo "player-frees-kira-video" "combat/player_frees_kira" _kiraMediaTarget>>
You snatch it from <<print _p.his>> hand!
<<say $player.name "Not anymore, asshole!">>
You snap the crop over your knee and throw it aside.
<<say _enemy.name "You little—!">>
<<set _enemy.weapon to "unarmed">>
<<modifyCurrentEnemyLust -10>>
<<relationChange "kira" "trust" 1>>
<<else>>
<<print _p.He>> pulls it back too fast!
<<say _enemy.name "Nice try!">>
<<print _p.He>> backhands you with the crop handle.
<<clampStat "player.health" -3 0 100>>
<div class="combat-hit-effect">
<span class="damage-number">-3</span>
</div>
<</if>>
<div class="choice-container">
<<vchoice "Continue fighting" "Combat_Actions" "move" "map">>
</div><<kiraAssailant>>
<<if $equipped && $equipped.weapon && ($equipped.weapon.type === "blade" || $equipped.weapon.name === "Combat Knife")>>
<<kiraMediaTarget>>
<<combatActionVideo "player-frees-kira-video" "combat/player_frees_kira" _kiraMediaTarget>>
You slash at the rope binding Kira's wrists!
The rope parts cleanly.
<<say $player.name "You're free!">>
<<set $combat.kiraWristsBound to false>>
<<if $combat.log>>
<<run $combat.log.push({type: "buff", text: "Cut Kira's wrist binds!", icon: "breaking-chain"})>>
<</if>>
<<say "Kira" "Thanks!">>
<<relationChange "kira" "trust" 1>>
<<else>>
You try to untie the knots but they're too tight!
<<say "Kira" "Need a knife! Can't untie it!">>
You'll need to try something else.
<</if>>
<div class="choice-container">
<<vchoice "Continue fighting" "Combat_Actions" "move" "map">>
</div><<kiraHelpBoundCardFlow>><<kiraAssailant>>
<<setPronouns _enemy>>
<<if $equipped && $equipped.weapon && ($equipped.weapon.type === "blade" || $equipped.weapon.name === "Combat Knife")>>
<<kiraMediaTarget>>
<<combatActionVideo "player-frees-kira-video" "combat/player_frees_kira" _kiraMediaTarget>>
You slice through the rope in one motion!
<<say $player.name "Got it!">>
Kira tears the remaining rope from her neck, gasping.
<<set $combat.kiraLeashed to false>>
<<say "Kira" "//cough// Fuck! I owe you one.">>
<<relationChange "kira" "trust" 2>>
<<relationChange "kira" "affection" 1>>
<<else>>
You grab the rope and try to yank it from <<print _p.his>> hand!
<<set _strCheck to random(1, 20) + Math.floor(($player.strength || 10) / 3)>>
<<if _strCheck >= 14>>
<<kiraMediaTarget>>
<<combatActionVideo "player-frees-kira-video" "combat/player_frees_kira" _kiraMediaTarget>>
You rip it free!
<<set $combat.kiraLeashed to false>>
<<say "Kira" "Thanks!">>
<<relationChange "kira" "trust" 1>>
<<else>>
<<print _p.He>> holds on tight! The rope stays around her neck!
<<say _enemy.name "She's not going anywhere!">>
<</if>>
<</if>>
<div class="choice-container">
<<vchoice "Continue fighting" "Combat_Actions" "move" "map">>
</div><<set $combat.kiraWatched to true>>
<<kiraWatchFuckedCardFlow>><<set $combat.kiraWatched to true>>
<<storyVideo "story/combat_kira_watched_fucked/kira_fucked">>
<<kiraWatchAnalCardFlow>><<kiraAssailant>>
<<setPronouns _enemy>>
You drive your blade through the stunned enemy's throat. <<print _p.He>> dies gurgling.
<<combatActionVideo "kill-stunned-video" "combat/kill_stunned" _enemy>>
<<set _enemy.health to 0>>
<<set _enemy.beenUsed to false>>
<<run setup.resolveDefeatedEnemies()>>
<<if setup.kiraAllowsUse()>>
Behind you, still sprawled where <<print _p.he>> left her, Kira lets out a breathless, filthy laugh.
<<else>>
Justice. But too late.
<</if>>
<<if $combat.enemies.length === 0>>
<div class="choice-container">
<<vchoice "Continue" "Combat_Victory_AfterKiraFucked" "action" "forward">>
</div>
<<else>>
<div class="choice-container">
<<vchoice "Continue fighting" "Combat_Actions" "move" "map">>
</div>
<</if>><<storyVideo "story/combat_kira_watched_fucked/combat_check_kira">>
<<kiraCheckCardFlow>><<countCombatVictory>>
<<storyVideo "story/combat_kira_watched_fucked/combat_check_kira">>
<<kiraVictoryAfterFuckedCardFlow>><<widget "farCarryLadder">>
<<for _fclRow range setup.farCarryLadder()>>
<<if _fclRow.on>>
<<vchoice _fclRow.label _fclRow.passage _fclRow.type _fclRow.icon>>
<<elseif _fclRow.act is "deepLocked">>
<<vchoiceDisabled "More than touch (not without her say-so)" "intimate" "corruption">>
<</if>>
<</for>>
<</widget>>
<<widget "farCarryDressLine">>
<<if setup.farCarryDress()>>
<p>Before you go you get her back into her own clothes, stiff with old blood, and leave the shift folded on the pillow where you found it.</p>
<</if>>
<</widget>>
<<widget "farCarryFareLine">>
<<if _args[0] gt 0>>
<<say "Caravan master" "Your fighter rode my crates all the way in. Freight rides, and freight pays. Ten scrap off your pay, and don't give me that face, hired. I could have left her in the ditch.">>
<</if>>
<</widget>>
<<widget "farCarryLiftLine">>
<<set _fcLift to setup.farCarryLiftTake()>>
<<if _fcLift is "arms">>
<p>You slide one arm under her knees and the other behind her shoulders and stand up with her. Her head rolls into the crook of your neck, and her breath is slow and warm on your collarbone.</p>
<<elseif _fcLift is "shoulder">>
<p>You get your shoulder into her belly and stand. She bends double over you, her ass right beside your cheek, round and warm, and your hand clamped across the backs of her thighs to keep her there.</p>
<<elseif _fcLift is "back">>
<p>You pull her arms over your shoulders, strap her wrists together across your chest and hitch her legs up around your hips. Her chin is on your shoulder, and her tits are pressed flat against your back with every step.</p>
<</if>>
<</widget>>
<<widget "farCarryPick">>
<<set _fcpPatch to _args[4]>>
<<set _fcpIcon to _args[3] ? '<span class="gi gi-' + _args[3] + ' gi-large"></span>' : "">>
<<capture _fcpPatch>>
<<link `'<span class="choice-button ' + (_args[2] || "action") + '">' + _fcpIcon + '<span class="label">' + _args[0] + '</span></span>'` _args[1]>><<run setup.farCarrySet(_fcpPatch)>><<if _fcpPatch and _fcpPatch.nap>><<run setup.historyCheckpointNext()>><</if>><</link>>
<</capture>>
<</widget>><<run setup.farCarryBegin("far")>>
<<set _fcOpen to setup.farCarryOpening(passage(), previous())>>
<<run setup.farCarrySet({ opening: _fcOpen, theirs: setup.farCarryTheirs(_fcOpen, previous()), bg: setup.farCarryStartPicture(_fcOpen) })>>
<<set _fcS to setup.farCarryView()>>
<<run VaultUI.setBackgroundDirect(setup.farCarryPicture())>>
<h2>A Long Way From Home</h2>
<<storyVideo "story/far_carry/start">>
<<if _fcS.opening is "handover">>
<p>She's yours to carry now, and the vault is <<print _fcS.base>> hours off through the woods.</p>
<<else>>
<<if _fcS.opening is "won">>
<p>You stay on your knees beside her until your breathing slows. Your hands are shaking and your shirt is stuck to your back with sweat.</p>
<<elseif _fcS.opening is "fled">>
<p>Nobody comes. You sit beside her until your lungs stop burning, and you listen for a long time to be sure.</p>
<<elseif _fcS.opening is "taken">>
<p>They're gone. It's so quiet now that you can hear her breathing.</p>
<</if>>
<p><<if _fcS.opening is "fled">>Kira lies where you set her down.<<elseif _fcS.opening is "taken">>Kira lies where they left her.<<if _fcS.theirs>> Their cum is drying on the insides of her thighs.<</if>><<else>>Kira lies where she fell.<</if>> There's blood in her hair and a long graze down her forearm, beaded red and already gritty with dust. <<if _fcS.opening isnot "won">>You get two fingers on her throat. A pulse, slow and even. You say her name. <</if>>You slap her cheek, not gently. Her eyes don't even move under the lids.</p>
<p>It's the same sleep as last time, and nothing out here is going to wake her.</p>
<p class="internal-thought">The vault is <<print _fcS.base>> hours from here on fresh legs, with nobody on your back. Nobody's coming to help.</p>
<</if>>
<div class="choice-container">
<<farCarryPick "Take her in your arms" `setup.farCarryAfterLift()` "action" "forward" `{ lift: "arms" }`>>
<<farCarryPick "Put her over your shoulder" `setup.farCarryAfterLift()` "action" "forward" `{ lift: "shoulder" }`>>
<<farCarryPick "Get her up on your back" `setup.farCarryAfterLift()` "action" "forward" `{ lift: "back" }`>>
</div><<set _fcLine to setup.farCarrySumsLine(previous())>>
<<set _fcRest to setup.farCarryRestPassage()>>
<<run setup.farCarrySet({ stop: "" })>>
<<set _fcS to setup.farCarryView()>>
<<run VaultUI.setBackgroundDirect(setup.farCarryPicture())>>
<h2>The Sums</h2>
<<farCarryLiftLine>>
<<if _fcLine is "morning">>
<p>Morning. She hasn't moved, and neither have the sums.</p>
<<elseif _fcLine is "villa">>
<p>You sit on the edge of the other bunk and look at her, and do the sums.</p>
<<elseif _fcLine is "gate">>
<p>The gate shuts behind you. You stand on the track with her weight settling onto you and do the sums.</p>
<<else>>
<p>You stand there with her weight settling onto you and do the sums.</p>
<</if>>
<p class="internal-thought"><<print _fcS.left>> hours to the vault with her on you. You could go now and walk until you drop. Or you could do it properly: walk, rest, walk, and stop when the light does.</p>
<div class="choice-container">
<<vchoice `"Carry her home without stopping (" + _fcS.left + " hours)"` "Far_Carry_Skip" "action" "run">>
<<vchoice "Carry her home at your own pace" "Far_Carry_Leg" "action" "forward">>
<<if _fcRest>>
<<vchoice "Rest here tonight" _fcRest "action" "bed">>
<</if>>
</div><<set _fcFrom to setup.farCarryView().from>>
<<set _fcHours to setup.farCarrySkipped()>>
<<advanceTime _fcHours 0>>
<<run VaultUI.setBackgroundDirect(setup.farCarryGround("reclaimed"))>>
<h2>Carrying Kira Home</h2>
<<storyVideo "story/far_carry/skip">>
<<farCarryDressLine>>
<p>You get her settled and you go.</p>
<p>Afterwards you don't remember most of it, only the road and your boots, and her weight sliding down and you heaving her up again, and again, and again. Somewhere her arm works loose and swings against your hip for an hour before you can be bothered to stop and tuck it back. You drink when you have water and you don't when you don't. You talk to her for a while, about nothing, the way you'd talk to a dog. Then you stop talking.</p>
<p><<if _fcFrom is "greenhollow">>The woods give way to the ruins, and the ruins go on forever.<<elseif _fcFrom is "overgrown_ruins">>The vines give way to broken road, and the road goes on forever.<<else>>The road is long, and every yard of it is uphill.<</if>><<if setup.farCarryLate()>> The last stretch is in the dark, feeling for the road with your feet.<</if>></p>
<p>When the vault door comes up out of the hillside, your legs are shaking so hard you have to lean on it.</p>
<div class="choice-container">
<<vchoice "Carry her in" "Kira_Unconscious_Return_Simple" "move" "door-handle">>
</div><<set _fcWash to setup.farCarryWashTake()>>
<<set _fcLeg to setup.farCarryWalk(Math.random())>>
<<advanceTime _fcLeg.hours _fcWash>>
<<set _fcNext to setup.farCarryAfterLeg()>>
<<run VaultUI.setBackgroundDirect(setup.farCarryPicture())>>
<h2>The Road Home</h2>
<<storyVideo "story/far_carry/leg">>
<<if _fcLeg.left gt 1>>
<p class="system-info">About <<print _fcLeg.left>> hours to the vault.</p>
<<elseif _fcLeg.left is 1>>
<p class="system-info">About an hour to the vault.</p>
<</if>>
<<farCarryDressLine>>
<<if _fcWash gt 0>>
<p>You use the last of the water on her, and a clean corner of your shirt, and you don't stop until there's nothing left to find.</p>
<</if>>
<<if _fcLeg.opening is "first">>
<p>The first hour is fine. The second hour your shoulders start talking to you. By the third they're screaming, the sweat's running into your eyes faster than you can blink it out, and her hair keeps getting in your mouth. The blood on your shirt has dried stiff.<<if not _fcLeg.dark>> Flies follow you. They want the cut on her head. You wave them off and they come back.<</if>></p>
<<elseif _fcLeg.opening is "dawn">>
<p>Your body has had a night to stiffen, and every step hurts from the first one. She's lighter than yesterday, or you've lost the part of you that complained. The frost is still on the road.</p>
<<elseif _fcLeg.opening is "last">>
<p>The last leg is the worst. But the ground starts to look like ground you know: the burned bus, the water tower with its legs gone, the long slope down to the hillside. Then the door.</p>
<<elseif _fcLeg.opening is "middle">>
<p>You stop counting steps and start counting the things you pass: a car with a tree growing through it, a sign with no words left on it, a boot. Every time you shift her she slides back to the same sore place. You've stopped noticing the weight. It's just what walking is now.</p>
<</if>>
<<if _fcLeg.opening is "first">>
<<if _fcLeg.lift is "arms">>
<p>Your arms went dead a long time ago. You carry her on your forearms and your spite, her cheek against your chest, her mouth a little open against your shirt.</p>
<<elseif _fcLeg.lift is "shoulder">>
<p>Her hip bumps your jaw at every step and your hand hasn't left the backs of her thighs since you started. You've stopped pretending you don't notice where it is.</p>
<<elseif _fcLeg.lift is "back">>
<p>The strap has rubbed your chest raw. Her breath goes in and out beside your ear, slow as a tide, and it's the only clock you've got.</p>
<</if>>
<</if>>
<<if _fcLeg.open>>
<p>Her exposed skin slides against you. Soft. Warm. Vulnerable.</p>
<</if>>
<<if _fcLeg.beat is "trader">>
<p>A man with a mule and a cart full of scrap pulls up level with you, looks at Kira for a long time, then at you.</p>
<<say "Trader" "How much for the sleeping one?">>
<p>You put your hand on your blade. He clicks his tongue at the mule and is gone.</p>
<<elseif _fcLeg.beat is "runner">>
<p>A Covenant runner comes down the track at an easy lope, green sash, eyes front. She sees what you're carrying. She doesn't slow down and she doesn't say a word.</p>
<<elseif _fcLeg.beat is "rain">>
<p>The rain comes in sideways. In ten minutes she's soaked through and so are you, and her wet hair is plastered across your neck like weed.</p>
<<elseif _fcLeg.beat is "water">>
<p>You stop to drink. You hold the canteen to her lips and the water runs straight out of the corner of her mouth and down her neck into her collar. You try again, slower, a capful at a time, stroking her throat until it moves.</p>
<<elseif _fcLeg.beat is "slip">>
<p>Her weight starts to slide. You grab for her without thinking, and your hand lands square on her ass and holds her there. It's just to keep her from falling. You don't move your hand.</p>
<<elseif _fcLeg.beat is "crows">>
<p>Crows on the road ahead, a dozen of them, picking at a dead mule. They don't fly up until you're almost on top of them. You go round. They watch her, not you.</p>
<<elseif _fcLeg.beat is "quiet">>
<p>Nothing happens. There's the road and the wind and her breathing, and that's all.</p>
<</if>>
<div class="choice-container">
<<if _fcNext is "Far_Carry_Rest">>
<<vchoice "Set her down and rest" "Far_Carry_Rest" "action" "rest">>
<<elseif _fcNext is "Far_Carry_Camp">>
<<vchoice `_fcLeg.dark ? "Make camp" : "Make camp before the light's gone"` "Far_Carry_Camp" "action" "fire">>
<<elseif _fcNext is "Far_Carry_Leg">>
<<vchoice "Keep moving" "Far_Carry_Leg" "action" "forward">>
<<else>>
<<vchoice "Carry her in" "Kira_Unconscious_Return_Simple" "move" "door-handle">>
<</if>>
</div><<set _fcMin to setup.farCarryRestStop()>>
<<if _fcMin gt 0>><<advanceTime 0 _fcMin>><</if>>
<<set _fcNap to setup.farCarryNapTake()>>
<<if _fcNap>><<campRest "none">><</if>>
<<set _fcBack to setup.farCarryRestBack(_fcMin, _fcNap)>>
<<run VaultUI.setBackgroundDirect(setup.farCarryPicture())>>
<h2>A Rest</h2>
<<storyVideo "story/far_carry/rest">>
<<if _fcNap>>
<p>You sleep sitting up with her head in your lap and one hand on her chest. When you wake, the shadow of the overpass has moved, and she hasn't.</p>
<<elseif _fcBack>>
<p>You sit back against the concrete. She lies where you set her down.</p>
<<else>>
<p>You find shelter under the lip of an overpass and set her down on the concrete as gently as your arms let you, which isn't very. You sit. You drink. You look at her.</p>
<<if setup.kiraAllowsUse()>>
<p class="internal-thought">Out cold, whatever. Use me.</p>
<p>She said it looking you straight in the eye, red to the ears. She knew what she was handing you.</p>
<<else>>
<p class="internal-thought">She'd never know.</p>
<<if setup.farCarryUsedBefore()>>
<p>That's the thought. You've had it before, carrying her, and that time your hands ended up on her.</p>
<<else>>
<p>That's the thought. It turned up the moment you lifted her, and it's been walking beside you all day.</p>
<</if>>
<</if>>
<</if>>
<div class="choice-container">
<<vchoice "Get up. Keep going." "Far_Carry_Leg" "action" "forward">>
<<if setup.farCarryNapOpen()>>
<<farCarryPick "Sleep a few hours first" "Far_Carry_Rest" "action" "sleep" `{ nap: true }`>>
<</if>>
<<farCarryLadder>>
</div><<set _fcCamp to setup.farCarryCampMake()>>
<<run VaultUI.setBackgroundDirect(setup.farCarryPicture())>>
<h2>Making Camp</h2>
<<storyVideo "story/far_carry/camp">>
<p><<if _fcCamp.dark>>By the time you stop<<else>>By the time the light starts going<</if>> you can't feel your arms. You make camp where your legs give out.</p>
<p><<if _fcCamp.shelter is "tent">>You pitch the tent badly, one-handed, with her lying in the grass beside it.<<elseif _fcCamp.shelter is "tarp">>You string the tarp between a wall and a dead tree and drag your bedroll under it.<<else>>There's a hollow out of the wind with a slab of concrete at its back. It'll do. It has to.<</if>></p>
<p>You lay her down on your bedroll and build a fire out of whatever's dry.</p>
<<if not _fcCamp.again>>
<p>Then you look at her properly, in the firelight, for the first time since the fight.</p>
<p>The cut in her hairline has crusted black, and her hair is matted into it. You heat water in your tin and soak a cloth and work at it, a little at a time, easing the hair loose. It tears anyway. Fresh blood wells up, bright and thin, and runs down her temple into her ear. She doesn't feel it. The graze on her arm is full of grit. You pick it out with your fingernails, one black speck after another, and wash it, and the water in the tin goes brown, then red.<<if _fcCamp.theirs>> Then you wash their cum off her thighs.<</if>></p>
<</if>>
<<if _fcCamp.wet>>
<p>Her shirt is soaked through and stuck to her, and her lips are going grey at the edges. She's cold, properly cold, the kind of cold that kills people in the night. Wet clothes have to come off. Everybody knows that.</p>
<</if>>
<div class="choice-container">
<<if _fcCamp.wet>>
<<farCarryPick "Get her out of the wet things" "Far_Carry_Night" "action" "hand" `{ undressed: true, undressLine: true }`>>
<<farCarryPick "Wrap her as she is and feed the fire" "Far_Carry_Dawn" "action" "fire" `{ night: "wrap" }`>>
<<else>>
<<vchoice "Bank the fire" "Far_Carry_Night" "action" "fire">>
<</if>>
</div><<run setup.farCarryNightStop()>>
<<set _fcS to setup.farCarryView()>>
<<set _fcUndress to setup.farCarryTake("undressLine")>>
<<run VaultUI.setBackgroundDirect(setup.farCarryPicture())>>
<h2>The Night</h2>
<<storyVideo "story/far_carry/night">>
<<if _fcUndress>>
<p>You get her out of them. Boots, trousers, the shirt peeled off her arms like a second skin. You dry her with your spare shirt, hard, the way you'd rub down an animal, until some colour comes back, and you roll her into the blanket and hang her clothes on sticks by the fire. You didn't look. You looked. You had to look to do it, and you kept looking after you were done.</p>
<</if>>
<p>The fire's down to a red eye. She lies on your bedroll under the blanket, on her side, her back to you. You could count her breaths. You have been.</p>
<<if _fcS.undressed>>
<p>Her clothes are steaming on their sticks. Under the blanket she's wearing nothing at all.</p>
<</if>>
<div class="choice-container">
<<farCarryPick "Keep watch till morning" "Far_Carry_Dawn" "action" "wait" `{ night: "watch" }`>>
<<farCarryPick "Lie down beside her" "Far_Carry_Dawn" "action" "rest" `{ night: "beside" }`>>
<<farCarryPick "Sleep" "Far_Carry_Dawn" "action" "sleep" `{ night: "sleep" }`>>
<<farCarryLadder>>
</div><<set _fcN to setup.farCarryNightBegin()>>
<<campRest _fcN.shelter>>
<<set _fcM to setup.farCarryNightEnd(_fcN, Math.random())>>
<<run VaultUI.setBackgroundDirect(setup.farCarryPicture())>>
<h2>Morning</h2>
<<storyVideo "story/far_carry/dawn">>
<<if _fcM.kind is "wrap">>
<p>You wrap the blanket round her, wet clothes and all, and you feed the fire every half hour until it's light, and by morning her lips are the right colour again and you haven't slept.</p>
<<elseif _fcM.kind is "watch">>
<p>You sit up with the fire between you and the dark. The night is loud: dogs a long way off, a scream that's probably a bird, wind in the ruins. Every hour you lean over and put your hand on her chest until you feel it rise.</p>
<<elseif _fcM.kind is "beside">>
<p><<if _fcM.usedCamp>>You stay where you are, along her back, and pull the blanket over both of you.<<else>>You lie down along her back and pull the blanket over both of you.<</if>> She's still cold, and you hold her until she isn't. Her hair smells of blood and smoke. <<if _fcM.came>>Her ass is pressed back into your lap, and you fall asleep with your arm round her waist.<<else>>Her ass is pressed back into your lap and you're hard, and you lie there with it for a long time before you sleep.<</if>></p>
<<else>>
<p><<if _fcM.usedCamp>>You're asleep before you've let go of her.<<else>>You're asleep before you've finished lying down.<</if>></p>
<</if>>
<<if _fcM.dogs>>
<<set _fcUp to _fcM.kind is "watch" or _fcM.kind is "wrap">>
<p><<if _fcUp>>Some time after midnight three dogs come to the edge of the light<<else>>You wake to the fire low and three dogs at the edge of its light<</if>>, ribs like fingers under their hides, heads down. One of them <<if _fcUp>>gets<<else>>has<</if>> its nose an arm's length from Kira's <<if _fcM.undressed>>bare foot<<else>>boot<</if>>. You come up off the ground shouting, with your blade out, and cut it across the muzzle before it can turn. It runs off yelping, and the other two go with it. You stand over her with the blade in your hand until your heart slows down. They don't come back.</p>
<</if>>
<p>Grey light. The fire is ash. She hasn't moved all night except where you moved her.</p>
<<if not _fcM.evidence>>
<p>You check her breathing, her pulse, the cut. Then you pack up and get her onto you again.</p>
<<elseif _fcM.allowed>>
<p>You look at her in the daylight. Your cum from <<if _fcM.lastNight>>last night<<else>>yesterday<</if>> has dried on her skin. She'd grin if she could see it.</p>
<<else>>
<p>You look at her in the daylight. The rag didn't get all of your cum off her.</p>
<</if>>
<<if _fcM.undressed>>
<p>You get her back into her clothes, dry now and stiff with smoke. It takes longer than getting her out of them did.</p>
<</if>>
<div class="choice-container">
<<if not _fcM.evidence>>
<<vchoice "Break camp" "Far_Carry_Leg" "action" "sunrise">>
<<else>>
<<if _fcM.water>>
<<farCarryPick "Wash her properly" "Far_Carry_Leg" "action" "water" `{ wash: true }`>>
<<else>>
<<vchoiceDisabled "Wash her properly (no water)" "action" "water">>
<</if>>
<<vchoice "Leave her as she is" "Far_Carry_Leg" "action" "forward">>
<</if>>
</div><<run VaultUI.setBackgroundDirect(setup.farCarryPicture())>>
<<run setup.farCarryDid("look")>>
<<set _fcOut to setup.farCarryExit("look")>>
<<set _fcAt to setup.farCarryAt()>>
<<set _fcYes to setup.kiraAllowsUse()>>
<<storyVideo "story/combat_kira_carry_home/rest_temptation">>
<<print setup.farCarryText("Far_Carry_Look")>>
<div class="choice-container">
<<vchoice "No. Leave her be." _fcOut "action" "back">>
<<vchoice "Just jerk off. You won't touch her." "Far_Carry_Jerk_Near" "intimate" "high-arousal">>
<<if setup.farCarryCan("jerkOn").on>>
<<vchoice "Jerk off ON her." "Far_Carry_Jerk_On" "intimate" "corruption">>
<</if>>
<<if setup.farCarryCan("touch").on>>
<<vchoice "Touch her. Just touch." "Far_Carry_Touch" "intimate" "corruption">>
<</if>>
</div><<run VaultUI.setBackgroundDirect(setup.farCarryPicture())>>
<<addCorruption 3>>
<<run setup.farCarryDid("grope")>>
<<set _fcOut to setup.farCarryExit("grope")>>
<<set _fcYes to setup.kiraAllowsUse()>>
<<storyVideo "story/combat_kira_carry_home/grope_start">>
<<print setup.farCarryText("Far_Carry_Grope")>>
<div class="choice-container">
<<if _fcYes>>
<<vchoice "Stop. Not here." _fcOut "action" "back">>
<<else>>
<<vchoice "Stop. This is wrong." _fcOut "action" "broken-heart">>
<</if>>
<<vchoice "Keep touching her" "Far_Carry_Grope_More" "intimate" "hand">>
</div><<run VaultUI.setBackgroundDirect(setup.farCarryPicture())>>
<<addCorruption 5>>
<<run setup.farCarryDid("gropeMore")>>
<<set _fcOut to setup.farCarryExit("gropeMore")>>
<<set _fcYes to setup.kiraAllowsUse()>>
<<set $player.lust to Math.min(100, $player.lust + 20)>>
<<storyVideo "story/combat_kira_carry_home/grope_continue">>
<<print setup.farCarryText("Far_Carry_Grope_More")>>
<div class="choice-container">
<<vchoice "Enough." _fcOut "action" "back">>
</div><<run VaultUI.setBackgroundDirect(setup.farCarryPicture())>>
<<addCorruption 2>>
<<set $player.lust to 30>><<run setup.playerReleased()>>
<<run setup.farCarryDid("jerkNear")>>
<<set _fcOut to setup.farCarryExit("jerkNear")>>
<<set _fcAt to setup.farCarryAt()>>
<<set _fcYes to setup.kiraAllowsUse()>>
<<storyVideo "story/combat_kira_carry_home/jerkoff_near__jerkoff_near">>
<<print setup.farCarryText("Far_Carry_Jerk_Near")>>
<div class="choice-container">
<<vchoice "Enough." _fcOut "action" "back">>
</div><<run VaultUI.setBackgroundDirect(setup.farCarryPicture())>>
<<addCorruption 10>>
<<set $player.lust to 20>><<run setup.playerReleased()>>
<<set $flags.cumOnUnconsciousKira to true>>
<<run setup.farCarryDid("jerkOn")>>
<<set _fcOut to setup.farCarryExit("jerkOn")>>
<<set _fcYes to setup.kiraAllowsUse()>>
<<storyVideo "story/combat_kira_carry_home/jerkoff_near__jerkoff_on">>
<<print setup.farCarryText("Far_Carry_Jerk_On")>>
<div class="choice-container">
<<vchoice "Don't think about it." _fcOut "action" "back">>
</div><<run VaultUI.setBackgroundDirect(setup.farCarryPicture())>>
<<addCorruption 8>>
<<set $flags.abusedUnconsciousKira to true>>
<<set $player.lust to Math.min(100, $player.lust + 20)>>
<<run setup.farCarryDid("touch")>>
<<set _fcOut to setup.farCarryExit("touch")>>
<<set _fcYes to setup.kiraAllowsUse()>>
<<storyVideo "story/combat_kira_carry_home/abuse_touch__abuse_touch">>
<<print setup.farCarryText("Far_Carry_Touch")>>
<div class="choice-container">
<<vchoice "Enough." _fcOut "action" "back">>
</div><<run VaultUI.setBackgroundDirect(setup.farCarryPicture())>>
<<set _fcUse to setup.farCarryUse("mouth")>>
<<if _fcUse>><<set _fcOut to setup.farCarryExit("mouth")>><<set $player.lust to 20>><<run setup.playerReleased()>><</if>>
<h2>A Rest</h2>
<<if _fcUse>>
<<storyVideo "story/far_carry/use_mouth">>
<p>She's propped where you set her down, her back against the concrete and her head tipped to one side, lips a little apart. You've been looking at that mouth for an hour.</p>
<p class="internal-thought">Tied up, wrecked after a fight, out cold, whatever. Use me.</p>
<p>Her words. She looked you in the eye when she said them.</p>
<p>You kneel astride her thighs and open your belt. Your cock is already hard and heavy in your hand, and when you lay it against her lower lip she doesn't flinch, doesn't frown, doesn't do anything. Her breath runs warm over the head. You take her jaw in your other hand, thumb on her chin, ease her mouth open, and push in.</p>
<p>Not deep. She has to breathe, and she can't tell you when she can't. You keep to the first few inches of her: the wet inside of her lips, the flat of her tongue lying soft and slack under you. It's hot. It's so fucking hot, and so quiet. No clever tongue, no teeth grazing you on purpose, no eyes daring you from down there. Just her mouth, and you fucking it, slowly, holding her head still against the wall with your fingers in her hair.</p>
<<if setup.farCarryFirstCarry()>>
<p>You used her once before, on another road, when she hadn't said a word about it, and hated yourself afterwards. You don't hate yourself now.</p>
<</if>>
<p>Spit runs out of the corner of her mouth and down her chin. You watch your cock slide in and out between her lips, shining, and you tell her, out loud, as if she could hear it: how good her mouth is, how you're going to tell her about this when she wakes, every second of it, and watch her go red to the ears.</p>
<p>It doesn't take long. When you feel it coming you pull back until only the head is resting on her tongue, and you come there, in thick slow pulses, across her tongue and over her lip. Then you tip her face down, at once, and let your cum run out of her mouth into your palm, so she can't choke on it.</p>
<p>Her lips are red and wet and still a little open. She's breathing just the same as before.</p>
<p class="internal-thought">She can't say red. She knew that when she told you. That was the whole point of telling you.</p>
<div class="choice-container">
<<farCarryPick "Wipe her mouth clean" _fcOut "action" "hand" `setup.farCarryWipe("mouth")`>>
<<vchoice "Leave your cum on her lips" _fcOut "intimate" "lips">>
</div>
<<else>>
<div class="choice-container">
<<vchoice "Continue" `setup.farCarryStop()` "action" "forward">>
</div>
<</if>><<run VaultUI.setBackgroundDirect(setup.farCarryPicture())>>
<<set _fcUse to setup.farCarryUse("camp")>>
<<if _fcUse>><<set _fcOut to setup.farCarryExit("camp")>><<set $player.lust to 10>><<run setup.playerReleased()>><</if>>
<<set _fcS to setup.farCarryView()>>
<h2>The Night</h2>
<<if _fcUse>>
<<storyVideo "story/far_carry/use_camp">>
<p>The fire's down to coals. You lie down along her back under the blanket, hard against her ass.</p>
<p class="internal-thought">You don't have to ask. Tied up, wrecked after a fight, out cold, whatever. Use me.</p>
<p>She said it flushed to the ears and looking straight at you. She meant exactly this: a night like this one, and you beside her wanting it.</p>
<p><<if _fcS.undressed>>She's already bare under the blanket. You got her out of the wet things yourself.<<else>>You push her trousers down over her hips to her knees.<</if>></p>
<p>She's warm on the fire side and cold on the other. You lift her top leg forward, spit in your hand, twice, and work it into her cunt with two fingers, because her body isn't going to do it for you. She's dry and tight and perfectly still. The only sound out of her is her breathing. You slick your cock with what's left, fit the head against her, and push.</p>
<p>She opens slowly. You have to hold her hip and feed yourself into her an inch at a time, and every inch is a tight dry heat that drags at you, until you're in her to the root with your belly flat against her ass. You stay there. You can feel her heartbeat around your cock, slow and even. Nothing in her clenches. Nothing pushes back. She just holds you.</p>
<p>You fuck her like that, on your sides under the blanket, slowly, because slow is all the room there is and because it's her. Your arm is round her waist. Your face is in her hair, and it smells of smoke and dried blood. Her whole body rocks with each stroke and settles back, loose, her head rolling a little on your arm. You get a hand <<if _fcS.undressed>>round her<<else>>up under her shirt<</if>> and hold her tit while you do it, the nipple soft against your palm, and you talk into the back of her neck: that she feels fucking incredible, that she was right, that you're going to tell her every bit of this when she wakes.</p>
<<if setup.farCarryFirstCarry() is "fucked">>
<p>The last time you did this to her you couldn't look at her face for a week. Tonight you'd turn her over and look at it, if you could bear to pull out.</p>
<</if>>
<p>She gets easier as you go. Not the way she does awake, not that sudden flood when she's pinned and cursing you. Just your spit and your precum and her body making room. By the end you're sliding in her deep and easy, and the only sounds in the camp are the fire ticking, the wet push of your cock in her cunt, and your own breath going ragged.</p>
<p>You come buried in her, your hand clamped on her hip, grinding it out against her ass in long hard pulses until there's nothing left. She takes all of it without a sound.</p>
<p>Afterwards you stay inside her until you go soft. Her breathing never changed. You pull the blanket up over her shoulder and hold her, and for the first time today your arms don't hurt.</p>
<div class="choice-container">
<<farCarryPick "Clean her up" _fcOut "action" "hand" `setup.farCarryWipe("camp")`>>
<<vchoice "Leave your cum in her" _fcOut "intimate" "lust">>
</div>
<<else>>
<div class="choice-container">
<<vchoice "Continue" `setup.farCarryStop()` "action" "forward">>
</div>
<</if>><<set _fcS to setup.farCarryView()>>
<<set _fcYes to setup.kiraAllowsUse()>>
<<run setup.farCarryFinish(_fcS.evidence)>>
<<storyVideo "story/far_carry/wash">>
<<if not _fcS.evidence>>
<p>He looks at your boots, at the dirt caked to your knees, at your shaking arms.</p>
<<say "Groundskeeper" "You carried her a long way.">>
<p>He doesn't wait for an answer. He fills a basin at the wall tap, rolls his sleeves back and washes her himself: her face, her throat, the dried blood out of her hair, her hands, one finger at a time. It takes him a while, and he doesn't hurry.</p>
<<say "Groundskeeper" "There. Clean, at least. The rest is beyond soap. She will not wake without the elixir.">>
<<else>>
<p>He looks at your boots, at the dirt caked to your knees. Then he fills a basin at the wall tap, rolls his sleeves back and washes her himself: her face, her throat, the dried blood out of her hair. Then he goes on to the rest of her, and stops.</p>
<p>He looks for a long moment at the dried cum on her. Then he wets the cloth again and washes that off too, without a word, thoroughly, the way you'd clean a wound.</p>
<<say "Groundskeeper" "I have washed her. All of her.">>
<<if _fcYes>>
<p class="internal-thought">She said you could. He wasn't there when she said it, and you don't tell him.</p>
<<say "Groundskeeper" "The vault protects its own from what is outside it. If she has made some arrangement with you, she may tell me so herself, when she wakes. Until then I know only what I washed off her. She will not wake without the elixir.">>
<<else>>
<p>He wrings the cloth out over the basin and doesn't look at you while he does it.</p>
<<say "Groundskeeper" "The vault protects its own from what is outside it. I had not thought I would need to say what that includes. She will not wake without the elixir. When she does, she will know her own body. I would think about that before you wake her.">>
<</if>>
<</if>><<set _fcwHow to setup.farCarryWagonLoad(setup.farCarryOpening(passage(), previous()))>>
<<run VaultUI.setBackgroundDirect(setup.combatBackgroundImage())>>
<h2>Freight</h2>
<<storyVideo "story/far_carry/wagon">>
<<if _fcwHow is "won">>
<p>The road goes quiet. The drivers crawl out from under the wagons and start checking the lashings and the mules.</p>
<<elseif _fcwHow is "fled">>
<p>By the time you get back to the wagons it's over. One crate is gone off the last of them, the lashings cut, and the drivers are standing round the gap as if it might grow back.</p>
<<elseif _fcwHow is "taken">>
<p>They're gone, and one of the crates went with them. The drivers come out from under the wagons one at a time and find other things to look at: the cut lashings, the mules, their own boots.</p>
<</if>>
<p><<if _fcwHow is "taken">>Kira lies by the back wheel, where they left her.<<elseif _fcwHow is "fled">>You lay Kira down by the back wheel.<<else>>Kira lies by the back wheel.<</if>> Her hairline is split where something caught her, and blood has run down over one eye and into her open mouth and started to dry there, tacky and dark. She's breathing, slow and shallow. <<if _fcwHow isnot "won">>You say her name. Nothing. <</if>>It's the same sleep as last time.</p>
<<if ["won", "fled", "taken"].includes(_fcwHow)>>
<p>The caravan master comes down the line of wagons, <<if _fcwHow is "won">>steps over one of the attackers lying in the road without looking down, and looks at Kira instead<<elseif _fcwHow is "fled">>looks for a long moment at the gap where her crate was, and then at Kira<<elseif _fcwHow is "taken">>looks at the gap where her crate was, then at you for a good while longer, and last at Kira<</if>>.</p>
<</if>>
<<say "Caravan master" "Dead?">>
<<say $player.name "Out cold. She won't wake.">>
<<say "Caravan master" "Then she's freight. Freight rides. Get her up on the crates, hired, and wipe your blade before it rusts. I'm not stopping twice on this road for anybody.">>
<p>The woman who held the lead mule's head while the knives were out takes Kira's legs without being asked. Between you, you get her up over the tailboard and onto the crates. The woman wipes the blood out of Kira's eye with the heel of her hand, then wipes her hand on her own trousers, and tucks a horse blanket under Kira's head.</p>
<<if _fcwHow is "won">>
<<say "Caravan woman" "Went down swinging, that one. I watched. Most hired meat would've left her in the ditch and taken the fight money.">>
<<elseif _fcwHow is "fled">>
<<say "Caravan woman" "You ran, and you took her with you. Most hired meat would've left her in the ditch.">>
<<elseif _fcwHow is "taken">>
<<say "Caravan woman" "I saw it. All of it. She won't hear a word of it from me. Most hired meat would've walked off and left her in the road.">>
<</if>>
<p>The wagons roll. You walk beside the tailboard with one hand on Kira's ankle, feeling the jolt of every rut go through her. Her hand has slipped over the edge of the crate and swings, palm up, with the motion of the wheels.</p>
<div class="choice-container">
<<vchoice "Walk on with the wagons" `$journey.returnPassage || "Journey_Event_Continue"` "action" "forward">>
</div><<run VaultUI.setBackgroundDirect("media/backgrounds/vault/exterior/nomad_route.webp")>>
<h2>The Lead Wagon</h2>
<<storyVideo "story/far_carry/wagon_bed">>
<p>The lead wagon is empty now, smelling of straw and mule and old apples. You lay her down on the boards with the horse blanket under her and the canvas pulled across, and take her boots off one at a time. Her feet are filthy. Her shirt is stiff with dried blood down one side.</p>
<p>Outside, the drivers are lighting a fire in the ring of stones, and somebody laughs, too loud, the way people laugh after a day with knives in it.</p>
<p class="internal-thought">Dusk, she said. Ride back with her as far as Trader's Rest, or lift her out now and start walking.</p>
<div class="choice-container">
<<vchoice "Lift her out and carry her home" "Kira_Unconscious_Carry_Home" "action" "walk">>
<<vchoice "Ride back with the empties" "Far_Carry_Wagon_Ride" "action" "journey">>
</div><<calculateDistance setup.FAR_CARRY_WAGON.from setup.FAR_CARRY_WAGON.to>>
<<set _fcwRide to setup.farCarryWagonRide($journey.calculatedDistance)>>
<<if _fcwRide>>
<<if _fcwRide.wait>><<advanceToHour setup.FAR_CARRY_WAGON.dusk>><</if>>
<<advanceTime _fcwRide.hours 0>>
<</if>>
<<run VaultUI.setBackgroundDirect(setup.farCarryGround("highway"))>>
<h2>The Empties</h2>
<p>The wagons go back east light and fast, rattling like dice in a cup. You sit on the boards with her head in your lap and your hand on her chest and watch the highway unroll behind you in the last of the light. Nobody talks. The driver on the bench hums three notes of something, over and over, and never finds the fourth.</p>
<p>It's full dark when the lamps of Trader's Rest come up out of the fields. The caravan master is already shouting at somebody about a mule. You get Kira over the tailboard and onto you, and nobody watches you go. From here it's a road you know.</p>
<div class="choice-container">
<<vchoice "Carry her home" "Kira_Unconscious_Carry_Home" "action" "walk">>
</div><<run setup.farCarrySet({ stop: "" })>>
<<set _fcgGuest to setup.groveAtLeast("Guest")>>
<<set _fcgNext to setup.farCarryGroveNext()>>
<<run VaultUI.setBackgroundDirect(setup.GROVE_BG.grounds)>>
<h2>The Wardens</h2>
<<farCarryLiftLine>>
<p>Two wardens reach you before you've gone ten steps with her. One puts two fingers under Kira's jaw. The other keeps her rifle on your belly.</p>
<<say "Warden" "She lives. The Law requires the healer to see anyone carried bleeding inside these walls. Wait.">>
<p>The healer is an old woman with a lantern and cold hands. She lifts Kira's eyelids one at a time, smells her breath, presses a thumbnail into the skin under Kira's fingernail and watches how slowly the colour comes back. Then she shakes her head at the warden and goes back the way she came.</p>
<<say "Warden" "It is not a blow to the head. The healer has nothing for it. She will sleep until whatever holds her lets go.">>
<<if _fcgGuest>>
<<say "Warden" "You hold Guest standing. The villa is open to you. She is yours on the register: what is done to her under the Covenant's roof is yours to answer for, and the Covenant's to note.">>
<<else>>
<<say "Warden" "You hold no standing here. The healer has seen her. Now you carry her on.">>
<</if>>
<div class="choice-container">
<<if _fcgGuest>>
<<vchoice "Carry her to the villa" _fcgNext "move" "house">>
<<else>>
<<vchoice "Carry her out" _fcgNext "move" "forward">>
<</if>>
</div><<run setup.farCarryBunkMake()>>
<<run VaultUI.setBackgroundDirect(setup.GROVE_BG.villa)>>
<h2>The Guest Villa</h2>
<<storyVideo "story/far_carry/bunk">>
<p>The warden walks you down the orchard path to the guest villa and leaves you at the door. The back room is as you know it: two narrow bunks, clean sheets, the washstand, the jug. Somebody has left a folded shift on the pillow, Covenant green and thin as nothing.</p>
<p>You lay her down on the bunk. The clean white sheet takes her shape and goes pink under her hair where the cut is still seeping. You get her boots off. You wet a cloth in the jug and clean her face, slowly: the blood around her eye, the grit in the corner of her mouth. Her lips are dry and cracked. She doesn't flinch at the cold water. She doesn't do anything at all.</p>
<p>Her clothes are stiff with blood. You get her out of them and into the shift. It takes a while. She is not helping.</p>
<p>The door has no lock. You know it has no lock. You check it anyway.</p>
<div class="choice-container">
<<vchoice "Sit down" `setup.farCarryStop()` "action" "rest">>
</div><<set _fcgFirst to setup.farCarryBunkNightStop()>>
<<if _fcgFirst and not setup.campNight()>><<advanceToHour 17>><</if>>
<<run VaultUI.setBackgroundDirect(setup.GROVE_BG.villa)>>
<h2>The Guest Villa</h2>
<<storyVideo "story/far_carry/bunk_night">>
<p>The lamp is turned down. Outside, a warden calls the hour up at the Main House, and somewhere in the orchard a woman laughs. In here there's only her breathing. She lies on her back on the white sheet in the green shift, one hand palm up beside her face.</p>
<div class="choice-container">
<<vchoice "Sleep" "Far_Carry_Bunk_Morning" "action" "sleep">>
<<farCarryLadder>>
</div><<run setup.farCarryBunkSleep()>>
<<set $journey.campShelter to "shelter">>
<<campRest "shelter">>
<<set _fcgSleep to $journey.campSleep>>
<<run setup.farCarryBunkWoke()>>
<<run VaultUI.setBackgroundDirect(setup.GROVE_BG.villa)>>
<h2><<icon "sunrise">> Morning in the Villa</h2>
<<groveBunkWake "carry">>
<p class="system-info"><<icon "health">> +<<print _fcgSleep.health>> Health restored</p>
<p class="system-info"><<icon "energy">> +<<print _fcgSleep.energy>> Energy restored</p>
<div class="choice-container">
<<vchoice "Get up" `setup.farCarryStop()` "action" "sunrise">>
</div><<set _fcgUse to setup.farCarryBunkUse()>>
<<run VaultUI.setBackgroundDirect(setup.GROVE_BG.villa)>>
<h2>The Guest Villa</h2>
<<if _fcgUse>>
<<storyVideo "story/far_carry/use_bunk">>
<p>She lies on the bunk where you put her, washed, in the shift the Covenant left for her, one strap slipped off her shoulder. Her head's tipped back on the pillow and her mouth is a little open. The door is shut. It doesn't lock.</p>
<p class="internal-thought">You don't have to ask. She said that too.</p>
<p>You kneel between her feet and push the shift up over her thighs, over her hips, up under her tits. Lamplight on her belly, on the dark hair between her legs. You've never had this long just to look at her. Awake, she'd have called you a creep by now and dragged you down by the collar.</p>
<p>You spread her knees. They go where you put them and stay there.</p>
<p>You put your mouth on her first. She tastes of the washstand's soap and, under it, of her. You lick her open, slowly, the flat of your tongue and then the tip, until her cunt is shining wet with your spit all the way down. Nothing. Not a twitch in her thighs, not a catch in her breath. Awake, by now, she'd have both fists in your hair.</p>
<p>Then you hook her knees over your arms and push into her. She's tight, and she gives an inch at a time, and you watch every inch go in. When you're in her to the root you hold there, bent over her, looking: her slack mouth, her throat, her tits tipped back toward her chin under the rucked-up shift.</p>
<p>You fuck her on the Covenant's clean sheets with the lamp burning, and you take your time over it. Her tits roll with every stroke. Her head rocks on the pillow. Her hand lies palm up beside her face, the fingers a little curled, and it moves when you move her and not otherwise. The bunk creaks. Every creak sounds like the door.</p>
<<if $flags.darkestChoice>>
<p>You've been inside her like this before, when she hadn't said you could, on the dirt, and hated yourself by the time you'd pulled out. This is the same body and the same silence, and it's nothing like it.</p>
<</if>>
<p>You tell her what you're doing to her. Quietly, because of the door. That her cunt is so fucking good like this. That you're going to come in her and she's going to sleep right through it, and wake up some day soon and ask you why she's sore, and you're going to tell her, slowly, every detail, exactly as she asked.</p>
<p>You come deep in her, as deep as you can get, holding her hips up off the sheet with both hands, and you keep them there until you've stopped shaking.</p>
<p>When you pull out, your cum follows, slow and white, down onto the Covenant's sheet. You pull the shift down over her and the blanket up to her chin. She's breathing just the same as before.</p>
<<set $player.lust to 10>><<run setup.playerReleased()>>
<</if>>
<div class="choice-container">
<<if _fcgUse>>
<<farCarryPick "Clean her up" `setup.farCarryExit("bunk")` "action" "water" `setup.farCarryWipe("bunk")`>>
<<vchoice "Leave your cum in her" `setup.farCarryExit("bunk")` "action" "forward">>
<<else>>
<<vchoice "Continue" `setup.farCarryStop()` "action" "forward">>
<</if>>
</div><<run setup.farCarryDoorOpened()>>
<<run VaultUI.setBackgroundDirect(setup.GROVE_BG.villa)>>
<h2>The Guest Villa</h2>
<p>The door opens.</p>
<p>There's no knock, because there's no lock. A warden stands in the doorway with a lantern held up, and you have just enough time to know exactly what this looks like. She looks at Kira. She looks at you. Her face does nothing at all.</p>
<<say "Warden" "She is yours on the register. What you do to her under this roof is yours to answer for.">>
<p>She lowers the lantern.</p>
<<say "Warden" "The Lady hears what her wardens see.">>
<p>The door closes, quietly, the way you'd close it on a sleeper.</p>
<div class="choice-container">
<<vchoice "Continue" `setup.farCarryStop()` "action" "forward">>
</div><<widget "farCarrySeleneLine">>
<<if setup.farCarryReportDue()>>
<<run setup.farCarryReportSaid()>>
<<say "Lady Selene" "My wardens tell me you keep odd hours with your stray, vault boy. In my villa, where no door locks. I don't care what you do to her while she can't complain about it. I care that my wardens had to watch. Be quick about it. It is the one thing a man is for.">>
<</if>>
<</widget>><<widget "kiraAidMenu">>
<<set _kam to setup.kiraAidMenu()>>
<<if _kam.shown>>
<div class="action-category kira-aid-category">
<span class="category-label">Companion</span>
<<if _kam.down || _kam.blocked>>
<<set _kamWhy to _kam.down ? "Kira is down." : _kam.blocked>>
<span class="combat-btn disabled kira-aid-down" data-ct-persist="1" @title="_kamWhy"><<icon "health" "small">> Kira ▾ <span class="kira-aid-down-text"><<print _kamWhy>></span></span>
<<else>>
<div @class="'combat-btn-wrapper action kira-aid-wrapper' + (_kam.glow ? ' kira-aid-glow' : '')" data-ct-persist="1">
<a class="kira-aid-toggle" role="button" tabindex="0" aria-haspopup="true" aria-expanded="false" aria-controls="kira-aid-submenu" onclick="toggleSeductionMenu('kira-aid-submenu', this)"><<icon "health" "small">> Kira ▾</a>
<div id="kira-aid-submenu" class="seduction-submenu kira-aid-submenu submenu-actions" style="display: none">
<<for _kamItem range _kam.items>>
<<combatAction _kamItem.label _kamItem.passage "action" `_kamItem.kind === "cover" ? "shield" : "health"` true>>
<</for>>
</div>
</div>
<</if>>
</div>
<</if>>
<</widget>>
<<widget "kiraAidTurnStart">>
<<set _kats to setup.kiraAidTurnStart(_args[0])>>
<<if _kats.ignored>>
<<set _katsTrust to $companions[0].trust || 0>>
<<relationChange "kira" "trust" setup.KIRA_AID.ignoreTrust>>
<<set _katsTrust to ($companions[0].trust || 0) - _katsTrust>>
<<logCombat `"Kira needed you and you looked away. (Trust " + _katsTrust + ")"` "status">>
<</if>>
<<if _kats.callout>>
<<logCombat `'Kira: "' + _kats.callout + '"'` "status">>
<</if>>
<</widget>>
<<widget "kiraAidCard">>
<<set _kac to setup.kiraAidUse(_args[0])>>
<<if !_kac.ok>>
<<set $combat.actionNotice to setup.kiraAidBlock(setup.KIRA_AID_PASSAGES[_args[0]]) || "You can't do that now.">>
<<goto "Combat_Actions">>
<<else>>
<<silently>>
<<if _kac.kind === "stimpak">>
<<set _kacTitle to "STIMPAK">><<set _kacIcon to "health">><<set _kacFolder to "combat/kira_stimpak">>
<<set _kacText to either(
"You drop beside Kira, find the vein in her arm and drive the stimpak in. She hisses, then breathes again as the warmth spreads. \"Okay. Okay, I'm good.\"",
"You catch Kira's arm, pull her down behind you and jab the stimpak in. Her eyes clear. \"God, that stings. Thanks.\"")>>
<<logCombat `"You jab a stimpak into Kira. Kira +" + _kac.heal + " HP (" + _kac.after + "/" + _kac.max + ")."` "status">>
<<elseif _kac.kind === "bandage">>
<<set _kacTitle to "BANDAGE">><<set _kacIcon to "health">><<set _kacFolder to "combat/kira_bandage">>
<<set _kacText to either(
"Kira is down on her back, bleeding. You kneel over her, press the dressing hard into the wound and talk her through it. \"Stay with me.\" She nods, teeth gritted.",
"You press the dressing to her wound and tie it off fast. Kira squeezes your hand once. \"Good enough. Let's finish this.\"")>>
<<logCombat `"You bandage Kira's wound. Kira +" + _kac.heal + " HP (" + _kac.after + "/" + _kac.max + ")."` "status">>
<<else>>
<<set _kacTitle to "COVER HER">><<set _kacIcon to "shield">><<set _kacFolder to "combat/kira_cover">>
<<set _kacText to either(
"You step in front of Kira and square up. \"Behind me.\" She doesn't argue.",
"You drop in over Kira, cover her with your body and keep your weapon up. Whatever comes for her this turn has to go through you.")>>
<<logCombat "You step in front of Kira. Blows meant for her come to you this turn." "status">>
<</if>>
<<set _kacTrust to 0>>
<<if _kac.answered>>
<<set _kacTrust to $companions[0].trust || 0>>
<<relationChange "kira" "trust" setup.KIRA_AID.answerTrust>>
<<set _kacTrust to ($companions[0].trust || 0) - _kacTrust>>
<<logCombat `"Kira catches your eye and nods. (Trust +" + _kacTrust + ")"` "status">>
<</if>>
<<kiraMediaTarget>>
<<set _kiraMediaTarget.mediaSkin to setup.combatMediaPlayerSkin(null)>>
<<fillCombatVideoBox "kira-aid-video" _kacFolder _kiraMediaTarget>>
<</silently>>
<div class="player-turn-container">
<div @class="'combat-card player-card player-rest-card kira-aid-card kira-aid-' + _kac.kind">
<div class="card-header player-card-header player-defense-header">
<<icon _kacIcon "medium">>
<span class="player-card-name">KIRA</span>
<span class="attack-name"><<print _kacTitle>></span>
</div>
<div class="card-body">
<div class="attack-narrative-container"><div class="rest-narrative-row"><p class="rest-narrative"><<print _kacText>></p></div></div>
<div id="kira-aid-video" class="card-video-container" style="display: none"></div>
<div class="attack-effects-container">
<div class="rest-effects-row">
<<if _kac.kind === "cover">>
<div class="energy-recovered kira-aid-effect"><<icon "shield" "medium">> Blows meant for Kira come to you this turn</div>
<<else>>
<div class="energy-recovered kira-aid-effect"><<icon "health" "medium">> Kira +<<print _kac.heal>> HP (<<print _kac.after>>/<<print _kac.max>>)</div>
<div class="kira-aid-left"><<print _kac.left>> <<print _kac.kind === "stimpak" ? (_kac.left === 1 ? "stimpak" : "stimpaks") : (_kac.left === 1 ? "bandage" : "bandages")>> left</div>
<</if>>
<<if _kacTrust gt 0>><div class="kira-aid-trust">Kira trusts you more (+<<print _kacTrust>>)</div><</if>>
</div>
</div>
<div class="defense-warning-container">
<div class="defense-info rest-warning"><<icon "danger" "medium">> OPEN: enemies have +<<print setup.KIRA_AID.vulnerableHitBonus>> to hit you this turn<<if _kac.kind !== "cover">>, and one of them comes at you<</if>>.</div>
</div>
</div>
<div class="card-footer player-card-footer">
<div class="player-status-row">
<span class="player-energy"><<icon "health" "medium">> Kira <<print $companions[0].health>>/<<print $companions[0].maxHealth>></span>
</div>
</div>
</div>
</div>
<div class="choice-container">
<<vchoice "Continue" "Combat_Companion_Turn" "move" "map">>
</div>
<</if>>
<</widget>><<kiraAidCard "stimpak">><<kiraAidCard "bandage">><<kiraAidCard "cover">><<silently>>
<<set setup.kiraStatusConfigs to {}>>
<<set setup.kiraStatusConfigs.incapacitated to {
id: "incapacitated",
name: "INCAPACITATED",
icon: "sleep",
effect: "Kira cannot act",
canAttack: false,
autoRecover: false,
color: "#8b0000"
}>>
<<set setup.kiraStatusConfigs.dazed to {
id: "dazed",
name: "DAZED",
icon: "dizzy",
effect: "Kira loses her turn",
canAttack: false,
autoRecover: true,
color: "#888888"
}>>
<<set setup.kiraStatusConfigs.charmed to {
id: "charmed",
name: "CHARMED",
icon: "charmed",
effect: "Kira loses her turn",
canAttack: false,
autoRecover: true,
color: "#c71585"
}>>
<<set setup.kiraStatusConfigs.wrists_bound to {
id: "wrists_bound",
name: "WRISTS BOUND",
icon: "bound",
effect: "Cannot attack - 30% break free",
canAttack: false,
breakChance: 30,
color: "#8b4513"
}>>
<<set setup.kiraStatusConfigs.ankles_bound to {
id: "ankles_bound",
name: "ANKLES BOUND",
icon: "bound",
effect: "Cannot move - 25% break free",
canAttack: false,
breakChance: 25,
color: "#8b4513"
}>>
<<set setup.kiraStatusConfigs.leashed to {
id: "leashed",
name: "LEASHED",
icon: "submission",
effect: "-50% damage, 40% hit chance",
canAttack: true,
damageMultiplier: 0.5,
hitChance: 40,
color: "#800080"
}>>
<<set setup.kiraStatusConfigs.knocked_down to {
id: "knocked_down",
name: "KNOCKED DOWN",
icon: "prone",
effect: "Attempting to stand",
canAttack: false,
autoRecover: true,
color: "#666666"
}>>
<<set setup.kiraStatusConfigs.recovering to {
id: "recovering",
name: "RECOVERING",
icon: "muscle",
effect: "Getting back on feet",
canAttack: false,
color: "#32cd32"
}>>
<<set setup.kiraStatusConfigs.attacking to {
id: "attacking",
name: "ATTACKING",
icon: "attack",
effect: "Normal attack",
canAttack: true,
color: "#ff69b4"
}>>
<<set setup.kiraStatusConfigs.normal to {
id: "normal",
name: "READY",
icon: "companion",
effect: "Ready to fight",
canAttack: true,
color: "#ff69b4"
}>>
<<set setup.kiraStatusConfigs.stunned_orgasm to {
id: "stunned_orgasm",
name: "STUNNED",
icon: "stunned",
effect: "Recovering from orgasm",
canAttack: false,
autoRecover: true,
color: "#ff1493"
}>>
<<set setup.kiraCNCConfigs to {}>>
<<set setup.kiraCNCConfigs.unconscious to {
id: "unconscious",
name: "KIRA DOWN",
icon: "knockdown",
headerClass: "danger-header"
}>>
<<set setup.kiraCNCConfigs.cnc_watch to {
id: "cnc_watch",
name: "A DARK CHOICE",
icon: "voyeur",
headerClass: "dark-header"
}>>
<<set setup.kiraCNCConfigs.cnc_strip to {
id: "cnc_strip",
name: "STRIPPED",
icon: "broken-shield",
headerClass: "dark-header"
}>>
<<set setup.kiraCNCConfigs.cnc_full to {
id: "cnc_full",
name: "VIOLATED",
icon: "lust",
headerClass: "extreme-header"
}>>
<<set setup.kiraCNCConfigs.intervene to {
id: "intervene",
name: "ENOUGH!",
icon: "attack",
headerClass: "heroic-header"
}>>
<<set setup.kiraCNCConfigs.flee to {
id: "flee",
name: "ESCAPE",
icon: "run",
headerClass: "flee-header"
}>>
<<set setup.kiraCNCConfigs.victory to {
id: "victory",
name: "PYRRHIC VICTORY",
icon: "health",
headerClass: "victory-header"
}>>
<<set setup.kiraSexConfigs to {}>>
<<set setup.kiraSexConfigs.watch_fucked to {
id: "watch_fucked",
name: "WATCHING...",
icon: "voyeur",
headerClass: "sex-header",
playerLustGain: 30,
trustLoss: -4,
tensionGain: 8
}>>
<<set setup.kiraSexConfigs.watch_anal to {
id: "watch_anal",
name: "WATCHING...",
icon: "voyeur",
headerClass: "sex-header",
playerLustGain: 35,
trustLoss: -5,
tensionGain: 9
}>>
<<set setup.kiraSexConfigs.bound_fucked to {
id: "bound_fucked",
name: "HELPLESS",
icon: "bound",
headerClass: "extreme-header",
playerLustGain: 35,
trustLoss: -6,
tensionGain: 12
}>>
<<set setup.kiraSexConfigs.bound_anal to {
id: "bound_anal",
name: "HELPLESS",
icon: "bound",
headerClass: "extreme-header",
playerLustGain: 40,
trustLoss: -7,
tensionGain: 12
}>>
<<set setup.kiraPositionConfigs to {}>>
<<set setup.kiraPositionConfigs.standing to {
id: "standing",
name: "Standing",
icon: "muscle",
defenseClass: "position-normal"
}>>
<<set setup.kiraPositionConfigs.kneeling to {
id: "kneeling",
name: "On Knees",
icon: "kneeling",
defenseClass: "position-vulnerable"
}>>
<<set setup.kiraPositionConfigs.prone_front to {
id: "prone_front",
name: "Face Down",
icon: "prone",
defenseClass: "position-danger"
}>>
<<set setup.kiraPositionConfigs.prone_back to {
id: "prone_back",
name: "On Back",
icon: "prone",
defenseClass: "position-danger"
}>>
<<set setup.kiraPositionConfigs.bent_over to {
id: "bent_over",
name: "Bent Over",
icon: "bent-over",
defenseClass: "position-danger"
}>>
<<set setup.kiraPositionConfigs.pinned to {
id: "pinned",
name: "PINNED",
icon: "pinned",
defenseClass: "position-critical"
}>>
<<set setup.kiraCombatStats to {
baseDamage: 5,
statDivisor: 4,
varianceMin: -1,
varianceMax: 2,
hitChance: 65,
leashed: {
damageMultiplier: 0.5,
hitChance: 40
},
breakFree: {
knockedDown: 35,
wristsBound: 30,
anklesBound: 25
},
painPleasureChance: 25,
clothingDamageChance: 45
}>>
<<set setup.kiraPositionLogs to {
generic: {
kneeling: "Kira forced to her knees!",
prone_front: "Kira knocked face-down!",
prone_back: "Kira knocked onto her back!",
bent_over: "Kira bent over!",
pinned: "Kira pinned down!"
},
specific: {
hair_grab_force: "Kira forced bent over!",
leg_sweep: "Kira swept onto her back!",
wrist_yank: "Kira forced to her knees!",
hip_throw: "Kira thrown onto her back!",
chain_choke: "Kira choked to her knees!",
rope_bind_ankles: "Kira yanked face-down!",
leash_pull_kneel: "Kira yanked to her knees by leash!"
},
recovery: {
kneeling: "Kira struggles to her feet!",
prone_front: "Kira scrambles up!",
prone_back: "Kira rolls to her feet!",
bent_over: "Kira straightens up!",
pinned: "Kira breaks free!"
}
}>>
<</silently>>
<<widget "initKiraConfig">>
<</widget>>
<<widget "logKiraPositionChange">>
<<set _lkpPosition to _args[0]>>
<<set _lkpAction to _args[1] || null>>
<<set _lkpType to _args[2] || "generic">>
<<if _lkpPosition && setup.kiraPositionLogs && $combat.log>>
<<set _lkpMsg to null>>
<<set _lkpIcon to setup.kiraPositionConfigs?.[_lkpPosition]?.icon || "hazard-sign">>
<<if _lkpAction && setup.kiraPositionLogs.specific?.[_lkpAction]>>
<<set _lkpMsg to setup.kiraPositionLogs.specific[_lkpAction]>>
<<elseif _lkpType === "recovery" && setup.kiraPositionLogs.recovery?.[_lkpPosition]>>
<<set _lkpMsg to setup.kiraPositionLogs.recovery[_lkpPosition]>>
<<elseif setup.kiraPositionLogs.generic?.[_lkpPosition]>>
<<set _lkpMsg to setup.kiraPositionLogs.generic[_lkpPosition]>>
<</if>>
<<if _lkpMsg>>
<<run $combat.log.push({
type: "debuff",
text: _lkpMsg,
icon: _lkpIcon
})>>
<</if>>
<</if>>
<</widget>><<silently>>
<<run setup.combatNarrative = setup.combatNarrative || {}>>
<<set setup.combatNarrative.kira_attack to [
"Kira darts forward, her blade flashing. The strike lands true.",
"With practiced precision, Kira strikes, her weapon biting deep.",
"Kira lunges, a snarl on her lips. Blood sprays.",
"She moves like lightning, blade finding flesh before [Enemy] can react.",
"Kira attacks with savage efficiency, her weapon carving through resistance.",
"A blur of motion—Kira's blade sinks home."
]>>
<<set setup.combatNarrative.kira_miss to [
"Kira's strike goes wide by inches. 'Close.' Not close enough.",
"[Enemy] twists aside at the last moment and Kira's blade cuts only air.",
"Kira overextends, her attack sailing past its mark, and she stumbles off-balance.",
"She lunges, but [Enemy] is faster and slides out of reach.",
"The strike glances off armor. Kira glares at the scratch she left. 'Great. Now it's annoyed.'",
"Kira lunges, blade whistling through empty air, and swears under her breath.",
"Kira's blade misses by inches. She resets her stance, jaw tight.",
"Kira swings hard and [Enemy] slides smoothly out of reach. 'Oh, you're quick. Cute.'",
"Kira misses. 'Slippery bastard,' she mutters, then, with feeling: 'Slippery little fucker.'",
"Kira misses, breathing hard, sweat stinging her eyes. 'Fine. Round two.'",
"[Enemy] dodges. Kira growls low in her throat, and it isn't a friendly sound.",
"Kira fails to connect. 'Stand still and die like a normal person.'",
"Kira's strike goes wide. 'Fuck,' she hisses.",
"Kira's blade finds nothing. She's angry now, and angry makes her sloppy.",
"Kira swings; [Enemy] sidesteps. 'Keep dancing. I've got all day.'",
"Kira strikes, [Enemy] dodges easily, and she snarls something vicious.",
"Kira misses badly and bounces on her toes. 'Warm-up. That was the warm-up.'",
"Kira misses. 'You can't dodge forever, and I can swing all night.'",
"Kira's attack fails. She stops fencing and gets ugly, pressing in hard.",
"Kira misses badly. 'Hold. Still.'",
"Kira swings and misses, and [Enemy] laughs at her. She does not take it well.",
"Kira's strike misses. 'Lucky. Won't happen twice.'",
"Kira misses completely. 'Son of a bitch.' She means it personally.",
"Kira misses. Her jaw sets and her eyes go cold."
]>>
<<set setup.combatNarrative.kira_kill to [
"[Enemy] falls, dead before they hit the ground.",
"Kira's blade finds the throat. Arterial spray. Down they go.",
"One more enemy drops. Kira doesn't even slow down.",
"The killing blow lands. The light fades from their eyes.",
"Kira finishes them with brutal efficiency."
]>>
<<set setup.combatNarrative.kira_dazed to [
"Kira is still trembling from her orgasm... she can't focus.",
"Her legs are shaky, aftershocks still rippling through her body.",
"Kira's eyes are glazed, still lost in the aftermath of forced pleasure.",
"She's panting, unable to concentrate. Her body betrayed her.",
"Still twitching from what they did to her, Kira can barely stand."
]>>
<<set setup.combatNarrative.kira_wrists_bound to [
"Kira struggles against her bound wrists, unable to attack!",
"Her hands are tied tight. She can't grip her weapon.",
"Wrists lashed together, Kira can only struggle uselessly.",
"The ropes bite into her wrists as she fights to break free."
]>>
<<set setup.combatNarrative.kira_ankles_bound to [
"Kira can't stand with her ankles bound!",
"Her legs are tied together. She can barely move.",
"Hobbled like an animal, Kira struggles on the ground.",
"The ropes around her ankles keep her from standing."
]>>
<<set setup.combatNarrative.kira_leashed to [
"The rope around Kira's neck keeps her controlled!",
"Every move she makes, the leash tightens, choking her.",
"She's on a fucking leash. Can barely breathe, let alone fight.",
"The collar digs into her throat with every movement."
]>>
<<set setup.combatNarrative.kira_knocked_down to [
"Kira is on the ground, struggling to get up.",
"She's down! Trying to find her footing.",
"Knocked flat, Kira scrambles to recover.",
"She hits the dirt hard, wind knocked out of her."
]>>
<<set setup.combatNarrative.kira_stand_up to [
"Kira forces herself back to her feet, snarling.",
"She rises, rage burning in her eyes.",
"Back on her feet. Kira's not done yet.",
"She staggers upright, ready to keep fighting."
]>>
<<set setup.combatNarrative.kira_break_free_wrists to [
"With a grunt of effort, Kira snaps the ropes binding her wrists!",
"She wrenches her hands free, skin rubbed raw but finally loose.",
"The bindings give way. Kira's hands are free!",
"She twists and pulls until the ropes finally break."
]>>
<<set setup.combatNarrative.kira_break_free_ankles to [
"Finally! Kira kicks the ropes off her ankles.",
"She gets the knots loose and tears the bindings away.",
"Her legs are free! Kira scrambles to her feet.",
"The ankle bindings fall away. She can move again."
]>>
<<set setup.combatNarrative.kira_attack_leashed to [
"Despite the collar, Kira manages a weakened strike.",
"Choking on the leash, she still lands a hit.",
"Half-strangled, Kira's attack still connects.",
"Even leashed, she finds a way to hurt them."
]>>
<<set setup.combatNarrative.kira_miss_leashed to [
"The leash jerks her back mid-swing. She misses.",
"Can't get enough reach with the collar choking her.",
"[Enemy] yanks the leash and her strike goes wild.",
"Strangled gasp as the leash pulls tight. Attack fails."
]>>
<<set setup.combatNarrative.kira_cnc_approach to [
"[Enemy] approaches Kira's unconscious form, intent clear in their eyes.",
"They move toward her limp body, hands already reaching.",
"Kira lies helpless as [Enemy] advances, predatory grin spreading.",
"[Enemy] crouches beside her, already pawing at her clothes."
]>>
<<set setup.combatNarrative.kira_cnc_strip to [
"They tear her clothes away, exposing her completely.",
"Rough hands rip the fabric from her unconscious body.",
"Her clothes come off easily—she can't fight back.",
"Within seconds she's stripped bare, completely vulnerable."
]>>
<<set setup.combatNarrative.kira_cnc_penetration to [
"They force themselves inside her limp body without hesitation.",
"Her unconscious form offers no resistance as they enter her.",
"They bury themselves in her, grunting with satisfaction.",
"She's taken roughly, her body shifting with each brutal thrust."
]>>
<<set setup.combatNarrative.kira_cnc_victim_sounds to [
"Even unconscious, soft sounds escape her lips—involuntary responses.",
"Her body twitches and a moan escapes despite her state.",
"Unconscious moans mix with the wet sounds of her violation.",
"She makes sounds she'd hate herself for if she were awake."
]>>
<<set setup.combatNarrative.kira_cnc_climax to [
"They finish inside her with a grunt, filling her unconscious body.",
"With a final thrust they empty themselves into her limp form.",
"They cum hard, leaving evidence of what they did dripping from her.",
"Her body is marked now, used and discarded while she couldn't resist."
]>>
<<set setup.combatNarrative.kira_intervene_early to [
"You snap out of it. Whatever held you breaks.",
"Enough. This ends NOW.",
"Something snaps inside you. Time to act.",
"The spell breaks. You charge."
]>>
<<set setup.combatNarrative.kira_intervene_late to [
"Shame burns through you. You shouldn't have let it get this far.",
"Too late to undo what they did. But you can end them.",
"The damage is done. But you'll make them pay.",
"Guilt fuels your rage. You attack with desperate force."
]>>
<<set setup.combatNarrative.kira_rescued to [
"You pull them off her. It's over.",
"She's safe now. Violated, but safe.",
"You got there in time. Barely.",
"[Enemy] is gone. Now to deal with the aftermath."
]>>
<<set setup.combatNarrative.kira_watched_stripped to [
"You watch as they strip her, piece by piece.",
"Her clothes come off while you do nothing.",
"You're watching her get exposed. And you're hard.",
"She's stripped bare in front of you. You don't move."
]>>
<<set setup.combatNarrative.kira_watched_fucked to [
"You watch them fuck her. Every thrust. Every moan.",
"She's being used right in front of you. And you're watching.",
"The wet slap of flesh. Her reluctant moans. You see it all.",
"They're using her and you're just standing there, cock hard."
]>>
<<set setup.combatNarrative.kira_watched_anal to [
"You watch them take her ass. She screams. You don't move.",
"They're sodomizing her brutally. You can't look away.",
"Her ass is being destroyed and you're just watching.",
"Every brutal thrust into her ass, you see. Every cry of pain."
]>>
<<set setup.combatNarrative.kira_aftermath_shame to [
"She won't look at you. Can't meet your eyes.",
"The shame is written all over her face.",
"She's broken. And she knows you saw everything.",
"Silent. Shaking. She pulls her torn clothes around herself."
]>>
<<set setup.combatNarrative.kira_aftermath_broken to [
"Something's changed in her eyes. Something died.",
"She's not the same. You did this. You let this happen.",
"Cum leaking from her, she stares at nothing.",
"She's still trembling. Body covered in evidence of her violation."
]>>
<<set setup.combatNarrative.kira_bound_fucked_start to [
"Tied and helpless, she can only struggle uselessly as they approach.",
"The ropes hold her in place. She's completely at their mercy.",
"Bound and exposed, Kira can do nothing but watch them position themselves.",
"Her restraints ensure she can't escape what's coming."
]>>
<<set setup.combatNarrative.kira_bound_fucked_penetration to [
"They enter her bound body without hesitation. She screams into her gag.",
"Tied down, she feels every inch as they force themselves inside.",
"The ropes creak as she struggles, but they're already inside her.",
"Helpless. Bound. Penetrated. She can only take it."
]>>
<<set setup.combatNarrative.kira_bound_fucked_during to [
"Her bound body jerks with each brutal thrust, ropes cutting into skin.",
"She's fucked like a tied-up toy, unable to do anything but moan.",
"The restraints ensure she feels every movement, every violation.",
"Bound and used, her body betrays her with shameful wetness."
]>>
<<set setup.combatNarrative.kira_bound_fucked_climax to [
"She cums while tied up, screaming her shame as her body spasms in the restraints.",
"Even bound, her body betrays her—orgasming helplessly around their cock.",
"The forced orgasm rips through her, enhanced by her helpless position.",
"She breaks completely, cumming hard despite—or because of—being restrained."
]>>
<<set setup.combatNarrative.kira_bound_fucked_aftermath to [
"She hangs limply in her bonds, cum dripping, completely broken.",
"Still tied, still leaking, she's a ruined mess of used flesh.",
"The ropes are the only thing holding her up now. She's destroyed.",
"Bound, fucked, and filled. She's nothing but a cumdump now."
]>>
<<set setup.combatNarrative.kira_bound_anal_start to [
"Ass up and tied down—the perfect position for what's coming.",
"The ropes hold her in place, ass raised and presented.",
"Bound with her ass in the air, she can do nothing but beg.",
"Her restraints ensure her tight ass is perfectly accessible."
]>>
<<set setup.combatNarrative.kira_bound_anal_penetration to [
"They force into her unprepared ass. Her scream is primal.",
"No prep, no mercy. They split her bound ass open.",
"The pain is intense—she feels everything as they take her ass.",
"Tied down, she can't clench, can't fight. Only take it all."
]>>
<<set setup.combatNarrative.kira_bound_anal_during to [
"Her bound body jerks with each thrust into her tight hole.",
"The ropes ensure she can't escape a single inch of anal violation.",
"She's sodomized brutally while completely helpless and restrained.",
"Ass up, face down, tied tight—she's just a hole to fuck."
]>>
<</silently>><<set setup.kiraSexConfig to {
positioning: {
hairGrab: { resistDC: 55, kiraLust: 2, damageMin: 2, damageMax: 4 },
legSweep: { resistDC: 45, kiraLust: 2 },
wristYank: { resistDC: 50, kiraLust: 2 },
hipThrow: { resistDC: 40, kiraLust: 3 },
beltYank: { resistDC: 45, kiraLust: 2 },
chainPull: { resistDC: 40, kiraLust: 2 },
knifePoint: { resistDC: 35, kiraLust: 2 },
ropeWrists: { resistDC: 50, kiraLust: 2, resistDamage: 4 },
ropeAnkles: { resistDC: 45, kiraLust: 3, resistDamage: 6 },
ropeLeash: { resistDC: 40, kiraLust: 3 },
chokeHold: { resistDC: 45, kiraLust: 3 },
armTwist: { resistDC: 38, kiraLust: 2 },
ankleSweep: { resistDC: 40, kiraLust: 2 },
shoulderShove: { resistDC: 40, kiraLust: 2 },
hairForce: { resistDC: 45, kiraLust: 3 }
},
grope: {
tits: { kiraLust: 3, enemyLust: 10 },
titsRefractory: { kiraLust: 3 },
ass: { kiraLust: 4, enemyLust: 8 },
pussy: { kiraLust: 4, enemyLust: 12 },
pussyRefractory: { kiraLust: 3 },
slap: { kiraLust: 3 }
},
crop: {
pussy: { kiraLust: 4 },
tits: { kiraLust: 3 },
ass: { kiraLust: 3 },
general: { kiraLust: 1 }
},
strip: {
topRip: { kiraLust: 3, resistDC: 50 },
bottomRip: { kiraLust: 3, resistDC: 45 },
underwearRip: { kiraLust: 4, resistDC: 40 },
knifeSlice: { kiraLust: 5, resistDC: 35 },
beltYank: { kiraLust: 4, resistDC: 42 },
pantsPull: { kiraLust: 3, resistDC: 45 },
shoveAside: { kiraLust: 4 }
},
sexActs: {
forcedOral: { kiraLust: 5, resistDC: 40 },
fingerPussy: { kiraLust: 4, resistDC: 45 },
fingerAss: { kiraLust: 3, resistDC: 40 },
fuckPussy: { kiraLust: 8 },
fuckAss: { kiraLust: 6 },
mount: { kiraLust: 5 }
},
resistSuccess: {
kick: { damage: 5 },
headbutt: { damage: 4 },
bite: { damage: 6 },
elbow: { damage: 4 }
},
damage: {
positioningHit: { min: 2, max: 4 },
positioningHard: { min: 3, max: 6 },
positioningBrutal: { min: 4, max: 7 },
throwDamage: { min: 2, max: 5 }
}
}>><<set setup.playerWatchConfig to {
grope: { playerLust: 15, kiraLust: 4 },
forcedOral: { playerLust: 25, cumChance: 30 },
mountAttempt: { playerLust: 10 },
stripped: { playerLust: 10 },
fingered: { playerLust: 18, kiraLust: 6 },
analFinger: { playerLust: 15, kiraLust: 5 },
kiraFucked: { playerLust: 30, trustPenalty: -4 },
kiraFuckedBound: { playerLust: 35, trustPenalty: -6 },
kiraFuckedRefractory: { playerLust: 30, trustPenalty: -5 },
kiraAnal: { playerLust: 35, trustPenalty: -5 },
kiraAnalBound: { playerLust: 40, trustPenalty: -7 },
trustPenalties: {
watchedGrope: -1,
watchedOral: -3,
watchedStrip: -1,
watchedFuck: -4,
watchedFuckBound: -6,
watchedAnal: -5,
watchedAnalBound: -7
}
}>><<set setup.interventionConfig to {
attack: {
standFromProneDC: 10,
standFromKneelingDC: 8,
hitChance: 75,
baseDamage: 8,
critMultiplier: 1.5,
playerDamageOnFail: { min: 3, max: 6 }
},
pull: {
strengthDC: 12,
playerDamageOnFail: { min: 2, max: 5 },
playerDamageOnPartial: 2
},
shout: {
charmDC: 14,
enemyDamageOnSuccess: 5
},
freeChain: {
strengthDC: 12,
trustGain: 2,
playerDamageOnFail: 4
},
freeWrists: {
agilityDC: 11,
trustGain: 1
},
cutRope: {
agilityDC: 10,
trustGain: 1
},
cutLeash: {
strengthDC: 10,
trustGain: 2,
playerDamageOnFail: 3
},
grabCrop: {
agilityDC: 14,
trustGain: 1,
playerDamageOnFail: 5
}
}>><<widget "validateKiraState">>
<<if $companions && $companions[0]>>
<<if $flags.kiraUnconsciousTriggered && !$flags.kiraResurgenceUsed>>
<<if !$flags.kiraIsUnconscious>>
<<set $flags.kiraIsUnconscious to true>>
<</if>>
<<if $companions[0].health gt 1>>
<<set $companions[0].health to 1>>
<</if>>
<<set $companions[0].status to "unconscious">>
<<set $companions[0].currentLocation to "kira_quarters">>
<<if $expeditionCompanion === "kira">>
<<set $expeditionCompanion to "">>
<</if>>
<</if>>
<</if>>
<</widget>>
<<widget "checkKiraUnconscious">>
<<if $companions && $companions[0] && $companions[0].health lte 1 && setup.kiraKnockoutAllowed()>>
<<if !$flags.kiraUnconsciousTriggered>>
<<set $flags.kiraIsUnconscious to true>>
<<set $flags.kiraUnconsciousFirstTime to true>>
<<logCombat "Kira collapses! She's unconscious!" "critical">>
<<else>>
<<set $flags.kiraIsUnconscious to true>>
<<set $flags.kiraUnconsciousFirstTime to false>>
<<logCombat "Kira falls unconscious again!" "critical">>
<</if>>
<</if>>
<</widget>>
<<widget "setKiraUnconscious">>
<<if !setup.kiraKnockoutAllowed() && !setup.kiraAlreadyDown()>>
<<run setup.guardKira()>>
<<else>>
<<set $flags.kiraIsUnconscious to true>>
<<set $companions[0].health to 1>>
<<set $companions[0].status to "unconscious">>
<<set $companions[0].currentLocation to ($flags.kiraResurgenceUsed ? "medical" : "kira_quarters")>>
<<set $combat.kiraIncapacitated to true>>
<<if $expeditionCompanion === "kira">>
<<set $expeditionCompanion to "">>
<</if>>
<</if>>
<</widget>><<if !setup.kiraKnockoutAllowed() && !setup.kiraAlreadyDown()>>
<<run setup.guardKira()>>
<<if $combat.enemies && $combat.enemies.filter(e => e.health > 0 && !e.beenUsed).length gt 0>>
<<goto "Combat_Actions">>
<<else>>
<<goto "Combat_Victory">>
<</if>>
<<else>>
<<storyVideo "story/combat_kira_unconscious_cnc/unconscious">>
<<kiraUnconsciousCardFlow>>
<</if>><<set $combat.kiraWatched to true>>
<<set _b9Raider to $combat.enemies.find(e => e.health > 0 && e.lust >= 40) || $combat.enemies.find(e => e.health > 0)>>
<<if !_b9Raider || (_b9Raider.gender || "male") isnot "female">><<storyVideo "story/combat_kira_unconscious_cnc/cnc_watch">><</if>>
<<kiraCNCWatchCardFlow>><<set $combat.kiraWatched to true>>
<<if !$temp || $temp.cncEnemyGender isnot "female">><<storyVideo "story/combat_kira_unconscious_cnc/cnc_strip">><</if>>
<<kiraCNCStripCardFlow>><<set $combat.kiraWatched to true>>
<<if !$temp || $temp.cncEnemyGender isnot "female">><<storyVideo "story/combat_kira_unconscious_cnc/cnc_full">><</if>>
<<kiraCNCFullCardFlow>><<kiraCNCInterveneCardFlow>><<kiraCNCInterveneLateCardFlow>><<storyVideo "story/combat_kira_unconscious_cnc/cnc_full">>
<<kiraCNCJoinCardFlow>><<storyVideo "story/combat_kira_unconscious_cnc/cnc_full">>
<<kiraCNCJoinMaleCardFlow>><<storyVideo "story/combat_kira_unconscious_cnc/cnc_full">>
<<kiraCNCJoinFemaleCardFlow>><<endCombat>>
<<run VaultUI.setBackgroundDirect(setup.combatBackgroundImage())>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<<if !$temp || $temp.cncEnemyGender isnot "female">><<storyVideo "story/combat_kira_unconscious_cnc/combat_cnc_aftermath_cleanup">><</if>>
<<if _storyClip is "dae934767067">>His cum lies in a glossy smear across her mound and slides down between her lips when you kneel beside her. You find water and rags. Carefully, you clean Kira's body, trying to remove all evidence of what happened.<<else>>You find water and rags. Carefully, you clean Kira's body, trying to remove all evidence of what happened.<</if>>
<<set $clothing.kira.top to 50>>
<<set $clothing.kira.bottom to 50>>
<<set $clothing.kira.titsExposed to false>>
<<set $clothing.kira.pussyExposed to false>>
<<run setup.fishingGame.endKiraForfeit()>>
You re-dress her as best you can with her damaged clothing.
<p class="internal-thought">She might not remember. She was unconscious the whole time. Maybe... maybe she never has to know.</p>
But you'll know. You watched. You let it happen.
When the wet rag passes over her stomach, her breath snags once against your knuckles. Her eyes stay shut.
<<set $flags.hidCNCFromKira to true>>
<<if setup.kiraKnockoutIsFirst()>>
<div class="choice-container">
<<vchoice "Continue" "Kira_Unconscious_FirstTime_Start" "action" "forward">>
</div>
<<else>>
<div class="choice-container">
<<vchoice "Continue" "Kira_Unconscious_Carry_Home" "action" "forward">>
</div>
<</if>><<endCombat>>
<<run VaultUI.setBackgroundDirect(setup.combatBackgroundImage())>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<<if !$temp || $temp.cncEnemyGender isnot "female">><<storyVideo "story/combat_kira_unconscious_cnc/combat_cnc_aftermath_cleanup">><</if>>
You don't bother cleaning her. She'll figure it out when she wakes up.
<<if _storyClip is "dae934767067">><p class="dark-consequence">She lies naked where he left her, skin slick, cum pooled on her mound and dripping between her lips.</p><<else>><p class="dark-consequence">Her clothes are torn, her body exposed. Evidence of violation obvious between her thighs.</p><</if>>
<p class="internal-thought dark">Let her deal with it. You've got enough problems.</p>
The tip of her tongue slips out, touches the wet corner of her mouth and draws back in. Her face goes slack again.
<<set $flags.leftCNCEvidence to true>>
<<if setup.kiraKnockoutIsFirst()>>
<div class="choice-container">
<<vchoice "Continue" "Kira_Unconscious_FirstTime_Start" "action" "forward">>
</div>
<<else>>
<div class="choice-container">
<<vchoice "Continue" "Kira_Unconscious_Carry_Home" "action" "forward">>
</div>
<</if>><<endCombat>>
<<run VaultUI.setBackgroundDirect(setup.combatBackgroundImage())>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<<storyVideo "story/combat_kira_unconscious_cnc/combat_cnc_aftermath_cleanup">>
<<if _storyClip is "dae934767067">>Cum is still pooled on her mound, running down between her lips. Your hands shake as you clean her. You use water from your canteen, wiping away the evidence of what you did.<<else>>Your hands shake as you clean her. You use water from your canteen, wiping away the evidence of what you did.<</if>>
<<set $clothing.kira.top to 30>>
<<set $clothing.kira.bottom to 30>>
<<set $clothing.kira.titsExposed to false>>
<<set $clothing.kira.pussyExposed to false>>
<<run setup.fishingGame.endKiraForfeit()>>
You re-dress her, fingers clumsy with guilt.
Her mouth twitches at one corner as your cloth passes her lips. Then it's slack again.
<p class="internal-thought dark">What the fuck did you just do? She trusted you. She TRUSTED you.</p>
<<set $player.guilt to ($player.guilt || 0) + 50>>
Maybe she'll think it was just the enemy. She was unconscious—she can't know you were part of it.
<p class="dark-consequence">But every time you look at her from now on, you'll remember. You'll remember the way her throat felt. The way her body responded even as her mind was gone.</p>
<<set $flags.hidCNCFromKira to true>>
<<set $flags.guiltyAboutCNC to true>>
<<if setup.kiraKnockoutIsFirst()>>
<div class="choice-container">
<<vchoice "Continue" "Kira_Unconscious_FirstTime_Start" "action" "forward">>
</div>
<<else>>
<div class="choice-container">
<<vchoice "Continue" "Kira_Unconscious_Carry_Home" "action" "forward">>
</div>
<</if>><<endCombat>>
<<run VaultUI.setBackgroundDirect(setup.combatBackgroundImage())>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<<storyVideo "story/combat_kira_unconscious_cnc/combat_cnc_aftermath_cleanup">>
<<if _storyClip is "dae934767067">>You don't clean her. Cum glistens on her bare mound, trickling down between her lips. Let her see. Let her know.<<else>>You don't clean her. Let her see. Let her know.<</if>>
<p class="dark-consequence">Maybe a part of you wants her to know what she is to you now. Just a body to use when she can't fight back.</p>
Her lips curve. Barely. Then her face goes slack again.
<<set $flags.leftCNCEvidence to true>>
<<set $flags.wantsKiraToKnow to true>>
<<if setup.kiraKnockoutIsFirst()>>
<div class="choice-container">
<<vchoice "Continue" "Kira_Unconscious_FirstTime_Start" "action" "forward">>
</div>
<<else>>
<div class="choice-container">
<<vchoice "Continue" "Kira_Unconscious_Carry_Home" "action" "forward">>
</div>
<</if>><<if !setup.kiraKnockoutAllowed() && !setup.kiraAlreadyDown()>>
<<run setup.guardKira()>>
<<goto "Combat_Flee">>
<<else>>
<<kiraFleeCardFlow>>
<</if>><<countCombatVictory>>
<<if !setup.kiraKnockoutAllowed() && !setup.kiraAlreadyDown()>>
<<run setup.guardKira()>>
<<goto "Combat_Victory">>
<<else>>
<<kiraVictoryUnconsciousCardFlow>>
<</if>><<run VaultUI.setBackgroundDirect(setup.combatBackgroundImage())>>
<<run VaultUI.setTimeOfDay($time.phase)>>
You lift Kira carefully, cradling her against your chest. Her head lolls against your shoulder.
<<storyVideo "story/mv_kira_carry/start">>
She's lighter than you expected. Or maybe the adrenaline is still pumping.
<p class="internal-thought">The vault is... three turns of travel from here. Through raider territory. Carrying dead weight.</p>
You adjust your grip on her. Her body is warm and soft against yours—
<p class="internal-thought">Don't. Don't think about that. She's hurt.</p>
But the thought is already there. Her breasts pressing against your arm. Her thighs draped over your other arm. Completely vulnerable.
<<set $temp.carryKiraPhase to 1>>
<<set $temp.carryKiraLust to 0>>
<<set $temp.carryKiraGuilt to 0>>
<<set $temp.carryKiraChoice to "">>
<<set $temp.carryKiraFiddled to false>>
<div class="choice-container">
<<vchoice "Start walking. Focus on getting her home." "Carry_Kira_Phase1" "action" "run">>
<<if $player.lust gte 50>>
<<vchoice "Adjust your grip... let your hand wander" "Carry_Kira_Grope_Start" "intimate" "hand">>
<</if>>
</div><<run VaultUI.setBackgroundDirect(setup.combatBackgroundImage())>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<<advanceTime 0 20>>
<h3>Phase 1 of 3 - Ruined District</h3>
<<storyVideo "story/mv_kira_carry/phase1">>
<<if _storyClip is "f057a53d09c2">>You move through the crumbling buildings, Kira's unconscious form a constant weight in your arms. A blown-out window at the end of a brick corridor throws your shadow down the rubble ahead of you: one black shape, her legs hanging loose over your arm.<<else>>You move through the crumbling buildings, Kira's unconscious form a constant weight in your arms.<</if>>
Every few minutes, you check her breathing. Still steady. Still alive.
<<set _event to random(1, 100)>>
<<if _event lte 30>>
Voices ahead. Raiders.
You duck behind a collapsed wall, pressing Kira's body against yours to keep her still.
<<if $clothing.kira.titsExposed>>
Her bare breasts press against your chest. You feel her nipples through your shirt.
<<set $player.lust to Math.min(100, $player.lust + 10)>>
<<set $temp.carryKiraLust += 10>>
<p class="internal-thought">Fuck. Not now.</p>
<</if>>
The raiders pass without noticing you. You wait until their footsteps fade.
<<elseif _event lte 50>>
Kira makes a sound—a soft moan.
You freeze. Is she waking up?
<<say "Kira" "Mmmnnh...">>
No. She's still unconscious. Just... dreaming? Her face scrunches, then relaxes.
<<if $clothing.kira.pussyExposed>>
Her hips shift slightly in your arms. With her pussy exposed, you can see—
<p class="internal-thought">Don't look. Don't fucking look.</p>
You look.
<<set $player.lust to Math.min(100, $player.lust + 15)>>
<<set $temp.carryKiraLust += 15>>
<</if>>
<<elseif _event lte 70>>
Your foot catches on rubble. You stumble, nearly dropping her.
You catch yourself, but the motion presses her body hard against yours.
<<if $clothing.kira.titsExposed || $clothing.kira.pussyExposed>>
Her exposed skin slides against you. Soft. Warm. Vulnerable.
<<set $player.lust to Math.min(100, $player.lust + 8)>>
<<set $temp.carryKiraLust += 8>>
<</if>>
<<say $player.name "Shit...">>
<<else>>
The journey continues in tense silence. Just you, her unconscious weight, and the ruined world.
<</if>>
<<set $temp.carryKiraPhase to 2>>
<div class="choice-container">
<<vchoice "Keep moving" "Carry_Kira_Phase2" "action" "run">>
<<if $player.lust gte 60 && $temp.carryKiraLust gte 15>>
<<vchoice "Set her down for a moment... you need to 'rest'" "Carry_Kira_Rest_Temptation" "intimate" "high-arousal">>
<</if>>
</div><<run VaultUI.setBackgroundDirect(setup.combatBackgroundImage())>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<<advanceTime 0 20>>
<h3>Phase 2 of 3 - Industrial Ruins</h3>
<<storyVideo "story/mv_kira_carry/phase2">>
Your arms are burning. Kira isn't heavy, but carrying her for this long is exhausting.
You shift her weight, and her head rolls against your neck. You can feel her breath on your skin.
<<set _event to random(1, 100)>>
<<if _event lte 25>>
A figure emerges from the shadows. Another survivor—a grizzled man with wary eyes.
<<say "Survivor" "She dead?">>
<<say $player.name "Unconscious. Taking her home.">>
He looks at Kira's limp form. At her torn clothing. At you.
<<say "Survivor" "Sure you are.">>
The implication makes your blood boil—and simultaneously makes you feel guilty for every wandering thought you've had.
<<say $player.name "Fuck off.">>
He shrugs and disappears back into the ruins.
<<elseif _event lte 50>>
Kira's body starts to slide from your grip. You grab her tighter—
Your hand lands directly on her ass.
<<set $player.lust to Math.min(100, $player.lust + 12)>>
<<set $temp.carryKiraLust += 12>>
<p class="internal-thought">It's just to keep her from falling. That's all.</p>
You don't move your hand.
<<elseif _event lte 75>>
<<say "Kira" "No... don't...">>
She's talking in her sleep. Nightmare? Memory?
<<say "Kira" "Please...">>
Her body tenses in your arms, then relaxes. Whatever dream she's having, it doesn't seem pleasant.
<<set $temp.carryKiraGuilt += 10>>
<p class="internal-thought">I need to get her somewhere safe. That's what matters.</p>
<<else>>
The monotony of walking gives your mind too much freedom.
You think about Kira. Helpless. Trusting you completely even though she can't.
<<if $player.corruption gte 30>>
<p class="internal-thought">You could do anything to her right now. Anything. And she'd never know.</p>
<<set $player.lust to Math.min(100, $player.lust + 10)>>
<<set $temp.carryKiraLust += 10>>
<<else>>
<p class="internal-thought">She trusts you. Don't betray that.</p>
<<set $temp.carryKiraGuilt += 5>>
<</if>>
<</if>>
<<set $temp.carryKiraPhase to 3>>
<div class="choice-container">
<<vchoice "Almost there. Keep going." "Carry_Kira_Phase3" "action" "run">>
<<if $player.lust gte 70 && $temp.carryKiraLust gte 25>>
<<vchoice "You can't take it anymore. Set her down." "Carry_Kira_Abuse_Choice" "intimate" "corruption">>
<</if>>
</div><<run VaultUI.setBackgroundDirect(setup.combatBackgroundImage())>>
<<run VaultUI.setTimeOfDay("evening")>>
<<advanceTime 0 20>>
<<if $time.hour lt 18>><<setTime 18 0>><</if>>
<h3>Phase 3 of 3 - Vault Approach</h3>
<<storyVideo "story/mv_kira_carry/phase3">>
The vault entrance is in sight. You're almost there.
Kira hasn't stirred the entire journey. Her breathing is steady but she shows no signs of waking.
<<set _event to random(1, 100)>>
<<if _event lte 40>>
So close to safety. So close to having to explain what happened.
Right now, it's just you and her. No witnesses. No judgment.
<<if $temp.carryKiraLust gte 30>>
Your cock is rock hard and has been for the last hour. Carrying her like this, feeling her body...
<p class="internal-thought">Last chance. Once you're inside, it's over.</p>
<</if>>
<<else>>
Relief washes over you as the vault entrance comes into view.
<<if $temp.carryKiraGuilt gte 15>>
<p class="internal-thought">You did the right thing. You protected her.</p>
<<elseif $temp.carryKiraLust gte 20>>
<p class="internal-thought">You thought about it. But you didn't act. That counts for something.</p>
<</if>>
<</if>>
<div class="choice-container">
<<vchoice "Enter the vault" "Carry_Kira_Vault_Arrival" "action" "door-handle">>
<<if $player.lust gte 80 && $player.corruption gte 40 && $temp.carryKiraLust gte 35>>
<<vchoice "Wait. You're not done with her yet." "Carry_Kira_Final_Abuse" "intimate" "corruption">>
<</if>>
</div><<set $temp.carryKiraFiddled to true>>
<<set $temp.carryKiraChoice to "groped">>
<<addCorruption 3>>
<<set $temp.carryKiraLust += 20>>
<<storyVideo "story/combat_kira_carry_home/grope_start">>
<<if _storyClip is "a16030fec2a2">>You lay her down on her front for a moment to rest your arms, and tell yourself you're just checking her over.<<else>>You tell yourself it's just adjusting your grip.<</if>>
Your hand slides from her back down to her ass. You squeeze.
Soft. Firm. She doesn't react at all.
<<if $clothing.kira.pussyExposed>>
Your fingers brush against her exposed pussy. She's... not wet. Of course not. She's unconscious.
<p class="internal-thought">What am I doing?</p>
<<else>>
<<if _storyClip is "090f35ae6223">>Through the thin strip of cloth between her legs, you can feel the heat of her body.<<else>>Through her torn pants, you can feel the heat of her body.<</if>>
<</if>>
<<set $player.lust to Math.min(100, $player.lust + 15)>>
<p class="guilt">A part of you feels sick. Another part wants more.</p>
<div class="choice-container">
<<vchoice "Stop. This is wrong. Start walking." "Carry_Kira_Phase1" "action" "broken-heart">>
<<vchoice "Keep touching her while you walk" "Carry_Kira_Grope_Continue" "intimate" "hand">>
</div><<set $temp.carryKiraFiddled to true>>
<<addCorruption 5>>
<<set $temp.carryKiraLust += 15>>
<<set $player.lust to Math.min(100, $player.lust + 20)>>
<<storyVideo "story/combat_kira_carry_home/grope_continue">>
You walk and grope. Every step bounces her body in your arms, and you use that as an excuse to let your hands roam.
<<if _storyClip is "cbf1a627a458">>Her tits. Her ass. Her thighs. You drag her top down under one breast and squeeze it bare in your palm.<<else>>Her tits. Her ass. Her thighs.<</if>>
She's completely limp. Completely yours.
<<if $clothing.kira.titsExposed>>
You cup her bare breast, feel the weight of it. Pinch her nipple.
She doesn't even twitch.
<</if>>
<p class="internal-thought">She'll never know. No one will ever know.</p>
<<set $flags.gropedUnconsciousKira to true>>
<div class="choice-container">
<<vchoice "Enough. Get her home." "Carry_Kira_Phase1" "action" "run">>
</div><<run VaultUI.setBackgroundDirect(setup.combatBackgroundImage())>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<<set $temp.carryKiraChoice to "rested">>
<<storyVideo "story/combat_kira_carry_home/rest_temptation">>
<<if _storyClip is "06dc224b15dc">>You find a gutted room with an old mattress still in it and lay Kira down on her side. You need a moment.<<else>>You set Kira down in a sheltered alcove. You need a moment.<</if>>
Your cock is straining against your pants. Carrying her like that, feeling her body—it's too much.
You look at her. Unconscious. Helpless. Beautiful even covered in dirt and blood.
<<if $clothing.kira.titsExposed>>
<<if _storyClip is "0269d877d0c9">>Her tits rise and fall with each breath, barely held in by what's left of her top.<<else>>Her bare tits rise and fall with each breath.<</if>>
<</if>>
<<if $clothing.kira.pussyExposed>>
<<if _storyClip is "0269d877d0c9">>Her pussy is right there, only a thin strip of cloth over it. Defenseless.<<else>>Her pussy is right there. Exposed. Defenseless.<</if>>
<</if>>
<p class="internal-thought">You could jerk off. Right here. Just... get it out of your system.</p>
<div class="choice-container">
<<vchoice "No. Pick her up and keep moving." "Carry_Kira_Phase2" "action" "run">>
<<vchoice "Just jerk off. You won't touch her." "Carry_Kira_Jerkoff_Near" "intimate" "high-arousal">>
<<if $player.corruption gte 50>>
<<vchoice "Jerk off ON her." "Carry_Kira_Jerkoff_On" "intimate" "corruption">>
<</if>>
</div><<addCorruption 2>>
<<set $player.lust to 30>><<run setup.playerReleased()>>
<<set $temp.carryKiraLust to 0>>
<<storyVideo "story/combat_kira_carry_home/jerkoff_near__jerkoff_near">>
<<if _storyClip is "33087b697a62">>You kneel by her head and pull your cock out, stroking it inches from her slack, parted lips.<<else>>You pull your cock out, keeping your eyes on Kira's unconscious form.<</if>>
It doesn't take long. You're already so worked up from carrying her.
You cum hard, spilling onto the dusty ground. The release is intense, fueled by guilt and lust in equal measure.
<<say $player.name "Fuck...">>
You clean yourself up, tuck away, and pick Kira back up.
<p class="internal-thought">She'll never know. It's fine. It's fine.</p>
<div class="choice-container">
<<vchoice "Keep moving" "Carry_Kira_Phase2" "action" "run">>
</div><<set $temp.carryKiraFiddled to true>>
<<addCorruption 10>>
<<set $player.lust to 20>><<run setup.playerReleased()>>
<<set $flags.cumOnUnconsciousKira to true>>
<<storyVideo "story/combat_kira_carry_home/jerkoff_near__jerkoff_on">>
<<if _storyClip is "789a53b28b80">>You kneel over her, cock in hand, and rub the head over her bare nipple.<<else>>You stand over her, cock in hand.<</if>>
This is wrong. This is so fucking wrong.
You cum anyway. Hot ropes splash across her—
<<if $clothing.kira.titsExposed>>
—her bare tits, pooling between them.
<<elseif $clothing.kira.pussyExposed>>
<<if _storyClip is "789a53b28b80">>—her bare tit, pooling around the nipple.<<else>>—her exposed pussy, dripping down her thighs.<</if>>
<<else>>
<<if _storyClip is "789a53b28b80">>—the bare tit you dragged free of her top, soaking into the fabric bunched beneath it.<<else>>—her torn clothes, soaking into the fabric.<</if>>
<</if>>
<<if _storyClip is "5283581be80b">>She doesn't stir. Doesn't react. Just lies there, your cum across her cheek and her closed eyes.<<else>>She doesn't stir. Doesn't react. Just lies there, covered in your cum.<</if>>
<<say $player.name "...">>
You wipe her off as best you can with a rag. Evidence removed. Mostly.
<p class="guilt">What have you become?</p>
<div class="choice-container">
<<vchoice "Pick her up. Don't think about it." "Carry_Kira_Phase2" "action" "run">>
</div><<run VaultUI.setBackgroundDirect(setup.combatBackgroundImage())>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<<storyVideo "story/combat_kira_carry_home/abuse_choice">>
You can't take it anymore.
<<if _storyClip is "71699821acee">>You set Kira down carefully on her side at the foot of a crumbling wall. Your hand stays on her ass a moment too long. She doesn't stir.<<elseif _storyClip is "b8c21ed1da15">>You set Kira down carefully on her side on your spread bedroll, and pull the blanket off her. Her head lolls to one side.<<else>>You set Kira down carefully, propping her against a crumbling wall. Her head lolls to one side.<</if>>
Your hands are shaking. Not from exhaustion.
<<say $player.name "I'm sorry. I'm sorry, I just—">>
She can't hear you. She can't respond. She can't consent.
<p class="internal-thought">This would make you a monster.</p>
<p class="internal-thought">But fuck, you WANT her so badly right now.</p>
<div class="choice-container">
<<vchoice "No. You're not that person. Pick her up." "Carry_Kira_Phase3" "action" "broken-heart">>
<<vchoice "Touch her. Just touch." "Carry_Kira_Abuse_Touch" "intimate" "corruption">>
<<if $player.corruption gte 45 && $temp.carryKiraFiddled>>
<<vchoice "More than touch." "Carry_Kira_Abuse_More" "intimate" "corruption">>
<</if>>
</div><<addCorruption 8>>
<<set $flags.abusedUnconsciousKira to true>>
<<set $player.lust to Math.min(100, $player.lust + 20)>>
<<storyVideo "story/combat_kira_carry_home/abuse_touch__abuse_touch">>
Your hands move over her body. No pretense now. Pure groping.
<<if _storyClip is "3cc40265bec5">>You squeeze her tits, pinch her nipples. Pull the strip of her underwear aside and run your fingers along her slit.<<else>>You squeeze her tits, pinch her nipples. Spread her thighs and run your fingers along her slit.<</if>>
She's not wet—unconscious women don't get wet—but her body is warm and soft and YOURS right now.
<<say $player.name "Fuck... Kira...">>
You finger her anyway. Two fingers, pumping slowly while you jerk yourself with your other hand.
You cum on her stomach, gasping.
After, the guilt hits like a sledgehammer.
<p class="guilt">She trusted you.</p>
You clean her up. Pick her up. Don't meet her closed eyes.
<<set $player.lust to 20>><<run setup.playerReleased()>>
<div class="choice-container">
<<vchoice "Get her to the vault. Now." "Carry_Kira_Phase3" "action" "run">>
</div><<addCorruption 20>>
<<set $flags.rapedUnconsciousKira to true>>
<<set $player.dominance += 10>>
<<storyVideo "story/combat_kira_carry_home/abuse_touch__abuse_more">>
You cross the line.
<<if _storyClip is "ce33dbf7e4ba">>You pull her pants down—or what's left of them—roll her onto her front, hook the strip of cloth underneath aside, and push her limp thighs apart from behind.<<elseif _storyClip is "40fff703df44">>You pull her pants down—or what's left of them—roll her onto her front and push her limp thighs apart from behind.<<else>>You pull her pants down—or what's left of them—and position yourself between her limp thighs.<</if>>
<p class="internal-thought">Last chance to stop.</p>
You don't stop.
You push inside her. She's not wet, so it's tight, almost painful for both of you. But you don't care anymore.
You fuck her unconscious body there in the ruins, grunting and thrusting while she lies limp beneath you.
She makes no sound. No movement. Just takes it.
You cum inside her. Deep.
<<say $player.name "...">>
Silence. Just your heavy breathing.
You pull out. Clean up as best you can. Pull her clothes back into place.
Pick her up. Keep walking.
<p class="guilt">You're a monster now. There's no taking this back.</p>
<<set $player.lust to 10>><<run setup.playerReleased()>>
<<set $companions[0].submission += 0>>
<<set $flags.darkestChoice to true>>
<div class="choice-container">
<<vchoice "Get to the vault. Pretend nothing happened." "Carry_Kira_Phase3" "action" "run">>
</div><<run VaultUI.setBackgroundDirect(setup.combatBackgroundImage())>>
<<run VaultUI.setTimeOfDay("evening")>>
<<addCorruption 5>>
<<storyVideo "story/combat_kira_carry_home/final_abuse">>
So close to safety. But you're not ready to give up this... opportunity.
<<if _storyClip is "20e1a73766fa">>You set her down on her side just outside the vault entrance, in a shadowed alcove where no one can see. Your hand is between her thighs before you've decided anything.<<else>>You set her down just outside the vault entrance, in a shadowed alcove where no one can see.<</if>>
<<say $player.name "Just... just once more.">>
She lies there. Silent. Unresisting.
<p class="internal-thought">This is your last chance before she's surrounded by others. Before she might wake up.</p>
<div class="choice-container">
<<vchoice "Touch her one last time" "Carry_Kira_Final_Touch" "intimate" "corruption">>
<<vchoice "No. Get her inside. This ends now." "Carry_Kira_Vault_Arrival" "action" "door-handle">>
</div><<addCorruption 5>>
<<set $flags.finalAbuse to true>>
You run your hands over her one last time. Memorizing her body.
Then you pick her up and carry her into the vault.
<p class="internal-thought">What happened out there... it stays out there.</p>
<div class="choice-container">
<<vchoice "Continue" "Carry_Kira_Vault_Arrival" "action" "forward">>
</div><<abandonJourney>>
<<set $currentLocation to "vault">>
<<settleExposure "home">>
<<run VaultUI.setBackground("commons")>>
<<run VaultUI.setTimeOfDay("evening")>>
The vault door seals behind you. Safety.
You're exhausted, covered in dirt and sweat, carrying Kira's unconscious body.
<<run VaultUI.showCharacter("groundskeeper", "left", "concerned")>>
The Groundskeeper emerges from the shadows immediately, his ancient face creased with concern.
<<say "Groundskeeper" "What happened? Bring her here, quickly.">>
He guides you to a bench where you lay Kira down. He checks her pulse, her pupils, listens to her breathing.
<<say "Groundskeeper" "She's not just unconscious. She's in a coma-like state.">>
<<say $player.name "What? How is that possible? She took a hit but—">>
<<say "Groundskeeper" "The vault... it protects its inhabitants in strange ways. And punishes those who threaten them.">>
He looks at Kira with something like sadness.
<<say "Groundskeeper" "Whatever hurt her triggered a defensive response. Her body has shut down to heal. But she won't wake naturally.">>
<<say $player.name "What do I do?">>
<<say "Groundskeeper" "Take her to her room. Keep her comfortable. I'll research what I can.">>
He pauses, looking at you intently.
<<say "Groundskeeper" "The answer may come to you in dreams. The vault speaks to its chosen.">>
<div class="choice-container">
<<vchoice "Carry Kira to her room" "Kira_Room_Unconscious_Setup" "action" "door-handle">>
</div><<run VaultUI.setBackground("quarters")>>
<<run VaultUI.setTimeOfDay("evening")>>
<<set $flags.kiraInComa to true>>
<<set $flags.kiraRoomRecoveryMode to true>>
You carry Kira to her room and lay her gently on her bed.
She looks peaceful. Like she's just sleeping.
<<run VaultUI.showCharacter("kira", "center", "unconscious")>>
You pull the blanket up over her, then stop.
<<if $flags.abusedUnconsciousKira || $flags.gropedUnconsciousKira>>
<p class="guilt">After what you did... you have no right to be gentle with her now.</p>
<<else>>
<p class="internal-thought">She looks so vulnerable. You protected her. Got her home safe.</p>
<</if>>
You sit in the chair by her bed, watching her breathe.
Eventually, exhaustion takes you.
<div class="choice-container">
<<vchoice "Fall asleep" "Kira_Unconscious_Dream_Velith" "action" "night">>
</div><<run VaultUI.setBackground("prelude/dream-void")>>
<<run VaultUI.setTimeOfDay("supernatural")>>
<<run document.body.classList.add("scene-mode-supernatural")>>
<<advanceToHour 3>>
<h2>Dream</h2>
Purple light. The familiar sensation of Velith's presence.
<<run VaultUI.showCharacter("velith", "center", "seductive")>>
<<say "Velith" "My sweet vessel... you seem troubled.">>
<<storyVideo "story/mv_kira_coma/dream_velith">>
<<if _storyClip is "8133b73eb70a">>She materializes from the darkness, all curves and hunger. Tonight she comes in a pale borrowed body: white-blonde hair, black paint running down her face and over her breasts, horns curling back out of her hair.<<else>>She materializes from the darkness, all curves and hunger.<</if>>
<<say $player.name "Kira. She's in a coma. The Groundskeeper said she won't wake naturally.">>
<<say "Velith" "Ahh, yes. The vault's protection. It shields those who dwell within... but the shield can become a prison.">>
<<if _storyClip is "8133b73eb70a">>She circles you, trailing one painted fingertip along your shoulder.<<else>>She circles you, trailing a gloved fingertip along your shoulder.<</if>>
<<say "Velith" "There is a way to wake her. A potion. Ancient. Powerful.">>
<<say $player.name "Tell me.">>
<<say "Velith" "Deep within this vault lies an alchemy laboratory. Hidden for centuries. Within it... someone who knows the old recipes.">>
<<say $player.name "Someone? Who?">>
<<if _storyClip is "8133b73eb70a">>Velith smiles, all white teeth.<<else>>Velith smiles, her fangs gleaming.<</if>>
<<say "Velith" "That would spoil the surprise. But I will tell you this...">>
She leans close, her lips brushing your ear.
<<say "Velith" "The path to the laboratory lies through the Archives. Search carefully. Look for what doesn't belong.">>
<<say $player.name "That's not much to go on.">>
<<say "Velith" "Where would be the fun in making it easy?">>
She pulls back, her form starting to fade.
<<say "Velith" "Wake now, my vessel. Your companion needs you.">>
<<if $flags.abusedUnconsciousKira>>
She pauses, her smile widening.
<<say "Velith" "Oh, and... I saw what you did to her. On the way home.">>
Your blood runs cold.
<<say "Velith" "I approve.">>
She fades, laughing.
<<else>>
She fades into darkness.
<</if>>
<<run document.body.classList.remove("scene-mode-supernatural")>>
<div class="choice-container">
<<vchoice "Wake up" "Kira_Unconscious_Morning_After" "action" "sun">>
</div><<run VaultUI.setBackground("quarters")>>
<<run VaultUI.setTimeOfDay("morning")>>
<<advanceToHour 7>>
<<sleepHeal>>
You wake with a start, the dream still vivid in your mind.
Kira hasn't moved. Still breathing. Still lost.
<<say $player.name "The Archives. I need to search the Archives.">>
You leave Kira's room and head to find the Groundskeeper.
<<run VaultUI.showCharacter("groundskeeper", "left", "thoughtful")>>
<<say $player.name "I had a dream. About an alchemy laboratory hidden in the vault.">>
The Groundskeeper's eyes widen slightly.
<<say "Groundskeeper" "You dreamed of the laboratory? Interesting...">>
<<say $player.name "Do you know about it?">>
<<say "Groundskeeper" "I know... legends. Stories passed down. The vault was built on older foundations. Much older.">>
He strokes his beard.
<<say "Groundskeeper" "The Archives. Yes. There were always rumors of a hidden passage. Behind the books, they said. I never found it.">>
<<say $player.name "I need to search.">>
<<say "Groundskeeper" "Be thorough. The old builders were clever with their secrets.">>
<<set $flags.archivesSearchUnlocked to true>>
<<set $flags.groundskeeperMentionedLab to true>>
<<set $flags.kiraUnconsciousTriggered to true>>
<p class="notification">New option unlocked: Search Archives</p>
<div class="choice-container">
<<vchoice "Go to the Archives" "Archives_Search_Start" "action" "book">>
<<vchoice "Check on Kira first" "Kira_Room_Coma_Visit" "action" "door-handle">>
</div><<attemptStandUp "player">>
<<if $combat.positions && $combat.positions.player === "standing">>
<<playerMediaTarget>>
<<combatActionVideo "player-stand-up-video" "combat/player_stand_up" _playerMediaTarget>>
<</if>>
<div class="choice-container">
<<vchoice "Continue" "Combat_Actions" "move" "map">>
</div><<silently>><<include "DominationNarratives">><</silently>>
<<executeVerbalDegrade setup.dominationConfigs.verbal_degrade>><<initCombatTarget>>
<<if _target.humiliationState !== "broken">>
<<set $combat.actionNotice to "She's not broken enough to capture without defeating her!">>
<<goto "Combat_Actions">>
<<else>>
<div class="combat-victory capture-victory">
<h2><<icon "lock" "medium">> CAPTURED</h2>
<<combatActionVideo "capture-video" "combat/capture" _target>>
<p class="explicit">She's completely broken. No fight left. She looks up at you with hollow, accepting eyes.</p>
<p class="explicit">Without needing to beat her into unconsciousness, you've claimed total victory through sheer domination.</p>
<<if _target.clothing && _target.clothing.pussyExposed>>
<p class="explicit">"I... I'll do anything," she whispers, legs still spread where you left them. "Just... don't hurt me anymore."</p>
<<elseif _target.clothing && _target.clothing.titsExposed>>
<p class="explicit">She makes no move to cover her exposed breasts. She's past caring. She's yours.</p>
<<else>>
<p class="explicit">"Please..." she whimpers. The single word holds complete surrender.</p>
<</if>>
<<run setup.defeatEnemyAt(_targetIndex)>>
<<set $player.dominance to ($player.dominance || 0) + 5>>
<<if !$combat.capturedEnemies>>
<<set $combat.capturedEnemies to []>>
<</if>>
<<run $combat.capturedEnemies.push(clone(_target))>>
<<if _target.gender === "female">><<run setup.countWomanClaimed()>><</if>>
<<if $combat.log>>
<<set _captureLog to _target.name + " #" + (_targetIndex + 1) + " captured through total humiliation!">>
<<logCombat _captureLog "critical">>
<</if>>
<<if $combat.enemies.length === 0>>
<div class="combat-complete">
<p>All enemies defeated!</p>
</div>
<<else>>
<p class="remaining-enemies"><<print $combat.enemies.length>> enemies remaining...</p>
<<set $combat.currentTarget to 0>>
<<if $combat.combo>><<set $combat.combo.target to -1>><</if>>
<</if>>
</div>
<div class="choice-container">
<<if $combat.enemies.length gt 0>>
<<vchoice "Continue Fight" "Combat_Actions" "action" "attack">>
<<else>>
<<vchoice "Victory!" "Combat_Victory" "action" "muscle">>
<</if>>
</div>
<</if>><<useHerSceneCardFlow>><<chokeFuckCardFlow>><<usedThroatCardFlow>><<usedOralCardFlow>><<usedFuckCardFlow>><<usedFuckStartCardFlow>><<usedAnalCardFlow>><<usedMissionaryCardFlow>><<usedDoggyCardFlow>><<usedFacefuckCardFlow>><<if !$combat.enemies[$combat.currentTarget || 0] || $combat.enemies[$combat.currentTarget || 0].gender !== "female">><<goto "Combat_Actions">><<else>>
<<executeAllowOrgasm setup.orgasmControlConfigs.allow_orgasm>>
<</if>><<if !$combat.enemies[$combat.currentTarget || 0] || $combat.enemies[$combat.currentTarget || 0].gender !== "female">><<goto "Combat_Actions">><<else>>
<<initCombatTarget>>
<<clampStat "player.energy" -3 0 $player.maxEnergy>>
<div class="combat-action arousal-action">
<<applyDenial _targetIndex>>
</div>
<<if !$combat.combo>><<set $combat.combo to {count: 0, lastAction: "", target: -1, bonus: 0}>><</if>>
<<if $combat.combo.target !== _targetIndex>>
<<set $combat.combo.count to 0>>
<<set $combat.combo.target to _targetIndex>>
<</if>>
<div class="choice-container">
<<vchoice "Continue" "Combat_Companion_Turn" "move" "map">>
</div>
<</if>><<if !$combat.enemies[$combat.currentTarget || 0] || $combat.enemies[$combat.currentTarget || 0].gender !== "female">><<goto "Combat_Actions">><<else>>
<<initCombatTarget>>
<<if _target.lust < 95>>
<<set $combat.actionNotice to "She's not aroused enough to force an orgasm yet. Build her lust higher first.">>
<<goto "Combat_Actions">>
<<else>>
<<clampStat "player.energy" -6 0 $player.maxEnergy>>
<div class="combat-action arousal-action">
<<applyForceOrgasm _targetIndex>>
</div>
<<if !$combat.combo>><<set $combat.combo to {count: 0, lastAction: "", target: -1, bonus: 0}>><</if>>
<<set $combat.combo.count to 0>>
<<set $combat.combo.target to -1>>
<<set $combat.combo.lastAction to "force_orgasm">>
<<if _target.humiliationState === "broken">>
<div class="victory-available">
<<icon "cage" "small">> She's completely broken! She can't fight back. Use her.
</div>
<</if>>
<div class="choice-container">
<<vchoice "Continue" "Combat_Companion_Turn" "move" "map">>
</div>
<</if>>
<</if>><<initCombatTarget>>
<<canWorsenPosition _targetIndex>>
<<if !_canWorsen>>
<<if _target.position === "pinned">>
<<set $combat.actionNotice to "They're already fully pinned. You can't worsen their position further.">>
<<else>>
<<set $combat.actionNotice to "You can't worsen their position right now.">>
<</if>>
<<goto "Combat_Actions">>
<<else>>
<<clampStat "player.energy" -4 0 $player.maxEnergy>>
<div class="combat-action position-action">
<<applyWorsenPosition _targetIndex>>
<<combatActionVideo "worsen-position-video" `"combat/worsen_position_" + (_target.position || "standing")` _target>>
</div>
<<getPositionDamageMultipliers _targetIndex>>
<<if _posLustMult gt 1.0 || _posDmgMult gt 1.0>>
<div class="position-info">
New vulnerability:
<<if _posDmgMult gt 1.0>>
<span class="multiplier"><<print "+" + Math.round((_posDmgMult - 1) * 100)>>% physical</span>
<</if>>
<<if _posLustMult gt 1.0>>
<span class="multiplier high"><<print "+" + Math.round((_posLustMult - 1) * 100)>>% lust</span>
<</if>>
</div>
<</if>>
<<if !$combat.combo>><<set $combat.combo to {count: 0, lastAction: "", target: -1, bonus: 0}>><</if>>
<<set $combat.combo.count += 1>>
<<set $combat.combo.target to _targetIndex>>
<<set $combat.combo.lastAction to "worsen_position">>
<div class="choice-container">
<<vchoice "Continue" "Combat_Companion_Turn" "move" "map">>
</div>
<</if>><<initCombatTarget>>
<<canHoldPosition _targetIndex>>
<<if !_canHold>>
<<set $combat.actionNotice to "They're standing—there's no position to hold them in.">>
<<goto "Combat_Actions">>
<<else>>
<<clampStat "player.energy" -2 0 $player.maxEnergy>>
<div class="combat-action position-action">
<<applyHoldPosition _targetIndex>>
<<combatActionVideo "hold-position-video" "combat/hold_position" _target>>
</div>
<<getPositionDamageMultipliers _targetIndex>>
<<set _escapeChance to Math.max(5, 40 - _posEscapeDiff - (_target.positionHeldTurns * 10))>>
<div class="position-info">
Escape chance reduced to <<print _escapeChance>>%
</div>
<<if !$combat.combo>><<set $combat.combo to {count: 0, lastAction: "", target: -1, bonus: 0}>><</if>>
<<set $combat.combo.count += 1>>
<<set $combat.combo.target to _targetIndex>>
<<set $combat.combo.lastAction to "hold_position">>
<div class="choice-container">
<<vchoice "Continue" "Combat_Companion_Turn" "move" "map">>
</div>
<</if>><<silently>>
<<include "BasicAttackNarratives">>
<<initBasicAttackConfigs>>
<</silently>>
<<playerAttackCardFlow setup.basicAttackConfigs.light_strike>><<silently>>
<<include "BasicAttackNarratives">>
<<initBasicAttackConfigs>>
<</silently>>
<<playerAttackCardFlow setup.basicAttackConfigs.heavy_strike>><<silently>>
<<include "DefensiveActionNarratives">>
<<initDefensiveActionConfigs>>
<</silently>>
<<playerDefenseCardFlow setup.defensiveActionConfigs.block>><<silently>>
<<include "DefensiveActionNarratives">>
<<initDefensiveActionConfigs>>
<</silently>>
<<playerDefenseCardFlow setup.defensiveActionConfigs.parry>><<silently>>
<<include "DefensiveActionNarratives">>
<<initDefensiveActionConfigs>>
<</silently>>
<<playerDefenseCardFlow setup.defensiveActionConfigs.riposte>><<silently>>
<<include "DefensiveActionNarratives">>
<<initDefensiveActionConfigs>>
<</silently>>
<<playerDefenseCardFlow setup.defensiveActionConfigs.dodge>><<playerRestCardFlow>><<silently>><<include "BasicAttackNarratives">><</silently>>
<<canFinisher>>
<<if !_canFinisher>>
<<set $combat.actionNotice to "Can't use Finisher! (Need 3+ combo and 8 energy)">>
<<goto "Combat_Actions">>
<<else>>
<<set _attackConfig to {
name: "FINISHER",
icon: "damage-boost",
attackType: "finisher",
energyCost: 8,
damageMultiplier: 2.0,
damageVariance: [-2, 5],
useWeaponBonus: true,
accuracyModifier: 0,
autoHit: true,
narrativeKey: "finisher_hit",
videoFolder: "combat/finisher",
narrativeFallback: "You channel your momentum into a devastating finishing blow!",
missNarrativeKey: null,
missFallback: null,
clothingDamage: {
chance: 60,
amount: [25, 45],
targetSlot: "random",
critBonus: false
},
knockdownChance: 50,
consumeCombo: true,
playerVulnerable: false,
critThreshold: 0,
hitLogKey: "finisher_hit_log",
hitLogFallback: "FINISHER! {damage} damage!",
missLogKey: null,
missLogFallback: null,
killLogKey: "finisher_kill_log",
killLogFallback: "{enemy} OBLITERATED!",
killNarrativeKey: "finisher_kill",
killNarrativeFallback: "Your finisher OBLITERATES {enemy}!"
}>>
<<playerAttackCardFlow _attackConfig>>
<</if>><<silently>><<include "BasicAttackNarratives">><</silently>>
<<playerAttackCardFlow setup.basicAttackConfigs.slash_upper>><<silently>><<include "BasicAttackNarratives">><</silently>>
<<playerAttackCardFlow setup.basicAttackConfigs.slash_lower>><<silently>><<include "BasicAttackNarratives">><</silently>>
<<playerAttackCardFlow setup.basicAttackConfigs.brutal_stab>><<silently>><<initStripAttackConfigs>><</silently>>
<<playerClothingAttackCardFlow setup.stripAttackConfigs.rip_top>><<silently>><<initStripAttackConfigs>><</silently>>
<<playerClothingAttackCardFlow setup.stripAttackConfigs.tear_bottom>><<playerExposeDickCardFlow>><<playerFlauntCardFlow>><<playerBreakWillCardFlow>><<silently>><<include "PainPleasureNarratives">><</silently>>
<<playerPainPleasureCardFlow setup.painPleasureConfigs.slap_grope_tits>><<silently>><<include "PainPleasureNarratives">><</silently>>
<<playerPainPleasureCardFlow setup.painPleasureConfigs.slap_grope_ass>><<silently>><<include "PainPleasureNarratives">><</silently>>
<<playerPainPleasureCardFlow setup.painPleasureConfigs.pinch_tease_nipples>><<silently>><<include "PainPleasureNarratives">><</silently>>
<<playerPainPleasureCardFlow setup.painPleasureConfigs.pinch_tease_clit>><<silently>><<include "PainPleasureNarratives">><</silently>>
<<playerPainPleasureCardFlow setup.painPleasureConfigs.bite_lick_neck>><<silently>><<include "PainPleasureNarratives">><</silently>>
<<playerPainPleasureCardFlow setup.painPleasureConfigs.bite_lick_nipples>><<silently>><<include "PainPleasureNarratives">><</silently>>
<<playerPainPleasureCardFlow setup.painPleasureConfigs.bite_lick_thighs>><<silently>><<include "PainPleasureNarratives">><</silently>>
<<playerPainPleasureCardFlow setup.painPleasureConfigs.spank_finger>><<silently>><<include "PainPleasureNarratives">><</silently>>
<<playerPainPleasureCardFlow setup.painPleasureConfigs.hair_pull_grind>><<playerForceBegCardFlow>><<silently>><<include "PainPleasureNarratives">><</silently>>
<<playerPainPleasureCardFlow setup.painPleasureConfigs.choke_fuck>><<silently>><<include "ExploitationNarratives">><</silently>>
<<set _exploitConfig to {
name: "Slap Tits",
actionType: "slap",
bodyPart: "tits",
lustDamageRange: [15, 25],
painDamageRange: null,
playerLustGain: 5,
usePositionMultiplier: true,
hasResistanceCheck: false,
resistanceDifficulty: 0,
humiliationType: "slap",
stunChance: 30,
weltChance: 40,
secondaryEffect: null,
increaseMasochism: 0,
narrativeKey: "slap_tits",
videoFolder: "combat/slap_tits",
hitFallback: "You slap her exposed tit HARD! The flesh jiggles from the impact!"
}>>
<<playerSeductionCardFlow _exploitConfig>><<silently>><<include "ExploitationNarratives">><</silently>>
<<initCombatTarget>>
<<set _targetClothing to _target.clothing || {}>>
<<set _assExposed to (_targetClothing.pussyExposed || _targetClothing.assExposed)>>
<<set _lustRange to _assExposed ? [15, 25] : [8, 15]>>
<<set _exploitConfig to {
name: "Slap Ass",
actionType: "slap",
bodyPart: "ass",
lustDamageRange: _lustRange,
painDamageRange: null,
playerLustGain: 3,
usePositionMultiplier: false,
hasResistanceCheck: false,
resistanceDifficulty: 0,
humiliationType: "slap",
stunChance: 0,
weltChance: _assExposed ? 50 : 0,
secondaryEffect: null,
increaseMasochism: 0,
narrativeKey: "slap_ass",
videoFolder: "combat/slap_ass",
hitFallback: _assExposed ? "You bring your hand down on her bare ass with a loud SMACK! Her flesh jiggles from the impact!" : "You slap her ass through her clothes— the impact still makes her yelp!"
}>>
<<playerSeductionCardFlow _exploitConfig>><<silently>><<include "ExploitationNarratives">><</silently>>
<<set _exploitConfig to {
name: "Grope Tits",
actionType: "grope",
bodyPart: "tits",
lustDamageRange: [25, 35],
painDamageRange: null,
playerLustGain: 10,
usePositionMultiplier: true,
hasResistanceCheck: true,
resistanceDifficulty: 2,
humiliationType: "grope",
stunChance: 0,
weltChance: 0,
secondaryEffect: {chance: 40, lustBonus: 8, narrative: "grope_tits_nipple_pinch", fallback: "You pinch her nipples, rolling them between thumb and finger!"},
increaseMasochism: 0,
narrativeKey: "grope_tits",
videoFolder: "combat/grope_tits",
hitFallback: "You grab both her tits and SQUEEZE! Soft flesh spills between your fingers!",
resistFallback: "She slaps your hands away before you can grab her!"
}>>
<<playerSeductionCardFlow _exploitConfig>><<silently>><<include "ExploitationNarratives">><</silently>>
<<set _exploitConfig to {
name: "Grope Pussy",
actionType: "grope",
bodyPart: "pussy",
lustDamageRange: [30, 45],
painDamageRange: null,
playerLustGain: 15,
usePositionMultiplier: true,
hasResistanceCheck: true,
resistanceDifficulty: 3,
humiliationType: "grope_pussy",
stunChance: 0,
weltChance: 0,
secondaryEffect: {chance: 50, lustBonus: 10, narrative: "grope_pussy_finger", playerLustBonus: 5, fallback: "You slide a finger inside— she clenches around you involuntarily!"},
increaseMasochism: 0,
narrativeKey: "grope_pussy",
videoFolder: "combat/grope_pussy",
hitFallback: "You reach between her legs and cup her bare pussy! She's already wet!",
resistFallback: "She twists away, blocking your groping hand!"
}>>
<<playerSeductionCardFlow _exploitConfig>><<silently>><<include "ExploitationNarratives">><</silently>>
<<set _exploitConfig to {
name: "Twist Nipples",
actionType: "twist",
bodyPart: "nipples",
lustDamageRange: [20, 30],
painDamageRange: [3, 6],
playerLustGain: 8,
usePositionMultiplier: false,
hasResistanceCheck: false,
resistanceDifficulty: 0,
humiliationType: null,
stunChance: 0,
weltChance: 0,
secondaryEffect: null,
increaseMasochism: 0,
narrativeKey: "twist_nipples",
videoFolder: "combat/twist_nipples",
hitFallback: "You grab her nipples and TWIST! She screams— pain and pleasure mixing!"
}>>
<<playerSeductionCardFlow _exploitConfig>><<silently>><<include "ExploitationNarratives">><</silently>>
<<set _exploitConfig to {
name: "Suck Tits",
actionType: "suck",
bodyPart: "tits",
lustDamageRange: [35, 50],
painDamageRange: null,
playerLustGain: 15,
usePositionMultiplier: false,
hasResistanceCheck: false,
resistanceDifficulty: 0,
humiliationType: "oral",
stunChance: 0,
weltChance: 0,
secondaryEffect: {chance: 40, lustBonus: 10, narrative: "You bite down gently— she cries out, legs trembling!"},
increaseMasochism: 0,
narrativeKey: "suck_tits",
videoFolder: "combat/suck_tits",
hitFallback: "You take her nipple in your mouth and SUCK! She gasps, back arching!"
}>>
<<playerSeductionCardFlow _exploitConfig>><<silently>><<include "ExploitationNarratives">><</silently>>
<<set _exploitConfig to {
name: "Spread Cheeks",
actionType: "spread",
bodyPart: "ass",
lustDamageRange: [25, 40],
painDamageRange: null,
playerLustGain: 12,
usePositionMultiplier: false,
hasResistanceCheck: false,
resistanceDifficulty: 0,
humiliationType: "spread",
stunChance: 0,
weltChance: 0,
secondaryEffect: null,
increaseMasochism: 0,
narrativeKey: "spread_cheeks",
videoFolder: "combat/spread_cheeks",
hitFallback: "You grab her ass cheeks and SPREAD them wide! Everything is on display!",
positionBonus: {
positions: ["bent_over", "prone_front"],
lustBonus: 10,
narrative: "Holes completely exposed!"
}
}>>
<<playerSeductionCardFlow _exploitConfig>><<silently>><<include "ExploitationNarratives">><</silently>>
<<set _exploitConfig to {
name: "Slap Pussy",
actionType: "slap",
bodyPart: "pussy",
lustDamageRange: [20, 35],
painDamageRange: [2, 5],
playerLustGain: 10,
usePositionMultiplier: false,
hasResistanceCheck: false,
resistanceDifficulty: 0,
humiliationType: "slap",
stunChance: 30,
weltChance: 100,
secondaryEffect: null,
increaseMasochism: 3,
narrativeKey: "slap_pussy",
videoFolder: "combat/slap_pussy",
hitFallback: "SLAP! Your hand connects with her bare pussy! She SCREAMS!"
}>>
<<playerSeductionCardFlow _exploitConfig>><<silently>><<include "ExploitationNarratives">><</silently>>
<<set _exploitConfig to {
name: "Finger Pussy",
actionType: "finger",
bodyPart: "pussy",
lustDamageRange: [40, 55],
painDamageRange: null,
playerLustGain: 18,
usePositionMultiplier: false,
hasResistanceCheck: true,
resistanceDifficulty: 4,
humiliationType: "finger",
stunChance: 0,
weltChance: 0,
secondaryEffect: {chance: 50, lustBonus: 15, narrative: "You curl your fingers, finding her g-spot— she WAILS!"},
increaseMasochism: 0,
narrativeKey: "finger_pussy",
videoFolder: "combat/finger_pussy",
hitFallback: "You thrust two fingers deep inside her! She's soaking wet, walls clenching around you!",
resistFallback: "She twists away before you can reach her!"
}>>
<<playerSeductionCardFlow _exploitConfig>><<silently>><<include "ExploitationNarratives">><</silently>>
<<set _exploitConfig to {
name: "Eat Pussy",
actionType: "eat",
bodyPart: "pussy",
lustDamageRange: [50, 70],
painDamageRange: null,
playerLustGain: 25,
usePositionMultiplier: false,
hasResistanceCheck: true,
resistanceDifficulty: 5,
humiliationType: "oral",
stunChance: 0,
weltChance: 0,
secondaryEffect: {chance: 60, lustBonus: 15, narrative: "You thrust your tongue inside, tasting her arousal— she's absolutely flooding!"},
increaseMasochism: 0,
narrativeKey: "eat_pussy",
videoFolder: "combat/eat_pussy",
hitFallback: "You bury your face between her legs, tongue lashing her clit! She SCREAMS in pleasure!",
resistFallback: "She clamps her thighs together, denying you access!"
}>>
<<playerSeductionCardFlow _exploitConfig>><<silently>><<include "PinnedActionNarratives">><</silently>>
<<playerPinnedCardFlow setup.pinnedConfigs.grind>><<silently>><<include "PinnedActionNarratives">><</silently>>
<<playerPinnedCardFlow setup.pinnedConfigs.choke>><<silently>><<initStripAttackConfigs>><</silently>>
<<playerClothingAttackCardFlow setup.stripAttackConfigs.rip_top_pinned>><<silently>><<initStripAttackConfigs>><</silently>>
<<playerClothingAttackCardFlow setup.stripAttackConfigs.tear_bottom_pinned>><<silently>><<include "PinnedActionNarratives">><</silently>>
<<playerPinnedCardFlow setup.pinnedConfigs.abuse_tits>><<silently>><<include "PinnedActionNarratives">><</silently>>
<<playerPinnedCardFlow setup.pinnedConfigs.finger>><<silently>><<include "PinnedActionNarratives">><</silently>>
<<playerPinnedCardFlow setup.pinnedConfigs.dick_out>><<silently>><<include "PinnedActionNarratives">><</silently>>
<<playerPinnedCardFlow setup.pinnedConfigs.deepthroat>><<silently>><<include "PinnedActionNarratives">><</silently>>
<<playerPinnedCardFlow setup.pinnedConfigs.fuck>><<silently>><<include "TakedownNarratives">><</silently>>
<<set _takedownConfig to {
name: "Force to Knees",
targetPosition: "kneeling",
baseChance: 60,
strengthBonus: true,
dominanceBonus: true,
lustBonus: {threshold: 70, amount: 15},
healthBonus: {threshold: 0.5, amount: 10},
positionBonus: {},
enemyLustGain: 8,
playerLustGain: 5,
dominanceGain: 1,
setEnemyPinned: false,
successNarrativeKey: "takedown_kneel",
videoFolder: "combat/force_to_knees",
successIcon: "leg-sweep",
successMessage: "success_kneel",
hitFallback: "You sweep her legs and SHOVE— she crashes to her knees before you!",
resistFallback: "She twists out of your grip— still on her feet!"
}>>
<<playerTakedownCardFlow _takedownConfig>><<silently>><<include "TakedownNarratives">><</silently>>
<<set _takedownConfig to {
name: "Tackle to Back",
targetPosition: "prone_back",
baseChance: 55,
strengthBonus: true,
dominanceBonus: true,
lustBonus: {threshold: 70, amount: 15},
healthBonus: {threshold: 0.5, amount: 10},
positionBonus: {},
enemyLustGain: 12,
playerLustGain: 8,
dominanceGain: 2,
setEnemyPinned: false,
successNarrativeKey: "takedown_back",
videoFolder: "combat/tackle_to_back",
successIcon: "knockdown",
successMessage: "success_back",
hitFallback: "You tackle her hard— she slams onto her back with you on top!",
resistFallback: "She slips away before you can take her down!"
}>>
<<playerTakedownCardFlow _takedownConfig>><<silently>><<include "TakedownNarratives">><</silently>>
<<set _takedownConfig to {
name: "Shove Face Down",
targetPosition: "prone_front",
baseChance: 55,
strengthBonus: true,
dominanceBonus: true,
lustBonus: {threshold: 70, amount: 15},
healthBonus: {threshold: 0.5, amount: 10},
positionBonus: {},
enemyLustGain: 10,
playerLustGain: 8,
dominanceGain: 2,
setEnemyPinned: false,
successNarrativeKey: "takedown_prone",
videoFolder: "combat/shove_face_down",
successIcon: "prone",
successMessage: "success_prone",
hitFallback: "You shove her hard— she goes down face-first, ass up!",
resistFallback: "She catches herself before hitting the ground!"
}>>
<<playerTakedownCardFlow _takedownConfig>><<silently>><<include "TakedownNarratives">><</silently>>
<<set _takedownConfig to {
name: "Bend Her Over",
targetPosition: "bent_over",
baseChance: 50,
strengthBonus: true,
dominanceBonus: true,
lustBonus: {threshold: 70, amount: 20},
healthBonus: {threshold: 0.5, amount: 10},
positionBonus: {kneeling: 15, prone_front: 15, prone_back: 15},
enemyLustGain: 15,
playerLustGain: 10,
dominanceGain: 3,
setEnemyPinned: false,
successNarrativeKey: "takedown_bent",
videoFolder: "combat/bend_her_over",
successIcon: "bent-over",
successMessage: "success_bent",
hitFallback: "You grab her hair and BEND her over— she catches herself on her hands, ass thrust up!",
resistFallback: "She struggles and breaks free before you can position her!"
}>>
<<playerTakedownCardFlow _takedownConfig>><<silently>><<include "TakedownNarratives">><</silently>>
<<set _takedownConfig to {
name: "Pin Enemy",
targetPosition: "pinned",
baseChance: 45,
strengthBonus: true,
dominanceBonus: true,
lustBonus: {threshold: 70, amount: 15},
healthBonus: {threshold: 0.5, amount: 10},
positionBonus: {prone_front: 25, prone_back: 25, bent_over: 25},
enemyLustGain: 20,
playerLustGain: 0,
dominanceGain: 3,
setEnemyPinned: true,
successNarrativeKey: "takedown_pin",
videoFolder: "combat/pin_enemy",
successIcon: "lock",
successMessage: "success_pin",
hitFallback: "You drop your full weight on her— she's PINNED beneath you, completely helpless!",
resistFallback: "She kicks and writhes— you can't get a solid pin!"
}>>
<<playerTakedownCardFlow _takedownConfig>><<silently>><<include "DickOutDominationNarratives">><</silently>>
<<playerDickOutCardFlow setup.dickOutConfigs.cock_slap>><<silently>><<include "DickOutDominationNarratives">><</silently>>
<<playerDickOutCardFlow setup.dickOutConfigs.rub_face>><<silently>><<include "DickOutDominationNarratives">><</silently>>
<<playerDickOutCardFlow setup.dickOutConfigs.press_lips>><<silently>><<include "DickOutDominationNarratives">><</silently>>
<<playerDickOutCardFlow setup.dickOutConfigs.slap_lips>><<silently>><<include "DickOutDominationNarratives">><</silently>>
<<playerDickOutCardFlow setup.dickOutConfigs.make_suck>><<silently>><<include "DickOutDominationNarratives">><</silently>>
<<playerDickOutCardFlow setup.dickOutConfigs.use_throat>><<silently>><<include "DickOutDominationNarratives">><</silently>>
<<playerDickOutCardFlow setup.dickOutConfigs.grind_behind>><<silently>><<include "DickOutDominationNarratives">><</silently>>
<<playerDickOutCardFlow setup.dickOutConfigs.hotdog_ass>><<silently>><<include "DickOutDominationNarratives">><</silently>>
<<playerDickOutCardFlow setup.dickOutConfigs.rub_ass>><<silently>><<include "DickOutDominationNarratives">><</silently>>
<<playerDickOutCardFlow setup.dickOutConfigs.hotdog_prone>><<silently>><<include "DickOutDominationNarratives">><</silently>>
<<playerDickOutCardFlow setup.dickOutConfigs.tease_entrance>><<silently>><<include "DickOutDominationNarratives">><</silently>>
<<playerDickOutCardFlow setup.dickOutConfigs.grind_back>><<silently>><<include "DickOutDominationNarratives">><</silently>>
<<playerDickOutCardFlow setup.dickOutConfigs.rub_thighs>><<silently>><<include "DickOutDominationNarratives">><</silently>>
<<playerDickOutCardFlow setup.dickOutConfigs.tease_pussy>><<initCombatTarget>>
<div class="combat-action-result ultra-action">
<p class="explicit ultra">You grab her hair and pull her face to your cock!</p>
<<set _resistRoll to random(1, 100)>>
<<set _resistChance to 40 - (_target.lust || 0) / 2>>
<<if _resistRoll gt _resistChance>>
<<combatActionVideo "deep-throat-video" "combat/deep_throat" _target>>
<p class="explicit ultra">She opens her mouth— you thrust deep! Her throat clenches around your shaft!</p>
<<set _lustDamage to random(40, 60)>>
<<set _target.lust to setup.enemyLustPlus(_target, _lustDamage)>>
<<run setup.markEnemySexUsed(_target)>>
<<set $player.lust to Math.min(100, $player.lust + 20)>>
<<combatNarrative "player_hit_ultra_extreme" "" "ultra-narrative">>
<<if _target.lust gte _target.seduceThreshold>>
<<fillCombatVideoBox "deep-throat-video" "combat/enemy_climax_oral" _target>>
<p class="explicit victory">Her eyes roll back! She's cumming with your cock down her throat— COMPLETE SUBMISSION!</p>
<<set _target.defeated to true>>
<<set _target.beenUsed to true>>
<<set _target.sexUsed to true>>
<<run setup.countWomanUsed(_target)>>
<<set _target.defeatType to "seduced">>
<<else>>
<p class="explicit">You fuck her throat, each thrust making her gag and drool!</p>
<</if>>
<div class="lust-dealt ultra">
<<icon "lips" "small">> <<print "+" + _lustDamage>> enemy lust | You +20 lust
</div>
<<else>>
<p class="combat-miss">She bites— you yank back just in time!</p>
<<clampStat "player.health" -3 0 100>>
<</if>>
</div>
<div class="choice-container">
<<vchoice "Continue" "Combat_Companion_Turn" "move" "map">>
</div><<initCombatTarget>>
<div class="combat-action-result ultra-action">
<p class="explicit ultra">You grab your zipper and pull— your throbbing cock springs free!</p>
<<set $clothing.player.dickExposed to true>>
<<set $player.lust to Math.min(100, $player.lust + 5)>>
<p class="explicit">She stares at your hard cock, eyes widening...</p>
<<set _resistRoll to random(1, 100)>>
<<set _resistChance to 45 - (_target.lust || 0) / 2>>
<<if _resistRoll gt _resistChance>>
<<set _unzipLog to "Unzip & throat fuck " + _target.name + "! +" + random(35, 55) + " arousal">>
<<logCombat _unzipLog "intimate">>
<<combatActionVideo "unzip-throat-video" "combat/unzip_throat" _target>>
<p class="explicit ultra">You grab her hair and shove your cock into her mouth! She gags but takes it!</p>
<<set _lustDamage to random(35, 55)>>
<<set _target.lust to setup.enemyLustPlus(_target, _lustDamage)>>
<<run setup.markEnemySexUsed(_target)>>
<<set $player.lust to Math.min(100, $player.lust + 18)>>
<<if _target.lust gte _target.seduceThreshold>>
<<fillCombatVideoBox "unzip-throat-video" "combat/enemy_climax_oral" _target>>
<p class="explicit victory">She moans around your shaft, sucking eagerly— COMPLETE SUBMISSION!</p>
<<set _target.defeated to true>>
<<set _target.beenUsed to true>>
<<set _target.sexUsed to true>>
<<run setup.countWomanUsed(_target)>>
<<set _target.defeatType to "seduced">>
<<else>>
<p class="explicit">Her throat bulges with each thrust! Drool runs down her chin!</p>
<</if>>
<div class="lust-dealt ultra">
<<icon "lips" "small">> <<print "+" + _lustDamage>> enemy lust
</div>
<<else>>
<<set _resistLog to _target.name + " #" + (_targetIndex + 1) + " resists throat fuck!">>
<<logCombat _resistLog "damage">>
<p class="combat-miss">She jerks her head away! "Not happening!"</p>
<</if>>
</div>
<div class="choice-container">
<<vchoice "Continue" "Combat_Companion_Turn" "move" "map">>
</div><<silently>><<include "UltraExtremeNarratives">><</silently>>
<<executeUltraExtreme setup.ultraExtremeConfigs.claim_her>><<silently>><<include "UltraExtremeNarratives">><</silently>>
<<executeUltraExtreme setup.ultraExtremeConfigs.mount_claim>><<silently>><<include "UltraExtremeNarratives">><</silently>>
<<executeUltraExtreme setup.ultraExtremeConfigs.grind_clothed>><<silently>><<include "UltraExtremeNarratives">><</silently>>
<<executeUltraExtreme setup.ultraExtremeConfigs.mount_grind>><<silently>><<include "UltraExtremeNarratives">><</silently>>
<<executeUltraExtreme setup.ultraExtremeConfigs.grab_grind>><<silently>><<include "UltraExtremeNarratives">><</silently>>
<<executeUltraExtreme setup.ultraExtremeConfigs.tear_and_take>><<silently>><<include "UltraExtremeNarratives">><</silently>>
<<executeUltraExtreme setup.ultraExtremeConfigs.rip_and_enter>><<silently>><<include "UltraExtremeNarratives">><</silently>>
<<executeUltraExtreme setup.ultraExtremeConfigs.anal>><<initCombatTarget>>
<div class="combat-action-result ultra-action">
<p class="explicit ultra"><<combatNarrative "use_mouth">></p>
<<set _resistRoll to random(1, 100)>>
<<set _resistChance to 35 - (_target.lust || 0) / 2 - ($player.dominance || 0)>>
<<if _resistRoll gt _resistChance>>
<<combatActionVideo "use-mouth-video" "combat/use_mouth" _target>>
<<if _target.lust gte 60>>
<p class="explicit ultra">She opens willingly, taking you deep! Her tongue works your shaft eagerly!</p>
<<else>>
<p class="explicit ultra">You push past her lips! She gags but has no choice but to take it!</p>
<</if>>
<<set _lustDamage to random(35, 50)>>
<<set _target.lust to setup.enemyLustPlus(_target, _lustDamage)>>
<<run setup.markEnemySexUsed(_target)>>
<<set $player.lust to Math.min(100, $player.lust + 22)>>
<<if _target.lust gte _target.seduceThreshold>>
<<fillCombatVideoBox "use-mouth-video" "combat/enemy_climax_oral" _target>>
<p class="explicit victory">She moans around your cock as she cums from sucking you— CONQUERED!</p>
<<set _target.defeated to true>>
<<set _target.beenUsed to true>>
<<set _target.sexUsed to true>>
<<run setup.countWomanUsed(_target)>>
<<set _target.defeatType to "claimed">>
<<set $player.dominance to ($player.dominance || 0) + 4>>
<<else>>
<p class="explicit">You fuck her face, using her mouth as you please!</p>
<</if>>
<div class="lust-dealt ultra">
<<icon "lips" "small">> <<print "+" + _lustDamage>> enemy lust | You +22 lust
</div>
<<else>>
<p class="combat-miss">She turns her head away! "I won't—!"</p>
<</if>>
</div>
<div class="choice-container">
<<vchoice "Continue" "Combat_Companion_Turn" "move" "map">>
</div><<silently>><<include "BasicAttackNarratives">><</silently>>
<<playerAttackCardFlow setup.basicAttackConfigs.power_strike>><<playerIntimidateCardFlow>><<playerDarkPulseCardFlow>><<set _seduced to setup.seducedEnemy()>>
<<countCombatVictory>>
<<set _sdReturn to $combat.returnPassage || "Day3_Combat_Aftermath">>
<<endCombat>>
<<set $combat.result to "seduced">><<run setup.noteSeductionOthers()>>
<<run VaultUI.setBackgroundDirect(setup.combatBackgroundImage())>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<h2>Seduction Success</h2>
<<combatActionVideo "seduced-yield-video" "combat/enemy_seduced_yield" _seduced>>
<<set _sp to setup.pronouns(_seduced.gender)>><<print setup.enemyRef(_seduced, true)>> drops <<print _sp.his>> weapon, eyes glazed with desire.
<<if _seduced.id && setup.raiderTypeMap && setup.raiderTypeMap[_seduced.id]>>
<<getRaiderSeduced _seduced>>
<<set _seducedLine to _return>>
<<say _seduced.name _seducedLine>>
<<elseif _seduced.seduced>>
<<say _seduced.name _seduced.seduced>>
<<else>>
"I... I yield..."
<</if>>
<<if $combat.companionInCombat === "kira" && !$combat.kiraIncapacitated>>
<<run VaultUI.showCharacter("kira", "center", "guarded")>>
<<say "Kira" `"Seriously? You seduced " + setup.pronouns(_seduced.gender).him + " in the middle of a fight?"`>>
<<relationChange "kira" "trust" -1>>
<<relationChange "kira" "affection" 2>>
<</if>>
<<set $vault.scrap += 1>>
<div class="choice-container">
<<vchoice "Take what you can and leave" _sdReturn "move" "crystal">>
<<if $flags.seductionUnlocked && _seduced.gender === "female">>
<<vchoice "Take advantage of the situation..." "Combat_Seduction_Scene" "intimate" "lips">>
<</if>>
</div><<silently>><<include "RapidStrikesNarratives">><</silently>>
<<executeRapidStrikes>><<set _target to $combat.enemies[$combat.currentTarget || 0] || $combat.enemies[0]>>
<<clampStat "player.energy" -8 0 $player.maxEnergy>>
<<combatActionVideo "sultry-gaze-video" "combat/seduce_sultry_gaze" _target>>
You lock eyes with <<print setup.enemyRef(_target)>>, your gaze smoldering with desire...
<<set _successRoll to random(1, 100)>>
<<set _successChance to 50 + $player.charm - (_target.lustResistance || 20)>>
<<if _successRoll lte _successChance>>
<<applyStatus _target "lust_daze">>
<<set _lustDamage to 8 + $player.allure>>
<<set _target.lust to setup.enemyLustPlus(_target, _lustDamage)>>
<<logCombat `"Enemy arousal +" + _lustDamage + "!"` "sexual">>
<div class="status-applied"><<print setup.enemyRef(_target, true)>> is entranced! (<<print "+" + _lustDamage>> Lust)</div>
<<else>>
<<logCombat "Seduction failed!" "sexual">>
<<print setup.enemyRef(_target, true)>> looks away, resisting your gaze.
<</if>>
<div class="choice-container">
<<vchoice "Continue" "Combat_Companion_Turn" "move" "map">>
</div><<clampStat "player.energy" -12 0 $player.maxEnergy>>
<<set _stTarget to $combat.enemies[$combat.currentTarget || 0] || $combat.enemies[0]>>
<<combatActionVideo "strip-tease-video" "combat/seduce_strip_tease" _stTarget>>
You put on a provocative display, drawing every eye to you...
<<set _lustDamage to 15 + Math.floor($player.allure / 2)>>
<<logCombat `"Strip tease! Arousal +" + _lustDamage + "!"` "sexual">>
<<for _i, _enemy range $combat.enemies>>
<<if _enemy.gender === "female" || _enemy.type === "supernatural">>
<<set _enemy.lust to setup.enemyLustPlus(_enemy, _lustDamage)>>
<<set $combat.enemies[_i].lust to _enemy.lust>>
<div class="lust-damage"><<print _enemy.name>> gains <<print _lustDamage>> Lust!</div>
<</if>>
<</for>>
<<clampStat "player.lust" 5>>
<div class="choice-container">
<<vchoice "Continue" "Combat_Companion_Turn" "move" "map">>
</div><<set _kissIdx to ($combat.enemies[$combat.currentTarget || 0] ? ($combat.currentTarget || 0) : 0)>>
<<set _target to $combat.enemies[_kissIdx]>>
<<set _kissSeduced to false>>
<<clampStat "player.energy" -20 0 $player.maxEnergy>>
<<combatActionVideo "kiss-of-submission-video" "combat/kiss_of_submission" _target>>
Dark energy swirls around you as you approach <<print setup.enemyRef(_target)>>...
<<if _target.lust && _target.lust gte 70>>
<<logCombat "Kiss of Submission! Enemy seduced!" "sexual">>
Your lips meet theirs, and their will crumbles completely.
<<set $combat.seduced to _target.id>>
<<set $combat.seducedIndex to _kissIdx>>
<<addCorruption 2>>
<<set _kissSeduced to true>>
<<else>>
<<set _lustDamage to 25 + $player.allure>>
<<set _target.lust to setup.enemyLustPlus(_target, _lustDamage)>>
<<logCombat `"Kiss! Arousal +" + _lustDamage + "!"` "sexual">>
Your kiss leaves them dazed and burning with desire. <div class="lust-damage"><<print "+" + _lustDamage>> Lust!</div>
<<if _target.lust gte _target.seduceThreshold>>
<<set $combat.seduced to _target.id>>
<<set $combat.seducedIndex to _kissIdx>>
<<set _kissSeduced to true>>
<</if>>
<</if>>
<div class="choice-container">
<<vchoice "Continue" `_kissSeduced ? "Combat_Seduction_Success" : "Combat_Companion_Turn"` "move" "map">>
</div><<silently>><<include "SupernaturalNarratives">><</silently>>
<<executeDrainEssence>><<silently>><<include "SupernaturalNarratives">><</silently>>
<<executeTerrorVisage>><<silently>><<include "SupernaturalNarratives">><</silently>>
<<executeSuccubusKiss>><<silently>><<include "SupernaturalNarratives">><</silently>>
<<executeShadowStep>><<silently>><<include "SupernaturalNarratives">><</silently>>
<<executeAbyssalForm>><<set _target to $combat.enemies[0]>>
<<combatActionVideo "negotiate-video" "combat/negotiate" _target>>
You raise your hands in a peaceful gesture.
<<say $player.name "Wait. We don't have to do this.">>
<<set _successRoll to random(1, 100)>>
<<set _successChance to (_target.negotiateThreshold || 30)>>
<<if _successRoll lte _successChance>>
<<print setup.enemyRef(_target, true)>> hesitates, then lowers <<print setup.pronouns(_target.gender).his>> weapon.
<<if _target.negotiate>>
<<say _target.name _target.negotiate>>
<<else>>
"...Fine. But you owe me."
<</if>>
<<set _ngReturn to $combat.returnPassage || "Day3_Combat_Aftermath">>
<<endCombat>>
<<run VaultUI.setBackgroundDirect(setup.combatBackgroundImage())>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<<set $stats.negotiations_successful += 1>>
<<set $vault.scrap += 1>>
<div class="choice-container">
<<vchoice "Part ways peacefully" _ngReturn "move" "hand">>
</div>
<<else>>
<<print setup.enemyRef(_target, true)>> snarls.
"Too late for talk!"
They attack with renewed fury!
<div class="choice-container">
<<vchoice "Continue" "Combat_Companion_Turn" "move" "map">>
</div>
<</if>><<set _enemy to setup.seducedEnemy()>>
<<countCombatVictory>>
<<endCombat>>
<<set $combat.result to "seduced">><<run setup.noteSeductionOthers()>>
<<run VaultUI.setBackgroundDirect(setup.combatBackgroundImage())>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<<seducedEnemyPortrait _enemy>>
<<postBattleVideo "seduced_victory">>
<h3>Seduction Victory</h3>
<<print _enemy.name>> drops her weapon. Her eyes are glazed with desire, chest heaving.
<<say _enemy.name "I... I can't... what did you do to me?">>
She's completely under your spell. Helpless. Wanting.
<<if $combat.companionInCombat === "kira">>
<<showCharacter "kira" "left" "conflicted">>
<<say "Kira" "You... seduced her. In combat.">>
Her voice is strained. You can't tell if she's impressed or disturbed.
<<addTension "kira" 10 "" "combat">>
<</if>>
<div class="victory-options">
<h4>What do you do with her?</h4>
<div class="choice-container">
<<vchoice "Claim your reward" "Combat_Seduction_Sex" "intimate" "lips">>
<<vchoice "Let her go" "Combat_Seduction_Release" "action" "hand">>
<<if _enemy.hasInformation>>
<<vchoice "Interrogate her" "Combat_Seduction_Interrogate" "talk" "alert">>
<</if>>
</div>
</div><<set _enemy to setup.seducedEnemy()>>
<<sexScene _enemy.id "seduction" "dominant" "wasteland-combat">>
<<seducedEnemyPortrait _enemy>>
She kneels before you, waiting. No resistance left.
<<say $player.name "Good girl.">>
The words make her shudder.
<<set $player.dominance += 5>>
<<sexPhase "buildup">>
<<performSexAct "undress_partial">>
<<postBattleVideo "seduced_strip">>
<<run setup.postBattleStripNaked(setup.seducedEnemy())>>
She strips for you, desperate to please. Her hands shake with anticipation.
<<say _enemy.name "Please... I need...">>
<<if $combat.companionInCombat === "kira">>
<<showCharacter "kira" "left" "aroused">>
<<say "Kira" "I'll... keep watch.">>
Her voice is thick. She's watching. You can feel her eyes on you.
<<addTension "kira" 20 "" "combat">>
<<addKiraLust 15>>
<</if>>
<<sexPhase "action">>
<div class="choice-container">
<<vchoice "Use her mouth" "Combat_Seduction_Oral" "intimate" "lips">>
<<vchoice "Take her here" "Combat_Seduction_Full" "intimate" "rapid-strikes">>
<<vchoice "Make her beg" "Combat_Seduction_Tease" "intimate" "corruption">>
</div><<set _enemy to setup.seducedEnemy()>>
<<postBattleVideo "seduced_oral">>
<<say $player.name "On your knees. Show me what that mouth can do.">>
<<performSexAct "oral_receive">>
She drops immediately, eager. Her mouth finds you, hot and wet.
<<say _enemy.name "Mmmph...">>
She's enthusiastic if not refined. The power dynamic makes it exquisite.
<<performSexAct "oral_receive">>
Her tongue works desperately, trying to please you. To earn your approval.
<<if $combat.companionInCombat === "kira">>
You glance at Kira. She's frozen, watching. Her breathing has changed.
<<say "Kira" "...">>
No words. Just heat in her eyes.
<</if>>
<<sexPhase "climax">>
<<performSexAct "climax_player">>
You finish with a groan. She swallows without being asked, looking up for approval.
<<say $player.name "Good. Very good.">>
<div class="choice-container">
<<vchoice "Aftermath" "Combat_Seduction_Aftermath" "move" "map">>
</div><<set _enemy to setup.seducedEnemy()>>
<<postBattleVideo "seduced_fuck">>
<<say $player.name "Get on your hands and knees.">>
<<performSexAct "position_doggy">>
She obeys instantly, presenting herself. No shame. Just need.
<<performSexAct "penetrate">>
You take her there in the Reclaimed dust. Hard. Claiming.
<<say _enemy.name "Oh god— yes— please—">>
<<performSexAct "thrust_fast">>
She knows how to move. How to clench. Making it good while staying submissive.
<<if $combat.companionInCombat === "kira">>
Kira is watching everything. You lock eyes with her over the raider's back.
<<addTension "kira" 15 "" "combat">>
Something passes between you. Unspoken.
<</if>>
<<sexPhase "climax">>
<<performSexAct "climax_together">>
You finish together. She collapses forward, gasping.
<div class="choice-container">
<<vchoice "Aftermath" "Combat_Seduction_Aftermath" "move" "map">>
</div><<set _enemy to setup.seducedEnemy()>>
<<postBattleVideo "seduced_tease">>
<<say $player.name "Beg for it.">>
<<performSexAct "touch_intimate">>
Your fingers find her wetness. She's drenched. Desperate.
<<say _enemy.name "Please— I need— please—">>
<<say $player.name "Need what?">>
<<performSexAct "touch_intimate">>
You bring her right to the edge. Then stop.
<<say _enemy.name "No! Please don't stop!">>
She's writhing. Begging. Completely yours.
<<performSexAct "penetrate">>
When you finally take her, she screams.
<<sexPhase "climax">>
<<performSexAct "climax_together">>
The orgasm rips through her. She's shaking, tears streaming.
<div class="choice-container">
<<vchoice "Aftermath" "Combat_Seduction_Aftermath" "move" "map">>
</div><<endSexScene>>
<<set _enemy to $combat.lastEnemy || setup.seducedEnemy()>>
<<seducedEnemyPortrait _enemy>>
<<postBattleVideo "seduced_aftermath">>
<<if _pbClip is "6483da24b080">>She lies there a long while, naked and dazed, smiling at nothing, before she finally reaches for her clothes.<<elseif _pbClip is "f3dea27f3b3d">>She lies face-down a long while, naked and half asleep, before she finally reaches for her clothes.<<else>>She dresses slowly, still dazed.<</if>>
<<say _enemy.name "I don't... what was that?">>
<<say $player.name "You're free to go.">>
She stares, confused by the mercy. Then gathers her things and flees, glancing back once.
<<set $player.seductionVictories += 1>>
<<set $stats.combat.enemiesSeduced += 1>>
<<run setup.fightLootStart()>>
<<if _enemy.loot && _enemy.loot.length gt 0>>
<<for _item range _enemy.loot>>
<<if random(1, 100) <= ((_enemy.lootChance || 0.5) * 100)>>
<<set _lootLabel to setup.postBattleTakeLoot(_item, _item.replace(/_/g, " "), 1, _enemy.name, "fightLoot")>>
<<if _lootLabel>><p class="loot-found">Found: <<print _lootLabel>></p><</if>>
<</if>>
<</for>>
<<lootLeftList "fightLoot">>
<</if>>
<<if $combat.companionInCombat === "kira">>
<<showCharacter "kira" "right" "flushed">>
Kira won't meet your eyes at first.
<<say "Kira" "So. That's your... technique.">>
<<say $player.name "It works.">>
<<say "Kira" "Yeah. It does.">>
A long pause.
<<say "Kira" "We should get back.">>
<<addTension "kira" 10 "" "combat">>
<<addAffection "kira" 1>>
<</if>>
<<run $combat.enemies.splice(setup.seducedEnemyIndex(), 1)>>
<<endCombat>>
<div class="choice-container">
<<if $combat.returnPassage>>
<<vchoice "Return to exploration" $combat.returnPassage "move" "map">>
<<else>>
<<vchoice "Return to the Reclaimed" "WorldMap_View" "move" "map">>
<</if>>
</div><<set _enemy to setup.seducedEnemy()>>
<<postBattleVideo "seduced_release">>
You step back, giving her space.
<<say $player.name "Go. I won't hurt you.">>
She stares, confused. Aroused and confused and grateful.
<<say _enemy.name "You're... letting me go?">>
<<say $player.name "Consider it mercy.">>
She scrambles for her weapon, backs away slowly. Then turns and runs.
<<set $player.mercyShown += 1>>
<<if _enemy.faction>>
<<set $factions[_enemy.faction].reputation += 2>>
<</if>>
<<if !$flags.releasedEnemies>>
<<set $flags.releasedEnemies to []>>
<</if>>
<<run $flags.releasedEnemies.push(_enemy.id)>>
<<if $combat.companionInCombat === "kira">>
<<showCharacter "kira" "right" "approving">>
<<say "Kira" "Generous of you.">>
<<say $player.name "She wasn't trying to kill us. Just protecting her territory.">>
<<say "Kira" "Still. Not many would show mercy out here.">>
<<relationChange "kira" "trust" 1>>
<</if>>
<<run $combat.enemies.splice(setup.seducedEnemyIndex(), 1)>>
<<endCombat>>
<div class="choice-container">
<<if $combat.returnPassage>>
<<vchoice "Continue" $combat.returnPassage "move" "map">>
<<else>>
<<vchoice "Continue" "WorldMap_View" "move" "map">>
<</if>>
</div><<set _enemy to setup.seducedEnemy()>>
<<seducedEnemyPortrait _enemy>>
<<postBattleVideo "seduced_interrogate">>
<<say $player.name "I have questions. You're going to answer them.">>
She nods eagerly, still under the spell of arousal.
<<say $player.name "Who sent you?">>
<<if _enemy.information>>
<<say _enemy.name _enemy.information>>
<<if _enemy.faction>>
<<set $factions[_enemy.faction].intelligence += 10>>
<</if>>
<<else>>
<<say _enemy.name "I'm just a scout. I don't know anything important, I swear!">>
<</if>>
<<say $player.name "Good. Now go.">>
She flees, grateful for the mercy.
<<set $stats.enemiesInterrogated += 1>>
<<run $combat.enemies.splice(setup.seducedEnemyIndex(), 1)>>
<<endCombat>>
<div class="choice-container">
<<if $combat.returnPassage>>
<<vchoice "Continue" $combat.returnPassage "move" "map">>
<<else>>
<<vchoice "Continue" "WorldMap_View" "move" "map">>
<</if>>
</div><<kiraTurnCardFlow>><<set $combat.phase to "enemy">>
<<set _etDefeat to false>><<set _etKiraDown to false>><<set _etVictory to false>><<set _etLustScene to "">>
<<silently>><<include "WeaponDatabase">><</silently>>
<<if ndef $settings>><<set $settings to {}>><</if>>
<<if $settings.useCardUI === undefined>><<set $settings.useCardUI to true>><</if>>
<div class="enemy-turn-container">
<!-- HEADER with Round Badge -->
<div class="enemy-turn-page-header">
<h3><<icon "crossed-swords" "small">> Enemy Turn</h3>
<span class="enemy-turn-round-badge">Round <<print $combat.turn>></span>
</div>
<!-- STATUS MESSAGES (passive effects, weapon escalation) -->
<div class="enemy-turn-status-messages">
<<processWeaponEffectsTurn>>
<<run setup.holdUsedEnemies()>>
<<for _cetEnemy range $combat.enemies>>
<<if _cetEnemy.abilities && _cetEnemy.abilities.includes("regenerate_weak")>>
<<set _cetEnemy.health to Math.min(_cetEnemy.maxHealth, _cetEnemy.health + 3)>>
<div class="passive-effect"><<print _cetEnemy.name>> regenerates 3 HP</div>
<</if>>
<<if _cetEnemy.abilities && _cetEnemy.abilities.includes("pack_tactics")>>
<<set _cetAllyCount to $combat.enemies.filter(function (e) { return e !== _cetEnemy && e.health > 0 && !e.beenUsed && !e.fled; }).length>>
<<if _cetAllyCount gt 0>>
<<set _cetEnemy.damage += (_cetAllyCount * 5)>>
<</if>>
<</if>>
<</for>>
<<for _cetIdx2 to 0; _cetIdx2 lt $combat.enemies.length; _cetIdx2++>>
<<resetFlauntDistracted _cetIdx2>>
<</for>>
</div>
<!-- CARDS WRAPPER -->
<div class="enemy-turn-cards-wrapper">
<<predetermineAllEnemyActions>>
<<renderEnemyActionCards>>
<<executeAllEnemyActions>>
</div>
<!-- FOOTER with Continue Button -->
<div class="enemy-turn-footer">
<div class="choice-container">
<<if $combat.pendingSexAction && $combat.pendingSexAction.passage === "Combat_Enemy_Sex_Kira_Check" && !setup.kiraInFight()>>
<<set $combat.pendingSexAction to null>>
<</if>>
<<if _etDefeat>>
<<vchoice "Continue" "Combat_Defeat" "move" "map">>
<<elseif _etLustScene>>
<<vchoice "Continue" _etLustScene "move" "map">>
<<elseif _etKiraDown>>
<<vchoice "Continue" "Combat_Kira_Unconscious" "move" "map">>
<<elseif _etVictory>>
<<vchoice "Continue" "Combat_Victory" "move" "map">>
<<elseif $combat.pendingSexAction && $combat.pendingSexAction.passage>>
<<link "Continue">><<goto $combat.pendingSexAction.passage>><</link>>
<<else>>
<<vchoice "Continue" "Combat_Actions" "move" "map">>
<</if>>
</div>
</div>
</div><<logCombat "VICTORY!" "critical">>
<<countCombatVictory>>
<<run setup.guardKira()>>
<<if $combat.kiraIncapacitated>>
<<goto "Combat_Victory_Kira_Unconscious">>
<<elseif $flags.exposureEventPending>>
<<set _event to $flags.exposureEventPending>>
<<set $flags.exposureEventPending to "">>
<<goto _event>>
<<else>>
<<if $flags.seductionUnlocked>>
<<combatVictoryTransition>>
<<else>>
<<goto "Combat_Victory_Simple">>
<</if>>
<</if>><<endCombat>>
<<set $combat.result to "victory">>
<<run VaultUI.setBackgroundDirect(setup.combatBackgroundImage())>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<h2>Victory</h2>
The last raider falls. Silence settles over the ruins, broken only by your ragged breathing.
<<set _cvsKira to setup.kiraInFight()>>
<<if _cvsKira>><<run VaultUI.showCharacter("kira", "center", "smile")>><</if>>
<<postBattleVideo "hub">>
<<if _cvsKira>><<say "Kira" "Not bad. You can actually handle yourself.">><</if>>
<<set _loot to []>>
<<for _enemy range $combat.enemies>>
<<if Math.random() lt (_enemy.lootChance || 0.5)>>
<<if _enemy.loot && _enemy.loot.length gt 0>>
<<set _item to either(_enemy.loot)>>
<<run _loot.push(_item)>>
<<else>>
<<set _item to either("scrap metal", "dirty water", "bandage")>>
<<run _loot.push(_item)>>
<</if>>
<</if>>
<</for>>
<<run setup.fightLootStart()>>
<<set _lootFound to []>>
<<for _lootId range _loot>>
<<set _lootName to _lootId.replace(/_/g, " ").replace(/\b\w/g, function(l){ return l.toUpperCase() })>>
<<set _lootLabel to setup.postBattleTakeLoot(_lootId, _lootName, 1, "", "fightLoot")>>
<<if _lootLabel>><<run _lootFound.push(_lootLabel)>><</if>>
<</for>>
<<if _lootFound.length gt 0>>
You search the bodies and find:
<ul>
<<for _lootLabel range _lootFound>>
<li><<print _lootLabel>></li>
<</for>>
</ul>
<<lootLeftList "fightLoot">>
<</if>>
<<if _cvsKira>>
<<relationChange "kira" "trust" 2>>
<<relationChange "kira" "affection" 1>>
<</if>>
<<set $vault.scrap += 2>>
<div class="choice-container">
<<set _cvsScene to setup.combatScenePassage("victory")>>
<<run setup.clearCombatScenes()>>
<<if _cvsScene>>
<<vchoice "Continue" _cvsScene "move" "map">>
<<elseif $combat.returnPassage>>
<<vchoice "Continue" $combat.returnPassage "move" "map">>
<<else>>
<<vchoice "Gather supplies and return" "Day3_Combat_Aftermath" "move" "crystal">>
<</if>>
</div><<logCombat "Defeated..." "critical">>
<<set _savedReturnPassage to $combat.returnPassage || "Vault_Hub">>
<<set _savedDefeatScene to setup.combatScenePassage("defeat")>>
<<run setup.clearCombatScenes()>>
<<set _wasKiraIncapacitated to $combat.kiraIncapacitated>>
<<set _hadCompanion to $combat.companionInCombat === "kira">>
<<set $player.health to 1>>
<<if _hadCompanion && $companions && $companions[0]>>
<<getCompanion "kira">>
<<set $tempCompanion.health to setup.kiraFloorHealth(Math.max(1, $tempCompanion.health - 20))>>
<</if>>
<<endCombat>>
<<set $combat.result to "defeat">>
<<if !$temp>><<set $temp to {}>><</if>>
<<set $temp.defeatReturnPassage to _savedReturnPassage>>
<<set _kiraDown to _wasKiraIncapacitated || ($companions[0] && $companions[0].health <= 1)>>
<<set _inVault to !($journey && $journey.active) && ($currentLocation === "vault" || $currentLocation === "commons")>>
<<set _savedDefeatGrove to !!(_savedDefeatScene && Story.has(_savedDefeatScene) && Story.get(_savedDefeatScene).tags.includes("grove"))>>
<<if _savedDefeatGrove && $grove>>
<<set $grove.kiraDownHome to (_hadCompanion && _kiraDown) ? setup.groveKiraDownHome() : null>>
<</if>>
<<if _savedDefeatScene && (!_kiraDown || !_hadCompanion || _savedDefeatGrove)>>
<<goto _savedDefeatScene>>
<<elseif !_hadCompanion>>
<<goto "Combat_Defeat_Solo">>
<<elseif _inVault && _kiraDown>>
<<goto "Combat_Defeat_Vault">>
<<elseif !_inVault && _kiraDown>>
<<goto "Combat_Defeat_Wasteland_Both_Down">>
<<else>>
<<if _inVault>>
<<run VaultUI.setBackground("commons")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<<else>>
<<run VaultUI.setBackgroundDirect(setup.combatBackgroundImage())>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<</if>>
<h2>Defeat</h2>
<<playerMediaTarget>>
<<combatActionVideo "player-defeated-video" "combat/player_defeated" _playerMediaTarget>>
The blow sends you sprawling. Your vision blurs. Through the haze, you see Kira fighting desperately—
<<run VaultUI.showCharacter("kira", "center", "worried")>>
<<say "Kira" "Get up! GET UP!">>
Darkness creeps at the edges of your vision...
<div class="choice-container">
<<vchoice "Continue" "Combat_Rescued" "move" "map">>
</div>
<</if>><<run VaultUI.setBackground("commons")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<h2>Darkness</h2>
<<playerMediaTarget>>
<<combatActionVideo "player-defeated-video" "combat/player_defeated" _playerMediaTarget>>
<p>You fall. Kira falls beside you. Neither of you can fight anymore.</p>
<p>The enemy looms over you both. This is it. This is how it ends.</p>
<p>Then—light. Blinding, ancient light.</p>
<<say "Groundskeeper" "BEGONE.">>
<p>The voice echoes with power you've never heard from the old man before. The enemy recoils, shrieking.</p>
<p>Through fading vision, you see the Groundskeeper standing in the doorway, one hand raised. Symbols glow on his skin—old marks, older than the vault itself.</p>
<p>The enemy flees. Or is destroyed. You can't tell which.</p>
<p>Then darkness takes you completely.</p>
<div class="choice-container">
<<vchoice "..." "Combat_Groundskeeper_Rescue" "action" "sleep">>
</div><<run VaultUI.setBackground("medical")>>
<<run VaultUI.setTimeOfDay("morning")>>
<<advanceTime 12>>
<h2>Awakening</h2>
<p>You wake in the medical bay. Soft light. The smell of herbs and old stone.</p>
<<run VaultUI.showCharacter("groundskeeper", "left", "concerned")>>
<p>The Groundskeeper sits in a chair beside your bed, looking older than usual. Tired.</p>
<<say "Groundskeeper" "You're awake. Good.">>
<<say $player.name "What... what happened? That light—">>
<<say "Groundskeeper" "The vault protects its own. When it must.">>
<p>He doesn't elaborate. You sense you won't get more from him on that topic.</p>
<<say $player.name "Kira?">>
<<set _gkrKiraDown to setup.kiraLaterKnockout() && setup.kiraStaysInMedical()>>
<<if _gkrKiraDown>>
<<say "Groundskeeper" "Alive. In the next bed. She has not woken, and she will not, not by any medicine of mine.">>
<p>You know what that means. Lysara.</p>
<<else>>
<<say "Groundskeeper" "Alive. Recovering in her room. She woke an hour ago.">>
<p>Relief floods through you.</p>
<</if>>
<<say "Groundskeeper" "You were both very close to death. The vault's defenses... they are not unlimited. Do not rely on such intervention again.">>
<<set $player.health to Math.floor($player.maxHealth * 0.4)>>
<<if _gkrKiraDown>>
<<run setup.kiraToInfirmary()>>
<<elseif $companions[0]>>
<<set $companions[0].health to Math.floor($companions[0].maxHealth * 0.4)>>
<</if>>
<<set $flags.groundskeeperRescueCount++>>
<<set $flags.vaultDebt += 25>>
<<if $flags.groundskeeperRescueCount === 1>>
<<say "Groundskeeper" "The vault extended its protection. Such gifts... are rarely free.">>
<p>Something in his tone makes you uneasy.</p>
<<elseif $flags.groundskeeperRescueCount === 2>>
<p>He gives you a long look.</p>
<<say "Groundskeeper" "Twice now. The vault remembers. It will collect what is owed... eventually.">>
<p class="warning">You feel a strange weight settle in your chest. A debt unpaid.</p>
<<elseif $flags.groundskeeperRescueCount >= 3>>
<p>His eyes hold something like pity.</p>
<<say "Groundskeeper" "<<print $flags.groundskeeperRescueCount>> times. Your debt grows heavy. When the vault calls to collect... you will answer. There is no alternative.">>
<p class="warning">The weight of your debt is almost physical now. Something will come for what you owe.</p>
<<if $flags.vaultDebt >= 50>>
<<set $flags.debtCollectionPending to true>>
<</if>>
<</if>>
<<say "Groundskeeper" "Rest. Recover. And be more careful.">>
<p>He rises slowly, joints creaking, and shuffles toward the door.</p>
<<set _returnTo to "Vault_Hub">>
<<if $temp && $temp.defeatReturnPassage>><<unset $temp.defeatReturnPassage>><</if>>
<div class="choice-container">
<<vchoice "\"Thank you.\"" "Combat_Groundskeeper_Thanks" "talk" "talk">>
<<vchoice "Rest and recover" _returnTo "action" "sleep">>
</div><<run VaultUI.setBackground("medical")>>
<<run VaultUI.setTimeOfDay("morning")>>
<p>The Groundskeeper pauses at the door.</p>
<<say $player.name "Thank you. For saving us.">>
<p>He turns. For a moment, something flickers in his ancient eyes. Almost warmth.</p>
<<say "Groundskeeper" "I have watched over this vault for longer than you can imagine. I have seen many come and go.">>
<p>He looks at you—really looks, as if seeing something beyond your face.</p>
<<say "Groundskeeper" "You and the girl... you are different. The vault chose you for a reason.">>
<<say $player.name "Chose us?">>
<<say "Groundskeeper" "Rest. The answers will come in time.">>
<p>He leaves. The door closes softly behind him.</p>
<p class="internal-thought">What did he mean, the vault chose us?</p>
<<set _returnTo to "Vault_Hub">>
<div class="choice-container">
<<vchoice "Rest and think" _returnTo "action" "sleep">>
</div><<run VaultUI.setBackgroundDirect(setup.combatBackgroundImage())>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<h2>Alone</h2>
<<playerMediaTarget>>
<<combatActionVideo "player-defeated-video" "combat/player_defeated" _playerMediaTarget>>
<p>The final blow sends you crashing to the ground. No one is coming to help. No one to drag you to safety.</p>
<p>Your vision dims. The raiders laugh, their voices distant and echoing.</p>
<<set _roll to random(1, 100)>>
<<if _roll <= 40 || setup.defeatHasMen()>>
<p>They kick you a few times, rifle through your belongings, and leave you for dead.</p>
<p class="narrator">Hours later, you wake. Everything hurts. But you're alive.</p>
<<advanceTime 3>>
<p>You crawl to cover, patch yourself up as best you can. The journey back to the vault will be brutal.</p>
<<set $player.health to Math.floor($player.maxHealth * 0.2)>>
<<set $player.energy to 10>>
<<set $player.carriedFood to Math.max(0, $player.carriedFood - 2)>>
<<set $player.carriedWater to Math.max(0, $player.carriedWater - 1)>>
<div class="choice-container">
<<vchoice "Limp back to the vault" "Vault_Hub" "action" "health">>
</div>
<<else>>
<p>Rough hands grab you. They're not done with you yet.</p>
<<set $flags.dubconEncountered to true>>
<p class="narrator">When you finally come to, you're bound. Bruised. But alive.</p>
<<advanceTime 4>>
<p>It takes everything you have to escape, slipping your bonds in the night and fleeing into the darkness.</p>
<<set $player.health to Math.floor($player.maxHealth * 0.15)>>
<<set $player.energy to 5>>
<<set $player.lust to Math.min(100, ($player.lust || 0) + 15)>>
<<set $player.carriedFood to 0>>
<<set $player.carriedWater to 0>>
<div class="choice-container">
<<vchoice "Escape back to the vault" "Vault_Hub" "action" "run">>
</div>
<</if>><<run VaultUI.setBackgroundDirect(setup.combatBackgroundImage())>>
<<run VaultUI.setTimeOfDay("night")>>
<h2>Darkness Falls</h2>
<<playerMediaTarget>>
<<combatActionVideo "player-defeated-video" "combat/player_defeated" _playerMediaTarget>>
<p>You fall. Somewhere nearby, Kira has already fallen—unconscious, maybe worse.</p>
<p>The raiders stand over you both. Victorious. Hungry.</p>
<<set _bdHome to ($flags.kiraIsUnconscious && setup.kiraKnockoutIsFirst()) ? "Carry_Kira_Vault_Arrival" : "Vault_Hub">>
<<if setup.kiraLaterKnockout()>><<set _bdHome to "Kira_Unconscious_Return_Simple">><</if>>
<<set _roll to random(1, 100)>>
<<if _roll <= 50 || $currentLocation === "hollow" || setup.defeatHasMen()>>
<p>They take what they want from your packs. Argue about what to do with you. In the end, they leave—maybe satisfied, maybe just lazy.</p>
<p class="narrator">You wake to cold night air. Every breath is agony.</p>
<p>Kira lies a few feet away. Still breathing. Barely.</p>
<<say $player.name "Kira...">>
<p>You crawl to her. Check her pulse. Weak but steady.</p>
<p>Together, somehow, you make it back. Neither of you remembers much of the journey.</p>
<<set $player.health to Math.floor($player.maxHealth * 0.15)>>
<<set $player.energy to 5>>
<<if $companions && $companions[0]>>
<<set $companions[0].health to Math.floor($companions[0].maxHealth * 0.15)>>
<</if>>
<<set $player.carriedFood to 0>>
<<set $player.carriedWater to 0>>
<div class="choice-container">
<<vchoice "Collapse at the vault gates" _bdHome "action" "health">>
</div>
<<else>>
<p>They don't leave. They have plans for you both.</p>
<<set $flags.dubconEncountered to true>>
<p class="narrator">The next hours are a blur of pain and darkness. But eventually, an opportunity comes.</p>
<p>A distraction. A moment of carelessness from your captors. You grab Kira—still barely conscious—and run.</p>
<<set $player.health to Math.floor($player.maxHealth * 0.1)>>
<<set $player.energy to 3>>
<<set $player.lust to Math.min(100, ($player.lust || 0) + 20)>>
<<if $companions && $companions[0]>>
<<set $companions[0].health to Math.floor($companions[0].maxHealth * 0.1)>>
<<set $companions[0].lust to Math.min(100, ($companions[0].lust || 0) + 25)>>
<<addTension "kira" 15 "" "combat">>
<</if>>
<<set $player.carriedFood to 0>>
<<set $player.carriedWater to 0>>
<p>Neither of you speaks about what happened. Some things are better left in the dark.</p>
<div class="choice-container">
<<vchoice "Return to the vault" _bdHome "action" "run">>
</div>
<</if>><<if $player.health lte 0>>
<<set $player.health to 1>>
<</if>>
<<run VaultUI.showCharacter("kira", "center", "worried")>>
You wake to Kira dragging you behind a collapsed wall. Her face is bloody, one arm hanging at an odd angle.
<<say "Kira" "Stay down. They think we're dead.">>
Footsteps. Raider voices, moving away.
<<say "Kira" "That was too close. We need to get back to the vault.">>
She looks at you with something new in her eyes. Not just suspicion anymore. Concern.
<<say "Kira" "Can you walk?">>
<<relationChange "kira" "trust" 3>>
<<relationChange "kira" "affection" 2>>
<<set _returnTo to ($temp && $temp.defeatReturnPassage) ? $temp.defeatReturnPassage : "Vault_Hub">>
<<if $temp && $temp.defeatReturnPassage>><<unset $temp.defeatReturnPassage>><</if>>
<<turnJourneyHome _returnTo>>
<div class="choice-container">
<<vchoice "\"Thanks for saving me.\"" _returnTo "talk" "talk">>
<<vchoice "Nod and stand" _returnTo "action" "strength">>
</div><<set _seduced to setup.seducedEnemy()>>
<<set _savedReturnPassage to $combat.returnPassage || "Vault_Hub">>
<<run VaultUI.setBackgroundDirect(setup.combatBackgroundImage())>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<h2>Intimate Victory</h2>
<<print setup.enemyRef(_seduced, true)>> is completely under your control, eyes glazed with desire and submission.
<<if _seduced.gender === "female">><<postBattleVideo "seduced_fuck">><</if>>
<<if _seduced.gender === "female">>
You take what you want from her. In the Reclaimed, pleasure is currency, and she's paying her surrender.
<<say _seduced.name "Please... more...">>
<<set $player.lust to Math.min(100, ($player.lust || 0) + 20)>>
<<if setup.kiraInFight()>>
<<addTension "kira" 15 "He's... doing it right here. I should look away." "combat">>
<<run VaultUI.showCharacter("kira", "center", "aroused")>>
<<say "Kira" "I... I'll keep watch.">>
She turns away, but not before you catch her watching. Her breathing has changed.
<<relationChange "kira" "lust" 20>>
<<relationChange "kira" "trust" -2>>
<</if>>
<<set $vault.scrap += 2>>
<<set $stats.combat.enemiesSeduced += 1>>
<<if setup.kiraInFight()>><<notify "intimate">>+20 Lust. Kira is watching...<</notify>><<else>><<notify "intimate">>+20 Lust<</notify>><</if>>
<</if>>
<<endCombat>>
<div class="choice-container">
<<vchoice "Finish and leave" _savedReturnPassage "move" "crystal">>
</div><<if $combat.kiraIncapacitated && $combat.companionInCombat === "kira" && (setup.kiraKnockoutAllowed() || setup.kiraAlreadyDown())>>
<<goto "Combat_Flee_With_Kira">>
<<else>>
<<silently>>
<<playerMediaTarget>>
<<set _fleeMediaTarget to _playerMediaTarget>>
<<set _savedReturnPassage to $combat.returnPassage || "Vault_Hub">>
<<set $combat.result to "fled">>
<<endCombat>>
<</silently>>
<div class="combat-card player-card flee-card">
<div class="card-header flee-header">
<span class="card-icon"><<icon "run">></span>
<span class="card-title">ESCAPE</span>
</div>
<div class="card-body">
<<combatActionVideo "flee-video" "combat/flee" _fleeMediaTarget>>
<p>You break away from the fight, putting distance between yourself and your enemies.</p>
<<if $companions && $companions[0] && $combat.companionInCombat === "kira" && !$combat.kiraIncapacitated>>
<p class="player-speech">"Kira, we're leaving!"</p>
<p>She falls in behind you without question, covering your retreat as you both disappear into the ruins.</p>
<<else>>
<p>Your heart pounds as you sprint through the wasteland, weaving between cover until you're certain you've lost them.</p>
<</if>>
<p class="tactical-note">You escaped, but gained nothing from the encounter.</p>
</div>
</div>
<div class="choice-container">
<<vchoice "Continue" _savedReturnPassage "action" "forward">>
</div>
<</if>><<set _currentEnemyIndex to ($combat.pendingSexAction && $combat.pendingSexAction.enemyIndex !== undefined) ? $combat.pendingSexAction.enemyIndex : 0>>
<<set _enemy to $combat.enemies[_currentEnemyIndex]>>
<<set _intent to ($combat.pendingSexAction && $combat.pendingSexAction.intent) ? $combat.pendingSexAction.intent : null>>
<<if !_enemy>>
<<goto "Combat_Actions">>
<</if>>
<<if _intent>>
<<set _c to $clothing.player>>
<<set _pos to $combat.positions.player>>
<<switch _intent>>
<<case "ride">>
<p class="explicit"><<print _enemy.name>> straddles you, positioning her dripping pussy over your exposed cock.</p>
<<say _enemy.name "Mmm, nice and hard for me. Let me take care of that.">>
<<if $player.lust gte 90>>
<p class="narrator">You can't think straight. You NEED this.</p>
<div class="choice-container">
<<vchoice "Continue" "Combat_Player_Ridden_NoEscape" "action" "forward">>
</div>
<<else>>
<div class="choice-container">
<<vchoice "Push her off!" "Combat_Escape_Sex_Player" "action" "strength">>
<<vchoice "Let her ride you" "Combat_Let_Ride" "intimate" "corruption">>
<<if $companions && $companions[0] && $companions[0].tension gte 50 && !$combat.kiraIncapacitated>>
<<vchoice "Look at Kira while she rides you" "Combat_Ride_LookKira" "intimate" "search">>
<</if>>
</div>
<</if>>
<<case "blowjob">>
<p class="explicit"><<print _enemy.name>> drops to her knees in front of you, eyes locked on your hard cock.</p>
<<say _enemy.name "Let me taste you, warrior.">>
She wraps her lips around your shaft before you can react.
<<set $player.lust to Math.min(100, $player.lust + setup.playerSexConfig.enemySex.blowjob.escapePlayerLust)>>
<<if $player.lust gte 90>>
<p class="explicit">Fuck— her mouth is incredible. You can't pull away.</p>
<div class="choice-container">
<<vchoice "Continue" "Combat_Player_Blowjob_NoEscape" "action" "forward">>
</div>
<<else>>
<div class="choice-container">
<<vchoice "Push her away" "Combat_Escape_Sex_Player" "action" "strength">>
<<vchoice "Grab her head and fuck her throat" "Combat_Facefuck" "intimate" "rapid-strikes">>
<<vchoice "Let her continue" "Combat_Let_Blowjob" "intimate" "corruption">>
</div>
<</if>>
<<case "handjob">>
<p class="explicit"><<print _enemy.name>> grabs your exposed cock mid-fight, stroking it.</p>
<<say _enemy.name "Fighting with this thing hard? Let me help.">>
<<set $player.lust to Math.min(100, $player.lust + setup.playerSexConfig.enemySex.handjob.escapePlayerLust)>>
<div class="choice-container">
<<vchoice "Slap her hand away" "Combat_Escape_Sex_Player" "action" "hand">>
<<vchoice "Let her stroke you (vulnerable)" "Combat_Let_Handjob" "intimate" "corruption">>
</div>
<<case "leg_sweep_female">>
<<combatNarrative "female_attack_leg_sweep" "She sweeps your legs out from under you!" "explicit">>
<<set _cfg to setup.playerSexConfig.enemySex.blowjob>>
<<set _resistRoll to random(1, 100)>>
<<set _agiBonus to Math.floor($player.agility / 3)>>
<<if _resistRoll + _agiBonus gt _cfg.escapeDC.base>>
You jump over the sweep, landing ready to fight.
<<say "Player" "Nice try.">>
<<set _enemy.sexIntent to null>>
<<enemySexMissVideo _enemy>>
<div class="choice-container">
<<vchoice "Counter-attack!" "Combat_Actions" "action" "attack">>
</div>
<<else>>
You crash hard onto your back! The impact knocks the wind out of you.
<<set $combat.positions.player to "prone_back">>
<<set $combat.lastAttackWasGrab to true>>
<<combatTableVideo "enemy-sex-player-video" "enemySexPlayerVideoFolders" _intent "player" null _enemy>>
<<set _fallDmg to -random(3, 6)>>
<<clampStat "player.health" _fallDmg 0 100>>
<<if $combat.log>>
<<run $combat.log.push({type: "debuff", text: "You're swept onto your back!", icon: "prone"})>>
<</if>>
<<set _mountTauntPool to setup.combatNarrative.female_mount_taunt || ["Gotcha. Now you're mine."]>>
<p class="explicit">She's on you before you can recover, straddling your chest!</p>
<<if setup.combatNarrative.female_mount_taunt_narration>><p class="explicit"><<print setup.combatNarrative.female_mount_taunt_narration.random()>></p><</if>>
<<say _enemy.name _mountTauntPool.random()>>
<<if $clothing.player.dickExposed>>
<p class="explicit">Your hard cock juts up between her thighs, brushing against her.</p>
<<modifyCurrentEnemyLust 15>>
<</if>>
<div class="choice-container">
<<vchoice "Throw her off!" "Combat_Escape_Mount_Player" "action" "strength">>
<<if $clothing.player.dickExposed>>
<<vchoice "Let her have her way" "Combat_Let_Mount_Player" "intimate" "corruption">>
<</if>>
</div>
<</if>>
<<case "push_down_mount">>
<<combatNarrative "female_attack_push_down_mount" "She shoves you hard and sends you sprawling!" "explicit">>
<<set _cfg to setup.playerSexConfig.enemySex.mounted>>
<<set _resistRoll to random(1, 100)>>
<<set _strBonus to Math.floor($player.strength / 3)>>
<<if _resistRoll + _strBonus gt _cfg.escapeDC.base>>
You brace and stay on your feet, shoving her back!
<<set _enemy.sexIntent to null>>
<<enemySexMissVideo _enemy>>
<div class="choice-container">
<<vchoice "Counter-attack!" "Combat_Actions" "action" "attack">>
</div>
<<else>>
<<set $combat.positions.player to "prone_back">>
<<set $combat.lastAttackWasGrab to true>>
<<combatTableVideo "enemy-sex-player-video" "enemySexPlayerVideoFolders" _intent "player" null _enemy>>
<<set _pushDmg to -random(2, 4)>>
<<clampStat "player.health" _pushDmg 0 100>>
<<if $combat.log>>
<<run $combat.log.push({type: "debuff", text: "You're pushed down!", icon: "prone"})>>
<</if>>
She straddles you, pinning your arms with her knees.
<<set _mountTauntPool to setup.combatNarrative.female_mount_taunt || ["Mmm, I like this position."]>>
<<if setup.combatNarrative.female_mount_taunt_narration>><p class="explicit"><<print setup.combatNarrative.female_mount_taunt_narration.random()>></p><</if>>
<<say _enemy.name _mountTauntPool.random()>>
<<if $clothing.player.dickExposed>>
<p class="explicit">Your cock throbs inches from her pussy. She notices.</p>
<<say _enemy.name "Oh? Is THAT for me?">>
<<modifyCurrentEnemyLust 20>>
<</if>>
<div class="choice-container">
<<vchoice "Buck her off!" "Combat_Escape_Mount_Player" "action" "strength">>
<<if $clothing.player.dickExposed>>
<<vchoice "Let her take what she wants" "Combat_Let_Mount_Player" "intimate" "corruption">>
<</if>>
</div>
<</if>>
<<case "grab_and_straddle">>
<<combatNarrative "female_attack_grab_straddle" "She grabs you and takes you down, straddling your hips!" "explicit">>
<<set _cfg to setup.playerSexConfig.enemySex.mounted>>
<<set _resistRoll to random(1, 100)>>
<<if _resistRoll gt _cfg.escapeDC.base>>
You twist free and shove her away!
<<set _enemy.sexIntent to null>>
<<enemySexMissVideo _enemy>>
<div class="choice-container">
<<vchoice "Attack while she's off-balance!" "Combat_Attack_Distracted" "action" "attack">>
</div>
<<else>>
<<set $combat.positions.player to "pinned">>
<<set $combat.lastAttackWasGrab to true>>
<<combatTableVideo "enemy-sex-player-video" "enemySexPlayerVideoFolders" _intent "player" null _enemy>>
<<if $combat.log>>
<<run $combat.log.push({type: "debuff", text: "You're pinned down!", icon: "pinned"})>>
<</if>>
<p class="explicit">Her thighs lock tight around you. You can feel the heat of her against your crotch.</p>
<<set _mountTauntPool to setup.combatNarrative.female_mount_taunt || ["Gotcha. Now stay still."]>>
<<if setup.combatNarrative.female_mount_taunt_narration>><p class="explicit"><<print setup.combatNarrative.female_mount_taunt_narration.random()>></p><</if>>
<<say _enemy.name _mountTauntPool.random()>>
<<if $clothing.player.dickExposed>>
<p class="explicit">Your cock presses against her as she grinds down.</p>
<<set $player.lust to Math.min(100, $player.lust + setup.playerSexConfig.enemySex.teasing.playerLust)>>
<<modifyCurrentEnemyLust 15>>
<</if>>
<div class="choice-container">
<<vchoice "Break free!" "Combat_Escape_Mount_Player" "action" "agility">>
<<vchoice "Grab her hips" "Combat_Grab_Her_Hips" "intimate" "hand">>
</div>
<</if>>
<<case "knee_to_balls">>
<p class="explicit"><<print _enemy.name>> drives her knee up toward your groin!</p>
<<set _dodgeRoll to random(1, 100)>>
<<set _dodgeDC to 40>>
<<if _dodgeRoll gt _dodgeDC>>
You twist aside, barely avoiding the blow!
<<set _enemy.sexIntent to null>>
<<enemySexMissVideo _enemy>>
<div class="choice-container">
<<vchoice "Counter-attack!" "Combat_Actions" "action" "attack">>
</div>
<<else>>
WHACK! Her knee connects solidly!
<<set _kneeDmg to -random(5, 10)>>
<<clampStat "player.health" _kneeDmg 0 100>>
<<set $combat.playerEffects to ($combat.playerEffects || {})>>
<<set $combat.playerEffects.stunned to 1>>
You double over in pain, gasping!
<<say _enemy.name "That's what happens when you fight with that thing out.">>
She shoves you down while you're stunned!
<<set $combat.positions.player to "prone_back">>
<<set $combat.lastAttackWasGrab to true>>
<<combatTableVideo "enemy-sex-player-video" "enemySexPlayerVideoFolders" _intent "player" null _enemy>>
<<if $combat.log>>
<<run $combat.log.push({type: "debuff", text: "You're shoved down!", icon: "prone"})>>
<</if>>
<p class="explicit">Before you can recover, she's straddling you.</p>
<div class="choice-container">
<<vchoice "Try to fight through the pain" "Combat_Escape_Mount_Player" "action" "will">>
<<if $clothing.player.dickExposed>>
<<vchoice "You can't resist right now..." "Combat_Let_Mount_Player" "intimate" "corruption">>
<</if>>
</div>
<</if>>
<<case "pounce_player">>
<<combatNarrative "female_attack_pounce" "She POUNCES with inhuman speed, slamming you to the ground!" "explicit">>
<<set _dodgeRoll to random(1, 100)>>
<<set _dodgeDC to 55>>
<<if _dodgeRoll gt _dodgeDC>>
You dive aside at the last second!
<<set _enemy.sexIntent to null>>
<<enemySexMissVideo _enemy>>
<div class="choice-container">
<<vchoice "Counter while she recovers!" "Combat_Actions" "action" "attack">>
</div>
<<else>>
<<set $combat.positions.player to "pinned">>
<<set $combat.lastAttackWasGrab to true>>
<<combatTableVideo "enemy-sex-player-video" "enemySexPlayerVideoFolders" _intent "player" null _enemy>>
<<set _pounceDmg to -random(4, 8)>>
<<clampStat "player.health" _pounceDmg 0 100>>
<<if $combat.log>>
<<run $combat.log.push({type: "debuff", text: "You're pounced and pinned!", icon: "pinned"})>>
<</if>>
<p class="explicit">Her body presses against yours. You can feel an unnatural heat radiating from her.</p>
<<set _mountTauntPool to setup.combatNarrative.female_mount_taunt || ["Mmm, I've caught myself a treat."]>>
<<if setup.combatNarrative.female_mount_taunt_narration>><p class="explicit"><<print setup.combatNarrative.female_mount_taunt_narration.random()>></p><</if>>
<<say _enemy.name _mountTauntPool.random()>>
<<if _enemy.dealsLustDamage>>
<p class="explicit">Her touch sends waves of arousal through you.</p>
<<set $player.lust to Math.min(100, $player.lust + setup.playerSexConfig.enemySex.supernatural.clawLust)>>
<</if>>
<div class="choice-container">
<<vchoice "Fight her off!" "Combat_Escape_Mount_Player" "action" "will">>
<<vchoice "Give in to the pleasure" "Combat_Supernatural_Mount" "intimate" "corruption">>
</div>
<</if>>
<<case "pants_yank_player">>
<<combatNarrative "female_attack_pants_yank" "She grabs your waistband and YANKS— your pants come down!" "explicit">>
<<set _resistRoll to random(1, 100)>>
<<if _resistRoll gt 60>>
You grab your pants and hold them up, stumbling back!
<<set _enemy.sexIntent to null>>
<<enemySexMissVideo _enemy>>
<div class="choice-container">
<<vchoice "Attack while she's off-balance!" "Combat_Actions" "action" "attack">>
</div>
<<else>>
Your weakened pants tear away! Your cock springs free!
<<set $clothing.player.bottom to 0>>
<<set $clothing.player.dickExposed to true>>
<<combatTableVideo "enemy-sex-player-video" "enemySexPlayerVideoFolders" _intent "player" null _enemy>>
<<say _enemy.name "There it is. That's what I wanted to see.">>
<<modifyCurrentEnemyLust 20>>
<<set $combat.lastAttackWasGrab to true>>
<p class="explicit">You're exposed now. Vulnerable.</p>
<<if $combat.companionInCombat === "kira">>
<<say "Kira" "She— she stripped you!">>
<<addKiraLust setup.kiraSexConfig.crop.general.kiraLust>>
<</if>>
<div class="choice-container">
<<vchoice "Cover yourself and fight!" "Combat_Actions" "action" "defense">>
<<vchoice "Let her see what you've got" "Combat_Show_Off_Player" "intimate" "allure">>
</div>
<</if>>
<<case "whip_cock">>
<<set _hitRoll to random(1, 100)>>
<<if _hitRoll lte 70>>
<<combatTableVideo "enemy-sex-player-video" "enemySexPlayerVideoFolders" _intent "player" null _enemy>>
<<combatNarrative "female_attack_whip_cock" "CRACK! The whip catches your exposed cock!" "explicit">>
<<set _whipDmg to -random(3, 6)>>
<<clampStat "player.health" _whipDmg 0 100>>
<<set $player.lust to Math.min(100, $player.lust + random(5, 12))>>
You cry out— half pain, half something else.
<<say _enemy.name "Mmm, you liked that, didn't you?">>
<<set $combat.lastAttackWasWhip to true>>
<<if $player.lust gte 70>>
<p class="explicit">The sting of the whip against your sensitive cock is driving you crazy.</p>
<</if>>
<<else>>
You twist aside and the whip misses!
<<enemySexMissVideo _enemy>>
<</if>>
<div class="choice-container">
<<vchoice "Continue fighting" "Combat_Actions" "move" "map">>
</div>
<<case "cock_grab">>
<<combatTableVideo "enemy-sex-player-video" "enemySexPlayerVideoFolders" _intent "player" null _enemy>>
<<combatNarrative "female_attack_cock_grab" "She reaches out and GRABS your exposed cock firmly!" "explicit">>
Her fingers wrap around your shaft, squeezing.
<<say _enemy.name "Fighting me with THIS out? Bold.">>
<<set $player.lust to Math.min(100, $player.lust + setup.playerSexConfig.enemySex.handjob.escapePlayerLust)>>
<<modifyCurrentEnemyLust 10>>
She gives it a rough stroke before you can pull away.
<div class="choice-container">
<<vchoice "Slap her hand away" "Combat_Escape_Sex_Player" "action" "hand">>
<<vchoice "Enjoy it for a moment" "Combat_Let_Handjob" "intimate" "corruption">>
</div>
<<case "teasing_handjob">>
<<combatTableVideo "enemy-sex-player-video" "enemySexPlayerVideoFolders" _intent "player" null _enemy>>
<<combatNarrative "female_attack_teasing_handjob" "Her fingers slide along your shaft slowly, teasing..." "explicit">>
<<say _enemy.name "Can't push me away now, can you?">>
She teases you mercilessly, keeping you on edge.
<<set $player.lust to Math.min(100, $player.lust + setup.playerSexConfig.enemySex.handjob.letHandjobLust)>>
<p class="explicit">Her thumb circles the head of your cock. You're completely at her mercy.</p>
<div class="choice-container">
<<vchoice "Try to break free" "Combat_Escape_Bound_Player" "action" "strength">>
<<vchoice "Let her edge you" "Combat_Let_Teasing" "intimate" "corruption">>
</div>
<<case "claw_caress">>
<<combatTableVideo "enemy-sex-player-video" "enemySexPlayerVideoFolders" _intent "player" null _enemy>>
<<combatNarrative "female_attack_claw_caress" "Her claws trace down your chest, leaving thin red lines..." "explicit">>
<<say _enemy.name "So fragile. I could tear you apart... or make you feel SO good.">>
<<set $player.lust to Math.min(100, $player.lust + setup.playerSexConfig.enemySex.supernatural.clawLust)>>
<<if _enemy.dealsLustDamage>>
<<set $player.lust to Math.min(100, $player.lust + setup.playerSexConfig.enemySex.supernatural.clawLust)>>
<</if>>
<p class="explicit">Her sharp nails drag across sensitive skin, the threat of pain mixing with pleasure.</p>
<div class="choice-container">
<<vchoice "Push her away carefully" "Combat_Escape_Sex_Player" "action" "agility">>
<<vchoice "Let her continue" "Combat_Claw_Continue" "intimate" "corruption">>
</div>
<<case "drain_touch">>
<<combatTableVideo "enemy-sex-player-video" "enemySexPlayerVideoFolders" _intent "player" null _enemy>>
<<combatNarrative "female_attack_drain_touch" "Her touch BURNS with supernatural lust— your body trembles!" "explicit">>
<<set $player.lust to Math.min(100, $player.lust + setup.playerSexConfig.enemySex.supernatural.mountLust)>>
<<set _enemy.health += 10>>
<<set _enemy.health to Math.min(_enemy.health, _enemy.maxHealth)>>
<<say _enemy.name "Mmm, your desire tastes delicious.">>
<p class="explicit">You feel drained yet incredibly aroused. She feeds on your lust.</p>
<div class="choice-container">
<<vchoice "Fight through the haze" "Combat_Actions" "action" "will">>
</div>
<<default>>
<<set _enemy.sexIntent to null>>
<</switch>>
<<if $combat.companionInCombat === "kira">>
<<if _intent === "ride" || _intent === "blowjob">>
<<if $companions && $companions[0] && $companions[0].affection gte 40>>
<<say "Kira" "Are you— are you SERIOUS right now?!">>
<p class="narrator">She sounds jealous. And maybe something else.</p>
<<if $companions[0].jealousy>>
<<set $companions[0].jealousy += 15>>
<</if>>
<<else>>
<<say "Kira" "Focus on the damn fight!">>
<</if>>
<</if>>
<</if>>
<</if>><<set _esp to $combat.pendingSexAction>>
<<set _enemy to (_esp && _esp.enemyIndex !== undefined && $combat.enemies[_esp.enemyIndex]) ? $combat.enemies[_esp.enemyIndex] : $combat.enemies[0]>>
<<set _escIntent to (_esp && _esp.intent) ? _esp.intent : _enemy.sexIntent>>
<<attemptEscape "player" "sexual_assault">>
<<if $tempEscaped>>
<<playerMediaTarget>>
<<combatActionVideo "player-breaks-free-video" "combat/player_breaks_free" _playerMediaTarget>>
You shove her off and roll away!
<<set $combat.positions.player to "standing">>
<div class="choice-container">
<<vchoice "Continue fighting" "Combat_Actions" "move" "map">>
</div>
<<else>>
She's too strong! Or you're too turned on to fight it.
<<if _escIntent === "ride">>
<div class="choice-container">
<<vchoice "Continue" "Combat_Player_Ridden_NoEscape" "action" "forward">>
</div>
<<elseif _escIntent === "blowjob">>
<div class="choice-container">
<<vchoice "Continue" "Combat_Player_Blowjob_NoEscape" "action" "forward">>
</div>
<<elseif _escIntent === "handjob">>
<div class="choice-container">
<<if previous() === "Combat_Let_Handjob">>
<<vchoice "Continue" "Combat_Handjob_Finish" "action" "forward">>
<<else>>
<<vchoice "Continue" "Combat_Let_Handjob" "action" "forward">>
<</if>>
</div>
<<else>>
<<set _playerPos to $combat.positions.player || "standing">>
<<set _dickOut to $clothing.player.dickExposed>>
<<if $player.lust >= 85 && _dickOut>>
<<set _finishChance to 40 + Math.floor(($player.lust - 85) * 4)>>
<<if random(1, 100) <= _finishChance>>
<div class="combat-action-result ultra-explicit">
<<switch _playerPos>>
<<case "standing">>
<<combatNarrative "female_finishes_player_standing" "Her hand wraps around your throbbing cock and STROKES. \"You're so fucking hard! Let me help you with that—\"" "explicit ultra">>
<<combatNarrative "player_forced_cum_standing" "Three strokes and you EXPLODE! Your cock erupts, cum shooting onto the ground as your knees buckle!" "explicit ultra">>
<<case "kneeling">>
<<combatNarrative "female_finishes_player_kneeling" "She grabs your cock from above. \"On your knees with your dick out? Pathetic.\" She pumps you ruthlessly." "explicit ultra">>
<<combatNarrative "player_forced_cum_kneeling" "You cum all over yourself, moaning and shaking on your knees while she laughs!" "explicit ultra">>
<<case "prone_back" "prone_front">>
<<combatNarrative "female_finishes_player_prone" "She kneels over you and grabs your cock. \"Look at you, flat on your back with this thing twitching!\"" "explicit ultra">>
<<combatNarrative "player_forced_cum_prone" "You cum helplessly, cock pulsing in her grip as she milks you onto your own stomach!" "explicit ultra">>
<<default>>
<p class="explicit ultra">She grabs your exposed cock and strokes fast! "You're about to pop, aren't you?"</p>
<p class="explicit ultra">You cum HARD, completely at her mercy, body shaking as she drains you!</p>
<</switch>>
<<playerMediaTarget _enemy>>
<<combatActionVideo "enemy-sex-player-video" "combat/enemy_handjob_player" _playerMediaTarget>>
<<fillCombatVideoBox "enemy-sex-player-video" "combat/player_climax" _playerMediaTarget>>
<<set $player.lust to 0>><<run setup.playerReleased()>>
<<run setup.stunPlayer(2, "orgasm")>>
<<set $player.energy to Math.max(0, $player.energy - 10)>>
<p class="system-alert">She made you cum! Stunned for 2 turns!</p>
<<if $combat.companionInCombat === "kira">>
<<say "Kira" "Did you just— in the middle of a FIGHT?!">>
<<addTension "kira" 3 "" "combat">>
<</if>>
</div>
<div class="choice-container">
<<vchoice "Try to recover" "Combat_Enemy_Turn" "move" "map">>
</div>
<<else>>
<p class="explicit">She takes advantage of your vulnerability, hands roaming your body...</p>
<<playerMediaTarget _enemy>>
<<combatActionVideo "enemy-sex-player-video" "combat/enemy_handjob_player" _playerMediaTarget>>
<<if _dickOut>>
<p class="explicit">Her fingers brush against your exposed cock, making you gasp!</p>
<<set $player.lust to 100>>
<<else>>
<<set $player.lust to Math.min(100, $player.lust + 15)>>
<</if>>
<div class="choice-container">
<<vchoice "Continue" "Combat_Enemy_Turn" "move" "map">>
</div>
<</if>>
<<elseif _dickOut>>
<p class="explicit">She takes advantage of your vulnerability, hands finding your exposed cock...</p>
<<playerMediaTarget _enemy>>
<<combatActionVideo "enemy-sex-player-video" "combat/enemy_handjob_player" _playerMediaTarget>>
<<set _lustGain to random(15, 25)>>
<<set $player.lust to Math.min(100, $player.lust + _lustGain)>>
<<if $player.lust >= 90>>
<p class="explicit lust-high">"Oh, you're getting close aren't you?" She strokes you slowly, deliberately keeping you on edge.</p>
<<else>>
<p class="explicit">"Nice cock. Let's see how long you can last..." She teases you mercilessly.</p>
<</if>>
<div class="choice-container">
<<vchoice "Continue" "Combat_Enemy_Turn" "move" "map">>
</div>
<<else>>
<p class="explicit">She takes advantage of your vulnerability, hands roaming your body...</p>
<<playerMediaTarget _enemy>>
<<combatActionVideo "enemy-sex-player-video" "combat/enemy_grinds_player" _playerMediaTarget>>
<<set $player.lust to Math.min(100, $player.lust + 15)>>
<div class="choice-container">
<<vchoice "Continue" "Combat_Enemy_Turn" "move" "map">>
</div>
<</if>>
<</if>>
<</if>><<playerRiddenCardFlow>><<playerRiddenForcedCardFlow>><<playerBlowjobCardFlow>><<playerFacefuckCardFlow>><<kiraRideLookCardFlow>><<playerBlowjobForcedCardFlow>><<playerHandjobCardFlow>><<playerHandjobFinishCardFlow>><<playerEscapeMountCardFlow>><<playerMountedCardFlow>><<playerStrippedMountCardFlow>><<playerGrabHipsCardFlow>><<playerSupernaturalMountCardFlow>><<playerEscapeBoundCardFlow>><<playerTeasingCardFlow>><<playerClawCardFlow>><<playerShowOffCardFlow>><<widget "enemySexMissVideo">>
<div id="enemy-sex-player-video" class="card-video-container combat-action-video" style="display:none"></div>
<<playerMediaTarget _args[0]>>
<<enemyAttackVideo "enemy-sex-player-video" `setup.weaponFor(_args[0])` "miss" false _playerMediaTarget>>
<</widget>><<widget "playerSexCardFooter">>
<<set _pHP to (typeof $player.health === "number") ? $player.health : 100>>
<<set _pMaxHP to $player.maxHealth || 100>>
<<set _pLust to (typeof $player.lust === "number") ? $player.lust : 0>>
<div class="player-status-row">
<span class="player-hp"><<icon "health" "small">> <<print _pHP>>/<<print _pMaxHP>></span>
<span class="player-lust"><<icon "lust" "small">> <<print _pLust>>%</span>
</div>
<</widget>>
<<widget "playerRiddenCard">>
<div class="combat-card player-card player-sex-card">
<div class="card-header sex-header intimate-header">
<span class="card-icon"><<icon "lust">></span>
<span class="card-title">MOUNTED</span>
</div>
<div class="card-body">
<div id="player-ridden-image" class="card-image-container"></div>
<div id="player-ridden-narrative" class="sex-scene-display"></div>
<div id="player-ridden-video" class="card-video-container"></div>
<div id="player-ridden-effects" class="scene-effects"></div>
</div>
<div class="card-footer player-card-footer">
<<playerSexCardFooter>>
</div>
</div>
<</widget>>
<<widget "executePlayerRiddenCard">>
<<silently>>
<<set _enemyIdx to ($combat.pendingSexAction && $combat.pendingSexAction.enemyIndex !== undefined) ? $combat.pendingSexAction.enemyIndex : 0>>
<<set _enemy to $combat.enemies[_enemyIdx]>>
<<setPronouns _enemy>>
<<set $player.lust to Math.min(100, $player.lust + setup.playerSexConfig.enemySex.mounted.playerLust)>>
<<set $flags.playerFuckedInCombat to true>>
<<set $combat.playerJustFucked to "mounted">>
<<set $combat.positions.player to "prone_back">>
<<if $combat.log>>
<<run $combat.log.push({type: "debuff", text: "You're mounted!", icon: "prone"})>>
<</if>>
<<set _enemy.stunned to true>>
<<set _enemy.stunnedTurns to setup.playerSexConfig.cardEffects.stun.standard>>
<<if $combat.companionInCombat === "kira" && $companions && $companions[0] && !$combat.kiraIncapacitated>>
<<addTension "kira" setup.playerSexConfig.kiraWatching.playerMounted.tension>>
<<set _kiraReaction to "Are you FUCKING her?! In the middle of a FIGHT?!">>
<<else>>
<<set _kiraReaction to "">>
<</if>>
<<set window._playerRiddenData to {
enemyName: _enemy.name,
pronoun: _p,
playerLust: $player.lust,
kiraReaction: _kiraReaction,
showVideo: $preferences && $preferences.showVideos
}>>
<<playerMediaTarget>>
<<fillCombatVideoBox "player-ridden-video" "combat/enemy_rides_player" _playerMediaTarget>>
<</silently>>
<<script>>
setTimeout(function() {
var data = window._playerRiddenData;
if (!data) return;
var imageEl = document.getElementById('player-ridden-image');
var narrativeEl = document.getElementById('player-ridden-narrative');
var videoEl = document.getElementById('player-ridden-video');
var effectsEl = document.getElementById('player-ridden-effects');
if (imageEl) {
imageEl.innerHTML = '';
}
if (narrativeEl) {
var html = '<p class="explicit">You don\'t resist. Let her climb on.</p>';
html += '<p class="dialogue enemy-dialogue"><span class="speaker">' + data.enemyName + ':</span> "That\'s it. Just relax and enjoy."</p>';
html += '<p class="explicit">She sinks down onto your cock. Hot. Wet. Tight.</p>';
html += '<p class="explicit">She rides you MID-COMBAT. Bouncing on your cock while the battle rages.</p>';
html += '<p class="explicit">After a minute, she cums hard, clenching around you. STUNNED.</p>';
html += '<p class="explicit">She slumps on top of you, dazed but still straddling you...</p>';
if (data.kiraReaction) {
html += '<p class="dialogue kira-dialogue"><span class="speaker">Kira:</span> "' + data.kiraReaction + '"</p>';
}
narrativeEl.innerHTML = html;
}
if (effectsEl) {
var effects = '<div class="effect-row"><span class="effect negative">+Lust</span></div>';
effects += '<div class="effect-row"><span class="effect positive">Enemy Stunned (2 turns)</span></div>';
effectsEl.innerHTML = effects;
}
}, 50);
<</script>>
<</widget>>
<<widget "playerRiddenCardFlow">>
<<playerRiddenCard>>
<<executePlayerRiddenCard>>
<div class="choice-container">
<<vchoice "Try to stand up" "Combat_Standup_Attempt" "action" "strength">>
</div>
<</widget>>
<<widget "playerRiddenForcedCard">>
<div class="combat-card player-card player-sex-card">
<div class="card-header sex-header forced-header">
<span class="card-icon"><<icon "lust">></span>
<span class="card-title">OVERWHELMED</span>
</div>
<div class="card-body">
<div id="player-ridden-forced-image" class="card-image-container"></div>
<div id="player-ridden-forced-narrative" class="sex-scene-display"></div>
<div id="player-ridden-forced-video" class="card-video-container"></div>
<div id="player-ridden-forced-effects" class="scene-effects"></div>
</div>
<div class="card-footer player-card-footer">
<<playerSexCardFooter>>
</div>
</div>
<</widget>>
<<widget "executePlayerRiddenForcedCard">>
<<silently>>
<<set _enemyIdx to ($combat.pendingSexAction && $combat.pendingSexAction.enemyIndex !== undefined) ? $combat.pendingSexAction.enemyIndex : 0>>
<<set _enemy to $combat.enemies[_enemyIdx]>>
<<setPronouns _enemy>>
<<set $combat.playerJustMounted to true>>
<<set $combat.playerJustFucked to "mounted">>
<<set $combat.positions.player to "prone_back">>
<<if $combat.log>>
<<run $combat.log.push({type: "debuff", text: "You're mounted!", icon: "prone"})>>
<</if>>
<<set _enemy.stunned to true>>
<<set _enemy.stunnedTurns to setup.playerSexConfig.cardEffects.stun.standard>>
<<set $flags.playerFuckedInCombat to true>>
<<if $combat.companionInCombat === "kira" && $companions && $companions[0]>>
<<set _kiraReaction to "FOCUS! Snap out of it!">>
<<else>>
<<set _kiraReaction to "">>
<</if>>
<<set window._playerRiddenForcedData to {
enemyName: _enemy.name,
pronoun: _p,
playerLust: $player.lust,
kiraReaction: _kiraReaction,
showVideo: $preferences && $preferences.showVideos
}>>
<<playerMediaTarget>>
<<fillCombatVideoBox "player-ridden-forced-video" "combat/enemy_rides_player" _playerMediaTarget>>
<</silently>>
<<script>>
setTimeout(function() {
var data = window._playerRiddenForcedData;
if (!data) return;
var narrativeEl = document.getElementById('player-ridden-forced-narrative');
var videoEl = document.getElementById('player-ridden-forced-video');
var effectsEl = document.getElementById('player-ridden-forced-effects');
if (narrativeEl) {
var html = '<p class="explicit">She sinks onto your cock and you MOAN. Can\'t help it.</p>';
html += '<p class="dialogue enemy-dialogue"><span class="speaker">' + data.enemyName + ':</span> "That\'s it. Give in. Let me milk that cock."</p>';
html += '<p class="explicit">She rides you hard, using you, while you lie there unable to resist.</p>';
html += '<p class="explicit">You\'re too horny. Too weak. You let her fuck you.</p>';
html += '<p class="explicit">She cums around you, going limp. STUNNED.</p>';
html += '<p class="explicit">She slumps against you, panting, but still has you trapped inside her...</p>';
if (data.kiraReaction) {
html += '<p class="dialogue kira-dialogue"><span class="speaker">Kira:</span> "' + data.kiraReaction + '"</p>';
}
narrativeEl.innerHTML = html;
}
if (effectsEl) {
var effects = '<div class="effect-row"><span class="effect negative">Too aroused to resist!</span></div>';
effects += '<div class="effect-row"><span class="effect positive">Enemy Stunned (2 turns)</span></div>';
effectsEl.innerHTML = effects;
}
}, 50);
<</script>>
<</widget>>
<<widget "playerRiddenForcedCardFlow">>
<<playerRiddenForcedCard>>
<<executePlayerRiddenForcedCard>>
<div class="choice-container">
<<vchoice "Try to get up" "Combat_Standup_Attempt" "action" "strength">>
</div>
<</widget>>
<<widget "playerBlowjobCard">>
<div class="combat-card player-card player-sex-card">
<div class="card-header sex-header intimate-header">
<span class="card-icon"><<icon "lust">></span>
<span class="card-title">SERVICED</span>
</div>
<div class="card-body">
<div id="player-blowjob-image" class="card-image-container"></div>
<div id="player-blowjob-narrative" class="sex-scene-display"></div>
<div id="player-blowjob-video" class="card-video-container"></div>
<div id="player-blowjob-effects" class="scene-effects"></div>
</div>
<div class="card-footer player-card-footer">
<<playerSexCardFooter>>
</div>
</div>
<</widget>>
<<widget "executePlayerBlowjobCard">>
<<silently>>
<<set _enemyIdx to ($combat.pendingSexAction && $combat.pendingSexAction.enemyIndex !== undefined) ? $combat.pendingSexAction.enemyIndex : 0>>
<<set _enemy to $combat.enemies[_enemyIdx]>>
<<setPronouns _enemy>>
<<set $player.lust to Math.min(100, $player.lust + setup.playerSexConfig.enemySex.blowjob.letBlowjobLust)>>
<<set _finishes to ($player.lust >= setup.playerSexConfig.cardEffects.thresholds.blowjobFinish)>>
<<if _finishes>>
<<set _enemy.stunned to true>>
<<set _enemy.stunnedTurns to setup.playerSexConfig.cardEffects.stun.standard>>
<<set $player.lust to setup.playerSexConfig.cardEffects.lustReset.standard>><<run setup.playerReleased()>>
<</if>>
<<if $combat.companionInCombat === "kira" && $companions && $companions[0]>>
<<addTension "kira" setup.playerSexConfig.kiraWatching.playerBlowjob.tension>>
<<set _kiraReaction to "SERIOUSLY?!">>
<<else>>
<<set _kiraReaction to "">>
<</if>>
<<set window._playerBlowjobData to {
enemyName: _enemy.name,
pronoun: _p,
playerLust: $player.lust,
finishes: _finishes,
kiraReaction: _kiraReaction,
showVideo: $preferences && $preferences.showVideos
}>>
<<playerMediaTarget>>
<<fillCombatVideoBox "player-blowjob-video" "combat/enemy_blowjob_player" _playerMediaTarget>>
<</silently>>
<<script>>
setTimeout(function() {
var data = window._playerBlowjobData;
if (!data) return;
var narrativeEl = document.getElementById('player-blowjob-narrative');
var videoEl = document.getElementById('player-blowjob-video');
var effectsEl = document.getElementById('player-blowjob-effects');
if (narrativeEl) {
var html = '<p class="explicit">You let her suck you. Mid-combat. Insane.</p>';
html += '<p class="explicit">Her mouth works your cock expertly. You stand there, letting an enemy blow you during battle.</p>';
if (data.kiraReaction) {
html += '<p class="dialogue kira-dialogue"><span class="speaker">Kira:</span> "' + data.kiraReaction + '"</p>';
}
html += '<p class="explicit">She sucks harder, trying to make you cum.</p>';
if (data.finishes) {
html += '<p class="explicit">You finish in her mouth. She swallows, then STAGGERS.</p>';
}
narrativeEl.innerHTML = html;
}
if (effectsEl) {
var effects = '<div class="effect-row"><span class="effect negative">+Lust</span></div>';
if (data.finishes) {
effects += '<div class="effect-row"><span class="effect positive">Enemy Stunned (2 turns)</span></div>';
effects += '<div class="effect-row"><span class="effect positive">Lust Reset</span></div>';
}
effectsEl.innerHTML = effects;
}
}, 50);
<</script>>
<</widget>>
<<widget "playerBlowjobCardFlow">>
<<playerBlowjobCard>>
<<executePlayerBlowjobCard>>
<div class="choice-container">
<<vchoice "Continue" "Combat_Actions" "move" "map">>
</div>
<</widget>>
<<widget "playerBlowjobForcedCard">>
<div class="combat-card player-card player-sex-card">
<div class="card-header sex-header forced-header">
<span class="card-icon"><<icon "lust">></span>
<span class="card-title">OVERWHELMED</span>
</div>
<div class="card-body">
<div id="player-blowjob-forced-image" class="card-image-container"></div>
<div id="player-blowjob-forced-narrative" class="sex-scene-display"></div>
<div id="player-blowjob-forced-video" class="card-video-container"></div>
<div id="player-blowjob-forced-effects" class="scene-effects"></div>
</div>
<div class="card-footer player-card-footer">
<<playerSexCardFooter>>
</div>
</div>
<</widget>>
<<widget "executePlayerBlowjobForcedCard">>
<<silently>>
<<set _enemyIdx to ($combat.pendingSexAction && $combat.pendingSexAction.enemyIndex !== undefined) ? $combat.pendingSexAction.enemyIndex : 0>>
<<set _enemy to $combat.enemies[_enemyIdx]>>
<<setPronouns _enemy>>
<<performSexAct "oral_receive">>
<<performSexAct "climax_player">>
<<set _enemy.stunned to true>>
<<set _enemy.stunnedTurns to setup.playerSexConfig.cardEffects.stun.standard>>
<<set $player.lust to setup.playerSexConfig.cardEffects.lustReset.standard>>
<<set $flags.playerFuckedInCombat to true>>
<<set $combat.playerJustFucked to "blowjob">>
<<if setup.kiraInFight() && $companions && $companions[0]>>
<<set _kiraReaction to "Snap OUT of it!">>
<<relationChange "kira" "affection" setup.playerSexConfig.kiraReaction.forcedBlowjobAffection>>
<<else>>
<<set _kiraReaction to "">>
<</if>>
<<set window._playerBlowjobForcedData to {
enemyName: _enemy.name,
pronoun: _p,
playerLust: $player.lust,
kiraReaction: _kiraReaction,
kiraAffection: setup.playerSexConfig.kiraReaction.forcedBlowjobAffection,
kiraDown: $combat.companionInCombat === "kira" && !setup.kiraInFight(),
showVideo: $preferences && $preferences.showVideos
}>>
<<playerMediaTarget>>
<<fillCombatVideoBox "player-blowjob-forced-video" "combat/enemy_blowjob_player" _playerMediaTarget>>
<</silently>>
<<script>>
setTimeout(function() {
var data = window._playerBlowjobForcedData;
if (!data) return;
var narrativeEl = document.getElementById('player-blowjob-forced-narrative');
var videoEl = document.getElementById('player-blowjob-forced-video');
var effectsEl = document.getElementById('player-blowjob-forced-effects');
if (narrativeEl) {
var html = '<p class="explicit">Her mouth is on your cock. You MOAN. Can\'t help it.</p>';
html += '<p class="explicit">She sucks you expertly. Mid-combat. Your mind is clouded with lust.</p>';
html += '<p class="dialogue player-dialogue"><span class="speaker">You:</span> "Oh fuck— your mouth—"</p>';
if (data.kiraReaction) {
html += '<p class="dialogue kira-dialogue"><span class="speaker">Kira:</span> "' + data.kiraReaction + '"</p>';
} else {
html += '<p class="explicit">' + (data.kiraDown ? 'At least Kira\'s out cold and can\'t see this.' : 'Nobody\'s here to see it. Small mercies.') + '</p>';
}
html += '<p class="explicit">But you can\'t snap out of it. Too turned on. You just stand there being blown.</p>';
html += '<p class="explicit">You finish in her mouth. She swallows, then goes limp. STUNNED.</p>';
narrativeEl.innerHTML = html;
}
if (effectsEl) {
var effects = '<div class="effect-row"><span class="effect negative">Too aroused to resist!</span></div>';
effects += '<div class="effect-row"><span class="effect positive">Enemy Stunned (2 turns)</span></div>';
if (data.kiraReaction) {
effects += '<div class="effect-row"><span class="effect negative">Kira Affection ' + data.kiraAffection + '</span></div>';
}
effectsEl.innerHTML = effects;
}
}, 50);
<</script>>
<</widget>>
<<widget "playerBlowjobForcedCardFlow">>
<<playerBlowjobForcedCard>>
<<executePlayerBlowjobForcedCard>>
<div class="choice-container">
<<vchoice "Try to get up" "Combat_Standup_Attempt" "action" "strength">>
</div>
<</widget>>
<<widget "playerFacefuckCard">>
<div class="combat-card player-card player-sex-card">
<div class="card-header sex-header dominant-header">
<span class="card-icon"><<icon "dominance">></span>
<span class="card-title">DOMINATING</span>
</div>
<div class="card-body">
<div id="player-facefuck-image" class="card-image-container"></div>
<div id="player-facefuck-narrative" class="sex-scene-display"></div>
<div id="player-facefuck-video" class="card-video-container"></div>
<div id="player-facefuck-effects" class="scene-effects"></div>
</div>
<div class="card-footer player-card-footer">
<<playerSexCardFooter>>
</div>
</div>
<</widget>>
<<widget "executePlayerFacefuckCard">>
<<silently>>
<<set _enemyIdx to ($combat.pendingSexAction && $combat.pendingSexAction.enemyIndex !== undefined) ? $combat.pendingSexAction.enemyIndex : 0>>
<<set _enemy to $combat.enemies[_enemyIdx]>>
<<setPronouns _enemy>>
<<set $player.lust to Math.min(100, $player.lust + setup.playerSexConfig.enemySex.blowjob.facefuckLust)>>
<<set $player.dominance += setup.playerSexConfig.cardEffects.dominance.facefuck>>
<<set _enemy.stunned to true>>
<<set _enemy.stunnedTurns to setup.playerSexConfig.cardEffects.stun.standard>>
<<set $player.lust to setup.playerSexConfig.cardEffects.lustReset.facefuck>><<run setup.playerReleased()>>
<<set window._playerFacefuckData to {
enemyName: _enemy.name,
pronoun: _p,
playerName: $player.name,
showVideo: $preferences && $preferences.showVideos
}>>
<<fillCombatVideoBox "player-facefuck-video" "combat/player_facefucks_enemy" _enemy>>
<</silently>>
<<script>>
setTimeout(function() {
var data = window._playerFacefuckData;
if (!data) return;
var narrativeEl = document.getElementById('player-facefuck-narrative');
var videoEl = document.getElementById('player-facefuck-video');
var effectsEl = document.getElementById('player-facefuck-effects');
if (narrativeEl) {
var html = '<p class="explicit">You grab her head and THRUST into her throat.</p>';
html += '<p class="dialogue player-dialogue"><span class="speaker">' + data.playerName + ':</span> "If you\'re going to suck it, do it RIGHT."</p>';
html += '<p class="explicit">You fuck her face while she\'s on her knees. Using her throat. Mid-battle.</p>';
html += '<p class="explicit">She gags but takes it.</p>';
html += '<p class="explicit">You finish down her throat. She chokes, swallows, STAGGERS.</p>';
narrativeEl.innerHTML = html;
}
if (effectsEl) {
var effects = '<div class="effect-row"><span class="effect positive">+5 Dominance</span></div>';
effects += '<div class="effect-row"><span class="effect positive">Enemy Stunned (2 turns)</span></div>';
effects += '<div class="effect-row"><span class="effect positive">Lust Reset</span></div>';
effectsEl.innerHTML = effects;
}
}, 50);
<</script>>
<</widget>>
<<widget "playerFacefuckCardFlow">>
<<playerFacefuckCard>>
<<executePlayerFacefuckCard>>
<div class="choice-container">
<<vchoice "Stand over her" "Combat_Actions" "move" "map">>
</div>
<</widget>>
<<widget "playerHandjobCard">>
<div class="combat-card player-card player-sex-card">
<div class="card-header sex-header intimate-header">
<span class="card-icon"><<icon "lust">></span>
<span class="card-title">STROKED</span>
</div>
<div class="card-body">
<div id="player-handjob-image" class="card-image-container"></div>
<div id="player-handjob-narrative" class="sex-scene-display"></div>
<div id="player-handjob-video" class="card-video-container"></div>
<div id="player-handjob-effects" class="scene-effects"></div>
</div>
<div class="card-footer player-card-footer">
<<playerSexCardFooter>>
</div>
</div>
<</widget>>
<<widget "executePlayerHandjobCard">>
<<silently>>
<<set _enemyIdx to ($combat.pendingSexAction && $combat.pendingSexAction.enemyIndex !== undefined) ? $combat.pendingSexAction.enemyIndex : 0>>
<<set _enemy to $combat.enemies[_enemyIdx]>>
<<setPronouns _enemy>>
<<performSexAct "handjob_receive">>
<<set $player.lust to Math.min(100, $player.lust + setup.playerSexConfig.enemySex.handjob.letHandjobLust)>>
<<if $combat.companionInCombat === "kira" && $companions && $companions[0]>>
<<addTension "kira" setup.playerSexConfig.kiraWatching.playerHandjob.tension>>
<<set _kiraReaction to "Are you LETTING her?!">>
<<else>>
<<set _kiraReaction to "">>
<</if>>
<<set window._playerHandjobData to {
enemyName: _enemy.name,
pronoun: _p,
playerLust: $player.lust,
kiraReaction: _kiraReaction
}>>
<<playerMediaTarget>>
<<fillCombatVideoBox "player-handjob-video" "combat/enemy_handjob_player" _playerMediaTarget>>
<</silently>>
<<script>>
setTimeout(function() {
var data = window._playerHandjobData;
if (!data) return;
var imageEl = document.getElementById('player-handjob-image');
var narrativeEl = document.getElementById('player-handjob-narrative');
var effectsEl = document.getElementById('player-handjob-effects');
if (imageEl) {
imageEl.innerHTML = '';
}
if (narrativeEl) {
var html = '<p class="explicit">You let her hand pump your exposed cock. Mid-battle. Insane.</p>';
html += '<p class="dialogue enemy-dialogue"><span class="speaker">' + data.enemyName + ':</span> "That\'s it. Just relax. Let me make you feel good."</p>';
html += '<p class="explicit">Her grip is skilled. You\'re vulnerable but it feels too good to stop.</p>';
if (data.kiraReaction) {
html += '<p class="dialogue kira-dialogue"><span class="speaker">Kira:</span> "' + data.kiraReaction + '"</p>';
}
html += '<p class="explicit">She keeps stroking until you\'re on the edge.</p>';
narrativeEl.innerHTML = html;
}
if (effectsEl) {
var effects = '<div class="effect-row"><span class="effect negative">+Lust</span></div>';
effectsEl.innerHTML = effects;
}
}, 50);
<</script>>
<</widget>>
<<widget "playerHandjobCardFlow">>
<<playerHandjobCard>>
<<executePlayerHandjobCard>>
<div class="choice-container">
<<vchoice "Push her away before you finish" "Combat_Escape_Sex_Player" "action" "strength">>
<<vchoice "Let her finish you" "Combat_Handjob_Finish" "intimate" "shower">>
</div>
<</widget>>
<<widget "playerHandjobFinishCard">>
<div class="combat-card player-card player-sex-card">
<div class="card-header sex-header intimate-header">
<span class="card-icon"><<icon "lust">></span>
<span class="card-title">RELEASED</span>
</div>
<div class="card-body">
<div id="player-handjob-finish-narrative" class="sex-scene-display"></div>
<div id="player-handjob-finish-video" class="card-video-container" style="display:none"></div>
<div id="player-handjob-finish-effects" class="scene-effects"></div>
</div>
<div class="card-footer player-card-footer">
<<playerSexCardFooter>>
</div>
</div>
<</widget>>
<<widget "executePlayerHandjobFinishCard">>
<<silently>>
<<set _enemyIdx to ($combat.pendingSexAction && $combat.pendingSexAction.enemyIndex !== undefined) ? $combat.pendingSexAction.enemyIndex : 0>>
<<set _enemy to $combat.enemies[_enemyIdx]>>
<<setPronouns _enemy>>
<<performSexAct "climax_player">>
<<set _enemy.stunned to true>>
<<set _enemy.stunnedTurns to setup.playerSexConfig.cardEffects.stun.standard>>
<<set $player.lust to setup.playerSexConfig.cardEffects.lustReset.handjob>>
<<set $flags.playerFuckedInCombat to true>>
<<set $combat.playerDazed to true>>
<<set $combat.playerDazedTurns to setup.playerSexConfig.cardEffects.daze.handjobFinish>>
<<set $combat.playerDazedCause to "orgasm">>
<<set window._playerHandjobFinishData to {
enemyName: _enemy.name,
pronoun: _p
}>>
<<playerMediaTarget>>
<<fillCombatVideoBox "player-handjob-finish-video" "combat/player_climax" _playerMediaTarget>>
<</silently>>
<<script>>
setTimeout(function() {
var data = window._playerHandjobFinishData;
if (!data) return;
var narrativeEl = document.getElementById('player-handjob-finish-narrative');
var effectsEl = document.getElementById('player-handjob-finish-effects');
if (narrativeEl) {
var html = '<p class="explicit">You can\'t stop. Too close.</p>';
html += '<p class="explicit">You cum hard, spilling onto her hand. She keeps stroking, milking every drop.</p>';
html += '<p class="dialogue enemy-dialogue"><span class="speaker">' + data.enemyName + ':</span> "Good boy. Now I\'m spent too."</p>';
html += '<p class="explicit">She staggers, post-orgasm daze. You\'re both recovering.</p>';
narrativeEl.innerHTML = html;
}
if (effectsEl) {
var effects = '<div class="effect-row"><span class="effect positive">Enemy Stunned (2 turns)</span></div>';
effects += '<div class="effect-row"><span class="effect negative">You are Dazed (1 turn)</span></div>';
effects += '<div class="effect-row"><span class="effect positive">Lust Reset</span></div>';
effectsEl.innerHTML = effects;
}
}, 50);
<</script>>
<</widget>>
<<widget "playerHandjobFinishCardFlow">>
<<playerHandjobFinishCard>>
<<executePlayerHandjobFinishCard>>
<div class="choice-container">
<<vchoice "Fight on" "Combat_Actions" "move" "map">>
</div>
<</widget>>
<<widget "playerSupernaturalMountCard">>
<div class="combat-card player-card player-sex-card">
<div class="card-header sex-header supernatural-header">
<span class="card-icon"><<icon "corruption">></span>
<span class="card-title">DRAINED</span>
</div>
<div class="card-body">
<div id="player-supernatural-mount-narrative" class="sex-scene-display"></div>
<div id="player-supernatural-mount-video" class="card-video-container"></div>
<div id="player-supernatural-mount-effects" class="scene-effects"></div>
</div>
<div class="card-footer player-card-footer">
<<playerSexCardFooter>>
</div>
</div>
<</widget>>
<<widget "executePlayerSupernaturalMountCard">>
<<silently>>
<<set _enemyIdx to ($combat.pendingSexAction && $combat.pendingSexAction.enemyIndex !== undefined) ? $combat.pendingSexAction.enemyIndex : 0>>
<<set _enemy to $combat.enemies[_enemyIdx]>>
<<setPronouns _enemy>>
<<set $player.lust to Math.min(100, Number($player.lust || 0) + (setup.playerSexConfig.enemySex.supernatural.mountLust || 0))>>
<<addCorruption setup.playerSexConfig.cardEffects.corruption.supernatural>>
<<if _enemy.dealsLustDamage>>
<<set $player.lust to Math.min(100, Number($player.lust || 0) + Number(_enemy.lustDamage || setup.playerSexConfig.cardEffects.defaults.enemyLustDamage || 0))>>
<</if>>
<<set _dickExposed to $clothing.player.dickExposed>>
<<if _dickExposed>>
<<set _enemy.health += setup.playerSexConfig.cardEffects.supernaturalDrain.enemyHeal>>
<<set _enemy.health to Math.min(_enemy.health, _enemy.maxHealth)>>
<<set $flags.playerFuckedBySupernatural to true>>
<<set $combat.playerJustFucked to "mounted">>
<<set _enemy.stunned to true>>
<<set _enemy.stunnedTurns to setup.playerSexConfig.cardEffects.stun.standard>>
<<set $player.lust to setup.playerSexConfig.cardEffects.lustReset.supernatural>>
<<set _supernaturalDamage to -(setup.playerSexConfig.cardEffects.supernaturalDrain.playerDamage || 0)>>
<<clampStat "player.health" _supernaturalDamage 0 100>>
<</if>>
<<set window._playerSupernaturalMountData to {
enemyName: _enemy.name,
pronoun: _p,
dickExposed: _dickExposed,
showVideo: $preferences && $preferences.showVideos
}>>
<<playerMediaTarget>>
<<fillCombatVideoBox "player-supernatural-mount-video" "combat/enemy_supernatural_ride" _playerMediaTarget>>
<</silently>>
<<script>>
setTimeout(function() {
var data = window._playerSupernaturalMountData;
if (!data) return;
var narrativeEl = document.getElementById('player-supernatural-mount-narrative');
var videoEl = document.getElementById('player-supernatural-mount-video');
var effectsEl = document.getElementById('player-supernatural-mount-effects');
if (narrativeEl) {
var html = '<p class="explicit">You stop fighting. Let the unnatural pleasure wash over you.</p>';
html += '<p class="dialogue enemy-dialogue"><span class="speaker">' + data.enemyName + ':</span> "Yesss... give in to me."</p>';
html += '<p class="explicit">Her supernatural aura amplifies every sensation. Your resistance crumbles.</p>';
if (data.dickExposed) {
html += '<p class="explicit">She impales herself on your cock. The sensation is beyond human.</p>';
html += '<p class="dialogue enemy-dialogue"><span class="speaker">' + data.enemyName + ':</span> "Your life force... SO good..."</p>';
}
narrativeEl.innerHTML = html;
}
if (effectsEl) {
var effects = '<div class="effect-row"><span class="effect negative">+30 Lust</span></div>';
effects += '<div class="effect-row"><span class="effect negative">+5 Corruption</span></div>';
if (data.dickExposed) {
effects += '<div class="effect-row"><span class="effect negative">-10 HP (Drained)</span></div>';
effects += '<div class="effect-row"><span class="effect positive">Enemy Stunned (2 turns)</span></div>';
}
effectsEl.innerHTML = effects;
}
}, 50);
<</script>>
<</widget>>
<<widget "playerSupernaturalMountCardFlow">>
<<playerSupernaturalMountCard>>
<<executePlayerSupernaturalMountCard>>
<div class="choice-container">
<<vchoice "Try to get up" "Combat_Standup_Attempt" "action" "strength">>
</div>
<</widget>>
<<widget "playerEscapeMountCard">>
<div class="combat-card player-card player-sex-card">
<div class="card-header sex-header action-header">
<span class="card-icon"><<icon "strength">></span>
<span class="card-title">ESCAPE ATTEMPT</span>
</div>
<div class="card-body">
<div id="player-escape-mount-narrative" class="sex-scene-display"></div>
<div id="player-escape-mount-video" class="card-video-container" style="display:none"></div>
<div id="player-escape-mount-effects" class="scene-effects"></div>
</div>
<div class="card-footer player-card-footer">
<<playerSexCardFooter>>
</div>
</div>
<</widget>>
<<widget "executePlayerEscapeMountCard">>
<<silently>>
<<set _enemyIdx to ($combat.pendingSexAction && $combat.pendingSexAction.enemyIndex !== undefined) ? $combat.pendingSexAction.enemyIndex : 0>>
<<set _enemy to $combat.enemies[_enemyIdx]>>
<<setPronouns _enemy>>
<<set _escapeCfg to setup.playerSexConfig.enemySex.mounted.escapeDC>>
<<set _escapeRoll to random(1, 100)>>
<<set _strBonus to Math.floor($player.strength / setup.playerSexConfig.cardEffects.escapeMod.strengthDivisor)>>
<<set _escapeDC to _escapeCfg.base>>
<<if $combat.playerWristsBound>>
<<set _escapeDC += setup.playerSexConfig.cardEffects.escapeMod.boundPenalty>>
<</if>>
<<set _escaped to (_escapeRoll + _strBonus > _escapeDC)>>
<<if _escaped>>
<<set $combat.positions.player to "standing">>
<<set _enemy.stunned to true>>
<<set _enemy.stunnedTurns to setup.playerSexConfig.cardEffects.stun.escape>>
<<else>>
<<if $clothing.player.dickExposed>>
<<set $player.lust to Math.min(100, $player.lust + setup.playerSexConfig.escape.struggleLust.mounted)>>
<</if>>
<<modifyCurrentEnemyLust setup.playerSexConfig.cardEffects.enemyLust.struggle>>
<<set $combat.lastAttackWasGrab to true>>
<</if>>
<<set window._playerEscapeMountData to {
enemyName: _enemy.name,
escaped: _escaped,
dickExposed: $clothing.player.dickExposed
}>>
<<playerMediaTarget>>
<<fillCombatVideoBox "player-escape-mount-video" `_escaped ? "combat/player_breaks_free" : "combat/enemy_grinds_player"` _playerMediaTarget>>
<</silently>>
<<script>>
setTimeout(function() {
var data = window._playerEscapeMountData;
if (!data) return;
var narrativeEl = document.getElementById('player-escape-mount-narrative');
var effectsEl = document.getElementById('player-escape-mount-effects');
if (narrativeEl) {
var html = '';
if (data.escaped) {
html += '<p class="explicit">You buck your hips HARD and throw her off!</p>';
html += '<p class="dialogue enemy-dialogue"><span class="speaker">' + data.enemyName + ':</span> "Ugh—!"</p>';
html += '<p class="explicit">She hits the ground, momentarily stunned.</p>';
} else {
html += '<p class="explicit">She clamps down with her thighs, riding out your struggle.</p>';
html += '<p class="dialogue enemy-dialogue"><span class="speaker">' + data.enemyName + ':</span> "Nice try. But you\'re not going anywhere."</p>';
if (data.dickExposed) {
html += '<p class="explicit">Her weight presses your cock against her. You feel the heat of her.</p>';
}
}
narrativeEl.innerHTML = html;
}
if (effectsEl) {
var effects = '';
if (data.escaped) {
effects = '<div class="effect-row"><span class="effect positive">Escaped!</span></div>';
effects += '<div class="effect-row"><span class="effect positive">Enemy Stunned (1 turn)</span></div>';
} else {
effects = '<div class="effect-row"><span class="effect negative">Failed to escape</span></div>';
if (data.dickExposed) {
effects += '<div class="effect-row"><span class="effect negative">+Lust from struggle</span></div>';
}
}
effectsEl.innerHTML = effects;
}
}, 50);
<</script>>
<</widget>>
<<widget "playerEscapeMountCardFlow">>
<<playerEscapeMountCard>>
<<executePlayerEscapeMountCard>>
<<if window._playerEscapeMountData && window._playerEscapeMountData.escaped>>
<div class="choice-container">
<<vchoice "Attack now!" "Combat_Actions" "action" "attack">>
</div>
<<else>>
<div class="choice-container">
<<vchoice "Keep struggling" "Combat_Actions" "action" "defense">>
</div>
<</if>>
<</widget>>
<<widget "playerMountedCard">>
<div class="combat-card player-card player-sex-card">
<div class="card-header sex-header intimate-header">
<span class="card-icon"><<icon "lust">></span>
<span class="card-title">MOUNTED</span>
</div>
<div class="card-body">
<div id="player-mounted-narrative" class="sex-scene-display"></div>
<div id="player-mounted-video" class="card-video-container" style="display:none"></div>
<div id="player-mounted-effects" class="scene-effects"></div>
</div>
<div class="card-footer player-card-footer">
<<playerSexCardFooter>>
</div>
</div>
<</widget>>
<<widget "executePlayerMountedCard">>
<<silently>>
<<set _enemyIdx to ($combat.pendingSexAction && $combat.pendingSexAction.enemyIndex !== undefined) ? $combat.pendingSexAction.enemyIndex : 0>>
<<set _enemy to $combat.enemies[_enemyIdx]>>
<<setPronouns _enemy>>
<<set _dickExposed to $clothing.player.dickExposed>>
<<if !_dickExposed>>
<<set $player.lust to Math.min(100, $player.lust + setup.playerSexConfig.enemySex.teasing.letTeasingLust)>>
<<modifyCurrentEnemyLust setup.playerSexConfig.cardEffects.enemyLust.struggle>>
<<set $combat.lastAttackWasGrab to true>>
<</if>>
<<set window._playerMountedData to {
enemyName: _enemy.name,
dickExposed: _dickExposed
}>>
<<playerMediaTarget>>
<<fillCombatVideoBox "player-mounted-video" "combat/enemy_mounts_player" _playerMediaTarget>>
<</silently>>
<<script>>
setTimeout(function() {
var data = window._playerMountedData;
if (!data) return;
var narrativeEl = document.getElementById('player-mounted-narrative');
var effectsEl = document.getElementById('player-mounted-effects');
if (narrativeEl) {
var html = '<p class="explicit">You stop struggling. Let her have you.</p>';
html += '<p class="dialogue enemy-dialogue"><span class="speaker">' + data.enemyName + ':</span> "Smart boy. Just relax."</p>';
html += '<p class="explicit">She grinds down against your hard cock, teasing you through the fabric— or skin on skin if you\'re exposed.</p>';
if (data.dickExposed) {
html += '<p class="explicit">She reaches down and guides your cock inside her. Hot. Wet. Tight.</p>';
} else {
html += '<p class="explicit">She grinds against your hard cock, teasing.</p>';
html += '<p class="dialogue enemy-dialogue"><span class="speaker">' + data.enemyName + ':</span> "Let\'s get these pants off you..."</p>';
}
narrativeEl.innerHTML = html;
}
if (effectsEl) {
var effects = '';
if (data.dickExposed) {
effects = '<div class="effect-row"><span class="effect negative">She takes you inside her...</span></div>';
} else {
effects = '<div class="effect-row"><span class="effect negative">+Lust from teasing</span></div>';
}
effectsEl.innerHTML = effects;
}
}, 50);
<</script>>
<</widget>>
<<widget "playerMountedCardFlow">>
<<playerMountedCard>>
<<executePlayerMountedCard>>
<<if $clothing.player.dickExposed>>
<div class="choice-container">
<<vchoice "..." "Combat_Let_Ride" "intimate" "lust">>
</div>
<<else>>
<div class="choice-container">
<<vchoice "Let her strip you" "Combat_Player_Stripped_Mount" "intimate" "corruption">>
<<vchoice "Resist!" "Combat_Escape_Mount_Player" "action" "strength">>
</div>
<</if>>
<</widget>>
<<widget "playerStrippedMountCard">>
<div class="combat-card player-card player-sex-card">
<div class="card-header sex-header intimate-header">
<span class="card-icon"><<icon "allure">></span>
<span class="card-title">STRIPPED</span>
</div>
<div class="card-body">
<div id="player-stripped-mount-narrative" class="sex-scene-display"></div>
<div id="player-stripped-mount-video" class="card-video-container" style="display:none"></div>
<div id="player-stripped-mount-effects" class="scene-effects"></div>
</div>
<div class="card-footer player-card-footer">
<<playerSexCardFooter>>
</div>
</div>
<</widget>>
<<widget "executePlayerStrippedMountCard">>
<<silently>>
<<set _enemyIdx to ($combat.pendingSexAction && $combat.pendingSexAction.enemyIndex !== undefined) ? $combat.pendingSexAction.enemyIndex : 0>>
<<set _enemy to $combat.enemies[_enemyIdx]>>
<<setPronouns _enemy>>
<<set $clothing.player.bottom to 0>>
<<set $clothing.player.dickExposed to true>>
<<set window._playerStrippedMountData to {
enemyName: _enemy.name
}>>
<<playerMediaTarget>>
<<fillCombatVideoBox "player-stripped-mount-video" "combat/enemy_strips_player" _playerMediaTarget>>
<</silently>>
<<script>>
setTimeout(function() {
var data = window._playerStrippedMountData;
if (!data) return;
var narrativeEl = document.getElementById('player-stripped-mount-narrative');
var effectsEl = document.getElementById('player-stripped-mount-effects');
if (narrativeEl) {
var html = '<p class="explicit">She tugs your pants down, freeing your cock.</p>';
html += '<p class="dialogue enemy-dialogue"><span class="speaker">' + data.enemyName + ':</span> "There it is. Now for the fun part."</p>';
html += '<p class="explicit">She positions herself over your throbbing cock.</p>';
narrativeEl.innerHTML = html;
}
if (effectsEl) {
effectsEl.innerHTML = '<div class="effect-row"><span class="effect negative">Exposed!</span></div>';
}
}, 50);
<</script>>
<</widget>>
<<widget "playerStrippedMountCardFlow">>
<<playerStrippedMountCard>>
<<executePlayerStrippedMountCard>>
<div class="choice-container">
<<vchoice "..." "Combat_Let_Ride" "intimate" "lust">>
</div>
<</widget>>
<<widget "playerGrabHipsCard">>
<div class="combat-card player-card player-sex-card">
<div class="card-header sex-header dominant-header">
<span class="card-icon"><<icon "dominance">></span>
<span class="card-title">TAKING CONTROL</span>
</div>
<div class="card-body">
<div id="player-grab-hips-narrative" class="sex-scene-display"></div>
<div id="player-grab-hips-video" class="card-video-container" style="display:none"></div>
<div id="player-grab-hips-effects" class="scene-effects"></div>
</div>
<div class="card-footer player-card-footer">
<<playerSexCardFooter>>
</div>
</div>
<</widget>>
<<widget "executePlayerGrabHipsCard">>
<<silently>>
<<set _enemyIdx to ($combat.pendingSexAction && $combat.pendingSexAction.enemyIndex !== undefined) ? $combat.pendingSexAction.enemyIndex : 0>>
<<set _enemy to $combat.enemies[_enemyIdx]>>
<<setPronouns _enemy>>
<<set $player.dominance += setup.playerSexConfig.cardEffects.dominance.grabHips>>
<<modifyCurrentEnemyLust setup.playerSexConfig.cardEffects.enemyLust.struggle>>
<<set _dickExposed to $clothing.player.dickExposed>>
<<set window._playerGrabHipsData to {
enemyName: _enemy.name,
dickExposed: _dickExposed
}>>
<<playerMediaTarget>>
<<fillCombatVideoBox "player-grab-hips-video" "combat/enemy_grinds_player" _playerMediaTarget>>
<</silently>>
<<script>>
setTimeout(function() {
var data = window._playerGrabHipsData;
if (!data) return;
var narrativeEl = document.getElementById('player-grab-hips-narrative');
var effectsEl = document.getElementById('player-grab-hips-effects');
if (narrativeEl) {
var html = '<p class="explicit">You grab her hips and pull her down against you.</p>';
html += '<p class="dialogue enemy-dialogue"><span class="speaker">' + data.enemyName + ':</span> "Oh? Taking control?"</p>';
html += '<p class="explicit">You grind up against her, taking initiative.</p>';
if (data.dickExposed) {
html += '<p class="explicit">You guide yourself into her, thrusting up as she gasps.</p>';
} else {
html += '<p class="explicit">She moans as your hard cock presses against her.</p>';
html += '<p class="dialogue enemy-dialogue"><span class="speaker">' + data.enemyName + ':</span> "Get those pants off and I\'ll really show you a good time."</p>';
}
narrativeEl.innerHTML = html;
}
if (effectsEl) {
var effects = '<div class="effect-row"><span class="effect positive">+3 Dominance</span></div>';
effects += '<div class="effect-row"><span class="effect positive">Enemy +15 Lust</span></div>';
effectsEl.innerHTML = effects;
}
}, 50);
<</script>>
<</widget>>
<<widget "playerGrabHipsCardFlow">>
<<playerGrabHipsCard>>
<<executePlayerGrabHipsCard>>
<<if $clothing.player.dickExposed>>
<div class="choice-container">
<<vchoice "..." "Combat_Let_Ride" "intimate" "lust">>
</div>
<<else>>
<div class="choice-container">
<<vchoice "Pull your pants down" "Combat_Player_Stripped_Mount" "intimate" "corruption">>
<<vchoice "Throw her off instead" "Combat_Escape_Mount_Player" "action" "strength">>
</div>
<</if>>
<</widget>>
<<widget "playerShowOffCard">>
<div class="combat-card player-card player-sex-card">
<div class="card-header sex-header dominant-header">
<span class="card-icon"><<icon "allure">></span>
<span class="card-title">SHOWING OFF</span>
</div>
<div class="card-body">
<div id="player-show-off-narrative" class="sex-scene-display"></div>
<div id="player-show-off-video" class="card-video-container" style="display:none"></div>
<div id="player-show-off-effects" class="scene-effects"></div>
</div>
<div class="card-footer player-card-footer">
<<playerSexCardFooter>>
</div>
</div>
<</widget>>
<<widget "executePlayerShowOffCard">>
<<silently>>
<<set _enemyIdx to ($combat.pendingSexAction && $combat.pendingSexAction.enemyIndex !== undefined) ? $combat.pendingSexAction.enemyIndex : 0>>
<<set _enemy to $combat.enemies[_enemyIdx]>>
<<setPronouns _enemy>>
<<modifyCurrentEnemyLust setup.playerSexConfig.cardEffects.enemyLust.showOff>>
<<set _seduced to (_enemy.gender === "female" && _enemy.lust >= _enemy.seduceThreshold)>>
<<if !_seduced>>
<<set $combat.lastAttackWasGrab to true>>
<<else>>
<<set $combat.seducedIndex to _enemyIdx>>
<</if>>
<<set window._playerShowOffData to {
enemyName: _enemy.name,
playerName: $player.name,
seduced: _seduced
}>>
<<playerMediaTarget>>
<<fillCombatVideoBox "player-show-off-video" "combat/player_show_off" _playerMediaTarget>>
<</silently>>
<<script>>
setTimeout(function() {
var data = window._playerShowOffData;
if (!data) return;
var narrativeEl = document.getElementById('player-show-off-narrative');
var effectsEl = document.getElementById('player-show-off-effects');
if (narrativeEl) {
var html = '<p class="explicit">You stand there, letting her look.</p>';
html += '<p class="dialogue player-dialogue"><span class="speaker">' + data.playerName + ':</span> "Like what you see?"</p>';
if (data.seduced) {
html += '<p class="narrator">She\'s overcome with lust. SEDUCED.</p>';
} else {
html += '<p class="explicit">She licks her lips.</p>';
html += '<p class="dialogue enemy-dialogue"><span class="speaker">' + data.enemyName + ':</span> "Oh, I\'m going to enjoy you."</p>';
}
narrativeEl.innerHTML = html;
}
if (effectsEl) {
var effects = '<div class="effect-row"><span class="effect positive">Enemy +25 Lust</span></div>';
if (data.seduced) {
effects += '<div class="effect-row"><span class="effect positive">SEDUCED!</span></div>';
}
effectsEl.innerHTML = effects;
}
}, 50);
<</script>>
<</widget>>
<<widget "playerShowOffCardFlow">>
<<playerShowOffCard>>
<<executePlayerShowOffCard>>
<<if window._playerShowOffData && window._playerShowOffData.seduced>>
<div class="choice-container">
<<vchoice "Victory!" "Combat_Seduction_Victory" "intimate" "allure">>
</div>
<<else>>
<div class="choice-container">
<<vchoice "Fight!" "Combat_Actions" "action" "attack">>
</div>
<</if>>
<</widget>>
<<widget "playerEscapeBoundCard">>
<div class="combat-card player-card player-sex-card">
<div class="card-header sex-header action-header">
<span class="card-icon"><<icon "breaking-chain">></span>
<span class="card-title">BREAK FREE</span>
</div>
<div class="card-body">
<div id="player-escape-bound-narrative" class="sex-scene-display"></div>
<div id="player-escape-bound-video" class="card-video-container" style="display:none"></div>
<div id="player-escape-bound-effects" class="scene-effects"></div>
</div>
<div class="card-footer player-card-footer">
<<playerSexCardFooter>>
</div>
</div>
<</widget>>
<<widget "executePlayerEscapeBoundCard">>
<<silently>>
<<set _enemyIdx to ($combat.pendingSexAction && $combat.pendingSexAction.enemyIndex !== undefined) ? $combat.pendingSexAction.enemyIndex : 0>>
<<set _enemy to $combat.enemies[_enemyIdx]>>
<<setPronouns _enemy>>
<<set _escapeRoll to random(1, 100)>>
<<set _escapeDC to setup.bondageConfig.escape.strengthDC * setup.playerSexConfig.cardEffects.escapeMod.bondageDCMultiplier>>
<<set _escaped to (_escapeRoll > _escapeDC)>>
<<if _escaped>>
<<set $combat.playerWristsBound to false>>
<<if $combat.playerEffects>><<set $combat.playerEffects.wristsBound to false>><</if>>
<<set $combat.positions.player to "standing">>
<<if $combat.log>>
<<run $combat.log.push({type: "buff", text: "Broke free from bindings!", icon: "breaking-chain"})>>
<</if>>
<<else>>
<<set $combat.lastAttackWasGrab to true>>
<</if>>
<<set window._playerEscapeBoundData to {
enemyName: _enemy.name,
escaped: _escaped
}>>
<<playerMediaTarget>>
<<fillCombatVideoBox "player-escape-bound-video" `_escaped ? "combat/player_breaks_free" : null` _playerMediaTarget>>
<</silently>>
<<script>>
setTimeout(function() {
var data = window._playerEscapeBoundData;
if (!data) return;
var narrativeEl = document.getElementById('player-escape-bound-narrative');
var effectsEl = document.getElementById('player-escape-bound-effects');
if (narrativeEl) {
var html = '';
if (data.escaped) {
html += '<p class="explicit">You manage to twist free, breaking the bindings!</p>';
} else {
html += '<p class="explicit">The bindings hold. You\'re helpless.</p>';
html += '<p class="dialogue enemy-dialogue"><span class="speaker">' + data.enemyName + ':</span> "Struggle all you want. You\'re mine now."</p>';
}
narrativeEl.innerHTML = html;
}
if (effectsEl) {
if (data.escaped) {
effectsEl.innerHTML = '<div class="effect-row"><span class="effect positive">Broke free!</span></div>';
} else {
effectsEl.innerHTML = '<div class="effect-row"><span class="effect negative">Still bound</span></div>';
}
}
}, 50);
<</script>>
<</widget>>
<<widget "playerEscapeBoundCardFlow">>
<<playerEscapeBoundCard>>
<<executePlayerEscapeBoundCard>>
<<if window._playerEscapeBoundData && window._playerEscapeBoundData.escaped>>
<div class="choice-container">
<<vchoice "Fight!" "Combat_Actions" "action" "attack">>
</div>
<<else>>
<div class="choice-container">
<<vchoice "Keep trying" "Combat_Actions" "action" "defense">>
</div>
<</if>>
<</widget>>
<<widget "playerTeasingCard">>
<div class="combat-card player-card player-sex-card">
<div class="card-header sex-header intimate-header">
<span class="card-icon"><<icon "lust">></span>
<span class="card-title">EDGED</span>
</div>
<div class="card-body">
<div id="player-teasing-narrative" class="sex-scene-display"></div>
<div id="player-teasing-video" class="card-video-container" style="display:none"></div>
<div id="player-teasing-effects" class="scene-effects"></div>
</div>
<div class="card-footer player-card-footer">
<<playerSexCardFooter>>
</div>
</div>
<</widget>>
<<widget "executePlayerTeasingCard">>
<<silently>>
<<set _enemyIdx to ($combat.pendingSexAction && $combat.pendingSexAction.enemyIndex !== undefined) ? $combat.pendingSexAction.enemyIndex : 0>>
<<set _enemy to $combat.enemies[_enemyIdx]>>
<<setPronouns _enemy>>
<<set $player.lust to Math.min(100, $player.lust + setup.playerSexConfig.enemySex.blowjob.letBlowjobLust)>>
<<set _climaxed to ($player.lust >= setup.playerSexConfig.cardEffects.thresholds.teasingClimax)>>
<<if _climaxed>>
<<set $player.lust to setup.playerSexConfig.cardEffects.lustReset.standard>><<run setup.playerReleased()>>
<<set $flags.playerFuckedInCombat to true>>
<<set _enemy.stunned to true>>
<<set _enemy.stunnedTurns to setup.playerSexConfig.cardEffects.stun.standard>>
<</if>>
<<set window._playerTeasingData to {
enemyName: _enemy.name,
climaxed: _climaxed,
playerLust: $player.lust
}>>
<<playerMediaTarget>>
<<fillCombatVideoBox "player-teasing-video" "combat/enemy_handjob_player" _playerMediaTarget>>
<<if _climaxed>>
<<fillCombatVideoBox "player-teasing-video" "combat/player_climax" _playerMediaTarget>>
<</if>>
<</silently>>
<<script>>
setTimeout(function() {
var data = window._playerTeasingData;
if (!data) return;
var narrativeEl = document.getElementById('player-teasing-narrative');
var effectsEl = document.getElementById('player-teasing-effects');
if (narrativeEl) {
var html = '<p class="explicit">You stop struggling and let her work your cock.</p>';
html += '<p class="dialogue enemy-dialogue"><span class="speaker">' + data.enemyName + ':</span> "Good. Just feel it."</p>';
html += '<p class="explicit">She strokes you slowly, expertly, keeping you right on the edge.</p>';
if (data.climaxed) {
html += '<p class="explicit">You can\'t take anymore. You CUM.</p>';
html += '<p class="dialogue enemy-dialogue"><span class="speaker">' + data.enemyName + ':</span> "There we go. Such a good boy."</p>';
}
narrativeEl.innerHTML = html;
}
if (effectsEl) {
var effects = '<div class="effect-row"><span class="effect negative">+Lust</span></div>';
if (data.climaxed) {
effects += '<div class="effect-row"><span class="effect positive">Released!</span></div>';
effects += '<div class="effect-row"><span class="effect positive">Enemy Stunned (2 turns)</span></div>';
}
effectsEl.innerHTML = effects;
}
}, 50);
<</script>>
<</widget>>
<<widget "playerTeasingCardFlow">>
<<playerTeasingCard>>
<<executePlayerTeasingCard>>
<div class="choice-container">
<<vchoice "Continue" "Combat_Actions" "move" "map">>
</div>
<</widget>>
<<widget "playerClawCard">>
<div class="combat-card player-card player-sex-card">
<div class="card-header sex-header supernatural-header">
<span class="card-icon"><<icon "corruption">></span>
<span class="card-title">DANGEROUS PLEASURE</span>
</div>
<div class="card-body">
<div id="player-claw-narrative" class="sex-scene-display"></div>
<div id="player-claw-video" class="card-video-container" style="display:none"></div>
<div id="player-claw-effects" class="scene-effects"></div>
</div>
<div class="card-footer player-card-footer">
<<playerSexCardFooter>>
</div>
</div>
<</widget>>
<<widget "executePlayerClawCard">>
<<silently>>
<<set _enemyIdx to ($combat.pendingSexAction && $combat.pendingSexAction.enemyIndex !== undefined) ? $combat.pendingSexAction.enemyIndex : 0>>
<<set _enemy to $combat.enemies[_enemyIdx]>>
<<setPronouns _enemy>>
<<set $player.lust to Math.min(100, $player.lust + setup.playerSexConfig.enemySex.supernatural.clawLust)>>
<<addCorruption setup.playerSexConfig.cardEffects.corruption.claw>>
<<if _enemy.dealsLustDamage>>
<<set $player.lust to Math.min(100, $player.lust + setup.playerSexConfig.enemySex.supernatural.clawLust)>>
<</if>>
<<set _climaxed to ($player.lust >= setup.playerSexConfig.cardEffects.thresholds.clawClimax)>>
<<if _climaxed>>
<<set $player.lust to setup.playerSexConfig.cardEffects.lustReset.standard>><<run setup.playerReleased()>>
<<set $flags.playerFuckedBySupernatural to true>>
<<set _enemy.stunned to true>>
<<set _enemy.stunnedTurns to setup.playerSexConfig.cardEffects.stun.standard>>
<</if>>
<<set window._playerClawData to {
enemyName: _enemy.name,
climaxed: _climaxed
}>>
<<playerMediaTarget>>
<<fillCombatVideoBox "player-claw-video" "combat/enemy_claw_caress" _playerMediaTarget>>
<<if _climaxed>>
<<fillCombatVideoBox "player-claw-video" "combat/player_climax" _playerMediaTarget>>
<</if>>
<</silently>>
<<script>>
setTimeout(function() {
var data = window._playerClawData;
if (!data) return;
var narrativeEl = document.getElementById('player-claw-narrative');
var effectsEl = document.getElementById('player-claw-effects');
if (narrativeEl) {
var html = '<p class="explicit">You don\'t push her away. Her claws trace lower.</p>';
html += '<p class="dialogue enemy-dialogue"><span class="speaker">' + data.enemyName + ':</span> "Brave... or foolish. I like it."</p>';
html += '<p class="explicit">Her sharp nails wrap around your cock, the danger adding to the thrill.</p>';
if (data.climaxed) {
html += '<p class="explicit">The mix of fear and pleasure pushes you over the edge.</p>';
html += '<p class="explicit">You cum with her claws still wrapped around you, gasping.</p>';
}
narrativeEl.innerHTML = html;
}
if (effectsEl) {
var effects = '<div class="effect-row"><span class="effect negative">+Lust</span></div>';
effects += '<div class="effect-row"><span class="effect negative">+2 Corruption</span></div>';
if (data.climaxed) {
effects += '<div class="effect-row"><span class="effect positive">Enemy Stunned (2 turns)</span></div>';
}
effectsEl.innerHTML = effects;
}
}, 50);
<</script>>
<</widget>>
<<widget "playerClawCardFlow">>
<<playerClawCard>>
<<executePlayerClawCard>>
<div class="choice-container">
<<vchoice "Continue" "Combat_Actions" "move" "map">>
</div>
<</widget>><<set setup.playerSexConfig to {
enemySex: {
mounted: {
escapeDC: { base: 50, lustPenalty: 0.5 },
playerLust: 40,
escapePlayerLust: 20,
letRideLust: 40
},
blowjob: {
escapeDC: { base: 45, lustPenalty: 0.5 },
playerLust: 35,
escapePlayerLust: 15,
letBlowjobLust: 35,
facefuckLust: 25
},
handjob: {
escapeDC: { base: 40, lustPenalty: 0.3 },
playerLust: 25,
escapePlayerLust: 10,
letHandjobLust: 25,
finishLust: 20
},
teasing: {
playerLust: 20,
letTeasingLust: 20
},
supernatural: {
mountLust: 35,
clawLust: 20
}
},
escape: {
failDamage: {
mounted: { min: 5, max: 10 },
blowjob: { min: 3, max: 6 },
handjob: { min: 2, max: 4 },
bound: { min: 4, max: 8 }
},
struggleLust: {
mounted: 10,
blowjob: 8,
handjob: 5,
bound: 12
}
},
submission: {
riddenToCompletion: { lustReset: 20 },
blowjobFinish: { lustReset: 15 },
handjobFinish: { lustReset: 10 }
},
stripped: {
lustGain: 10,
exposedLustGain: 15
},
kiraWatching: {
playerMounted: { tension: 5 },
playerBlowjob: { tension: 4 },
playerHandjob: { tension: 4 },
playerCums: { tension: 8 },
playerFucksEnemy: { tension: 10 }
},
kiraReaction: {
forcedBlowjobAffection: -10
},
cardEffects: {
stun: {
standard: 2,
escape: 1
},
lustReset: {
standard: 30,
facefuck: 20,
handjob: 20,
supernatural: 50
},
dominance: {
facefuck: 5,
grabHips: 3
},
enemyLust: {
struggle: 15,
showOff: 25
},
thresholds: {
blowjobFinish: 70,
teasingClimax: 90,
clawClimax: 80
},
corruption: {
supernatural: 5,
claw: 2
},
supernaturalDrain: {
enemyHeal: 20,
playerDamage: 10
},
daze: {
handjobFinish: 1
},
escapeMod: {
boundPenalty: 20,
strengthDivisor: 2,
bondageDCMultiplier: 5
},
defaults: {
enemyLustDamage: 10
}
}
}>><<set setup.bondageConfig to {
tieDown: {
base: { playerLust: 15 },
gagged: { playerLust: 10 },
fun: { playerLust: 25 },
fingered: { playerLust: 30 },
oral: { playerLust: 35 },
fucked: { playerLust: 40, lustReset: 20 }
},
escape: {
strengthDC: 14,
agilityDC: 12,
failDamage: { min: 4, max: 8 },
struggleLust: 12
}
}>><<set setup.postCombatConfig to {
clothingCheck: {
exposedLust: 10
},
repair: {
kiraRepairTrust: 3,
mutualRepairLust: 5
},
flirt: {
playerLust: 15,
kiraTension: 5
}
}>><<widget "getEnemyHitPlayerNarrative">>
<<set _damage to _args[0]>>
<<set _enemy to _args[1]>>
<<set _wasDickExposed to ($clothing.player && $clothing.player.dickExposed)>>
<<set _isDickExposed to ($clothing.player && $clothing.player.dickExposed)>>
<<set _isClothed to ($clothing.player && $clothing.player.bottom > 25 && $clothing.player.underwear > 25)>>
<<set _isTorn to ($clothing.player && (($clothing.player.top >= 26 && $clothing.player.top <= 50) || ($clothing.player.bottom >= 26 && $clothing.player.bottom <= 50)))>>
<<set _isVulnerable to ($combat.positions && $combat.positions.player && ["kneeling", "prone_front", "prone_back", "bent_over", "pinned"].includes($combat.positions.player))>>
<<set _weapon to (_enemy && _enemy.weapon) ? _enemy.weapon : "unarmed">>
<<set _lust to (_enemy && _enemy.lust) ? _enemy.lust : 0>>
<<set _pool to []>>
<<set _category to "">>
<<set _useWeaponNarrative to false>>
<<set _useRaiderNarrative to false>>
<<set _raiderNarrativeText to "">>
<<if _enemy && _enemy.id && _enemy.gender === "female" && setup.raiderTypeMap && setup.raiderTypeMap[_enemy.id]>>
<<getRaiderHitPlayerNarrative _enemy>>
<<set _raiderNarrativeText to _return>>
<<if _raiderNarrativeText && _raiderNarrativeText.trim().length gt 0>>
<<set _useRaiderNarrative to true>>
<</if>>
<</if>>
<<if _enemy && _enemy.gender === "female">>
<<if _weapon === "leather_belt">>
<<if _isDickExposed && setup.combatNarrative.weapon_belt_hit_player_exposed>>
<<set _category to "weapon_belt_hit_player_exposed">>
<<set _useWeaponNarrative to true>>
<<elseif setup.combatNarrative.weapon_belt_hit_player>>
<<set _category to "weapon_belt_hit_player">>
<<set _useWeaponNarrative to true>>
<</if>>
<<elseif _weapon === "riding_crop">>
<<if _isDickExposed && setup.combatNarrative.weapon_crop_hit_player_exposed>>
<<set _category to "weapon_crop_hit_player_exposed">>
<<set _useWeaponNarrative to true>>
<<elseif setup.combatNarrative.weapon_crop_hit_player>>
<<set _category to "weapon_crop_hit_player">>
<<set _useWeaponNarrative to true>>
<</if>>
<<elseif _weapon === "combat knife" || _weapon === "rusty_shiv">>
<<if _isDickExposed && setup.combatNarrative.weapon_knife_hit_player_exposed>>
<<set _category to "weapon_knife_hit_player_exposed">>
<<set _useWeaponNarrative to true>>
<<elseif setup.combatNarrative.weapon_knife_hit_player>>
<<set _category to "weapon_knife_hit_player">>
<<set _useWeaponNarrative to true>>
<</if>>
<<elseif _weapon === "chain">>
<<if _isDickExposed && setup.combatNarrative.weapon_chain_hit_player_exposed>>
<<set _category to "weapon_chain_hit_player_exposed">>
<<set _useWeaponNarrative to true>>
<<elseif setup.combatNarrative.weapon_chain_hit_player>>
<<set _category to "weapon_chain_hit_player">>
<<set _useWeaponNarrative to true>>
<</if>>
<<elseif _weapon === "rope">>
<<if _isDickExposed && setup.combatNarrative.weapon_rope_hit_player_exposed>>
<<set _category to "weapon_rope_hit_player_exposed">>
<<set _useWeaponNarrative to true>>
<<elseif setup.combatNarrative.weapon_rope_hit_player>>
<<set _category to "weapon_rope_hit_player">>
<<set _useWeaponNarrative to true>>
<</if>>
<<elseif _weapon === "machete">>
<<if _isDickExposed && setup.combatNarrative.weapon_machete_hit_player_exposed>>
<<set _category to "weapon_machete_hit_player_exposed">>
<<set _useWeaponNarrative to true>>
<<elseif setup.combatNarrative.weapon_machete_hit_player>>
<<set _category to "weapon_machete_hit_player">>
<<set _useWeaponNarrative to true>>
<</if>>
<<elseif _weapon === "fists" || _weapon === "unarmed">>
<<if _isDickExposed && setup.combatNarrative.weapon_fists_hit_player_exposed>>
<<set _category to "weapon_fists_hit_player_exposed">>
<<set _useWeaponNarrative to true>>
<<elseif setup.combatNarrative.weapon_fists_hit_player>>
<<set _category to "weapon_fists_hit_player">>
<<set _useWeaponNarrative to true>>
<</if>>
<</if>>
<<if _useWeaponNarrative && setup.combatNarrative[_category]>>
<<set _pool to setup.combatNarrative[_category]>>
<</if>>
<</if>>
<<if !_useWeaponNarrative>>
<<if _enemy && _enemy.gender === "female">>
<<if _isVulnerable && _isDickExposed>>
<<set _category to "female_raider_hits_player_position_vulnerable">>
<<elseif !_wasDickExposed && _isDickExposed>>
<<set _category to "female_raider_hits_player_exposes_dick">>
<<elseif _isDickExposed>>
<<if _enemy.lust && _enemy.lust >= 50>>
<<set _category to "female_raider_hits_player_exposed_high_lust">>
<<else>>
<<set _category to "female_raider_hits_player_exposed_low_lust">>
<</if>>
<<elseif _isTorn>>
<<set _category to "female_raider_hits_player_tears">>
<<else>>
<<set _category to "female_raider_hits_player_basic">>
<</if>>
<<if setup.combatNarrative[_category]>>
<<set _pool to setup.combatNarrative[_category]>>
<</if>>
<<else>>
<<if !_wasDickExposed && _isDickExposed>>
<<set _pool to setup.combatNarrative.enemy_hit_player_exposes_dick>>
<<elseif _isDickExposed>>
<<if (_enemy && _enemy.lust && _enemy.lust >= 50) || $player.lust >= 50>>
<<set _pool to setup.combatNarrative.enemy_hit_player_exposed_high_lust>>
<<else>>
<<set _pool to setup.combatNarrative.enemy_hit_player_exposed_low_lust>>
<</if>>
<<elseif _isTorn>>
<<set _pool to setup.combatNarrative.enemy_hit_player_tears_clothes>>
<<else>>
<<set _pool to setup.combatNarrative.enemy_hit_player_basic>>
<</if>>
<</if>>
<</if>>
<<if _useRaiderNarrative && _raiderNarrativeText.length gt 0>>
<<set _narrativeText to _raiderNarrativeText>>
<<elseif _weaponNarrativeText && _weaponNarrativeText.length gt 0>>
<<set _narrativeText to _weaponNarrativeText>>
<<else>>
<<if !_pool || _pool.length === 0>>
<<set _pool to ["{enemy} strikes you!"]>>
<</if>>
<<set _narrativeText to _pool.random()>>
<</if>>
<<if setup.lineMediaShown>><<run setup.lineMediaShown(_narrativeText)>><</if>>
<<if _narrativeText && _enemy && _enemy.name>>
<<set _narrativeText to setup.fillEnemyName(_narrativeText, _enemy)>>
<</if>>
<<set _lustFlavor to "">>
<<if _enemy && _enemy.gender === "female" && _lust>>
<<if _lust >= 80 && setup.combatNarrative.female_max_lust_hit>>
<<set _lustFlavor to setup.combatNarrative.female_max_lust_hit.random()>>
<<elseif _lust >= 60 && setup.combatNarrative.female_high_lust_hit>>
<<set _lustFlavor to setup.combatNarrative.female_high_lust_hit.random()>>
<<elseif _lust >= 31 && _isDickExposed && setup.combatNarrative.female_medium_lust_hit>>
<<set _lustFlavor to setup.combatNarrative.female_medium_lust_hit.random()>>
<</if>>
<<elseif _enemy && _enemy.lust>>
<<set _lfSuffix to setup.kiraInFight() ? "_player" : "_player_solo">>
<<if _enemy.lust >= 80 && setup.combatNarrative["enemy_max_lust_hit" + _lfSuffix]>>
<<set _lustFlavor to setup.combatNarrative["enemy_max_lust_hit" + _lfSuffix].random()>>
<<elseif _enemy.lust >= 60 && setup.combatNarrative["enemy_high_lust_hit" + _lfSuffix]>>
<<set _lustFlavor to setup.combatNarrative["enemy_high_lust_hit" + _lfSuffix].random()>>
<<elseif _enemy.lust >= 31 && _isDickExposed && setup.combatNarrative["enemy_medium_lust_hit" + _lfSuffix]>>
<<set _lustFlavor to setup.combatNarrative["enemy_medium_lust_hit" + _lfSuffix].random()>>
<</if>>
<</if>>
<<set _enemyTaunt to "">>
<<if random(1, 100) lte 30>>
<<if _enemy && _enemy.id && setup.raiderTypeMap && setup.raiderTypeMap[_enemy.id]>>
<<getRaiderTaunt _enemy>>
<<set _enemyTaunt to _return>>
<<elseif _enemy && _enemy.gender === "female">>
<<if _isDickExposed && setup.combatNarrative.enemy_taunt_female_exposed>>
<<set _enemyTaunt to setup.cnLine("enemy_taunt_female_exposed")>>
<<elseif setup.combatNarrative.enemy_taunt_female_clothed>>
<<set _enemyTaunt to setup.cnLine("enemy_taunt_female_clothed")>>
<</if>>
<<else>>
<<if _isDickExposed && setup.combatNarrative.enemy_taunt_male_exposed>>
<<set _enemyTaunt to setup.cnLine("enemy_taunt_male_exposed")>>
<<elseif setup.combatNarrative.enemy_taunt_male_clothed>>
<<set _enemyTaunt to setup.cnLine("enemy_taunt_male_clothed")>>
<</if>>
<</if>>
<</if>>
<<if _enemyTaunt && _enemy && _enemy.name>>
<<set _enemyTaunt to setup.fillEnemyName(_enemyTaunt, _enemy)>>
<</if>>
<<set _playerReaction to "">>
<<if random(1, 100) lte 30 && setup.combatNarrative.player_hit_reaction>>
<<set _playerReaction to setup.combatNarrative.player_hit_reaction.random()>>
<</if>>
<</widget>>
<<widget "getEnemyHitKiraNarrative">>
<<set _damage to _args[0]>>
<<set _enemy to _args[1]>>
<<set _attackType to _args[2]>>
<<if !setup.combatNarrative>>
<<set _narrativeText to "Kira takes a hit!">>
<<set _lustFlavor to "">>
<<set _enemyTaunt to "">>
<<set _kiraReaction to "">>
<<set _kiraHitReaction to "">>
<<else>>
<<set _wasTitsExposed to ($clothing.kira && $clothing.kira.titsExposed)>>
<<set _wasPussyExposed to ($clothing.kira && $clothing.kira.pussyExposed)>>
<<set _isTitsExposed to ($clothing.kira && $clothing.kira.titsExposed)>>
<<set _isPussyExposed to ($clothing.kira && $clothing.kira.pussyExposed)>>
<<set _isExposed to (_isTitsExposed || _isPussyExposed)>>
<<set _isTorn to ($clothing.kira && (($clothing.kira.top >= 26 && $clothing.kira.top <= 50) || ($clothing.kira.bottom >= 26 && $clothing.kira.bottom <= 50)))>>
<<set _isVulnerable to ($combat.positions && $combat.positions.kira && ["kneeling", "prone_front", "prone_back", "bent_over", "pinned"].includes($combat.positions.kira))>>
<<set _weapon to (_enemy && _enemy.weapon) ? _enemy.weapon : "unarmed">>
<<set _lust to (_enemy && _enemy.lust) ? _enemy.lust : 0>>
<<set _category to "enemy_hit_kira_basic">>
<<set _useWeaponNarrative to false>>
<<set _useLustNarrative to false>>
<<set _useRaiderNarrative to false>>
<<set _raiderNarrativeText to "">>
<<if _enemy && _enemy.id && _enemy.gender === "male" && setup.raiderTypeMap && setup.raiderTypeMap[_enemy.id]>>
<<getRaiderHitKiraNarrative _enemy>>
<<set _raiderNarrativeText to _return>>
<<if _raiderNarrativeText && _raiderNarrativeText.trim().length gt 0>>
<<set _useRaiderNarrative to true>>
<</if>>
<</if>>
<<if _weapon === "chain">>
<<if _isExposed && setup.combatNarrative.weapon_chain_hit_kira_exposed>>
<<set _category to "weapon_chain_hit_kira_exposed">>
<<set _useWeaponNarrative to true>>
<<elseif setup.combatNarrative.weapon_chain_hit_kira>>
<<set _category to "weapon_chain_hit_kira">>
<<set _useWeaponNarrative to true>>
<</if>>
<<elseif _weapon === "machete">>
<<if _isExposed && setup.combatNarrative.weapon_machete_hit_kira_exposed>>
<<set _category to "weapon_machete_hit_kira_exposed">>
<<set _useWeaponNarrative to true>>
<<elseif setup.combatNarrative.weapon_machete_hit_kira>>
<<set _category to "weapon_machete_hit_kira">>
<<set _useWeaponNarrative to true>>
<</if>>
<<elseif _weapon === "riding_crop">>
<<if _isExposed && setup.combatNarrative.weapon_crop_hit_kira_exposed>>
<<set _category to "weapon_crop_hit_kira_exposed">>
<<set _useWeaponNarrative to true>>
<<elseif setup.combatNarrative.weapon_crop_hit_kira>>
<<set _category to "weapon_crop_hit_kira">>
<<set _useWeaponNarrative to true>>
<</if>>
<<elseif _weapon === "rope">>
<<if _isExposed && setup.combatNarrative.weapon_rope_hit_kira_exposed>>
<<set _category to "weapon_rope_hit_kira_exposed">>
<<set _useWeaponNarrative to true>>
<<elseif setup.combatNarrative.weapon_rope_hit_kira>>
<<set _category to "weapon_rope_hit_kira">>
<<set _useWeaponNarrative to true>>
<</if>>
<<elseif _weapon === "leather_belt">>
<<if _isVulnerable && $combat.positions.kira === "prone_front" && setup.combatNarrative.weapon_belt_hit_kira_ass_up>>
<<set _category to "weapon_belt_hit_kira_ass_up">>
<<set _useWeaponNarrative to true>>
<<elseif _isVulnerable && $combat.positions.kira === "bent_over" && setup.combatNarrative.weapon_belt_hit_kira_bent_over>>
<<set _category to "weapon_belt_hit_kira_bent_over">>
<<set _useWeaponNarrative to true>>
<<elseif _isVulnerable && $combat.positions.kira === "kneeling" && setup.combatNarrative.weapon_belt_hit_kira_kneeling>>
<<set _category to "weapon_belt_hit_kira_kneeling">>
<<set _useWeaponNarrative to true>>
<<elseif _isExposed && setup.combatNarrative.weapon_belt_hit_kira_exposed>>
<<set _category to "weapon_belt_hit_kira_exposed">>
<<set _useWeaponNarrative to true>>
<<elseif setup.combatNarrative.weapon_belt_hit_kira>>
<<set _category to "weapon_belt_hit_kira">>
<<set _useWeaponNarrative to true>>
<</if>>
<<elseif _weapon === "combat knife">>
<<if _isExposed && setup.combatNarrative.weapon_knife_hit_kira_exposed>>
<<set _category to "weapon_knife_hit_kira_exposed">>
<<set _useWeaponNarrative to true>>
<<elseif setup.combatNarrative.weapon_knife_hit_kira>>
<<set _category to "weapon_knife_hit_kira">>
<<set _useWeaponNarrative to true>>
<</if>>
<<elseif _weapon === "rusty_pipe">>
<<if _isExposed && setup.combatNarrative.weapon_pipe_hit_kira_exposed>>
<<set _category to "weapon_pipe_hit_kira_exposed">>
<<set _useWeaponNarrative to true>>
<<elseif setup.combatNarrative.weapon_pipe_hit_kira>>
<<set _category to "weapon_pipe_hit_kira">>
<<set _useWeaponNarrative to true>>
<</if>>
<<elseif _weapon === "baseball_bat">>
<<if _isExposed && setup.combatNarrative.weapon_bat_hit_kira_exposed>>
<<set _category to "weapon_bat_hit_kira_exposed">>
<<set _useWeaponNarrative to true>>
<<elseif setup.combatNarrative.weapon_bat_hit_kira>>
<<set _category to "weapon_bat_hit_kira">>
<<set _useWeaponNarrative to true>>
<</if>>
<<elseif _weapon === "fists" || _weapon === "unarmed">>
<<if _isExposed && setup.combatNarrative.weapon_fists_hit_kira_exposed>>
<<set _category to "weapon_fists_hit_kira_exposed">>
<<set _useWeaponNarrative to true>>
<<elseif setup.combatNarrative.weapon_fists_hit_kira>>
<<set _category to "weapon_fists_hit_kira">>
<<set _useWeaponNarrative to true>>
<</if>>
<</if>>
<<if _useWeaponNarrative && _enemy && _enemy.gender === "female" && setup.combatNarrative[_category + "_female"] && setup.combatNarrative[_category + "_female"].length>>
<<set _category to _category + "_female">>
<</if>>
<<if !_useWeaponNarrative>>
<<if _enemy && _enemy.gender === "male">>
<<if _isVulnerable && (_isTitsExposed || _isPussyExposed)>>
<<set _category to "male_raider_hits_kira_position_vulnerable">>
<<elseif !_wasPussyExposed && _isPussyExposed>>
<<set _category to "male_raider_hits_kira_exposes_pussy">>
<<elseif !_wasTitsExposed && _isTitsExposed>>
<<set _category to "male_raider_hits_kira_exposes_tits">>
<<elseif _isTitsExposed || _isPussyExposed>>
<<if _enemy.lust && _enemy.lust >= 50>>
<<set _category to "male_raider_hits_kira_exposed_high_lust">>
<<else>>
<<set _category to "male_raider_hits_kira_exposed_low_lust">>
<</if>>
<<elseif _isTorn>>
<<set _category to "male_raider_hits_kira_tears">>
<<else>>
<<set _category to "male_raider_hits_kira_basic">>
<</if>>
<<else>>
<<if !_wasTitsExposed && _isTitsExposed>>
<<set _category to "enemy_hit_kira_exposes_tits">>
<<elseif !_wasPussyExposed && _isPussyExposed>>
<<set _category to "enemy_hit_kira_exposes_pussy">>
<<elseif _isTitsExposed || _isPussyExposed>>
<<set _category to "enemy_hit_kira_already_exposed">>
<<elseif _isTorn>>
<<set _category to "enemy_hit_kira_tears_clothes">>
<</if>>
<</if>>
<</if>>
<<if _useRaiderNarrative && _raiderNarrativeText.length gt 0>>
<<set _narrativeText to _raiderNarrativeText>>
<<elseif _weaponNarrativeText && _weaponNarrativeText.length gt 0>>
<<set _narrativeText to _weaponNarrativeText>>
<<else>>
<<if !setup.combatNarrative[_category] || !setup.combatNarrative[_category].length>>
<<set _category to "enemy_hit_kira_basic">>
<</if>>
<<silently>>
<<combatNarrative _category "Kira takes a hit!">>
<</silently>>
<<set _narrativeText to _narrativeResult.text>>
<</if>>
<<if setup.lineMediaShown>><<run setup.lineMediaShown(_narrativeText)>><</if>>
<<if _narrativeText && _enemy && _enemy.name>>
<<set _narrativeText to setup.fillEnemyName(_narrativeText, _enemy)>>
<</if>>
<<set _lustFlavor to "">>
<<if _enemy && _enemy.gender === "male" && _enemy.lust>>
<<if _enemy.lust >= 80 && setup.combatNarrative.enemy_max_lust_hit>>
<<set _lustFlavor to setup.combatNarrative.enemy_max_lust_hit.random()>>
<<elseif _enemy.lust >= 60 && setup.combatNarrative.enemy_high_lust_hit>>
<<set _lustFlavor to setup.combatNarrative.enemy_high_lust_hit.random()>>
<<elseif _enemy.lust >= 31 && _isExposed && setup.combatNarrative.enemy_medium_lust_hit>>
<<set _lustFlavor to setup.combatNarrative.enemy_medium_lust_hit.random()>>
<</if>>
<<elseif _enemy && _enemy.gender === "female" && _enemy.lust>>
<<if _enemy.lust >= 80 && setup.combatNarrative.female_max_lust_hit_kira>>
<<set _lustFlavor to setup.combatNarrative.female_max_lust_hit_kira.random()>>
<<elseif _enemy.lust >= 60 && setup.combatNarrative.female_high_lust_hit_kira>>
<<set _lustFlavor to setup.combatNarrative.female_high_lust_hit_kira.random()>>
<<elseif _enemy.lust >= 31 && _isExposed && setup.combatNarrative.female_medium_lust_hit_kira>>
<<set _lustFlavor to setup.combatNarrative.female_medium_lust_hit_kira.random()>>
<</if>>
<</if>>
<<set _enemyTaunt to "">>
<<if random(1, 100) lte 30>>
<<if _enemy && _enemy.id && setup.raiderTypeMap && setup.raiderTypeMap[_enemy.id]>>
<<getRaiderTaunt _enemy>>
<<set _enemyTaunt to _return>>
<<elseif _enemy && _enemy.gender === "female">>
<<if _isExposed && setup.combatNarrative.enemy_taunt_kira_female_exposed>>
<<set _enemyTaunt to setup.combatNarrative.enemy_taunt_kira_female_exposed.random()>>
<<elseif setup.combatNarrative.enemy_taunt_kira_female_clothed>>
<<set _enemyTaunt to setup.combatNarrative.enemy_taunt_kira_female_clothed.random()>>
<</if>>
<<else>>
<<if _isExposed && setup.combatNarrative.enemy_taunt_kira_male_exposed>>
<<set _enemyTaunt to setup.combatNarrative.enemy_taunt_kira_male_exposed.random()>>
<<elseif setup.combatNarrative.enemy_taunt_kira_male_clothed>>
<<set _enemyTaunt to setup.combatNarrative.enemy_taunt_kira_male_clothed.random()>>
<</if>>
<</if>>
<</if>>
<<if _enemyTaunt && _enemy && _enemy.name>>
<<set _enemyTaunt to setup.fillEnemyName(_enemyTaunt, _enemy)>>
<</if>>
<<set _kiraReaction to "">>
<<if $companions[0].lust >= 40 && random(1, 100) lte 25>>
<<if setup.combatNarrative.kira_combat_arousal>>
<<set _kiraReaction to setup.combatNarrative.kira_combat_arousal.random()>>
<</if>>
<</if>>
<<set _kiraHitReaction to "">>
<<if random(1, 100) lte 30 && setup.combatNarrative.kira_hit_reaction>>
<<set _kiraHitReaction to setup.combatNarrative.kira_hit_reaction.random()>>
<</if>>
<</if>>
<</widget>><<run VaultUI.setBackgroundDirect(setup.combatBackgroundImage())>>
<<showCharacter "kira" "center" "aroused">>
<<postBattleVideo "arousal_mutual_explosion">>
<<advanceTime 0 30>>
<h2>After the Fight</h2>
<p class="narrator"><<randomLine "arousal_mutual_explosion" "buildup">></p>
<<if $clothing.kira.titsExposed>>
<p class="explicit"><<randomLine "arousal_narrative" "kira_tits_exposed">></p>
<<else>>
<p class="explicit"><<randomLine "arousal_narrative" "kira_tits_hint">></p>
<</if>>
<<if $clothing.player.dickExposed>>
<p class="explicit"><<randomLine "arousal_narrative" "player_cock_exposed">></p>
<<else>>
<p class="explicit"><<randomLine "arousal_narrative" "player_cock_strain">></p>
<</if>>
<p class="explicit"><<randomLine "arousal_mutual_explosion" "crash_together">></p>
<p class="explicit"><<randomLine "arousal_mutual_explosion" "crash_together">></p>
<<sexScene "kira" "desperate" "rough" "wasteland-postbattle">>
<<sexPhase "foreplay">>
<<performSexAct "penetrate_rough">>
<<if _pbFamily is "sf_cg_postbattle_mutual_explosion_01" or _pbClip is "6baf9f67e48a">>
<p class="explicit">You bend her over a rusted rail at the edge of the ruins and pound her from behind. She hangs onto the rail with both hands, hair swinging, and every time you slow down she slams her ass back at you until you stop trying to.</p>
<<else>>
<p class="explicit"><<randomLine "arousal_mutual_explosion" "fucking">></p>
<</if>>
<<sexPhase "action">>
<<performSexAct "thrust_hard">>
<p class="explicit"><<randomLine "arousal_mutual_explosion" "fucking">></p>
<<performSexAct "thrust_fast">>
<<performSexAct "hairpull">>
<p class="explicit"><<randomLine "arousal_mutual_explosion" "fucking">></p>
<<performSexAct "grope_tits">>
<<performSexAct "thrust_deep">>
<p class="explicit"><<randomLine "arousal_mutual_explosion" "fucking">></p>
<<sexPhase "climax">>
<<performSexAct "climax_together">>
<p class="explicit"><<randomLine "arousal_mutual_explosion" "fucking">></p>
<<endSexScene>>
<<set _kiraAfterA to setup.kiraMoodLine("arousal_mutual_explosion", "aftermath")>>
<<set _kiraAfterB to setup.kiraMoodLine("arousal_mutual_explosion", "aftermath", undefined, _kiraAfterA)>>
<p class="narrator"><<print _kiraAfterA>></p>
<p class="narrator"><<print _kiraAfterB>></p>
<<say "Kira" `setup.kiraMoodLine("arousal_mutual_explosion", "aftermath_says", undefined, _kiraAfterA + " " + _kiraAfterB)`>>
<<set $player.lust to 10>>
<<set $companions[0].lust to 20>>
<<set $companions[0].tension to 40>>
<<addAffection "kira" 3>>
<<addTrust "kira" 5>>
<<set $flags.postBattleSexKira to true>>
<<set $flags.mutualExplosion to true>>
<<set $stats.sexScenes.kira.total++>>
<<set $stats.sexScenes.kira.vaginal++>>
<<set $stats.sexScenes.locations.wasteland++>>
<<if $companions[0].tension >= 60>>
<<discoverKink "kira" "rough_play">>
<</if>>
<div class="choice-container">
<<vchoice "Deal with the aftermath" "PostBattle_Normal" "action" "map">>
</div><<run VaultUI.setBackgroundDirect(setup.combatBackgroundImage())>>
<<showCharacter "kira" "center" "desperate">>
<<postBattleVideo "arousal_kira_jumps_player">>
<<set _jumpsClip to _pbClip>>
<<set _jumpsFamily to _pbFamily>>
<<advanceTime 0 30>>
<h2>After the Fight</h2>
<p class="narrator"><<randomLine "arousal_kira_jumps_player" "before">></p>
<p class="narrator"><<randomLine "arousal_kira_jumps_player" "before">></p>
<<sexScene "kira" "desperate" "dominant" "wasteland-postbattle">>
<<sexPhase "foreplay">>
<<performSexAct "oral_aggressive">>
<p class="explicit"><<randomLine "arousal_kira_jumps_player" "blowjob">></p>
<<kinkMatchNarrative "oral">>
<p class="explicit"><<randomLine "arousal_kira_jumps_player" "blowjob">></p>
<<if _jumpsFamily is "sf_cg_postbattle_kira_jumps_player_01">>
<p class="explicit">She pushes you flat on your back, swings a leg over your face and goes straight back to your cock upside down, grinding her soaked cunt on your mouth while she sucks.</p>
<</if>>
<<performSexAct "oral_deepthroat">>
<<if !_jumpsFamily>><<postBattleVideo "arousal_kira_deepthroat">><</if>>
<<if !_jumpsFamily && _pbClip is "b16a6fb0d019">>
<p class="explicit">She digs a leather collar out of her pack, buckles it around her own throat, cinches a strap across her chest and shoves the ends into your fist. "Hold on. Don't you dare let go." She drops to her knees and tips her head right back, and you fuck her throat straight down from above while she gags and the spit runs over the leather and down her tits.</p>
<<else>>
<p class="explicit"><<randomLine "arousal_kira_jumps_player" "blowjob">></p>
<</if>>
<<sexPhase "action">>
<p class="narrator"><<randomLine "arousal_kira_jumps_player" "demands_more">></p>
<<performSexAct "position_cowgirl">>
<<performSexAct "penetrate_cowgirl">>
<p class="explicit"><<randomLine "arousal_kira_jumps_player" "fucking">></p>
<<kinkMatchNarrative "rough">>
<<performSexAct "ride_fast">>
<<performSexAct "thrust_up">>
<p class="explicit"><<randomLine "arousal_kira_jumps_player" "fucking">></p>
<<kinkMatchNarrative "submissive">>
<<performSexAct "grind">>
<<performSexAct "ride_hard">>
<p class="explicit"><<randomLine "arousal_kira_jumps_player" "fucking">></p>
<<performSexAct "grope_tits">>
<<sexPhase "climax">>
<<kinkMatchNarrative "climax">>
<<performSexAct "climax_partner">>
<<set _kiraFinishA to setup.kiraMoodLine("arousal_kira_jumps_player", "finish")>>
<p class="explicit"><<print _kiraFinishA>></p>
<<performSexAct "climax_inside">>
<p class="explicit"><<print setup.kiraMoodLine("arousal_kira_jumps_player", "finish", undefined, _kiraFinishA)>></p>
<<endSexScene>>
<<set _kiraAfterA to setup.kiraMoodLine("arousal_kira_jumps_player", "after")>>
<p class="narrator"><<print _kiraAfterA>></p>
<<kinkAfterNarrative>>
<<say "Kira" `setup.kiraMoodLine("arousal_kira_jumps_player", "after_says", undefined, _kiraAfterA)`>>
<<set $player.lust to 15>>
<<set $companions[0].lust to 30>>
<<clampStat "companions[0].tension" -25>>
<<addAffection "kira" 2>>
<<set $flags.kiraJumpedPlayer to true>>
<<set $flags.kiraBlowjobPostBattle to true>>
<<set $stats.sexScenes.kira.total++>>
<<set $stats.sexScenes.kira.oral_received++>>
<<set $stats.sexScenes.kira.vaginal++>>
<<set $stats.sexScenes.locations.wasteland++>>
<div class="choice-container">
<<vchoice "Deal with the aftermath" "PostBattle_Normal" "action" "map">>
</div><<run VaultUI.setBackgroundDirect(setup.combatBackgroundImage())>>
<<showCharacter "kira" "center" "vulnerable">>
<<postBattleVideo "arousal_player_takes_kira">>
<<advanceTime 0 30>>
<h2>After the Fight</h2>
The fight is over. Kira stands nearby, breathing hard.
<<if $clothing.kira.titsExposed>>
<p class="explicit"><<randomLine "arousal_narrative" "kira_full_exposed">></p>
<<elseif $clothing.kira.pussyExposed>>
<p class="explicit"><<randomLine "arousal_narrative" "kira_pussy_exposed">></p>
<<else>>
<p class="explicit"><<randomLine "arousal_narrative" "kira_body_exposed">></p>
<</if>>
<p class="narrator"><<randomLine "arousal_player_takes_kira" "buildup">></p>
<p class="narrator"><<randomLine "arousal_player_takes_kira" "buildup">></p>
<<sexScene "kira" "rough" "dominant" "wasteland-postbattle">>
<<sexPhase "foreplay">>
<<set _kiraTakeA to setup.kiraMoodLine("arousal_player_takes_kira", "take_her")>>
<p class="explicit"><<print _kiraTakeA>></p>
<p class="explicit"><<print setup.kiraMoodLine("arousal_player_takes_kira", "take_her", undefined, _kiraTakeA)>></p>
<<performSexAct "tease">>
<<sexPhase "action">>
<<performSexAct "penetrate_rough">>
<p class="explicit"><<randomLine "arousal_player_takes_kira" "reaction">></p>
<<if _pbFamily is "sf_cg_postbattle_player_takes_kira_02">>
<p class="explicit">You shove her down flat on her belly and keep pounding her from behind, your whole weight pinning her, her cheek mashed flat under you.</p>
<</if>>
<<performSexAct "thrust_hard">>
<<performSexAct "thrust_fast">>
<p class="explicit"><<randomLine "arousal_player_takes_kira" "reaction">></p>
<<performSexAct "hairpull">>
<<if _pbFamily is "sf_cg_postbattle_player_takes_kira_02">>
<p class="explicit">You haul her back up onto her knees, wind her hair around your fist and yank her head back while you fuck her. She cries out and shoves her ass back for more.</p>
<</if>>
<<performSexAct "rub_clit">>
<p class="explicit"><<randomLine "arousal_player_takes_kira" "reaction">></p>
<<performSexAct "thrust_deep">>
<p class="explicit"><<randomLine "arousal_player_takes_kira" "reaction">></p>
<<sexPhase "climax">>
<<performSexAct "climax_partner">>
<p class="explicit"><<randomLine "arousal_player_takes_kira" "reaction">></p>
<<performSexAct "climax_inside">>
<<endSexScene>>
<<set _kiraAfterA to setup.kiraMoodLine("arousal_player_takes_kira", "aftermath")>>
<p class="narrator"><<print _kiraAfterA>></p>
<<say "Kira" `setup.kiraMoodLine("arousal_player_takes_kira", "aftermath_says", undefined, _kiraAfterA)`>>
<<set $player.lust to 10>>
<<set $companions[0].lust to 20>>
<<set $companions[0].tension to 35>>
<<set $companions[0].submission += 10>>
<<addAffection "kira" 2>>
<<set $flags.tookKiraPostBattle to true>>
<<set $flags.dominatedKira to true>>
<<set $stats.sexScenes.kira.total++>>
<<set $stats.sexScenes.kira.vaginal++>>
<<set $stats.sexScenes.kira.rough++>>
<<set $stats.sexScenes.locations.wasteland++>>
<div class="choice-container">
<<vchoice "Deal with the aftermath" "PostBattle_Normal" "action" "map">>
</div><<set _playerDamaged to setup.clothesTorn("player")>>
<<set _kiraDamaged to setup.clothesTorn("kira")>>
<<if _playerDamaged || _kiraDamaged>>
<h3>After the Fight</h3>
<<if _playerDamaged && _kiraDamaged>>
You're both in rough shape. Clothes torn, barely covering anything.
<<if $clothing.player.dickExposed && $clothing.kira.titsExposed>>
<p class="explicit">Your cock is still hanging out. Her tits are still exposed. You're both pretending not to notice.</p>
<<travelMediaState>><<showTravelVideo _travelState>>
<<addTension "kira" 4 "" "combat">>
<</if>>
<<elseif _kiraDamaged>>
Kira's clothes are in tatters.
<<if $clothing.kira.titsExposed>>
<<showCharacter "kira" "center" "embarrassed">>
<<say "Kira" "Stop staring and find me something to wear.">>
<p class="narrator">But she's not covering herself very hard. Almost like she wants you to look.</p>
<<set _exposedLustVal to setup.postCombatConfig.clothingCheck.exposedLust || 0>>
<<clampStat "player.lust" _exposedLustVal>>
<</if>>
<<elseif _playerDamaged>>
Your clothes are shredded.
<<if $clothing.player.dickExposed>>
<<say "Kira" "You might want to... fix that.">>
She's trying not to stare. Failing.
<<addTension "kira" 3 "" "combat">>
<</if>>
<</if>>
<div class="choice-container">
<<if setup.fightOnTripAway()>>
<<vchoice "\"Let's just move on. I like the view.\"" "PostCombat_Flirt_Clothes" "intimate" "lips">>
<<else>>
<<vchoice "\"Let's just get back. I like the view.\"" "PostCombat_Flirt_Clothes" "intimate" "lips">>
<</if>>
<<vchoice "Help each other patch up" "PostCombat_Repair_Mutual" "action" "armor">>
<<if setup.fightOnTripAway()>>
<<vchoice "Walk on exposed" "PostCombat_Return_Exposed" "action" "run">>
<<else>>
<<vchoice "Head back exposed" "PostCombat_Return_Exposed" "action" "run">>
<</if>>
</div>
<</if>><<set _rmChest to $clothing.kira.titsExposed>><<quickPatch "player">><<quickPatch "kira">>
<<travelMediaState>><<showTravelVideo _travelState>>
You help each other patch the worst tears. Makeshift but functional.
Close proximity. Hands on each other. Intimate despite the circumstances.
<<if _rmChest>>
You help her tie fabric across her chest. Your fingers brush her nipple. She gasps.
<<addTension "kira" 3 "" "combat">>
<</if>>
<<relationChange "kira" "affection" 2>>
<div class="choice-container">
<<if $journey.active>>
<<vchoice "Walk on" "Journey_Tick" "action" "forward">>
<<else>>
<<vchoice "Head back" "Vault_Hub" "move" "house">>
<</if>>
</div><<if setup.fightOnTripAway()>><<say $player.name "Let's just move on. I like the view.">><<else>><<say $player.name "Let's just get back. I like the view.">><</if>>
<<showCharacter "kira" "center" "flustered">>
<<showTravelVideo "high_lust_kira">>
<<say "Kira" "You're such an ass.">>
But she's smiling. And not covering up any more than necessary.
<<if setup.fightOnTripAway()>>The walk is VERY distracting.<<else>>The walk back is VERY distracting.<</if>>
<<addTension "kira" 4 "" "combat">>
<<set _flirtLust to setup.postCombatConfig.flirt.playerLust || 0>>
<<clampStat "player.lust" _flirtLust>>
<div class="choice-container">
<<if $journey.active>>
<<vchoice "Walk on" "Journey_Tick" "action" "forward">>
<<else>>
<<vchoice "Return to vault" "Vault_Hub" "move" "house">>
<</if>>
</div><<travelMediaState>><<showTravelVideo _travelState>>
<<if setup.fightOnTripAway()>>You just walk on. Torn clothes and all.<<else>>You just head back. Torn clothes and all.<</if>>
<<if $journey.active>>
<<set _pcAhead to setup.tripAheadName()>>
<<if _pcAhead>><<= _pcAhead>> is hours away, and every step of it in rags.<<else>>The vault is hours away, and every step of it in rags.<</if>>
<</if>>
<<if !$journey.active && ($clothing.kira.titsExposed || $clothing.player.dickExposed)>>
The Groundskeeper raises an eyebrow when you return but says nothing.
<<addTension "kira" 3 "" "combat">>
<</if>>
<div class="choice-container">
<<if $journey.active>>
<<vchoice "Walk on" "Journey_Tick" "action" "forward">>
<<else>>
<<vchoice "Clean up" "Vault_Hub" "move" "house">>
<</if>>
</div><<silently>>
<<if !$postBattle || !$postBattle.defeatedEnemies>>
<<set _enemies to []>>
<<if $combat && $combat.defeatedEnemies && $combat.defeatedEnemies.length > 0>>
<<set _enemies to clone($combat.defeatedEnemies)>>
<</if>>
<<if $combat && $combat.enemies && $combat.enemies.length > 0>>
<<for _e range $combat.enemies>>
<<run _enemies.push(clone(_e))>>
<</for>>
<</if>>
<<if _enemies.length === 0 && $combat && $combat.allEnemies && $combat.allEnemies.length > 0>>
<<set _enemies to clone($combat.allEnemies)>>
<</if>>
<<if _enemies.length === 0>>
<<set _enemies to [
{
name: "Female Raider",
type: "human",
gender: "female",
health: 5,
maxHealth: 40,
clothing: {top: 0, bottom: 0, underwear: 0, titsExposed: true, pussyExposed: true, assExposed: true},
loot: ["scrap metal", "bandage", "ammo"],
lootChance: 0.6,
boundState: "none"
},
{
name: "Male Raider",
type: "human",
gender: "male",
health: 0,
maxHealth: 35,
clothing: {top: 0, bottom: 0, underwear: 0, titsExposed: false, pussyExposed: false, assExposed: false},
loot: ["scrap metal", "combat knife"],
lootChance: 0.5,
boundState: "none"
}
]>>
<</if>>
<<set $postBattle to {
defeatedEnemies: _enemies,
location: $currentLocation || "wasteland",
timeOfDay: $time.phase || "afternoon",
enemiesSearched: [],
enemiesSecondarySearched: [],
enemiesUsed: [],
enemiesReleased: [],
enemiesExecuted: [],
collectedLoot: []
}>>
<</if>>
<<for _i, _enemy range $postBattle.defeatedEnemies>>
<<if !_enemy.clothing>>
<<set _enemy.clothing to {
top: 0, bottom: 0, underwear: 0,
titsExposed: true, pussyExposed: true, assExposed: true
}>>
<</if>>
<<if !_enemy.loot>><<set _enemy.loot to ["scrap metal", "ammo"]>><</if>>
<<if !_enemy.lootChance>><<set _enemy.lootChance to 0.3>><</if>>
<<if !_enemy.boundState>><<set _enemy.boundState to "none">><</if>>
<<if !_enemy.gender>><<set _enemy.gender to "male">><</if>>
<<if !_enemy.health && _enemy.health !== 0>><<set _enemy.health to 0>><</if>>
<<if !_enemy.name>><<set _enemy.name to "Unknown Enemy">><</if>>
<</for>>
<</silently>>
<<run VaultUI.setBackgroundDirect(setup.combatBackgroundImage())>>
<<set _kiraHere to setup.kiraAfterFight()>>
<h2>Victory</h2>
The fight is over. Bodies litter the ground — some dead, some just unconscious.
<<if $postBattle.justTied != null>>
<<postBattleVideo "tie_up" $postBattle.justTied>>
<<set $postBattle.justTied to null>>
<<elseif _kiraHere>>
<<postBattleVideo "hub">>
<</if>>
<<if !_kiraHere>>
You wipe your blade and catch your breath. Nobody else is left standing.
<<elseif $clothing && $clothing.kira && ($clothing.kira.titsExposed || $clothing.kira.pussyExposed)>>
<<showCharacter "kira" "right" "disheveled">>
Kira stands nearby, breathing hard, not bothering to cover herself anymore.
<<say "Kira" "Let's... let's just deal with this and get back.">>
<<else>>
<<showCharacter "kira" "right" "combat-done">>
<<if _pbClip is "aafc2830b9ab">>Kira tugs the strap at her throat straight and twists round to check herself over, smug: not a scratch on her.<<else>>Kira wipes blood from her blade.<</if>>
<<say "Kira" "Search them. Take what we need.">>
<</if>>
<<set _totalLoot to []>>
<<for _i, _e range $postBattle.defeatedEnemies>>
<<if _e.loot && _e.loot.length gt 0>>
<<for _item range _e.loot>>
<<if Math.random() lte (_e.lootChance || 0.5)>>
<<run _totalLoot.push({item: _item, from: _e.name})>>
<</if>>
<</for>>
<</if>>
<</for>>
<div class="defeated-enemies">
<h3>Defeated Enemies (<<print $postBattle.defeatedEnemies.length>>)</h3>
<<for _i, _e range $postBattle.defeatedEnemies>>
<<if !$postBattle.enemiesReleased.includes(_i) && !$postBattle.enemiesExecuted.includes(_i)>>
<div class="enemy-card defeated">
<div class="enemy-info">
<strong><<print _e.name>></strong>
<<if _e.gender>>
<span class="gender-tag">(<<print _e.gender>>)</span>
<</if>>
<<if _e.gender === "female">>
<<if _e.clothing && _e.clothing.titsExposed && _e.clothing.pussyExposed>>
<span class="status-exposed">— Naked, exposed</span>
<<elseif _e.clothing && _e.clothing.titsExposed>>
<span class="status-exposed">— Tits out</span>
<<elseif _e.clothing && _e.clothing.pussyExposed>>
<span class="status-exposed">— Pussy exposed</span>
<</if>>
<</if>>
<<if _e.boundState === "tied">>
<span class="status-bound">— Tied up</span>
<</if>>
<<if _e.health lte 0 && _e.covenant>>
<span class="status-dead">— Out cold</span>
<<elseif _e.health lte 0>>
<span class="status-dead">— Dead</span>
<</if>>
</div>
<div class="enemy-actions">
<<set _searchId to "search-result-" + _i>>
<<set _isFemaleAlive to (_e.gender === "female" && _e.health gt 0)>>
<<capture _i, _e, _searchId, _isFemaleAlive>>
<<if !$postBattle.enemiesSearched.includes(_i)>>
<span @id="_searchId" class="search-result">
<<link "Search body">>
<<advanceTime 0 5>>
<<run $postBattle.enemiesSearched.push(_i)>>
<<set _found to []>>
<<if _e.loot>>
<<if Array.isArray(_e.loot)>>
<<for _lootItem range _e.loot>>
<<if Math.random() lte (_e.lootChance || 0.5)>>
<<set _itemName to _lootItem.replace(/_/g, " ")>>
<<run _found.push(setup.postBattleTakeLoot(_lootItem, _itemName, 1, _e.name))>>
<</if>>
<</for>>
<<else>>
<<for _itemId, _qtyData range _e.loot>>
<<if Math.random() lte (_e.lootChance || 0.5)>>
<<set _itemName to _itemId.replace(/_/g, " ")>>
<<if Array.isArray(_qtyData)>>
<<set _qty to Math.floor(Math.random() * (_qtyData[1] - _qtyData[0] + 1)) + _qtyData[0]>>
<<else>>
<<set _qty to _qtyData || 1>>
<</if>>
<<if _qty gt 0>>
<<run _found.push(setup.postBattleTakeLoot(_itemId, _itemName, _qty, _e.name))>>
<</if>>
<</if>>
<</for>>
<</if>>
<</if>>
<<set _rli to setup.raiderLootItem(_e)>>
<<if _rli>><<run _found.push(setup.postBattleTakeLoot(_rli, setup.itemName(_rli), 1, _e.name))>><</if>>
<<set _found to _found.filter(Boolean)>>
<<set _targetSelector to "#" + _searchId>>
<<if _found.length gt 0>>
<<if _isFemaleAlive>>
<<replace _targetSelector>><span class="loot-found">Found: <<print _found.join(", ")>></span> | <<link "Search again...">><<set $postBattle.currentEnemy to _i>><<goto "PostBattle_Secondary_Search">><</link>><<if _isFemaleAlive>><<postBattleVideo "search" _i>><</if>><</replace>>
<<else>>
<<replace _targetSelector>><span class="loot-found">Found: <<print _found.join(", ")>></span><</replace>>
<</if>>
<<else>>
<<if _isFemaleAlive>>
<<replace _targetSelector>><span class="loot-empty">Nothing useful</span> | <<link "Search again...">><<set $postBattle.currentEnemy to _i>><<goto "PostBattle_Secondary_Search">><</link>><<if _isFemaleAlive>><<postBattleVideo "search" _i>><</if>><</replace>>
<<else>>
<<replace _targetSelector>><span class="loot-empty">Nothing useful</span><</replace>>
<</if>>
<</if>>
<<replace "#loot-collected">><<include "PostBattle_Loot_Display">><</replace>>
<</link>>
</span>
<<elseif _isFemaleAlive && (!$postBattle.enemiesSecondarySearched || !$postBattle.enemiesSecondarySearched.includes(_i))>>
<<link "Search again...">>
<<set $postBattle.currentEnemy to _i>>
<<goto "PostBattle_Secondary_Search">>
<</link>>
<<else>>
<span class="already-searched">Already searched</span>
<</if>>
<<if _e.clothing>>
<<if _e.clothing.top gt 0 && !_e.clothing.titsExposed>>
<<if _e.gender === "female">>
<<link "Rip off her top">>
<<set $postBattle.currentEnemy to _i>>
<<set $postBattle.stripType to "top">>
<<goto "PostBattle_Strip_Enemy">>
<</link>>
<<else>>
<<link "Rip off his shirt">>
<<set $postBattle.currentEnemy to _i>>
<<set $postBattle.stripType to "top">>
<<goto "PostBattle_Strip_Enemy">>
<</link>>
<</if>>
<</if>>
<<if _e.clothing.bottom gt 0 && !_e.clothing.pussyExposed>>
<<if _e.gender === "female">>
<<link "Tear off her pants">>
<<set $postBattle.currentEnemy to _i>>
<<set $postBattle.stripType to "bottom">>
<<goto "PostBattle_Strip_Enemy">>
<</link>>
<<else>>
<<link "Tear off his pants">>
<<set $postBattle.currentEnemy to _i>>
<<set $postBattle.stripType to "bottom">>
<<goto "PostBattle_Strip_Enemy">>
<</link>>
<</if>>
<</if>>
<<if (_e.clothing.top gt 0 || _e.clothing.bottom gt 0) && !(_e.clothing.titsExposed && _e.clothing.pussyExposed)>>
<<if _e.gender === "female">>
<<link "Strip her naked">>
<<set $postBattle.currentEnemy to _i>>
<<set $postBattle.stripType to "all">>
<<goto "PostBattle_Strip_Enemy">>
<</link>>
<<else>>
<<link "Strip him naked">>
<<set $postBattle.currentEnemy to _i>>
<<set $postBattle.stripType to "all">>
<<goto "PostBattle_Strip_Enemy">>
<</link>>
<</if>>
<</if>>
<</if>>
<<if _e.gender === "female" && _e.health gt 0 && !$postBattle.playerCame>>
<<if _e.clothing && _e.clothing.titsExposed>>
<<link "Grope tits">>
<<set $postBattle.currentEnemy to _i>>
<<goto "PostBattle_Grope_Tits">>
<</link>>
<</if>>
<<if _e.clothing && _e.clothing.pussyExposed>>
<<link "Finger her">>
<<set $postBattle.currentEnemy to _i>>
<<goto "PostBattle_Finger_Enemy">>
<</link>>
<<link "Eat her out">>
<<set $postBattle.currentEnemy to _i>>
<<goto "PostBattle_EatOut_Enemy">>
<</link>>
<<link "Sit on your face">>
<<set $postBattle.currentEnemy to _i>>
<<goto "PostBattle_Facesit_Enemy">>
<</link>>
<</if>>
<<if _e.clothing && _e.clothing.pussyExposed>>
<<if $clothing && $clothing.player && $clothing.player.dickExposed>>
<<link "Fuck her pussy">>
<<set $postBattle.currentEnemy to _i>>
<<goto "PostBattle_Fuck_Enemy">>
<</link>>
<<else>>
<<link "Fuck her pussy">>
<<set $clothing.player.dickExposed to true>>
<<set $postBattle.currentEnemy to _i>>
<<goto "PostBattle_Fuck_Enemy">>
<</link>>
<</if>>
<</if>>
<<if _e.clothing && _e.clothing.assExposed>>
<<if $clothing && $clothing.player && $clothing.player.dickExposed>>
<<link "Fuck her ass">>
<<set $postBattle.currentEnemy to _i>>
<<goto "PostBattle_Anal_Enemy">>
<</link>>
<<else>>
<<link "Fuck her ass">>
<<set $clothing.player.dickExposed to true>>
<<set $postBattle.currentEnemy to _i>>
<<goto "PostBattle_Anal_Enemy">>
<</link>>
<</if>>
<</if>>
<<if $clothing && $clothing.player && $clothing.player.dickExposed>>
<<link "Use her mouth">>
<<set $postBattle.currentEnemy to _i>>
<<goto "PostBattle_Facefuck_Enemy">>
<</link>>
<<else>>
<<link "Use her mouth">>
<<set $clothing.player.dickExposed to true>>
<<set $postBattle.currentEnemy to _i>>
<<goto "PostBattle_Facefuck_Enemy">>
<</link>>
<</if>>
<<if _e.clothing && _e.clothing.titsExposed>>
<<link "Titfuck her">>
<<if !$clothing.player.dickExposed>><<set $clothing.player.dickExposed to true>><</if>>
<<set $postBattle.currentEnemy to _i>>
<<goto "PostBattle_Titfuck_Enemy">>
<</link>>
<</if>>
<<if _kiraHere && _e.clothing && _e.clothing.pussyExposed && $companions[0].lust gte 30>>
<<link "Have Kira use her">>
<<set $postBattle.currentEnemy to _i>>
<<goto "PostBattle_Kira_Uses_Enemy">>
<</link>>
<</if>>
<<if _kiraHere && setup.kiraRoomSexOpen() && _e.clothing && _e.clothing.pussyExposed && _e.clothing.titsExposed>>
<<link "Use her together with Kira">>
<<if !$clothing.player.dickExposed>><<set $clothing.player.dickExposed to true>><</if>>
<<set $postBattle.currentEnemy to _i>>
<<goto "PostBattle_Threesome_Enemy">>
<</link>>
<</if>>
<<link "Make her beg">>
<<set $postBattle.currentEnemy to _i>>
<<goto "PostBattle_MakeBeg_Enemy">>
<</link>>
<</if>>
<<if _e.gender === "male" && _e.health gt 0>>
<<if _e.clothing && _e.clothing.dickExposed>>
<<if !$postBattle.enemiesUsed.includes(_i)>>
<<link "Make him cum on himself">>
<<set $postBattle.currentEnemy to _i>>
<<goto "PostBattle_Humiliate_Male_Enemy">>
<</link>>
<</if>>
<<if _kiraHere && $companions[0].lust gte 50>>
<<link "Have Kira ride him">>
<<set $postBattle.currentEnemy to _i>>
<<goto "PostBattle_Kira_Rides_Male">>
<</link>>
<</if>>
<<else>>
<<link "Strip him">>
<<set $postBattle.defeatedEnemies[_i].clothing.dickExposed to true>>
<<set $postBattle.defeatedEnemies[_i].clothing.bottom to 0>>
<<goto "PostBattle_Normal">>
<</link>>
<</if>>
<</if>>
<<if _e.health gt 0 && _e.boundState !== "tied">>
<<link "Tie up">>
<<set $postBattle.defeatedEnemies[_i].boundState to "tied">>
<<if _e.gender === "female">><<set $postBattle.justTied to _i>><</if>>
<<goto "PostBattle_Normal">>
<</link>>
<</if>>
<<if _e.health gt 0>>
<<link "Let go">>
<<set $postBattle.currentEnemy to _i>>
<<goto "PostBattle_Release_Enemy">>
<</link>>
<</if>>
<<if _e.health gt 0>>
<<link "Execute">>
<<set $postBattle.currentEnemy to _i>>
<<goto "PostBattle_Execute_Enemy">>
<</link>>
<</if>>
<</capture>>
</div>
</div>
<</if>>
<</for>>
</div>
<div class="loot-summary">
<h3>Collected Loot</h3>
<div id="loot-collected">
<<include "PostBattle_Loot_Display">>
</div>
</div>
<div class="choice-container main-actions">
<<set _pbScene to setup.combatScenePassage("victory")>>
<<if _pbScene>>
<<vchoice "Continue" _pbScene "action" "forward">>
<<elseif setup.fightOnTrip()>>
<<link `'<span class="choice-button action"><span class="gi gi-journey gi-large"></span><span class="label">Done here, back on the road</span></span>'`>><<postBattleLeave>><<goto _pblNext>><</link>>
<<else>>
<<link `'<span class="choice-button action"><span class="gi gi-house gi-large"></span><span class="label">Done here — head back to vault</span></span>'`>><<postBattleLeave>><<goto _pblNext>><</link>>
<</if>>
</div><<lootLeftList "postBattle" "#loot-collected" "PostBattle_Loot_Display">>
<<if $postBattle && $postBattle.collectedLoot && $postBattle.collectedLoot.length gt 0>>
<<set _totalQty to 0>>
<ul class="loot-list">
<<for _loot range $postBattle.collectedLoot>>
<<set _qty to _loot.qty || 1>>
<<set _totalQty += _qty>>
<li class="loot-item">
<span class="loot-name"><<print _loot.name>><<if _qty gt 1>> x<<print _qty>><</if>></span>
<span class="loot-source">(from <<print _loot.from>>)</span>
</li>
<</for>>
</ul>
<p class="loot-total">Total items: <<print _totalQty>></p>
<<elseif !($postBattle && $postBattle.leftLoot && $postBattle.leftLoot.length gt 0)>>
<p class="loot-hint">Search bodies to collect loot.</p>
<</if>><<set _i to $postBattle.currentEnemy>>
<<set _e to $postBattle.defeatedEnemies[_i]>>
<<set _stripType to $postBattle.stripType || "all">>
<<set _isMale to (_e.gender === "male")>>
<<set _isTied to (_e.boundState === "tied")>>
<<set _isBroken to (_e.beenUsed || _e.defeatType === "seduced" || (_e.lust && _e.lust >= 90))>>
<<set _pool to _isTied ? "postbattle_strip_tied" : (_isBroken ? "postbattle_strip_broken" : "postbattle_strip")>>
<<advanceTime 0 5>>
<<if _isMale>>
<<if _stripType === "top">>
<<set $postBattle.defeatedEnemies[_i].clothing.top to 0>>
<h3>Rip Off His Shirt</h3>
<<if _e.health gt 0>>
<p class="narrator">You grab his shirt and tear it off. He grunts in protest but can't stop you.</p>
<<else>>
<p class="narrator">You strip the shirt from the corpse. The fabric is torn but still usable.</p>
<</if>>
<<elseif _stripType === "bottom">>
<<set $postBattle.defeatedEnemies[_i].clothing.bottom to 0>>
<<set $postBattle.defeatedEnemies[_i].clothing.underwear to 0>>
<h3>Tear Off His Pants</h3>
<<if _e.health gt 0>>
<p class="narrator">You yank his pants off, checking the pockets for anything useful. He curses at you weakly.</p>
<<else>>
<p class="narrator">You strip the pants from the corpse. The fabric is bloody but still usable for repairs.</p>
<</if>>
<<else>>
<<set $postBattle.defeatedEnemies[_i].clothing.top to 0>>
<<set $postBattle.defeatedEnemies[_i].clothing.bottom to 0>>
<<set $postBattle.defeatedEnemies[_i].clothing.underwear to 0>>
<h3>Strip Him</h3>
<<if _e.health gt 0>>
<p class="narrator">You strip him of all useful cloth, leaving him in just his undergarments. He spits curses at you, but he's too weak to resist.</p>
<<else>>
<p class="narrator">You strip the corpse of all usable cloth. Waste not. The fabric is torn and bloody, but it'll work for repairs.</p>
<</if>>
<</if>>
<<else>>
<<if _e.health gt 0>><<postBattleVideo `_stripType === "top" ? "strip_top" : (_stripType === "bottom" ? "strip_bottom" : "strip")`>><</if>>
<<if _stripType === "top">>
<<set $postBattle.defeatedEnemies[_i].clothing.top to 0>>
<<set $postBattle.defeatedEnemies[_i].clothing.titsExposed to true>>
<h3>Rip Off Her Top</h3>
<<if _e.health gt 0>>
<p class="explicit"><<randomLine _pool "rip_top">></p>
<<say _e.name `setup.randomLine(_pool, "her_reaction")`>>
<p class="explicit"><<randomLine _pool "rip_top">></p>
<<say _e.name `setup.randomLine(_pool, "her_reaction")`>>
<<else>>
<p class="narrator">You strip the top from the corpse. The fabric is torn but still usable.</p>
<</if>>
<<elseif _stripType === "bottom">>
<<set $postBattle.defeatedEnemies[_i].clothing.bottom to 0>>
<<set $postBattle.defeatedEnemies[_i].clothing.underwear to 0>>
<<set $postBattle.defeatedEnemies[_i].clothing.pussyExposed to true>>
<<set $postBattle.defeatedEnemies[_i].clothing.assExposed to true>>
<h3>Tear Off Her Pants</h3>
<<if _e.health gt 0>>
<p class="explicit"><<randomLine _pool "rip_bottom">></p>
<<say _e.name `setup.randomLine(_pool, "her_reaction")`>>
<p class="explicit"><<randomLine _pool "rip_bottom">></p>
<<say _e.name `setup.randomLine(_pool, "her_reaction")`>>
<<else>>
<p class="narrator">You strip the pants from the corpse. The fabric is bloody but still usable for repairs.</p>
<</if>>
<<else>>
<<set $postBattle.defeatedEnemies[_i].clothing.top to 0>>
<<set $postBattle.defeatedEnemies[_i].clothing.bottom to 0>>
<<set $postBattle.defeatedEnemies[_i].clothing.underwear to 0>>
<<set $postBattle.defeatedEnemies[_i].clothing.titsExposed to true>>
<<set $postBattle.defeatedEnemies[_i].clothing.pussyExposed to true>>
<<set $postBattle.defeatedEnemies[_i].clothing.assExposed to true>>
<h3>Strip Her Naked</h3>
<<if _e.health gt 0>>
<p class="explicit"><<randomLine _pool "strip_all">></p>
<<say _e.name `setup.randomLine(_pool, "her_reaction")`>>
<p class="explicit"><<randomLine _pool "strip_all">></p>
<<say _e.name `setup.randomLine(_pool, "her_reaction")`>>
<<if setup.kiraAfterFight() && $companions[0].tension >= 40>>
<<say "Kira" `setup.randomLine("postbattle_grope", "kira_watches")`>>
<<addTension "kira" 5 "" "combat">>
<</if>>
<<else>>
<p class="narrator">You strip the corpse of all usable cloth. Waste not. The fabric is torn and bloody, but it'll work for repairs.</p>
<</if>>
<</if>>
<<if _e.health gt 0 && $player.lust >= 40>>
<p class="explicit"><<randomLine "postbattle_narrative" "strip_aftermath">></p>
<</if>>
<</if>>
<<set _lootItems to []>>
<<set _maleShirts to ["survivor shirt", "flannel shirt", "tactical shirt", "hoodie"]>>
<<set _femaleShirts to ["survivor shirt", "tank top", "flannel shirt", "tactical shirt"]>>
<<set _malePants to ["cargo pants", "jeans", "tactical pants"]>>
<<set _femalePants to ["cargo pants", "jeans", "shorts"]>>
<<set _ragItems to ["scrap cloth", "worn clothes"]>>
<<set _getRandomItem to function(arr) { return arr[Math.floor(Math.random() * arr.length)]; }>>
<<if _stripType === "top" || _stripType === "all">>
<<set _topRoll to Math.random()>>
<<if _topRoll < 0.6>>
<<set _topLoot to _getRandomItem(_ragItems)>>
<<else>>
<<if _isMale>>
<<set _topLoot to _getRandomItem(_maleShirts)>>
<<else>>
<<set _topLoot to _getRandomItem(_femaleShirts)>>
<</if>>
<</if>>
<<run _lootItems.push(setup.postBattleTakeLoot(_topLoot, _topLoot, 1, _e.name))>>
<</if>>
<<if _stripType === "bottom" || _stripType === "all">>
<<set _bottomRoll to Math.random()>>
<<if _bottomRoll < 0.6>>
<<set _bottomLoot to _getRandomItem(_ragItems)>>
<<else>>
<<if _isMale>>
<<set _bottomLoot to _getRandomItem(_malePants)>>
<<else>>
<<set _bottomLoot to _getRandomItem(_femalePants)>>
<</if>>
<</if>>
<<run _lootItems.push(setup.postBattleTakeLoot(_bottomLoot, _bottomLoot, 1, _e.name))>>
<</if>>
<p class="loot">Obtained: <<print _lootItems.join(", ")>></p>
<div class="choice-container">
<<vchoice "Continue" "PostBattle_Normal" "action" "map">>
</div><<set _i to $postBattle.currentEnemy>>
<<set _e to $postBattle.defeatedEnemies[_i]>>
<<set _isTied to (_e.boundState === "tied")>>
<<set _isBroken to (_e.beenUsed || _e.defeatType === "seduced" || (_e.lust && _e.lust >= 90))>>
<<set _pool to _isTied ? "postbattle_grope_tied" : (_isBroken ? "postbattle_grope_broken" : "postbattle_grope")>>
<<advanceTime 0 10>>
<<postBattleVideo "grope_tits">>
<h3>Grope Her</h3>
<p class="explicit"><<randomLine _pool "action">></p>
<<say _e.name `setup.randomLine(_pool, "her_reaction")`>>
<p class="explicit"><<randomLine _pool "action">></p>
<<say _e.name `setup.randomLine(_pool, "her_reaction")`>>
<p class="explicit"><<randomLine _pool "action">></p>
<<if $player.lust >= 45>>
<p class="explicit"><<randomLine "postbattle_narrative" "grope_aftermath">></p>
<</if>>
<<set _e.lust to setup.enemyLustPlus(_e, 20)>>
<<clampStat "player.lust" 10>>
<<if setup.kiraAfterFight() && $companions[0].tension >= 50>>
<<say "Kira" `setup.randomLine("postbattle_grope", "kira_watches")`>>
<p class="narrator">She's watching. Pretending not to be interested. But her thighs are pressed together, and her breathing has changed.</p>
<<addTension "kira" 5 "" "combat">>
<<clampStat "companions[0].lust" 5>>
<</if>>
<p class="explicit"><<randomLine "postbattle_narrative" "grope_done">></p>
<div class="choice-container">
<<vchoice "Continue" "PostBattle_Normal" "action" "map">>
</div><<set _i to $postBattle.currentEnemy>>
<<set _e to $postBattle.defeatedEnemies[_i]>>
<<set _isTied to (_e.boundState === "tied")>>
<<set _isBroken to (_e.beenUsed || _e.defeatType === "seduced" || (_e.lust && _e.lust >= 90))>>
<<set _pool to _isTied ? "postbattle_finger_tied" : (_isBroken ? "postbattle_finger_broken" : "postbattle_finger")>>
<<advanceTime 0 15>>
<<postBattleVideo "finger">>
<h3>Finger Her</h3>
<p class="explicit"><<randomLine _pool "action">></p>
<<say _e.name `setup.randomLine(_pool, "her_reaction")`>>
<p class="explicit"><<randomLine _pool "action">></p>
<<say _e.name `setup.randomLine(_pool, "her_reaction")`>>
<p class="explicit"><<randomLine _pool "action">></p>
<<say _e.name `setup.randomLine(_pool, "her_reaction")`>>
<p class="explicit"><<randomLine _pool "action">></p>
<<say _e.name `setup.randomLine("defeated_enemy_cum", "orgasm_reaction")`>>
<p class="explicit"><<randomLine "postbattle_narrative" "finger_aftermath">></p>
<<set _e.lust to setup.enemyLustPlus(_e, 35)>>
<<clampStat "player.lust" 15>>
<<if $clothing.player.dickExposed && $player.lust >= 50>>
<p class="explicit"><<randomLine "postbattle_narrative" "finger_temptation">></p>
<</if>>
<<if setup.kiraAfterFight() && $companions[0].lust >= 40>>
<<say "Kira" `setup.randomLine("postbattle_grope", "kira_watches")`>>
<<clampStat "companions[0].lust" 10>>
<<addTension "kira" 10 "" "combat">>
<</if>>
<div class="choice-container">
<<vchoice "Continue" "PostBattle_Normal" "action" "map">>
</div><<set _i to $postBattle.currentEnemy>>
<<set _e to $postBattle.defeatedEnemies[_i]>>
<<set _isTied to (_e.boundState === "tied")>>
<<set _isBroken to (_e.beenUsed || _e.defeatType === "seduced" || (_e.lust && _e.lust >= 90))>>
<<set _pool to _isTied ? "postbattle_eatout_tied" : (_isBroken ? "postbattle_eatout_broken" : "postbattle_eatout")>>
<<advanceTime 0 20>>
<<postBattleVideo "eatout">>
<h3>Eat Her Out</h3>
<p class="explicit"><<randomLine _pool "action">></p>
<<say _e.name `setup.randomLine(_pool, "her_reaction")`>>
<p class="explicit"><<randomLine _pool "action">></p>
<<say _e.name `setup.randomLine(_pool, "her_reaction")`>>
<p class="explicit"><<randomLine _pool "action">></p>
<<say _e.name `setup.randomLine(_pool, "her_reaction")`>>
<<set _e.lust to setup.enemyLustPlus(_e, 50)>>
<p class="explicit"><<randomLine _pool "orgasm">></p>
<<say _e.name `setup.randomLine("defeated_enemy_cum", "orgasm_reaction")`>>
<p class="explicit"><<randomLine _pool "orgasm">></p>
<<clampStat "player.lust" 20>>
<p class="explicit"><<randomLine "postbattle_narrative" "eatout_aftermath">></p>
<<if setup.kiraAfterFight() && $companions[0].lust >= 50>>
<<say "Kira" `setup.randomLine("postbattle_grope", "kira_watches")`>>
<p class="explicit"><<randomLine "postbattle_narrative" "kira_watching_aroused">></p>
<<clampStat "companions[0].lust" 15>>
<<addTension "kira" 15 "" "combat">>
<</if>>
<div class="choice-container">
<<vchoice "Continue" "PostBattle_Normal" "action" "map">>
</div><<set _i to $postBattle.currentEnemy>>
<<if !$postBattle.enemiesUsed.includes(_i)>><<run $postBattle.enemiesUsed.push(_i)>><</if>>
<<set _e to $postBattle.defeatedEnemies[_i]>>
<<set _isTied to (_e.boundState === "tied")>>
<<set _isBroken to (_e.beenUsed || _e.defeatType === "seduced" || (_e.lust && _e.lust >= 90))>>
<<set _pool to _isTied ? "postbattle_fuck_tied" : (_isBroken ? "postbattle_fuck_broken" : "postbattle_fuck")>>
<<postBattleVideo "fuck">>
<<advanceTime 0 30>>
<h3>Fuck Her</h3>
<p class="explicit"><<randomLine _pool "enter">></p>
<<say _e.name `setup.randomLine(_pool, "her_reaction")`>>
<p class="explicit"><<randomLine _pool "fucking">></p>
<<say _e.name `setup.randomLine(_pool, "her_reaction")`>>
<p class="explicit"><<randomLine _pool "fucking">></p>
<<if !_isTied && !_isBroken>>
<p class="explicit"><<randomLine "postbattle_narrative" "fuck_resistance_breaking">></p>
<</if>>
<<say _e.name `setup.randomLine(_pool, "her_reaction")`>>
<p class="explicit"><<randomLine _pool "fucking">></p>
<<if setup.kiraAfterFight() && $companions[0].lust >= 60>>
<p class="narrator">Kira is watching. Not even pretending to look away anymore. Her hand has moved between her own legs, rubbing through her torn pants.</p>
<<clampStat "companions[0].lust" 20>>
<<addTension "kira" 15 "" "combat">>
<</if>>
<p class="explicit"><<randomLine "player_cum" "buildup">></p>
<div class="choice-container">
<<vchoice "Cum deep inside her pussy" "PostBattle_Fuck_CumInside" "intimate" "shower">>
<<vchoice "Pull out and cum on her face" "PostBattle_Fuck_CumOnFace" "intimate" "shower">>
<<vchoice "Pull out and cum on her tits" "PostBattle_Fuck_CumOnTits" "intimate" "shower">>
<<vchoice "Make her cum first, then cum inside" "PostBattle_Fuck_MakeHerCum" "intimate" "corruption">>
<<if setup.kiraAfterFight() && $companions[0].lust >= 50>>
<<vchoice "Make Kira cum while you fuck her" "PostBattle_Fuck_KiraCums" "intimate" "lust">>
<</if>>
</div><<set _i to $postBattle.currentEnemy>>
<<set _e to $postBattle.defeatedEnemies[_i]>>
<<postBattleVideo "fuck_cum_inside">>
<p class="explicit"><<randomLine "player_cum" "cum_inside">></p>
<<say _e.name `setup.randomLine("defeated_enemy_cum", "cum_inside_reaction")`>>
<p class="explicit"><<randomLine "player_cum" "cum_inside">></p>
<<say _e.name `setup.randomLine("defeated_enemy_cum", "orgasm_reaction")`>>
<p class="explicit"><<randomLine "postbattle_narrative" "cum_inside_aftermath">></p>
<p class="explicit"><<randomLine "player_cum" "after">></p>
<<set $player.lust to 20>><<run setup.playerReleased()>>
<<set $postBattle.playerCame to true>>
<<set _e.lust to 20>>
<<set $stats.sex.penetrativeTop += 1>>
<<if setup.kiraAfterFight() && $companions[0].tension >= 50>>
<<say "Kira" `setup.randomLine("postbattle_kira", "watching_done")`>>
<p class="narrator">Her voice is tight. Strained. Her nipples are hard through her torn shirt. There's a wet spot on her pants where her hand was.</p>
<<addTension "kira" 20 "" "combat">>
<</if>>
<div class="choice-container">
<<vchoice "Continue" "PostBattle_Normal" "action" "map">>
</div><<set _i to $postBattle.currentEnemy>>
<<set _e to $postBattle.defeatedEnemies[_i]>>
<<postBattleVideo "fuck_cum_face">>
<p class="explicit"><<randomLine "postbattle_narrative" "pullout_face">></p>
<p class="explicit"><<randomLine "player_cum" "cum_on_face">></p>
<<say _e.name `setup.randomLine("defeated_enemy_cum", "cum_on_face_reaction")`>>
<p class="explicit"><<randomLine "player_cum" "cum_on_face">></p>
<<say _e.name `setup.randomLine("defeated_enemy_cum", "cum_on_face_reaction")`>>
<p class="explicit"><<randomLine "player_cum" "after">></p>
<<set $player.lust to 20>><<run setup.playerReleased()>>
<<set $postBattle.playerCame to true>>
<<set $stats.sex.penetrativeTop += 1>>
<div class="choice-container">
<<vchoice "Continue" "PostBattle_Normal" "action" "map">>
</div><<set _i to $postBattle.currentEnemy>>
<<set _e to $postBattle.defeatedEnemies[_i]>>
<<postBattleVideo "fuck_cum_tits">>
<p class="explicit"><<randomLine "postbattle_narrative" "pullout_face">></p>
<p class="explicit"><<randomLine "player_cum" "cum_on_tits">></p>
<<say _e.name `setup.randomLine("defeated_enemy_cum", "cum_on_body_reaction")`>>
<p class="explicit"><<randomLine "player_cum" "cum_on_tits">></p>
<p class="explicit"><<randomLine "player_cum" "after">></p>
<<set $player.lust to 20>><<run setup.playerReleased()>>
<<set $postBattle.playerCame to true>>
<<set $stats.sex.penetrativeTop += 1>>
<div class="choice-container">
<<vchoice "Continue" "PostBattle_Normal" "action" "map">>
</div><<set _i to $postBattle.currentEnemy>>
<<set _e to $postBattle.defeatedEnemies[_i]>>
<<postBattleVideo "fuck_makehercum">>
<p class="explicit"><<randomLine "postbattle_narrative" "fuck_force_orgasm">></p>
<<say _e.name "What are you— no— I'm going to— I can't—!">>
<p class="explicit"><<randomLine "postbattle_fuck" "fucking">></p>
<p class="explicit"><<randomLine "postbattle_narrative" "fuck_force_building">></p>
<<say _e.name `setup.randomLine("defeated_enemy_cum", "orgasm_reaction")`>>
<p class="explicit"><<randomLine "postbattle_narrative" "fuck_force_climax">></p>
<p class="explicit"><<randomLine "player_cum" "cum_inside">></p>
<<say _e.name "FUCK! I'M CUMMING! AHHH! YOU'RE— YOU'RE CUMMING IN ME— AHHH!">>
<p class="explicit"><<randomLine "player_cum" "cum_inside">></p>
<p class="explicit"><<randomLine "postbattle_narrative" "fuck_mutual_aftermath">></p>
<<say _e.name `setup.randomLine("defeated_enemy_cum", "cum_inside_reaction")`>>
<p class="explicit"><<randomLine "player_cum" "after">></p>
<<set $player.lust to 20>><<run setup.playerReleased()>>
<<set $postBattle.playerCame to true>>
<<set _e.lust to 20>>
<<set $stats.sex.penetrativeTop += 1>>
<div class="choice-container">
<<vchoice "Continue" "PostBattle_Normal" "action" "map">>
</div><<set _i to $postBattle.currentEnemy>>
<<set _e to $postBattle.defeatedEnemies[_i]>>
<<postBattleVideo "fuck_kira_cums">>
<p class="explicit"><<randomLine "postbattle_narrative" "kira_watching_fuck">></p>
<<say $player.name "Kira. Get over here. I want to watch you cum.">>
<<say "Kira" "I— what? While you're—">>
<<say $player.name "Now.">>
<p class="explicit"><<randomLine "postbattle_narrative" "kira_masturbate_open">></p>
<p class="explicit"><<randomLine "postbattle_kira_male" "kira_buildup">></p>
<p class="explicit"><<randomLine "postbattle_fuck" "fucking">></p>
<<say "Kira" `setup.randomLine("postbattle_kira_male", "kira_buildup")`>>
<p class="explicit"><<randomLine "postbattle_narrative" "fuck_perform_kira">></p>
<p class="explicit"><<randomLine "postbattle_kira_male" "kira_buildup">></p>
<<say "Kira" `setup.randomLine("postbattle_kira_male", "kira_buildup")`>>
<p class="explicit"><<randomLine "postbattle_narrative" "kira_masturbate_orgasm">></p>
<<say "Kira" "FUCK! I'M— I'M CUMMING! AHHH!">>
<p class="explicit"><<randomLine "postbattle_narrative" "kira_masturbate_peak">></p>
<p class="explicit"><<randomLine "postbattle_narrative" "kira_cum_watching">></p>
<p class="explicit"><<randomLine "player_cum" "cum_inside">></p>
<<say _e.name `setup.randomLine("defeated_enemy_cum", "cum_inside_reaction")`>>
<p class="explicit"><<randomLine "postbattle_kira_male" "kira_after">></p>
<p class="explicit"><<randomLine "player_cum" "after">></p>
<<set $player.lust to 20>><<run setup.playerReleased()>>
<<set $postBattle.playerCame to true>>
<<set $companions[0].lust to 20>>
<<clampStat "companions[0].tension" -30 20 100>>
<<relationChange "kira" "affection" 2>>
<<set $flags.kiraWatchedAndCame to true>>
<div class="choice-container">
<<vchoice "Continue" "PostBattle_Normal" "action" "map">>
</div><<set _i to $postBattle.currentEnemy>>
<<if !$postBattle.enemiesUsed.includes(_i)>><<run $postBattle.enemiesUsed.push(_i)>><</if>>
<<set _e to $postBattle.defeatedEnemies[_i]>>
<<set _isTied to (_e.boundState === "tied")>>
<<set _isBroken to (_e.beenUsed || _e.defeatType === "seduced" || (_e.lust && _e.lust >= 90))>>
<<set _pool to _isTied ? "postbattle_anal_tied" : (_isBroken ? "postbattle_anal_broken" : "postbattle_anal")>>
<<postBattleVideo "anal">>
<<advanceTime 0 45>>
<h3>Fuck Her Ass</h3>
<p class="explicit"><<randomLine _pool "enter">></p>
<<say _e.name `setup.randomLine(_pool, "her_reaction")`>>
<<if !_isTied && !_isBroken>>
<p class="explicit"><<randomLine "postbattle_narrative" "anal_penetration">></p>
<<say _e.name `setup.randomLine("postbattle_anal_lines", "resistance")`>>
<</if>>
<p class="explicit"><<randomLine _pool "enter">></p>
<<say _e.name `setup.randomLine(_pool, "her_reaction")`>>
<p class="explicit"><<randomLine _pool "fucking">></p>
<<if _pbFamily is "sf_cg_postbattle_anal_enemy_02">>
<p class="explicit">You shove her onto her back, fold her legs up and fuck her ass from above. She throws her arms over her head, then gives up and rubs her own cunt while you pound her.</p>
<</if>>
<<say _e.name `setup.randomLine(_pool, "her_reaction")`>>
<p class="explicit"><<randomLine _pool "fucking">></p>
<<say _e.name `setup.randomLine("postbattle_anal_lines", "building")`>>
<p class="explicit"><<randomLine "postbattle_anal" "fucking">></p>
<<say _e.name `setup.randomLine("defeated_enemy_cum", "orgasm_reaction")`>>
<p class="explicit"><<randomLine "player_cum" "buildup">></p>
<div class="choice-container">
<<vchoice "Cum deep in her ass" "PostBattle_Anal_CumInAss" "intimate" "shower">>
<<vchoice "Pull out and cum on her ass" "PostBattle_Anal_CumOnAss" "intimate" "shower">>
</div><<set _i to $postBattle.currentEnemy>>
<<set _e to $postBattle.defeatedEnemies[_i]>>
<<postBattleVideo "anal_cum_inside">>
<<if _pbFamily is "sf_cg_postbattle_anal_enemy_02">>
<p class="explicit">You flip her onto her belly, spread her cheeks and shove back into her ass, then pin her there with one palm spread flat on her cheek. She mashes her face into her own folded arms and whimpers into them while you hammer the last strokes into her.</p>
<</if>>
<p class="explicit"><<randomLine "player_cum" "cum_in_ass">></p>
<<say _e.name `setup.randomLine("postbattle_anal_lines", "cum_in_ass")`>>
<p class="explicit"><<randomLine "player_cum" "cum_in_ass">></p>
<p class="explicit"><<randomLine "postbattle_narrative" "anal_aftermath">></p>
<<say _e.name `setup.randomLine("postbattle_aftermath", "after_anal")`>>
<p class="explicit"><<randomLine "player_cum" "after">></p>
<<set $player.lust to 20>><<run setup.playerReleased()>>
<<set $postBattle.playerCame to true>>
<<set $stats.sex.analGiven += 1>>
<div class="choice-container">
<<vchoice "Continue" "PostBattle_Normal" "action" "map">>
</div><<set _i to $postBattle.currentEnemy>>
<<set _e to $postBattle.defeatedEnemies[_i]>>
<<postBattleVideo "anal_cum_on">>
<<if _pbFamily is "sf_cg_postbattle_anal_enemy_02">>
<p class="explicit">You flip her onto her belly, spread her cheeks and shove back into her ass, then pin her there with one palm spread flat on her cheek. She mashes her face into her own folded arms and whimpers into them while you hammer the last strokes into her.</p>
<</if>>
<p class="explicit"><<randomLine "postbattle_narrative" "pullout_face">></p>
<p class="explicit"><<randomLine "player_cum" "cum_on_ass">></p>
<<say _e.name `setup.randomLine("defeated_enemy_cum", "cum_on_body_reaction")`>>
<p class="explicit"><<randomLine "player_cum" "cum_on_ass">></p>
<p class="explicit"><<randomLine "postbattle_narrative" "anal_aftermath">></p>
<p class="explicit"><<randomLine "player_cum" "after">></p>
<<set $player.lust to 20>><<run setup.playerReleased()>>
<<set $postBattle.playerCame to true>>
<<set $stats.sex.analGiven += 1>>
<div class="choice-container">
<<vchoice "Continue" "PostBattle_Normal" "action" "map">>
</div><<set _i to $postBattle.currentEnemy>>
<<if !$postBattle.enemiesUsed.includes(_i)>><<run $postBattle.enemiesUsed.push(_i)>><</if>>
<<set _e to $postBattle.defeatedEnemies[_i]>>
<<set _isTied to (_e.boundState === "tied")>>
<<set _isBroken to (_e.beenUsed || _e.defeatType === "seduced" || (_e.lust && _e.lust >= 90))>>
<<set _pool to _isTied ? "postbattle_facefuck_tied" : (_isBroken ? "postbattle_facefuck_broken" : "postbattle_facefuck")>>
<<postBattleVideo "facefuck">>
<<advanceTime 0 30>>
<h3>Use Her Mouth</h3>
<p class="explicit"><<randomLine _pool "action">></p>
<<say _e.name `setup.randomLine(_pool, "sounds")`>>
<p class="explicit"><<randomLine _pool "action">></p>
<<say _e.name `setup.randomLine(_pool, "sounds")`>>
<<if !_isTied && !_isBroken>>
<p class="explicit"><<randomLine "postbattle_narrative" "facefuck_tears">></p>
<</if>>
<<say _e.name `setup.randomLine("postbattle_facefuck", "sounds")`>>
<<if _e.lust >= 50>>
<p class="explicit"><<randomLine "postbattle_narrative" "facefuck_selfpleasure">></p>
<</if>>
<p class="explicit"><<randomLine "postbattle_facefuck" "action">></p>
<p class="explicit"><<randomLine "player_cum" "buildup">></p>
<div class="choice-container">
<<vchoice "Cum down her throat" "PostBattle_Facefuck_CumThroat" "intimate" "shower">>
<<vchoice "Pull out and cum on her face" "PostBattle_Facefuck_CumFace" "intimate" "shower">>
</div><<set _i to $postBattle.currentEnemy>>
<<set _e to $postBattle.defeatedEnemies[_i]>>
<<postBattleVideo "facefuck_cum_throat">>
<p class="explicit"><<randomLine "postbattle_facefuck" "finish">></p>
<<say _e.name `setup.randomLine("postbattle_facefuck_lines", "gagging")`>>
<p class="explicit"><<randomLine "player_cum" "cum_in_mouth">></p>
<p class="explicit"><<randomLine "player_cum" "cum_in_mouth">></p>
<p class="explicit"><<randomLine "postbattle_narrative" "facefuck_cum_aftermath">></p>
<<say _e.name `setup.randomLine("postbattle_aftermath", "after_swallow")`>>
<p class="explicit"><<randomLine "player_cum" "after">></p>
<<set $player.lust to 20>><<run setup.playerReleased()>>
<<set $postBattle.playerCame to true>>
<<set $stats.sex.oralReceived += 1>>
<div class="choice-container">
<<vchoice "Continue" "PostBattle_Normal" "action" "map">>
</div><<set _i to $postBattle.currentEnemy>>
<<set _e to $postBattle.defeatedEnemies[_i]>>
<<postBattleVideo "facefuck_cum_face">>
<p class="explicit"><<randomLine "postbattle_narrative" "pullout_face">></p>
<p class="explicit"><<randomLine "player_cum" "cum_on_face">></p>
<<say _e.name `setup.randomLine("defeated_enemy_cum", "cum_on_face_reaction")`>>
<p class="explicit"><<randomLine "player_cum" "cum_on_face">></p>
<p class="explicit"><<randomLine "postbattle_narrative" "facefuck_cum_aftermath">></p>
<<say _e.name `setup.randomLine("postbattle_aftermath", "after_facial")`>>
<p class="explicit"><<randomLine "player_cum" "after">></p>
<<set $player.lust to 20>><<run setup.playerReleased()>>
<<set $postBattle.playerCame to true>>
<<set $stats.sex.oralReceived += 1>>
<div class="choice-container">
<<vchoice "Continue" "PostBattle_Normal" "action" "map">>
</div><<set _i to $postBattle.currentEnemy>>
<<set _e to $postBattle.defeatedEnemies[_i]>>
<<advanceTime 0 25>>
<<postBattleVideo "kira_uses">>
<h3>Kira Uses Her</h3>
<<say $player.name "Kira. She's all yours if you want.">>
<<showCharacter "kira" "center" "surprised">>
<<say "Kira" `setup.randomLine("postbattle_threesome", "kira_initial_watch")`>>
<p class="narrator">But her eyes drop to the enemy's exposed body. She licks her lips unconsciously. Her breathing has changed.</p>
<<say $player.name "You've been watching this whole time. I know you want to.">>
<<say "Kira" `setup.randomLine("postbattle_kira", "hesitation")`>>
<p class="explicit"><<randomLine "postbattle_narrative" "kira_threesome_setup">></p>
<<say "Kira" `setup.randomLine("postbattle_kira", "reluctant_yes")`>>
<p class="explicit"><<randomLine "postbattle_narrative" "kira_lesbian_action">></p>
<<if _pbFamily is "sf_cg_postbattle_kira_uses_enemy_01">>
<p class="explicit">Then she changes her mind about who serves who. She swings a leg over and plants her cunt on the woman's face, sixty-nine, and makes her lick while she works her in return.</p>
<</if>>
<<say _e.name `setup.randomLine("postbattle_threesome", "enemy_first_woman_watch")`>>
<p class="explicit"><<randomLine "postbattle_narrative" "kira_eating_technique">></p>
<<say "Kira" `setup.randomLine("postbattle_male_enemy", "kira_riding_male")`>>
<p class="explicit"><<randomLine "postbattle_narrative" "enemy_reacting_kira">></p>
<<say _e.name `setup.randomLine("postbattle_threesome", "enemy_overwhelmed_watch")`>>
<p class="explicit"><<randomLine "postbattle_narrative" "watching_kira">></p>
<<clampStat "player.lust" 25>>
<<clampStat "companions[0].lust" -20 20 100>>
<<set $stats.sex.totalEncounters += 1>>
<<if $clothing.player.dickExposed && $player.lust >= 50 && setup.kiraRoomSexOpen()>>
<p class="explicit"><<randomLine "postbattle_narrative" "join_temptation">></p>
<div class="choice-container">
<<vchoice "Just watch" "PostBattle_Kira_Uses_Watch" "intimate" "search">>
<<vchoice "Fuck Kira while she eats her out" "PostBattle_Kira_Uses_Join" "intimate" "rapid-strikes">>
</div>
<<else>>
<div class="choice-container">
<<vchoice "Continue watching" "PostBattle_Kira_Uses_Watch" "intimate" "search">>
</div>
<</if>><<set _i to $postBattle.currentEnemy>>
<<set _e to $postBattle.defeatedEnemies[_i]>>
<<advanceTime 0 15>>
<<postBattleVideo "kira_uses_watch">>
<p class="explicit"><<randomLine "postbattle_narrative" "watching_kira_masturbate">></p>
<<say _e.name `setup.randomLine("postbattle_threesome", "enemy_cumming_watch")`>>
<<if _pbClip is "a6cd5324c652" or _pbClip is "2c2fad15c0f7">>
<p class="explicit"><<print _e.name>> ends up squatting over Kira's face, grinding down on her tongue, and cums like that, thighs shaking around Kira's head while Kira's fingers sink into her ass and hold her there.</p>
<<else>>
<p class="explicit"><<randomLine "postbattle_narrative" "lesbian_cum_description">></p>
<</if>>
<p class="explicit"><<randomLine "postbattle_narrative" "kira_face_after">></p>
<<say "Kira" `setup.randomLine("postbattle_kira", "after_using_enemy")`>>
<<say $player.name "Looked like you enjoyed that.">>
<<say "Kira" `setup.randomLine("postbattle_kira", "reluctant_yes")`>>
<p class="narrator">But the wet spot on her pants tells a different story.</p>
<<relationChange "kira" "affection" 1>>
<<set $flags.kiraLesbianAct to true>>
<div class="choice-container">
<<vchoice "Continue" "PostBattle_Normal" "action" "map">>
</div><<set _i to $postBattle.currentEnemy>>
<<set _e to $postBattle.defeatedEnemies[_i]>>
<<advanceTime 0 30>>
<<postBattleVideo "kira_uses_join">>
<h3>Join In</h3>
<p class="explicit"><<randomLine "postbattle_narrative" "threesome_join">></p>
<<say "Kira" `setup.randomLine("postbattle_threesome", "kira_initial")`>>
<p class="explicit"><<randomLine "postbattle_narrative" "threesome_entry">></p>
<<if _pbFamily is "sf_cg_postbattle_kira_uses_enemy_01" or _pbClip is "c80d45bb1f27" or _pbClip is "c4210ea35854" or _pbClip is "7c84bc0590b7">>
<p class="explicit">Kira stays down on all fours with her face buried in the woman's cunt while you fuck her from behind, one hand flat on her back. When she comes up for air you fist her hair and push her back down. The woman under her laughs, moans, eyes rolled up to the whites.</p>
<</if>>
<<say _e.name `setup.randomLine("postbattle_threesome", "during_chaos")`>>
<p class="explicit"><<randomLine "postbattle_narrative" "threesome_fucking">></p>
<<say "Kira" `setup.randomLine("postbattle_threesome", "kira_during")`>>
<p class="explicit"><<randomLine "postbattle_narrative" "threesome_sandwich">></p>
<<say _e.name `setup.randomLine("postbattle_threesome", "enemy_cumming")`>>
<p class="explicit"><<randomLine "postbattle_narrative" "threesome_climax">></p>
<<say "Kira" `setup.randomLine("postbattle_threesome", "kira_cumming")`>>
<p class="explicit"><<randomLine "postbattle_narrative" "threesome_aftermath">></p>
<p class="explicit"><<randomLine "postbattle_narrative" "threesome_collapse">></p>
<<say "Kira" `setup.randomLine("postbattle_kira", "after_threesome")`>>
<<set $player.lust to 5>><<run setup.playerReleased()>>
<<set $companions[0].lust to 20>>
<<clampStat "companions[0].tension" -20 20 100>>
<<relationChange "kira" "affection" 2>>
<<set $flags.threesomeWithKira to true>>
<<set $stats.sex.groupSex += 1>>
<div class="choice-container">
<<vchoice "Continue" "PostBattle_Normal" "action" "map">>
</div><<set _i to $postBattle.currentEnemy>>
<<set _e to $postBattle.defeatedEnemies[_i]>>
<<if !$postBattle.enemiesReleased.includes(_i)>><<run $postBattle.enemiesReleased.push(_i)>><</if>>
<<advanceTime 0 2>>
<<if _e.gender === "female">><<postBattleVideo "release">><</if>>
<h3>Release <<print setup.pronouns(_e.gender).Him>></h3>
<p class="narrator"><<randomLine "postbattle_release" "release_action">></p>
<<say $player.name `setup.randomLine("postbattle_release", "player_release")`>>
<<if $postBattle.enemiesUsed.includes(_i) && _e.gender === "female">>
<p class="explicit"><<randomLine "postbattle_narrative" "release_aftermath_used">></p>
<<say _e.name `setup.randomLine("postbattle_release", "enemy_confused_release")`>>
<<say $player.name `setup.randomLine("postbattle_release", "player_confirm_release")`>>
<p class="narrator"><<randomLine "postbattle_release" "release_scramble">></p>
<<if setup.kiraAfterFight() && $companions[0].tension >= 40>>
<<say "Kira" `setup.randomLine("postbattle_release", "kira_mercy_reaction")`>>
<<relationChange "kira" "affection" 1>>
<</if>>
<<else>>
<p class="narrator"><<randomLine "postbattle_release" "release_scramble">></p>
<<say _e.name `setup.randomLine("postbattle_release", "enemy_threatens")`>>
<<say $player.name `setup.randomLine("postbattle_release", "player_dismisses_threat")`>>
<<if setup.kiraAfterFight()>><<say "Kira" `setup.randomLine("postbattle_release", "kira_dismisses_release")`>><</if>>
<</if>>
<div class="choice-container">
<<vchoice "Continue" "PostBattle_Normal" "action" "map">>
</div><<set _i to $postBattle.currentEnemy>>
<<set _e to $postBattle.defeatedEnemies[_i]>>
<<advanceTime 0 2>>
<<set _wasAlive to (_e.health > 0)>>
<<if !$postBattle.enemiesExecuted.includes(_i)>>
<<run $postBattle.enemiesExecuted.push(_i)>>
<<if _e.covenant && _wasAlive>><<run setup.factionRep("verdant", setup.COVENANT.rep.huntressKilled, "killed a Covenant huntress", null, { noRival: true })>><</if>>
<</if>>
<h3>Execute</h3>
<<if _e.health > 0>>
<<postBattleVideo "execute">>
<p class="narrator"><<randomLine "postbattle_release" "execute_approach">></p>
<<say _e.name `setup.randomLine("postbattle_release", "enemy_begging_life")`>>
<<if $postBattle.enemiesUsed.includes(_i) && _e.gender === "female">>
<p class="explicit"><<randomLine "postbattle_narrative" "execute_aftermath_used">></p>
<</if>>
<p class="narrator"><<randomLine "postbattle_release" "execute_strike">></p>
<<if setup.kiraAfterFight()>><<say "Kira" `setup.randomLine("postbattle_release", "kira_approves_execute")`>><</if>>
<<else>>
<p class="narrator"><<randomLine "postbattle_release" "execute_confirm_dead">></p>
<<if setup.kiraAfterFight()>><<say "Kira" `setup.randomLine("postbattle_release", "kira_approves_execute")`>><</if>>
<</if>>
<<if _wasAlive>><<set $stats.combat.enemiesDefeated += 1>><</if>>
<<set _e.health to 0>>
<div class="choice-container">
<<vchoice "Continue" "PostBattle_Normal" "action" "map">>
</div><<set _i to $postBattle.currentEnemy>>
<<set _e to $postBattle.defeatedEnemies[_i]>>
<<set _isTied to (_e.boundState === "tied")>>
<<set _isBroken to (_e.beenUsed || _e.defeatType === "seduced" || (_e.lust && _e.lust >= 90))>>
<<set _pool to _isTied ? "postbattle_facesit_tied" : (_isBroken ? "postbattle_facesit_broken" : "postbattle_facesit")>>
<<advanceTime 0 15>>
<<postBattleVideo "facesit">>
<h3>Sit On Your Face</h3>
<p class="explicit"><<randomLine _pool "action">></p>
<<say _e.name `setup.randomLine(_pool, "her_reaction")`>>
<p class="explicit"><<randomLine _pool "action">></p>
<<say _e.name `setup.randomLine(_pool, "her_reaction")`>>
<p class="explicit"><<randomLine _pool "action">></p>
<<say _e.name `setup.randomLine(_pool, "her_reaction")`>>
<p class="explicit"><<randomLine _pool "action">></p>
<<say _e.name `setup.randomLine("defeated_enemy_cum", "orgasm_reaction")`>>
<<set _e.lust to setup.enemyLustPlus(_e, 40)>>
<<clampStat "player.lust" 20>>
<div class="choice-container">
<<vchoice "Continue" "PostBattle_Normal" "action" "map">>
</div><<set _i to $postBattle.currentEnemy>>
<<set _e to $postBattle.defeatedEnemies[_i]>>
<<set _isTied to (_e.boundState === "tied")>>
<<set _isBroken to (_e.beenUsed || _e.defeatType === "seduced" || (_e.lust && _e.lust >= 90))>>
<<set _pool to _isTied ? "postbattle_titfuck_tied" : (_isBroken ? "postbattle_titfuck_broken" : "postbattle_titfuck")>>
<<postBattleVideo "titfuck">>
<<advanceTime 0 20>>
<h3>Titfuck Her</h3>
<<if _pbFamily is "sf_cg_postbattle_titfuck_enemy_02" or _pbClip is "cd21e4894088" or _pbClip is "3a5e0426e163" or _pbClip is "c7e8bb64ab9a" or _pbClip is "b9b225dfeb79">>
<p class="explicit">You shove her flat on her back, straddle her chest and push your cock between her huge tits. She squeezes them together around you with both hands without being told, mouth hanging open under the tip every time it punches up.</p>
<</if>>
<p class="explicit"><<randomLine _pool "action">></p>
<<say _e.name `setup.randomLine(_pool, "her_reaction")`>>
<p class="explicit"><<randomLine _pool "action">></p>
<<say _e.name `setup.randomLine(_pool, "her_reaction")`>>
<p class="explicit"><<randomLine _pool "action">></p>
<<say _e.name `setup.randomLine(_pool, "her_reaction")`>>
<p class="explicit"><<randomLine "player_cum" "buildup">></p>
<div class="choice-container">
<<vchoice "Cum on her face" "PostBattle_Titfuck_CumFace" "intimate" "shower">>
<<vchoice "Cum on her tits" "PostBattle_Titfuck_CumTits" "intimate" "shower">>
<<vchoice "Cum in her mouth" "PostBattle_Titfuck_CumMouth" "intimate" "shower">>
</div><<set _i to $postBattle.currentEnemy>>
<<set _e to $postBattle.defeatedEnemies[_i]>>
<<set _isTied to (_e.boundState === "tied")>>
<<set _isBroken to (_e.beenUsed || _e.defeatType === "seduced" || (_e.lust && _e.lust >= 90))>>
<<set _pool to _isTied ? "postbattle_titfuck_tied" : (_isBroken ? "postbattle_titfuck_broken" : "postbattle_titfuck")>>
<<postBattleVideo "titfuck_cum_face">>
<p class="explicit"><<randomLine _pool "finish">></p>
<p class="explicit"><<randomLine "player_cum" "cum_on_face">></p>
<<say _e.name `setup.randomLine("defeated_enemy_cum", "cum_on_face_reaction")`>>
<p class="explicit"><<randomLine "player_cum" "cum_on_face">></p>
<p class="explicit"><<randomLine "player_cum" "after">></p>
<<set $player.lust to 20>><<run setup.playerReleased()>>
<<set $postBattle.playerCame to true>>
<<set $stats.sex.titfuck to ($stats.sex.titfuck || 0) + 1>>
<div class="choice-container">
<<vchoice "Continue" "PostBattle_Normal" "action" "map">>
</div><<set _i to $postBattle.currentEnemy>>
<<set _e to $postBattle.defeatedEnemies[_i]>>
<<set _isTied to (_e.boundState === "tied")>>
<<set _isBroken to (_e.beenUsed || _e.defeatType === "seduced" || (_e.lust && _e.lust >= 90))>>
<<set _pool to _isTied ? "postbattle_titfuck_tied" : (_isBroken ? "postbattle_titfuck_broken" : "postbattle_titfuck")>>
<<postBattleVideo "titfuck_cum_tits">>
<p class="explicit"><<randomLine _pool "finish">></p>
<p class="explicit"><<randomLine "player_cum" "cum_on_tits">></p>
<<say _e.name `setup.randomLine("defeated_enemy_cum", "cum_on_body_reaction")`>>
<p class="explicit"><<randomLine "player_cum" "cum_on_tits">></p>
<p class="explicit"><<randomLine "player_cum" "after">></p>
<<set $player.lust to 20>><<run setup.playerReleased()>>
<<set $postBattle.playerCame to true>>
<<set $stats.sex.titfuck to ($stats.sex.titfuck || 0) + 1>>
<div class="choice-container">
<<vchoice "Continue" "PostBattle_Normal" "action" "map">>
</div><<set _i to $postBattle.currentEnemy>>
<<set _e to $postBattle.defeatedEnemies[_i]>>
<<set _isTied to (_e.boundState === "tied")>>
<<set _isBroken to (_e.beenUsed || _e.defeatType === "seduced" || (_e.lust && _e.lust >= 90))>>
<<set _pool to _isTied ? "postbattle_titfuck_tied" : (_isBroken ? "postbattle_titfuck_broken" : "postbattle_titfuck")>>
<<postBattleVideo "titfuck_cum_mouth">>
<p class="explicit"><<randomLine _pool "finish">></p>
<p class="explicit"><<randomLine "postbattle_narrative" "cum_enemy_face">></p>
<p class="explicit"><<randomLine "player_cum" "cum_in_mouth">></p>
<<say _e.name "Mmph— glk—">>
<p class="explicit"><<randomLine "player_cum" "cum_in_mouth">></p>
<p class="explicit"><<randomLine "postbattle_narrative" "swallow_aftermath">></p>
<p class="explicit"><<randomLine "player_cum" "after">></p>
<<set $player.lust to 20>><<run setup.playerReleased()>>
<<set $postBattle.playerCame to true>>
<<set $stats.sex.titfuck to ($stats.sex.titfuck || 0) + 1>>
<div class="choice-container">
<<vchoice "Continue" "PostBattle_Normal" "action" "map">>
</div><<set _i to $postBattle.currentEnemy>>
<<set _e to $postBattle.defeatedEnemies[_i]>>
<<set _isTied to (_e.boundState === "tied")>>
<<set _isBroken to (_e.beenUsed || _e.defeatType === "seduced" || (_e.lust && _e.lust >= 90))>>
<<set _pool to _isTied ? "postbattle_beg_tied" : (_isBroken ? "postbattle_beg_broken" : "postbattle_beg")>>
<<advanceTime 0 15>>
<<postBattleVideo "beg">>
<h3>Make Her Beg</h3>
<p class="explicit"><<randomLine _pool "tease">></p>
<<say _e.name `setup.randomLine(_pool, "her_begging")`>>
<p class="explicit"><<randomLine _pool "tease">></p>
<<say _e.name `setup.randomLine(_pool, "her_begging")`>>
<p class="explicit"><<randomLine _pool "tease">></p>
<<say _e.name `setup.randomLine(_pool, "her_begging")`>>
<p class="explicit"><<randomLine _pool "tease">></p>
<<say _e.name `setup.randomLine(_pool, "her_begging")`>>
<p class="explicit"><<randomLine "postbattle_narrative" "male_beg_desperation">></p>
<<clampStat "player.dominance" 5>>
<<set _e.lust to setup.enemyLustPlus(_e, 30)>>
<div class="choice-container">
<<vchoice "Give her what she begged for" "PostBattle_Fuck_Enemy" "intimate" "lust">>
<<vchoice "Leave her wanting" "PostBattle_Normal" "action" "map">>
</div><<set _i to $postBattle.currentEnemy>>
<<set _e to $postBattle.defeatedEnemies[_i]>>
<<postBattleVideo "threesome">>
<<advanceTime 0 45>>
<h3>Threesome</h3>
<p class="explicit"><<randomLine "postbattle_threesome" "setup">></p>
<<showCharacter "kira" "left" "aroused">>
<<say "Kira" `setup.randomLine("postbattle_kira", "reluctant_yes")`>>
<p class="explicit"><<randomLine "postbattle_threesome" "setup">></p>
<<if _pbFamily is "sf_cg_postbattle_threesome_enemy_01" or _pbClip is "e37a6e6eb125" or _pbClip is "d11afebfb05a">>
<p class="explicit">Kira climbs on all fours over her, ass up for you. You fuck Kira from behind right over the woman's face, and her tongue works Kira's clit and your cock both.</p>
<</if>>
<<say _e.name `setup.randomLine("postbattle_threesome", "enemy_first_woman")`>>
<<say "Kira" `setup.randomLine("postbattle_male_enemy", "kira_riding_male")`>>
<p class="explicit"><<randomLine "postbattle_threesome" "during">></p>
<<say _e.name `setup.randomLine("postbattle_facefuck_lines", "gagging")`>>
<p class="explicit"><<randomLine "postbattle_threesome" "during">></p>
<<say "Kira" `setup.randomLine("kira_cum", "buildup")`>>
<p class="explicit"><<randomLine "postbattle_threesome" "during">></p>
<<say "Kira" `setup.randomLine("kira_cum", "buildup")`>>
<p class="explicit"><<randomLine "kira_cum" "orgasm">></p>
<<say "Kira" `setup.randomLine("postbattle_threesome", "kira_cumming")`>>
<p class="explicit"><<randomLine "player_cum" "buildup">></p>
<div class="choice-container">
<<vchoice "Cum inside the enemy" "PostBattle_Threesome_CumInEnemy" "intimate" "shower">>
<<vchoice "Pull out and cum on both of them" "PostBattle_Threesome_CumOnBoth" "intimate" "shower">>
<<vchoice "Switch to Kira and cum inside her" "PostBattle_Threesome_CumInKira" "intimate" "lust">>
</div><<set _i to $postBattle.currentEnemy>>
<<set _e to $postBattle.defeatedEnemies[_i]>>
<<postBattleVideo "threesome_cum_enemy">>
<<if _pbFamily is "sf_cg_postbattle_threesome_enemy_01">>
<p class="explicit">You grab Kira's face from behind, thumb hooked in her mouth, and pound her a last few strokes. Then you pull out of her and shove your cock down into the enemy's open mouth underneath.</p>
<<elseif _pbClip is "7cfa39ad3337">>
<p class="explicit">You pound Kira a last few strokes, pull out and shove your cock down into the enemy's open mouth underneath.</p>
<<else>>
<p class="explicit"><<randomLine "postbattle_threesome" "climax">></p>
<</if>>
<<if _pbFamily is "sf_cg_postbattle_threesome_enemy_01" or _pbClip is "7cfa39ad3337">>
<p class="explicit"><<randomLine "player_cum" "cum_in_mouth">></p>
<<else>>
<p class="explicit"><<randomLine "player_cum" "cum_inside">></p>
<</if>>
<<if _pbFamily is "sf_cg_postbattle_threesome_enemy_01" or _pbClip is "7cfa39ad3337">>
<<say _e.name `setup.randomLine("postbattle_aftermath", "after_swallow")`>>
<<else>>
<<say _e.name `setup.randomLine("defeated_enemy_cum", "cum_inside_reaction")`>>
<</if>>
<<if _pbFamily is "sf_cg_postbattle_threesome_enemy_01" or _pbClip is "7cfa39ad3337">><<else>><p class="explicit"><<randomLine "postbattle_threesome" "climax">></p><</if>>
<<say "Kira" `setup.randomLine("postbattle_kira", "after_threesome")`>>
<p class="explicit"><<randomLine "player_cum" "after">></p>
<p class="explicit"><<randomLine "kira_cum" "after">></p>
<<set $player.lust to 20>><<run setup.playerReleased()>>
<<set $postBattle.playerCame to true>>
<<set $companions[0].lust to 20>>
<<clampStat "companions[0].tension" -25 20 100>>
<<relationChange "kira" "affection" 1>>
<<set $flags.threesomeWithEnemy to true>>
<<set $stats.sex.groupSex to ($stats.sex.groupSex || 0) + 1>>
<div class="choice-container">
<<vchoice "Continue" "PostBattle_Normal" "action" "map">>
</div><<set _i to $postBattle.currentEnemy>>
<<set _e to $postBattle.defeatedEnemies[_i]>>
<<postBattleVideo "threesome_cum_both">>
<<if _pbFamily is "sf_cg_postbattle_threesome_enemy_01">>
<p class="explicit">You fuck Kira with your thumb hooked in her mouth, pull out, and let the woman underneath suck you for a few strokes.</p>
<</if>>
<p class="explicit"><<randomLine "postbattle_narrative" "threesome_cum_both">></p>
<p class="explicit"><<randomLine "player_cum" "cum_on_face">></p>
<p class="explicit"><<randomLine "postbattle_narrative" "threesome_mark_both">></p>
<<say "Kira" `setup.randomLine("postbattle_kira", "cum_on_her")`>>
<p class="explicit"><<randomLine "postbattle_narrative" "kira_cum_amused">></p>
<p class="explicit"><<randomLine "player_cum" "after">></p>
<<set $player.lust to 20>><<run setup.playerReleased()>>
<<set $postBattle.playerCame to true>>
<<set $companions[0].lust to 20>>
<<clampStat "companions[0].tension" -25 20 100>>
<<relationChange "kira" "affection" 1>>
<<set $flags.threesomeWithEnemy to true>>
<<set $stats.sex.groupSex to ($stats.sex.groupSex || 0) + 1>>
<div class="choice-container">
<<vchoice "Continue" "PostBattle_Normal" "action" "map">>
</div><<set _i to $postBattle.currentEnemy>>
<<set _e to $postBattle.defeatedEnemies[_i]>>
<<postBattleVideo "threesome_cum_kira">>
<<if _pbFamily is "sf_cg_postbattle_threesome_enemy_01">>
<p class="explicit">You grab Kira's face from behind, thumb hooked in her mouth, and fuck her hard. You pull out once and let the woman underneath suck Kira's taste off your cock, then drive back into Kira to finish.</p>
<<else>>
<p class="explicit"><<randomLine "postbattle_narrative" "finish_inside_kira">></p>
<</if>>
<<say "Kira" `setup.randomLine("postbattle_kira", "cum_inside_her")`>>
<p class="explicit"><<randomLine "postbattle_narrative" "thrust_kira_surprise">></p>
<<say "Kira" `setup.randomLine("kira_cum", "buildup")`>>
<p class="explicit"><<randomLine "player_cum" "cum_inside">></p>
<<say "Kira" `setup.randomLine("postbattle_kira", "cum_inside_her")`>>
<p class="explicit"><<randomLine "player_cum" "cum_inside">></p>
<<say "Kira" `setup.randomLine("kira_cum", "orgasm")`>>
<p class="explicit"><<randomLine "kira_cum" "kira_cum_from_sex">></p>
<p class="explicit"><<randomLine "player_cum" "after">></p>
<p class="explicit"><<randomLine "kira_cum" "after">></p>
<<set $player.lust to 20>><<run setup.playerReleased()>>
<<set $postBattle.playerCame to true>>
<<set $companions[0].lust to 20>>
<<clampStat "companions[0].tension" -30 20 100>>
<<relationChange "kira" "affection" 1>>
<<set $flags.threesomeWithEnemy to true>>
<<set $flags.cumInsideKira to true>>
<<set $stats.sex.groupSex to ($stats.sex.groupSex || 0) + 1>>
<div class="choice-container">
<<vchoice "Continue" "PostBattle_Normal" "action" "map">>
</div><<set _i to $postBattle.currentEnemy>>
<<set _e to $postBattle.defeatedEnemies[_i]>>
<<if !$postBattle.enemiesUsed.includes(_i)>><<run $postBattle.enemiesUsed.push(_i)>><</if>>
<<advanceTime 0 20>>
<<postBattleVideo "male_humiliate">>
<h3>Humiliate Him</h3>
<p class="explicit"><<randomLine "postbattle_narrative" "male_humiliate_start_rough">></p>
<<say $player.name `setup.randomLine("postbattle_male_enemy", "player_taunts_male")`>>
<<say _e.name `setup.randomLine("postbattle_male_enemy", "resistance")`>>
<p class="explicit"><<randomLine "postbattle_narrative" "male_humiliate_edge">></p>
<<say _e.name `setup.randomLine("postbattle_male_enemy", "forced_orgasm_building")`>>
<<say $player.name "Beg.">>
<<say _e.name `setup.randomLine("postbattle_male_enemy", "begging_to_cum")`>>
<p class="explicit"><<randomLine "postbattle_narrative" "male_humiliate_cum">></p>
<<if setup.kiraAfterFight()>><<say "Kira" `setup.randomLine("postbattle_male_enemy", "kira_watches_male")`>><</if>>
<<clampStat "player.dominance" 5>>
<div class="choice-container">
<<vchoice "Continue" "PostBattle_Normal" "action" "map">>
</div><<set _i to $postBattle.currentEnemy>>
<<set _e to $postBattle.defeatedEnemies[_i]>>
<<postBattleVideo "male_kira_rides">>
<<advanceTime 0 30>>
<h3>Kira Rides Him</h3>
<<say $player.name "Kira. Use him.">>
<<showCharacter "kira" "center" "aroused">>
<p class="explicit"><<randomLine "postbattle_kira_male" "approach">></p>
<<say "Kira" `setup.randomLine("postbattle_male_enemy", "kira_uses_male")`>>
<p class="explicit"><<randomLine "postbattle_kira_male" "riding">></p>
<<if _pbFamily is "sf_cg_postbattle_kira_rides_male_01">>
<p class="explicit">She sinks onto his cock facing him, then twists round and rides him backwards, ass slapping down on his thighs, then turns back again and grinds with her head thrown back and her hair whipping, his hands clamped on her hips like she put them there to hold on.</p>
<</if>>
<<say _e.name `setup.randomLine("postbattle_male_enemy", "denial_aroused")`>>
<<say "Kira" `setup.randomLine("postbattle_male_enemy", "kira_riding_male")`>>
<p class="explicit"><<randomLine "postbattle_kira_male" "riding">></p>
<<say "Kira" `setup.randomLine("postbattle_kira_male", "kira_buildup")`>>
<p class="explicit"><<randomLine "postbattle_kira_male" "riding">></p>
<<say "Kira" `setup.randomLine("postbattle_kira_male", "kira_buildup")`>>
<p class="explicit"><<randomLine "postbattle_kira_male" "kira_cum">></p>
<<say "Kira" `setup.randomLine("postbattle_kira_male", "kira_cumming")`>>
<p class="explicit"><<randomLine "postbattle_kira_male" "climax">></p>
<p class="explicit"><<randomLine "postbattle_kira_male" "kira_after">></p>
<<say "Kira" `setup.randomLine("postbattle_kira_male", "kira_after_say")`>>
<<set $companions[0].lust to 20>>
<<clampStat "companions[0].tension" -20 30 100>>
<<clampStat "player.lust" 30>>
<<set $flags.kiraUsedMaleEnemy to true>>
<div class="choice-container">
<<vchoice "Continue" "PostBattle_Normal" "action" "map">>
</div><<set _i to $postBattle.currentEnemy>>
<<set _e to $postBattle.defeatedEnemies[_i]>>
<<advanceTime 0 10>>
<<if !$postBattle.enemiesSecondarySearched>><<set $postBattle.enemiesSecondarySearched to []>><</if>>
<<run $postBattle.enemiesSecondarySearched.push(_i)>>
<<set _isBroken to (_e.beenUsed || _e.defeatType === "seduced" || (_e.lust && _e.lust >= 90) || (_e.humiliation && _e.humiliation >= 80))>>
<<postBattleVideo "secondary_search">>
<<if _isBroken>>
<h3>Search Her Again</h3>
<p class="explicit"><<randomLine "secondary_search_broken" "grope_search">></p>
<<say _e.name `setup.randomLine("secondary_search_broken", "her_submissive")`>>
<<set _slapType to random(1, 3)>>
<<if _slapType === 1>>
<p class="explicit"><<randomLine "secondary_search_broken" "slap_face">></p>
<<elseif _slapType === 2 && _e.clothing && _e.clothing.assExposed>>
<p class="explicit"><<randomLine "secondary_search_broken" "slap_ass">></p>
<<elseif _slapType === 3 && _e.clothing && _e.clothing.pussyExposed>>
<p class="explicit"><<randomLine "secondary_search_broken" "slap_pussy">></p>
<<else>>
<p class="explicit"><<randomLine "secondary_search_broken" "slap_face">></p>
<</if>>
<p class="explicit"><<randomLine "secondary_search_broken" "grope_search">></p>
<<say _e.name `setup.randomLine("secondary_search_broken", "her_submissive")`>>
<<set _slapType to random(1, 3)>>
<<if _slapType === 1>>
<p class="explicit"><<randomLine "secondary_search_broken" "slap_face">></p>
<<elseif _slapType === 2 && _e.clothing && _e.clothing.assExposed>>
<p class="explicit"><<randomLine "secondary_search_broken" "slap_ass">></p>
<<elseif _slapType === 3 && _e.clothing && _e.clothing.pussyExposed>>
<p class="explicit"><<randomLine "secondary_search_broken" "slap_pussy">></p>
<<else>>
<p class="explicit"><<randomLine "secondary_search_broken" "slap_face">></p>
<</if>>
<p class="explicit"><<randomLine "secondary_search_broken" "grope_search">></p>
<<say _e.name `setup.randomLine("secondary_search_broken", "her_submissive")`>>
<<set _slapType to random(1, 3)>>
<<if _slapType === 1>>
<p class="explicit"><<randomLine "secondary_search_broken" "slap_face">></p>
<<elseif _slapType === 2 && _e.clothing && _e.clothing.assExposed>>
<p class="explicit"><<randomLine "secondary_search_broken" "slap_ass">></p>
<<elseif _slapType === 3 && _e.clothing && _e.clothing.pussyExposed>>
<p class="explicit"><<randomLine "secondary_search_broken" "slap_pussy">></p>
<<else>>
<p class="explicit"><<randomLine "secondary_search_broken" "slap_face">></p>
<</if>>
<p class="explicit"><<randomLine "secondary_search_broken" "after">></p>
<<else>>
<h3>Search Her Again</h3>
<p class="explicit"><<randomLine "secondary_search" "grope_search">></p>
<<say _e.name `setup.randomLine("secondary_search", "her_cursing")`>>
<<set _slapType to random(1, 3)>>
<<if _slapType === 1>>
<p class="explicit"><<randomLine "secondary_search" "slap_face">></p>
<<elseif _slapType === 2 && _e.clothing && _e.clothing.assExposed>>
<p class="explicit"><<randomLine "secondary_search" "slap_ass">></p>
<<elseif _slapType === 3 && _e.clothing && _e.clothing.pussyExposed>>
<p class="explicit"><<randomLine "secondary_search" "slap_pussy">></p>
<<else>>
<p class="explicit"><<randomLine "secondary_search" "slap_face">></p>
<</if>>
<p class="explicit"><<randomLine "secondary_search" "grope_search">></p>
<<say _e.name `setup.randomLine("secondary_search", "her_cursing")`>>
<<set _slapType to random(1, 3)>>
<<if _slapType === 1>>
<p class="explicit"><<randomLine "secondary_search" "slap_face">></p>
<<elseif _slapType === 2 && _e.clothing && _e.clothing.assExposed>>
<p class="explicit"><<randomLine "secondary_search" "slap_ass">></p>
<<elseif _slapType === 3 && _e.clothing && _e.clothing.pussyExposed>>
<p class="explicit"><<randomLine "secondary_search" "slap_pussy">></p>
<<else>>
<p class="explicit"><<randomLine "secondary_search" "slap_face">></p>
<</if>>
<p class="explicit"><<randomLine "secondary_search" "grope_search">></p>
<<say _e.name `setup.randomLine("secondary_search", "her_cursing")`>>
<<set _slapType to random(1, 3)>>
<<if _slapType === 1>>
<p class="explicit"><<randomLine "secondary_search" "slap_face">></p>
<<elseif _slapType === 2 && _e.clothing && _e.clothing.assExposed>>
<p class="explicit"><<randomLine "secondary_search" "slap_ass">></p>
<<elseif _slapType === 3 && _e.clothing && _e.clothing.pussyExposed>>
<p class="explicit"><<randomLine "secondary_search" "slap_pussy">></p>
<<else>>
<p class="explicit"><<randomLine "secondary_search" "slap_face">></p>
<</if>>
<p class="explicit"><<randomLine "secondary_search" "after">></p>
<</if>>
<<set _e.lust to setup.enemyLustPlus(_e, 15)>>
<<clampStat "player.lust" 10>>
<<clampStat "player.dominance" 3>>
<<if setup.kiraAfterFight() && $companions[0].lust >= 30>>
<<say "Kira" `setup.randomLine("postbattle_grope", "kira_watches")`>>
<<clampStat "companions[0].lust" 5>>
<</if>>
<div class="choice-container">
<<vchoice "Continue" "PostBattle_Normal" "action" "map">>
</div><<widget "checkKiraOrgasm">>
<<if $combat && $combat.active && $companions && $companions[0]>>
<<if $combat.kiraInRefractory && $companions[0].lust > 80>>
<<set $companions[0].lust to 80>>
<</if>>
<<if $companions[0].lust >= 100 && !$combat.kiraOrgasmTriggered && !$combat.kiraInRefractory>>
<<set _pos to $combat.positions.kira || "standing">>
<<set _c to $clothing.kira>>
<<set _exposed to (_c.titsExposed || _c.pussyExposed)>>
<<set _beingTouched to ($combat.kiraBeingGroped || $combat.kiraBeingFingered)>>
<<set _chance to 30>>
<<if _exposed>><<set _chance += 10>><</if>>
<<if _pos === "kneeling" || _pos === "prone_back" || _pos === "prone_stomach" || _pos === "bent_over">>
<<set _chance += 15>>
<</if>>
<<if _beingTouched>><<set _chance += 20>><</if>>
<<set _roll to random(1, 100)>>
<<if _roll <= _chance>>
<<set $combat.kiraOrgasmTriggered to true>>
<<triggerKiraOrgasm>>
<</if>>
<</if>>
<</if>>
<</widget>>
<<widget "triggerKiraOrgasm">>
<<set _pos to $combat.positions.kira || "standing">>
<<set _c to $clothing.kira>>
<<set _exposed to (_c.titsExposed || _c.pussyExposed || _c.assExposed)>>
<<set _bound to ($combat.kiraWristsBound || $combat.kiraAnklesBound)>>
<<set _beingFucked to $combat.kiraBeingFucked>>
<<set _isMultiple to $combat.kiraInRefractory>>
<<if _pos === "prone_stomach">><<set _pos to "prone_front">><</if>>
<<set _clothingState to _exposed ? "exposed" : "clothed">>
<<set _poolKey to _pos + "_" + _clothingState>>
<<set _pools to setup.kiraOrgasm || {}>>
<<if _isMultiple && _pools.multiple>>
<<set _pool to _pools.multiple>>
<<set _type to "multiple">>
<<set _aftermathPool to _pools.aftermath_broken>>
<<elseif _beingFucked && _pools.being_fucked>>
<<set _pool to _pools.being_fucked>>
<<set _type to "fucked">>
<<set _aftermathPool to _pools.aftermath_intense>>
<<elseif _pools[_poolKey]>>
<<set _pool to _pools[_poolKey]>>
<<set _type to _poolKey>>
<<if _pos === "bent_over" || _pos === "pinned">>
<<set _aftermathPool to _pools.aftermath_intense>>
<<elseif _pos === "standing" && !_exposed>>
<<set _aftermathPool to _pools.aftermath_mild>>
<<else>>
<<set _aftermathPool to _pools.aftermath_intense>>
<</if>>
<<else>>
<<if _pos === "bent_over">>
<<set _pool to setup.combatNarrative.kira_orgasm_intense>>
<<elseif _pos === "prone_back">>
<<set _pool to setup.combatNarrative.kira_orgasm_helpless>>
<<elseif _pos === "prone_front">>
<<set _pool to setup.combatNarrative.kira_orgasm_grinding>>
<<elseif _pos === "kneeling">>
<<set _pool to setup.combatNarrative.kira_orgasm_submissive>>
<<elseif _exposed>>
<<set _pool to setup.combatNarrative.kira_orgasm_shuddering>>
<<else>>
<<set _pool to setup.combatNarrative.kira_orgasm_stifled>>
<</if>>
<<set _type to _pos>>
<<set _aftermathPool to _pools.aftermath_mild || setup.combatNarrative.kira_post_orgasm>>
<</if>>
<<set _narrative to _pool ? _pool.random() : "Kira shudders as an orgasm overwhelms her.">>
<<set _aftermath to _aftermathPool ? _aftermathPool.random() : "Kira trembles, her body betraying her.">>
<<set _boundNarrative to "">>
<<if _bound && _pools.bound_modifier>>
<<set _boundNarrative to _pools.bound_modifier.random()>>
<</if>>
<<set $combat.pendingKiraOrgasm to {
type: _type,
position: _pos,
exposed: _exposed,
bound: _bound,
narrative: _narrative,
boundNarrative: _boundNarrative,
aftermath: _aftermath
}>>
<div class="combat-event kira-orgasm">
<<kiraMediaTarget>>
<<combatActionVideo "kira-orgasm-video" "combat/kira_orgasm" _kiraMediaTarget>>
<p class="explicit"><<print setup.fillPlayerName(_narrative)>></p>
<<if _boundNarrative>>
<p class="explicit bound-detail"><<print setup.fillPlayerName(_boundNarrative)>></p>
<</if>>
<p class="state-change"><<print setup.fillPlayerName(_aftermath)>></p>
</div>
<<if _type === "multiple" || _type === "fucked">>
<<set $companions[0].lust to random(30, 45)>>
<<else>>
<<set $companions[0].lust to random(40, 60)>>
<</if>>
<<if _beingFucked || _bound>>
<<set _orgasmKind to "forced">>
<<elseif _pos === "bent_over" || _pos === "pinned">>
<<set _orgasmKind to "intense">>
<<else>>
<<set _orgasmKind to "mild">>
<</if>>
<<set $combat.pendingKiraOrgasm.kind to _orgasmKind>>
<<if _orgasmKind === "intense" || _orgasmKind === "forced">>
<<set $combat.kiraStunned to 2>>
<<else>>
<<set $combat.kiraStunned to 1>>
<</if>>
<<set $combat.kiraDefenseDebuff to 2 + ($combat.phase === "enemy" ? 1 : 0)>>
<<set $combat.kiraDefenseModifier to -15>>
<<set $combat.kiraInRefractory to true>>
<<set $combat.kiraRefractoryTurns to 3>>
<<set $combat.kiraPostOrgasmAttacks to 0>>
<<run $combat.log.push({
turn: $combat.turn,
type: "kira_orgasm",
text: "Kira orgasms! Stunned for " + $combat.kiraStunned + " turn(s); she takes +15% damage while weakened."
})>>
<<addTension "kira" 5 "" "combat">>
<</widget>>
<<widget "triggerKiraMultipleOrgasm">>
<<set _pos to $combat.positions.kira || "standing">>
<div class="combat-event kira-multiple-orgasm">
<<kiraMediaTarget>>
<<combatActionVideo "kira-multiple-orgasm-video" "combat/kira_orgasm" _kiraMediaTarget>>
<p class="explicit"><<narrativePrint setup.combatNarrative.kira_multiple_orgasm.random()>></p>
<p class="state-change"><<narrativePrint setup.combatNarrative.kira_multiple_orgasm_aftermath.random()>></p>
</div>
<<set $companions[0].lust to 30>>
<<set $combat.kiraStunned to 3>>
<<set $combat.kiraDefenseDebuff to 3 + ($combat.phase === "enemy" ? 1 : 0)>>
<<set $combat.kiraDefenseModifier to -25>>
<<set $combat.kiraMultipleOrgasm to true>>
<<set $combat.kiraInRefractory to false>>
<<set $combat.kiraRefractoryTurns to 0>>
<<set $combat.kiraPostOrgasmAttacks to 0>>
<<set $combat.kiraOrgasmTriggered to false>>
<<if $combat.currentTarget !== undefined && $combat.enemies[$combat.currentTarget]>>
<<set $combat.enemies[$combat.currentTarget].stunned to true>>
<<set $combat.enemies[$combat.currentTarget].stunnedTurns to 1>>
<</if>>
<<run $combat.log.push({
turn: $combat.turn,
type: "kira_multiple_orgasm",
text: "Kira suffers multiple orgasms! Completely broken - stunned 3 turns; she takes +25% damage while weakened."
})>>
<<addTension "kira" 10 "" "combat">>
<</widget>>
<<widget "trackPostOrgasmAttack">>
<<set _attackType to _args[0] || "grope">>
<<if $combat.kiraInRefractory>>
<<if _attackType === "fuck" || _attackType === "crop_pussy">>
<<set $combat.kiraPostOrgasmAttacks += 2>>
<<else>>
<<set $combat.kiraPostOrgasmAttacks += 1>>
<</if>>
<div class="combat-event kira-sensitive">
<p class="explicit"><<narrativePrint setup.getKiraPostOrgasmNarrative(_attackType)>></p>
</div>
<<if $combat.kiraPostOrgasmAttacks >= 3>>
<<triggerKiraMultipleOrgasm>>
<</if>>
<</if>>
<</widget>>
<<widget "tickKiraRefractory">>
<<if $combat.kiraInRefractory && $combat.kiraRefractoryTurns > 0>>
<<set $combat.kiraRefractoryTurns -= 1>>
<<if $combat.kiraRefractoryTurns <= 0>>
<<set $combat.kiraInRefractory to false>>
<<set $combat.kiraPostOrgasmAttacks to 0>>
<<set $combat.kiraOrgasmTriggered to false>>
<</if>>
<</if>>
<<if $combat.kiraDefenseDebuff > 0>>
<<set $combat.kiraDefenseDebuff -= 1>>
<<if $combat.kiraDefenseDebuff <= 0>>
<<set $combat.kiraDefenseModifier to 0>>
<</if>>
<</if>>
<<if $combat.kiraEffects>>
<<if $combat.kiraEffects.slapped && $combat.kiraEffects.slapped > 0>>
<<set $combat.kiraEffects.slapped -= 1>>
<</if>>
<<if $combat.kiraEffects.groped && $combat.kiraEffects.groped > 0>>
<<set $combat.kiraEffects.groped -= 1>>
<</if>>
<<if $combat.kiraEffects.welted && $combat.kiraEffects.welted > 0>>
<<set $combat.kiraEffects.welted -= 1>>
<</if>>
<</if>>
<<if $combat.kiraChoked && $combat.kiraChoked > 0>>
<<set $combat.kiraChoked -= 1>>
<</if>>
<</widget>>
<<widget "addKiraLust">>
<<set _amount to _args[0] || 0>>
<<if $companions && $companions[0]>>
<<set _lustBefore to $companions[0].lust>>
<<clampStat "companions[0].lust" _amount>>
<<set _lustAfter to $companions[0].lust>>
<<if $combat && $combat.active && $combat.enemies>>
<<set _threshCfg to setup.enemyLustTriggersConfig?.kiraLustThreshold || {fifty: {min: 5, max: 8}, seventy: {min: 8, max: 12}}>>
<<if _lustBefore < 50 && _lustAfter >= 50>>
<<addMaleEnemyLust `random(_threshCfg.fifty.min, _threshCfg.fifty.max)` "kira_lust_50">>
<</if>>
<<if _lustBefore < 70 && _lustAfter >= 70>>
<<addMaleEnemyLust `random(_threshCfg.seventy.min, _threshCfg.seventy.max)` "kira_lust_70">>
<</if>>
<</if>>
<<checkKiraOrgasm>>
<</if>>
<</widget>>
<<widget "checkKiraSexualAttack">>
<<set _attackType to _args[0] || "grope">>
<<set _kiraInRefractory to $combat.kiraInRefractory || false>>
<<if _kiraInRefractory>>
<<trackPostOrgasmAttack _attackType>>
<</if>>
<</widget>><<widget "postBattleVideo">>
<<silently>>
<<set _pbvBeat to _args[0]>>
<<set _pbvRow to setup.postBattleMedia[_pbvBeat] || null>>
<<if _pbvRow>>
<<if _pbvRow.who === "seduced">>
<<set _pbvEnemy to setup.seducedEnemy()>>
<<else>>
<<set _pbvIdx to (typeof _args[1] === "number") ? _args[1] : ($postBattle ? $postBattle.currentEnemy : null)>>
<<set _pbvEnemy to ($postBattle && $postBattle.defeatedEnemies && _pbvIdx != null) ? $postBattle.defeatedEnemies[_pbvIdx] : null>>
<</if>>
<<set _pbvTied to !!(_pbvEnemy && _pbvEnemy.boundState === "tied" && _pbvRow.who !== "kira")>>
<<set _pbvFolder to setup.postBattleFolder(_pbvBeat, _pbvTied)>>
<<set _pbvRuntime to setup.postBattleRuntimeFallback(_pbvBeat, _pbvTied)>>
<<set _pbvTarget to setup.postBattleMediaTarget(_pbvBeat, _pbvEnemy)>>
<<if !setup.mediaManifestCache[_pbvFolder]>><<loadMediaManifest _pbvFolder>><</if>>
<<set _pbvFam to setup.postBattleFamilyWant(_pbvFolder)>>
<<if _pbvFam>><<set _pbvTarget.mediaPrefer to [["family", _pbvFam]].concat(_pbvTarget.mediaPrefer || [])>><</if>>
<<set _pbvSeq to (_pbvSeq || 0) + 1>>
<<set _pbvBox to _args[2] || ("pb-video-" + _pbvBeat + "-" + _pbvSeq)>>
<</if>>
<</silently>>
<<if _pbvRow>><<combatActionVideo _pbvBox _pbvFolder _pbvTarget _pbvRuntime>><</if>>
<<silently>>
<<if _pbvRow>><<run setup.storyFamilyNote(_cvbTags)>><</if>>
<<set _pbClip to _pbvRow ? setup.postBattleClipStem(_cvbFile) : null>>
<<set _pbFamily to (_pbvRow && _cvbTags && _cvbTags.family) ? String(_cvbTags.family) : null>>
<</silently>>
<</widget>>
<<widget "seducedEnemyPortrait">>
<<silently>>
<<run setup.combatMediaTemps.stash()>>
<<set _sepEnemy to _args[0]>>
<<set _sepMedia to null>>
<<if _sepEnemy && _sepEnemy.visualGroup>>
<<getCombatEnemyMedia _sepEnemy.visualGroup _sepEnemy>>
<<if setup.combatMediaIsClip(_combatEnemyMedia)>><<set _sepMedia to _combatEnemyMedia>><</if>>
<</if>>
<<run setup.combatMediaTemps.restore()>>
<</silently>>
<<if _sepMedia>>
<div class="narrative-image seduced-enemy-portrait">
<<if ["webp", "jpg", "jpeg", "png", "gif"].includes(String(_sepMedia.format).toLowerCase())>>
<img class="combat-enemy-portrait" @src="_sepMedia.file" @alt="_sepEnemy.name">
<<else>>
<video class="combat-enemy-portrait" autoplay loop muted playsinline @src="_sepMedia.file"></video>
<</if>>
</div>
<</if>>
<</widget>><<widget "combatVictoryTransition">>
<<set _cvtMode to _args[0]>>
<<set _defeatedEnemies to []>>
<<if $combat && $combat.defeatedEnemies && $combat.defeatedEnemies.length > 0>>
<<set _defeatedEnemies to clone($combat.defeatedEnemies)>>
<</if>>
<<if $combat && $combat.enemies && $combat.enemies.length > 0>>
<<for _e range $combat.enemies>>
<<if _e.fled>>
<<run setup.recordLeftFight($combat, _e)>>
<<else>>
<<run _defeatedEnemies.push(clone(_e))>>
<</if>>
<</for>>
<</if>>
<<run setup.unrecordedEnemies($combat, _defeatedEnemies).forEach(function (e) { _defeatedEnemies.push(e); })>>
<<run setup.holdUsedEnemies(_defeatedEnemies)>>
<<set _cvtAllFled to !!($combat && Array.isArray($combat.fledEnemies) && $combat.fledEnemies.length)>>
<<if _defeatedEnemies.length === 0 && !_cvtAllFled && $combat && $combat.allEnemies && $combat.allEnemies.length > 0>>
<<set _defeatedEnemies to clone($combat.allEnemies)>>
<</if>>
<<if _defeatedEnemies.length === 0 && !_cvtAllFled>>
<<set _defeatedEnemies to [{
name: "Raider",
type: "human",
gender: "female",
health: 5,
maxHealth: 40,
clothing: {top: 0, bottom: 0, underwear: 0, titsExposed: true, pussyExposed: true, assExposed: true},
loot: ["scrap metal", "bandage", "ammo"],
lootChance: 0.6,
boundState: "none"
}]>>
<</if>>
<<set _cvtScene to setup.combatScenePassage("victory")>>
<<endCombat>>
<<set $combat.result to "victory">>
<<advanceTime 0 30>>
<<removeclass "body" "scene-mode-combat">>
<<set $postBattle = {
defeatedEnemies: _defeatedEnemies,
location: $currentLocation,
timeOfDay: $time.phase,
enemiesSearched: [],
enemiesUsed: [],
enemiesReleased: [],
enemiesExecuted: [],
victoryPassage: _cvtScene || ""
}>>
<<run setup.clearCombatScenes()>>
<<for _i, _enemy range $postBattle.defeatedEnemies>>
<<if !_enemy.clothing>>
<<set _enemy.clothing to {
top: 0,
bottom: 0,
underwear: 0,
titsExposed: true,
pussyExposed: true,
assExposed: true
}>>
<</if>>
<<if !_enemy.loot>>
<<set _enemy.loot to ["scrap metal", "ammo"]>>
<</if>>
<<if !_enemy.lootChance>>
<<set _enemy.lootChance to 0.3>>
<</if>>
<<if !_enemy.boundState>>
<<set _enemy.boundState to "none">>
<</if>>
<</for>>
<<set _playerAroused to ($player.lust >= 70)>>
<<set _kiraAroused to ($companions[0].lust >= 60)>>
<<set _highTension to ($companions[0].tension >= 60)>>
<<set _playerExposed to ($clothing.player.dickExposed || $clothing.player.chestExposed)>>
<<set _kiraExposed to ($clothing.kira.titsExposed || $clothing.kira.pussyExposed)>>
<<set _kiraHere to setup.kiraAfterFight()>>
<<if _kiraHere && setup.kiraRoomSexOpen() && _playerAroused && _kiraAroused && _highTension>>
<<set _cvtNext to "PostBattle_Mutual_Explosion">>
<<elseif _kiraHere && setup.kiraRoomSexOpen() && _kiraAroused && _highTension && $clothing.player.dickExposed>>
<<set _cvtNext to "PostBattle_Kira_Jumps_Player">>
<<elseif _kiraHere && setup.kiraRoomSexOpen() && _playerAroused && _kiraExposed>>
<<set _cvtNext to "PostBattle_Player_Takes_Kira">>
<<else>>
<<set _cvtNext to "PostBattle_Normal">>
<</if>>
<<if _cvtMode === "continue">>
<div class="choice-container">
<<vchoice "Continue" _cvtNext "action" "forward">>
</div>
<<else>>
<<goto _cvtNext>>
<</if>>
<</widget>>
/* =============================================================
TRAVEL ENCOUNTER RISK CALCULATION<<widget "combatNarrative">>
<<set _cnPool to _args[0]>>
<<set _cnFallback to _args[1] || "">>
<<set _cnArg to _args[2] || null>>
<<set _cnVideoFolder to (typeof _cnArg === "string" && _cnArg.indexOf("/") !== -1) ? _cnArg : null>>
<<set _cnClass to (typeof _cnArg === "string" && !_cnVideoFolder) ? _cnArg : "">>
<<set _cnVideoFilters to _args[3] || {}>>
<<set _cnLines to setup.cnLines(_cnPool)>>
<<if _cnLines.length>>
<<set _cnText to setup.pickFresh(_cnLines)>>
<<else>>
<<set _cnText to _cnFallback>>
<</if>>
<<if typeof _cnText === "string" && _cnText.indexOf("{") !== -1>>
<<set _cnWho to (typeof _target === "object" && _target && _target.gender) ? _target : (($combat && $combat.enemies) ? $combat.enemies[$combat.currentEnemyIndex || 0] : null)>>
<<set _cnText to setup.fillPronouns(_cnText, _cnWho && _cnWho.gender)>>
<</if>>
<<set _cnVideo to null>>
<<if _cnVideoFolder>>
<<run setup.combatMediaTemps.stash()>>
<<selectMediaFromPool _cnVideoFolder _cnVideoFilters>>
<<set _cnVideo to (_result && _result.file) ? _result.file : null>>
<<run setup.combatMediaTemps.restore()>>
<</if>>
<<set _narrativeResult to {
text: _cnText,
video: _cnVideo,
hasVideo: (_cnVideo !== null && _cnVideo !== undefined),
pool: _cnPool
}>>
<<if _cnClass && _cnText>>
<p @class="_cnClass"><<print _cnText>></p>
<<elseif _cnText>>
<<print _cnText>>
<</if>>
<</widget>>SECTION 23: SEDUCTION COMBAT WIDGETS
<<widget "describeKiraRoom">>
<<if $companions[0].trust >= 60>>
The room feels less guarded now. <<if $flags.kiraGiftGiven>>A small token you gave her sits on the desk.<</if>>
<<elseif $companions[0].trust >= 40>>
Spartan, but lived-in. She's made this corner of the vault her own.
<<else>>
Bare walls. Functional furniture. A room for surviving, not living.
<</if>>
<<if $companions[0].tension >= 60>>
The narrow bed seems very prominent suddenly.
<</if>>
<</widget>>SECTION 22: SEX SCENE WIDGETS
============================================================= */
<<widget "sexScene">>
<<set _partner to _args[0]>>
<<set _type to _args[1] || "romantic">>
<<set _tone to _args[2] || "passionate">>
<<set _location to _args[3] || "quarters-night">>
<<getCompanion _partner>>
<<set _partnerName to $tempCompanion ? $tempCompanion.name : _partner>>
<<set $currentSexScene to {
partner: _partner,
partnerName: _partnerName,
type: _type,
tone: _tone,
location: _location,
phase: "initiation",
actsPerformed: [],
playerOrgasms: 0,
partnerOrgasms: 0,
intensity: 0,
climaxReady: false
}>>
<<run document.body.classList.add("scene-mode-intimate")>>
<<if _type === "dream">>
<<run document.body.classList.add("scene-mode-dream")>>
<</if>>
<<if _partner === "velith">>
<<run document.body.classList.add("scene-mode-supernatural")>>
<</if>>
<</widget>>
<<widget "sexPhase">>
<<set _phase to _args[0]>>
<<if !$currentSexScene>>
<<set $currentSexScene to {phase: "initiation", actsPerformed: [], intensity: 0}>>
<</if>>
<<set $currentSexScene.phase to _phase>>
<<if _phase === "buildup">>
<div class="scene-transition">The air grows heavy with anticipation...</div>
<<elseif _phase === "action">>
<div class="scene-transition">Bodies intertwine...</div>
<<elseif _phase === "climax">>
<div class="scene-transition">The tension reaches its peak...</div>
<<elseif _phase === "aftermath">>
<<run document.body.classList.remove("scene-mode-intimate", "scene-mode-dream", "scene-mode-supernatural")>>
<div class="scene-transition">In the stillness that follows...</div>
<</if>>
<</widget>>
<<widget "performSexAct">>
<<set _actId to _args[0]>>
<<set _act to $sexualActs[_actId]>>
<<if _act>>
<<if !$currentSexScene>>
<<set $currentSexScene to {
partner: "unknown",
type: "spontaneous",
tone: "passionate",
phase: "action",
actsPerformed: [],
playerOrgasms: 0,
partnerOrgasms: 0,
intensity: 20
}>>
<</if>>
<<run $currentSexScene.actsPerformed.push(_actId)>>
<<set $currentSexScene.intensity += (_act.intensity || 0)>>
<<set _actPlayerLust to _act.playerLust || 0>>
<<clampStat "player.lust" _actPlayerLust>>
<<getCompanion $currentSexScene.partner>>
<<if $tempCompanion>>
<<set $tempCompanion.lust to Math.clamp((Number($tempCompanion.lust) || 0) + (_act.partnerLust || 0), 0, 100)>>
<</if>>
<<if _act.description>>
<div class="sex-act-description">
<<print _act.description>>
</div>
<</if>>
<<if _act.playerOrgasmChance>>
<<if random(1, 100) lte _act.playerOrgasmChance>>
<<set $currentSexScene.playerOrgasms += 1>>
<div class="orgasm-notification player">
Pleasure crashes through you...
</div>
<<set $player.lust to Math.max(0, $player.lust - 50)>><<run setup.playerReleased()>>
<</if>>
<</if>>
<<if _act.partnerOrgasmChance && $tempCompanion>>
<<if random(1, 100) lte _act.partnerOrgasmChance>>
<<set $currentSexScene.partnerOrgasms += 1>>
<div class="orgasm-notification partner">
She cries out, body arching...
</div>
<<set $tempCompanion.lust to Math.max(0, $tempCompanion.lust - 50)>>
<</if>>
<</if>>
<<if _act.playerOrgasm>>
<<set $currentSexScene.playerOrgasms += 1>>
<<set $player.lust to 0>><<run setup.playerReleased()>>
<</if>>
<<if _act.partnerOrgasm>>
<<set $currentSexScene.partnerOrgasms += 1>>
<<if $tempCompanion>><<set $tempCompanion.lust to 0>><</if>>
<</if>>
<<if _act.dominanceGain>>
<<set $player.dominance += _act.dominanceGain>>
<</if>>
<<if $currentSexScene.intensity gte 60>>
<<set $currentSexScene.climaxReady to true>>
<</if>>
<<if _act.endsScene>>
<<endSexScene>>
<</if>>
<<else>>
<</if>>
<</widget>>
<<widget "endSexScene">>
<<run document.body.classList.remove("scene-mode-intimate", "scene-mode-dream", "scene-mode-supernatural")>>
<<if $currentSexScene>>
<<silently>>
<<set _partner to $currentSexScene.partner || "kira">>
<<set _type to $currentSexScene.type || "romantic">>
<<set _tone to $currentSexScene.tone || "passionate">>
<<set _trustGain to 1>>
<<set _affectionGain to 2>>
<<set _tensionLoss to -30>>
<<if _tone === "tender">>
<<set _affectionGain += 2>>
<<set _trustGain += 1>>
<<elseif _tone === "rough">>
<<set _tensionLoss to -50>>
<<set _trustGain -= 1>>
<<elseif _tone === "dominant">>
<<set $player.dominance += 5>>
<</if>>
<<if $currentSexScene.partnerOrgasms gte 2>>
<<set _affectionGain += 2>>
<</if>>
<</silently>>
<<getCompanion _partner>>
<<if $tempCompanion>>
<<set $tempCompanion.trust to Math.clamp(($tempCompanion.trust || 0) + _trustGain, 0, 100)>>
<<set $tempCompanion.affection to Math.clamp(($tempCompanion.affection || 0) + _affectionGain, 0, 100)>>
<<set $tempCompanion.tension to Math.clamp(($tempCompanion.tension || 0) + _tensionLoss, 0, 100)>>
<<set $tempCompanion.lust to 0>>
<<if !$tempCompanion.sexualStages>>
<<set $tempCompanion.sexualStages to []>>
<</if>>
<<if !$tempCompanion.sexualStages.includes("first_time")>>
<<run $tempCompanion.sexualStages.push("first_time")>>
<</if>>
<<set $tempCompanion.lastIntimacy to $time.day>>
<<if !$tempCompanion.timesIntimate>><<set $tempCompanion.timesIntimate to 0>><</if>>
<<set $tempCompanion.timesIntimate += 1>>
<</if>>
<<if _partner === "velith">>
<<addCorruption 5>>
<<if !$supernaturals.succubus.bondStrength>><<set $supernaturals.succubus.bondStrength to 0>><</if>>
<<set $supernaturals.succubus.bondStrength += 10>>
<</if>>
<<set $player.lust to Math.max(0, $player.lust - 50)>>
<<silently>>
<<if !$player.sexHistory>><<set $player.sexHistory to []>><</if>>
<<run $player.sexHistory.push({
partner: _partner,
day: $time.day,
type: _type,
tone: _tone,
acts: $currentSexScene.actsPerformed ? clone($currentSexScene.actsPerformed) : [],
playerOrgasms: $currentSexScene.playerOrgasms || 0,
partnerOrgasms: $currentSexScene.partnerOrgasms || 0
})>>
<</silently>>
<<set $currentSexScene to null>>
<</if>>
<</widget>>
/* =============================================================<<widget "getPositionIcon">>
<<set _gpiEnemy to _args[0]>>
<<if typeof _gpiEnemy === "number">>
<<set _gpiEnemy to $combat.enemies[_gpiEnemy]>>
<</if>>
<<if _gpiEnemy && _gpiEnemy.position>>
<<switch _gpiEnemy.position>>
<<case "kneeling">>
<<set _positionIcon to "kneeling">>
<<case "prone_front" "prone_back">>
<<set _positionIcon to "prone">>
<<case "bent_over">>
<<set _positionIcon to "bent-over">>
<<case "pinned">>
<<set _positionIcon to "pinned">>
<<default>>
<<set _positionIcon to "prone">>
<</switch>>
<<else>>
<<set _positionIcon to "prone">>
<</if>>
<</widget>>
<<widget "initClothingTactics">>
<<set _ictIdx to _args[0] || 0>>
<<if $combat.enemies[_ictIdx]>>
<<set _enemy to $combat.enemies[_ictIdx]>>
<<if _enemy.isCovering === undefined>>
<<set _enemy.isCovering to false>>
<<set $combat.enemies[_ictIdx].isCovering to false>>
<</if>>
<<if _enemy.coveringPart === undefined>>
<<set _enemy.coveringPart to null>>
<<set $combat.enemies[_ictIdx].coveringPart to null>>
<</if>>
<<if _enemy.coveringTurns === undefined>>
<<set _enemy.coveringTurns to 0>>
<<set $combat.enemies[_ictIdx].coveringTurns to 0>>
<</if>>
<<if _enemy.seenPlayerDick === undefined>>
<<set _enemy.seenPlayerDick to false>>
<<set $combat.enemies[_ictIdx].seenPlayerDick to false>>
<</if>>
<</if>>
<</widget>>
<<widget "initHumiliationState">>
<<set _ihsIdx to _args[0] || 0>>
<<if $combat.enemies[_ihsIdx]>>
<<set _enemy to $combat.enemies[_ihsIdx]>>
<<if _enemy.humiliation === undefined>>
<<set _enemy.humiliation to 0>>
<<set $combat.enemies[_ihsIdx].humiliation to 0>>
<</if>>
<<if _enemy.humiliationState === undefined>>
<<set _enemy.humiliationState to "normal">>
<<set $combat.enemies[_ihsIdx].humiliationState to "normal">>
<</if>>
<<if _enemy.humiliationDecay === undefined>>
<<set _enemy.humiliationDecay to 0>>
<<set $combat.enemies[_ihsIdx].humiliationDecay to 0>>
<</if>>
<</if>>
<</widget>>
<<widget "checkEnemyCoveringSilent">>
<<set _cecIdx to _args[0] || 0>>
<<set _enemy to $combat.enemies[_cecIdx]>>
<<set _isCovering to false>>
<<set _coveringPart to null>>
<<set _coverAccPenalty to 0>>
<<set _coverCanHeavy to true>>
<<set _coveringNarrative to "">>
<<set _coveringNarrativeType to "none">>
<<if _enemy && _enemy.gender === "female">>
<<initClothingTactics _cecIdx>>
<<initHumiliationState _cecIdx>>
<<set _titsOut to (_enemy.clothing && _enemy.clothing.titsExposed)>>
<<set _pussyOut to (_enemy.clothing && _enemy.clothing.pussyExposed)>>
<<set _humLevel to _enemy.humiliation || 0>>
<<set _isRestrained to (_enemy.position === "pinned" || _enemy.boundState === "tied")>>
<<if (_titsOut || _pussyOut) && !_isRestrained>>
<<if _humLevel >= 90>>
<<set _enemy.isCovering to false>>
<<set _enemy.coveringPart to null>>
<<set $combat.enemies[_cecIdx].isCovering to false>>
<<set $combat.enemies[_cecIdx].coveringPart to null>>
<<if _enemy.coveringTurns === 0>>
<<set _coveringNarrativeType to "broken">>
<<if setup.combatNarrative && setup.combatNarrative.cover_broken>>
<<set _coveringNarrative to setup.combatNarrative.cover_broken.random()>>
<<else>>
<<set _coveringNarrative to "She doesn't even try to cover herself anymore. What's the point?">>
<</if>>
<<set _enemy.coveringTurns to 1>>
<<set $combat.enemies[_cecIdx].coveringTurns to 1>>
<</if>>
<<else>>
<<set _coverChance to 30>>
<<if _humLevel >= 60>>
<<set _coverChance to 15>>
<<elseif _humLevel >= 30>>
<<set _coverChance to 25>>
<</if>>
<<if _enemy.isCovering>>
<<set _coverChance += 40>>
<</if>>
<<if random(1, 100) <= _coverChance>>
<<set _isCovering to true>>
<<set _enemy.isCovering to true>>
<<set $combat.enemies[_cecIdx].isCovering to true>>
<<if _titsOut && _pussyOut>>
<<set _coveringPart to "both">>
<<elseif _pussyOut>>
<<set _coveringPart to "pussy">>
<<else>>
<<set _coveringPart to "tits">>
<</if>>
<<set _enemy.coveringPart to _coveringPart>>
<<set $combat.enemies[_cecIdx].coveringPart to _coveringPart>>
<<set _coverAccPenalty to 15>>
<<set _coverCanHeavy to false>>
<<set _coveringNarrativeType to "covering">>
<<if _humLevel >= 60>>
<<if setup.combatNarrative && setup.combatNarrative.cover_high_humiliation>>
<<set _coveringNarrative to setup.combatNarrative.cover_high_humiliation.random()>>
<<else>>
<<set _coveringNarrative to "She starts to cover herself, then stops, unsure if it even matters anymore.">>
<</if>>
<<elseif _humLevel >= 30>>
<<if setup.combatNarrative && setup.combatNarrative.cover_medium_humiliation>>
<<set _coveringNarrative to setup.combatNarrative.cover_medium_humiliation.random()>>
<<else>>
<<set _coveringNarrative to "She hesitates, torn between covering herself and defending.">>
<</if>>
<<else>>
<<if setup.combatNarrative && setup.combatNarrative.cover_low_humiliation>>
<<set _coveringNarrative to setup.combatNarrative.cover_low_humiliation.random()>>
<<else>>
<<set _coveringNarrative to "She covers herself quickly, maintaining her combat stance as best she can.">>
<</if>>
<<if _coveringPart === "both">>
<<if setup.combatNarrative && setup.combatNarrative.enemy_cover_both>>
<<set _coveringNarrative to _coveringNarrative + " " + setup.combatNarrative.enemy_cover_both.random()>>
<</if>>
<<elseif _coveringPart === "pussy">>
<<if setup.combatNarrative && setup.combatNarrative.enemy_cover_pussy>>
<<set _coveringNarrative to _coveringNarrative + " " + setup.combatNarrative.enemy_cover_pussy.random()>>
<</if>>
<<else>>
<<if setup.combatNarrative && setup.combatNarrative.enemy_cover_tits>>
<<set _coveringNarrative to _coveringNarrative + " " + setup.combatNarrative.enemy_cover_tits.random()>>
<</if>>
<</if>>
<</if>>
<<set _enemy.coveringTurns += 1>>
<<set $combat.enemies[_cecIdx].coveringTurns to _enemy.coveringTurns>>
<<else>>
<<if _enemy.isCovering>>
<<set _coveringNarrativeType to "stopped">>
<<if setup.combatNarrative && setup.combatNarrative.stop_cover_attack>>
<<set _coveringNarrative to setup.combatNarrative.stop_cover_attack.random()>>
<<else>>
<<set _coveringNarrative to "She drops her covering arm to fight, exposing herself again.">>
<</if>>
<</if>>
<<set _enemy.isCovering to false>>
<<set _enemy.coveringPart to null>>
<<set $combat.enemies[_cecIdx].isCovering to false>>
<<set $combat.enemies[_cecIdx].coveringPart to null>>
<</if>>
<</if>>
<<else>>
<<set _enemy.isCovering to false>>
<<set $combat.enemies[_cecIdx].isCovering to false>>
<</if>>
<</if>>
<</widget>>
<<widget "forcedStopCovering">>
<<set _fscIdx to _args[0] || 0>>
<<set _enemy to $combat.enemies[_fscIdx]>>
<<if _enemy && _enemy.isCovering>>
<<set _enemy.isCovering to false>>
<<set _enemy.coveringPart to null>>
<<set $combat.enemies[_fscIdx].isCovering to false>>
<<set $combat.enemies[_fscIdx].coveringPart to null>>
<div class="forced-uncover">
<<combatNarrative "stop_cover_forced" "You force her arms away, exposing her completely.">>
</div>
<</if>>
<</widget>>
<<widget "displayCoveringStatus">>
<<set _dcsEnemy to _args[0]>>
<<if _dcsEnemy && _dcsEnemy.isCovering>>
<span class="status-badge status-covering"
@title="'Covering ' + _dcsEnemy.coveringPart + ' - Accuracy -' + (_dcsEnemy.coveringAccPenalty || 15) + ', no heavy attacks'">
<<icon "shield" "small">> COV
</span>
<</if>>
<</widget>>
<<widget "getCoveringModifiers">>
<<set _gcmIdx to _args[0] || 0>>
<<set _covAccPenalty to 0>>
<<set _covCanHeavy to true>>
<<set _covDmgPenalty to 0>>
<<if $combat.enemies[_gcmIdx]>>
<<initClothingTactics _gcmIdx>>
<<set _enemy to $combat.enemies[_gcmIdx]>>
<<if _enemy.isCovering>>
<<set _covAccPenalty to 15>>
<<set _covCanHeavy to false>>
<<if _enemy.coveringPart === "both">>
<<set _covAccPenalty to 25>>
<<set _covDmgPenalty to 10>>
<</if>>
<</if>>
<</if>>
<</widget>>
<<widget "getStrippingAdvice">>
<<set _gsaIdx to _args[0] || $combat.currentTarget || 0>>
<<set _enemy to $combat.enemies[_gsaIdx]>>
<<set _stripAdvice to "">>
<<set _recommendedTarget to "either">>
<<if _enemy && _enemy.gender === "female">>
<<set _humLevel to _enemy.humiliation || 0>>
<<set _lustLevel to _enemy.lust || 0>>
<<set _titsOut to (_enemy.clothing && _enemy.clothing.titsExposed)>>
<<set _pussyOut to (_enemy.clothing && _enemy.clothing.pussyExposed)>>
<<if _titsOut && _pussyOut>>
<<set _stripAdvice to "She's already fully exposed. No stripping needed.">>
<<set _recommendedTarget to "none">>
<<elseif _humLevel >= 60 && !_titsOut>>
<<set _recommendedTarget to "top">>
<<combatNarrative "strip_advice_humiliation" "Her humiliation is high — exposing her tits will break her completely.">>
<<set _stripAdvice to _cnText>>
<<elseif _lustLevel >= 60 && !_pussyOut>>
<<set _recommendedTarget to "bottom">>
<<combatNarrative "strip_advice_lust" "She's dripping wet — tear off her bottom for direct access.">>
<<set _stripAdvice to _cnText>>
<<elseif _titsOut && !_pussyOut>>
<<set _recommendedTarget to "bottom">>
<<set _stripAdvice to "Tits already out. Strip her bottom for full access.">>
<<elseif _pussyOut && !_titsOut>>
<<set _recommendedTarget to "top">>
<<set _stripAdvice to "Pussy already exposed. Bare her tits to complete the humiliation.">>
<<else>>
<<set _recommendedTarget to "either">>
<<combatNarrative "strip_advice_balanced" "Top first for humiliation, bottom for the kill. Your choice.">>
<<set _stripAdvice to _cnText>>
<</if>>
<</if>>
<</widget>>
<<widget "displayTacticalAdvice">>
<<set _dtaIdx to _args[0] || $combat.currentTarget || 0>>
<<set _enemy to $combat.enemies[_dtaIdx]>>
<<if _enemy && _enemy.gender === "female">>
<<getStrippingAdvice _dtaIdx>>
<<getPositionComboHint _dtaIdx>>
<<if (_stripAdvice && _recommendedTarget !== "none") || (_positionHint && _positionHint !== "")>>
<div class="tactical-advice-box">
<<if _stripAdvice && _recommendedTarget !== "none">>
<div class="stripping-advice">
<<icon "armor" "small">> <span class="advice-text"><<print _stripAdvice>></span>
<<if _recommendedTarget === "top">>
<span class="recommended">[RIP TOP]</span>
<<elseif _recommendedTarget === "bottom">>
<span class="recommended">[TEAR BOTTOM]</span>
<</if>>
</div>
<</if>>
<<if _positionHint && _positionHint !== "">>
<div class="position-combo-hint">
<<getPositionIcon _enemy>>
<<icon _positionIcon "small">> <span class="hint-text"><<print _positionHint>></span>
</div>
<</if>>
</div>
<</if>>
<</if>>
<</widget>>
<<widget "getPositionComboHint">>
<<set _pchIdx to _args[0] || $combat.currentTarget || 0>>
<<set _enemy to $combat.enemies[_pchIdx]>>
<<set _positionHint to "">>
<<if _enemy && _enemy.gender === "female">>
<<set _pos to _enemy.position || "standing">>
<<set _titsOut to (_enemy.clothing && _enemy.clothing.titsExposed)>>
<<set _pussyOut to (_enemy.clothing && _enemy.clothing.pussyExposed)>>
<<set _playerDickOut to ($clothing && $clothing.player && $clothing.player.dickExposed)>>
<<switch _pos>>
<<case "standing">>
<<set _positionHint to "Trip her to her knees to unlock throat options.">>
<<case "kneeling">>
<<set _pchUsed to setup.enemySheIsYours(_enemy)>>
<<set _pchLust to Math.floor(Number($player.lust) || 0)>>
<<set _pchBlock to setup.playerActionBlock(_pchUsed ? (_playerDickOut ? "Combat_Used_Throat" : "Combat_Used_Oral") : (_playerDickOut ? "Combat_Deep_Throat" : "Combat_Player_Expose"))>>
<<set _pchNeed to /^Not enough energy! \(Need (\d+)\)/.exec(_pchBlock || "")>>
<<set _pchPush to !setup.playerActionBlock("Combat_Worsen_Position") ? " Or push her face down." : "">>
<<if $combat && $combat.positions && ($combat.positions.player || "standing") !== "standing">>
<<set _positionHint to "Get back on your feet first.">>
<<elseif _pchNeed>>
<<set _positionHint to "Her mouth is at dick height, but you need " + _pchNeed[1] + " energy.">>
<<elseif _pchBlock>>
<<set _positionHint to "Her mouth is at dick height, but " + _pchBlock.charAt(0).toLowerCase() + _pchBlock.slice(1)>>
<<elseif _pchUsed && _playerDickOut>>
<<set _positionHint to "Her mouth is at dick height, and she's yours: fuck her throat.">>
<<elseif _pchUsed>>
<<set _positionHint to "Her mouth is at dick height, and she's yours: make her suck.">>
<<elseif _playerDickOut && _pchLust lt 40>>
<<set _positionHint to "Her mouth is at dick height. Her throat opens at lust 40 (yours is " + _pchLust + ")." + _pchPush>>
<<elseif _playerDickOut>>
<<set _positionHint to "Her mouth is at dick height: take her throat." + _pchPush>>
<<elseif _pchLust lt 40>>
<<set _positionHint to "Pull your dick out. Her throat then opens at lust 40 (yours is " + _pchLust + ")." + _pchPush>>
<<else>>
<<set _positionHint to "Pull your dick out for throat access." + _pchPush>>
<</if>>
<<case "prone_front">>
<<if _pussyOut>>
<<set _positionHint to "Pin her down to take her from behind. Or roll her over to see her face.">>
<<else>>
<<set _positionHint to "Strip her first. Then pin her to claim her ass.">>
<</if>>
<<case "prone_back">>
<<if _pussyOut>>
<<set _positionHint to "Pin her down to mount and claim her.">>
<<else>>
<<set _positionHint to "Tear her clothes off, then pin her to take her.">>
<</if>>
<<case "bent_over">>
<<if _pussyOut && _playerDickOut>>
<<set _positionHint to "She's presenting. Claim her or pin her down first.">>
<<elseif _pussyOut>>
<<set _positionHint to "Pull your dick out and take her from behind.">>
<<else>>
<<set _positionHint to "Rip her pants off. She's perfectly positioned.">>
<</if>>
<<case "pinned">>
<<if _pussyOut && _playerDickOut>>
<<set _positionHint to "She's completely helpless. Do whatever you want.">>
<<elseif _pussyOut>>
<<set _positionHint to "She can't escape. Pull out your dick and use her.">>
<<else>>
<<set _positionHint to "Strip her completely. She can't stop you now.">>
<</if>>
<</switch>>
<</if>>
<</widget>>
<<widget "canPlayerExpose">>
<<set _canExpose to false>>
<<if $clothing && $clothing.player>>
<<if !$clothing.player.dickOut && !$clothing.player.dickExposed>>
<<set _hasTarget to false>>
<<for _i, _e range $combat.enemies>>
<<if _e.gender === "female" && _e.health > 0>>
<<if _e.position === "kneeling" || (_e.lust && _e.lust >= 30) || (_e.humiliation && _e.humiliation >= 50)>>
<<set _hasTarget to true>>
<</if>>
<</if>>
<</for>>
<<if _hasTarget>>
<<set _canExpose to true>>
<</if>>
<</if>>
<</if>>
<</widget>>
<<widget "canPlayerFlaunt">>
<<set _canFlaunt to false>>
<<if $clothing && $clothing.player>>
<<if $clothing.player.dickOut || $clothing.player.dickExposed>>
<<for _i, _e range $combat.enemies>>
<<if _e.gender === "female" && !_e.flauntedThisTurn>>
<<set _canFlaunt to true>>
<</if>>
<</for>>
<</if>>
<</if>>
<</widget>>
<<widget "getFlauntModifiers">>
<<set _gfmIdx to _args[0] || 0>>
<<set _flauntAccPenalty to 0>>
<<if $combat.enemies[_gfmIdx]>>
<<set _enemy to $combat.enemies[_gfmIdx]>>
<<if _enemy.flauntDistracted>>
<<set _flauntAccPenalty to 10>>
<</if>>
<</if>>
<</widget>>
<<widget "resetFlauntDistracted">>
<<set _rfdIdx to _args[0] || 0>>
<<if $combat.enemies[_rfdIdx]>>
<<set $combat.enemies[_rfdIdx].flauntedThisTurn to false>>
<<set $combat.enemies[_rfdIdx].flauntDistracted to false>>
<</if>>
<</widget>><<widget "settleExposure">>
<<if _args[0] === "home">><<run setup.fishingGame.endKiraForfeit()>><</if>>
<<if $clothing>>
<<set _sxP to $clothing.player>>
<<if _sxP>>
<<if _sxP.chestExposed && setup.clothingValue(_sxP.top) gt 25>><<set _sxP.chestExposed to false>><</if>>
<<if _sxP.dickExposed && !setup.belowWaistBare(_sxP)>><<set _sxP.dickExposed to false>><</if>>
<<if _sxP.assExposed && setup.clothingValue(_sxP.bottom) gt 25>><<set _sxP.assExposed to false>><</if>>
<</if>>
<<set _sxK to $clothing.kira>>
<<if _sxK>>
<<if _sxK.titsExposed && setup.clothingValue(_sxK.top) gt 25>><<set _sxK.titsExposed to false>><</if>>
<<if _sxK.leftTitExposed && setup.clothingValue(_sxK.top) gt 50>><<set _sxK.leftTitExposed to false>><</if>>
<<if _sxK.rightTitExposed && setup.clothingValue(_sxK.top) gt 50>><<set _sxK.rightTitExposed to false>><</if>>
<<if _sxK.pussyExposed && !setup.belowWaistBare(_sxK)>><<set _sxK.pussyExposed to false>><</if>>
<<if _sxK.assExposed && setup.clothingValue(_sxK.bottom) gt 25>><<set _sxK.assExposed to false>><</if>>
<<run setup.fishingGame.applyKiraForfeit()>>
<</if>>
<</if>>
<</widget>>
<<widget "quickPatch">>
<<set _qpWho to _args[0]>>
<<if $clothing && $clothing[_qpWho]>>
<<if $clothing[_qpWho].top lt 50>><<clampStat `"clothing." + _qpWho + ".top"` 30 0 50>><</if>>
<<if $clothing[_qpWho].bottom lt 50>><<clampStat `"clothing." + _qpWho + ".bottom"` 30 0 50>><</if>>
<<updateExposure _qpWho true>>
<<if $journey && $journey.active && $journey.currentSegment>><<updateJourneyExposure>><</if>>
<</if>>
<</widget>>
<<widget "updateExposure">>
<<set _target to _args[0]>>
<<set _reset to _args[1] || false>>
<<if _target === "player">>
<<set _c to $clothing.player>>
<<if _reset>>
<<set _c.chestExposed to (_c.top lte 25)>>
<<set _c.dickExposed to setup.belowWaistBare(_c)>>
<<set _c.assExposed to (_c.bottom lte 25)>>
<<else>>
<<set _c.chestExposed to (_c.chestExposed || _c.top lte 25)>>
<<set _c.dickExposed to (_c.dickExposed || setup.belowWaistBare(_c))>>
<<set _c.assExposed to (_c.assExposed || _c.bottom lte 25)>>
<</if>>
<<elseif _target === "kira">>
<<set _c to $clothing.kira>>
<<if _reset>>
<<set _c.leftTitExposed to (_c.top lte 50 && random(0,1) === 1)>>
<<set _c.rightTitExposed to (_c.top lte 50 && random(0,1) === 1)>>
<<set _c.titsExposed to (_c.top lte 25)>>
<<set _c.pussyExposed to setup.belowWaistBare(_c)>>
<<set _c.assExposed to (_c.bottom lte 25)>>
<<else>>
<<set _c.leftTitExposed to (_c.leftTitExposed || (_c.top lte 50 && random(0,1) === 1))>>
<<set _c.rightTitExposed to (_c.rightTitExposed || (_c.top lte 50 && random(0,1) === 1))>>
<<set _c.titsExposed to (_c.titsExposed || _c.top lte 25)>>
<<set _c.pussyExposed to (_c.pussyExposed || setup.belowWaistBare(_c))>>
<<set _c.assExposed to (_c.assExposed || _c.bottom lte 25)>>
<</if>>
<<run setup.fishingGame.applyKiraForfeit()>>
<<else>>
<<set _e to $combat.enemies[_target]>>
<<if _e && _e.clothing>>
<<set _priorTits to _e.clothing.titsExposed>>
<<set _priorPussy to _e.clothing.pussyExposed>>
<<set _eBottomDown to (_e.clothing.bottom lte 25)>>
<<set _eUnderDown to (setup.clothingValue(_e.clothing.underwear, 0) lte 25)>>
<<if _e.gender === "male">>
<<set _priorDick to _e.clothing.dickExposed>>
<<set _e.clothing.titsExposed to false>>
<<set _e.clothing.pussyExposed to false>>
<<set _e.clothing.dickExposed to (_e.clothing.dickExposed === true || (_eBottomDown && _eUnderDown))>>
<<set _e.clothing.assExposed to ((!_reset && _e.clothing.assExposed === true) || _eBottomDown)>>
<<if _e.clothing.dickExposed && !_priorDick>>
<<run setup.applyExposedDebuffs(_e)>>
<<logCombat `_e.name + "'s pants are torn away. His cock is out: he fights worse (-15 accuracy) and is easier to hit (+10)."` "clothing">>
<</if>>
<<elseif _reset>>
<<set _e.clothing.titsExposed to (_e.clothing.top lte 25)>>
<<set _e.clothing.pussyExposed to (_eBottomDown && _eUnderDown)>>
<<set _e.clothing.assExposed to (_e.clothing.bottom lte 25)>>
<<else>>
<<set _e.clothing.titsExposed to (_e.clothing.titsExposed || _e.clothing.top lte 25)>>
<<set _e.clothing.pussyExposed to (_e.clothing.pussyExposed || (_eBottomDown && _eUnderDown))>>
<<set _e.clothing.assExposed to (_e.clothing.assExposed || _e.clothing.bottom lte 25)>>
<</if>>
<<if (_e.clothing.titsExposed && !_priorTits) || (_e.clothing.pussyExposed && !_priorPussy)>>
<<if _e.combatExpression !== "fearful" && _e.combatExpression !== "defiant">>
<<setEnemyExpression _e "vulnerable" 1>>
<</if>>
<</if>>
<</if>>
<</if>>
<</widget>>
<<widget "damageClothing">>
<<if $flags.seductionUnlocked>>
<<set _target to _args[0]>>
<<set _part to _args[1]>>
<<set _amount to _args[2]>>
<<if typeof _amount !== "number" || isNaN(_amount)>>
<<set _amount to 15>>
<</if>>
<<if _part === "random">>
<<set _roll to random(1, 100)>>
<<if _roll lte 40>>
<<set _part to "top">>
<<elseif _roll lte 75>>
<<set _part to "bottom">>
<<else>>
<<set _part to "underwear">>
<</if>>
<</if>>
<<if _target === "player">>
<<set _currentVal to ($clothing.player[_part] == null || isNaN($clothing.player[_part])) ? 100 : Number($clothing.player[_part])>>
<<set _newVal to Math.max(0, _currentVal - Number(_amount))>>
<<set $clothing.player[_part] to _newVal>>
<<updateExposure "player">>
<<checkFirstExposure "player">>
<<displayClothingDamage "player" _part _amount>>
<<if $combat && $combat.active>>
<<run VaultUI.updateCombatSidebar()>>
<</if>>
<<if _amount >= 20 && $companions && $companions[0] && (($combat && $combat.active) ? setup.kiraInFight() : ($combat.companionInCombat === "kira" || $companions[0].currentLocation === $player.currentLocation))>>
<<if random(1, 100) <= 40>>
<<kiraReactsToClothingDamage>>
<</if>>
<</if>>
<<if $clothing.player.dickExposed && random(1, 100) <= 30>>
<<playerExposedDickReaction>>
<</if>>
<<elseif _target === "kira">>
<<set _clothingBefore to {top: $clothing.kira.top, bottom: $clothing.kira.bottom, underwear: $clothing.kira.underwear}>>
<<set _wasExposedTits to $clothing.kira.titsExposed || $clothing.kira.top lte 25>>
<<set _wasExposedPussy to $clothing.kira.pussyExposed || $clothing.kira.bottom lte 25 || $clothing.kira.underwear lte 25>>
<<set _wasExposedAss to $clothing.kira.assExposed || $clothing.kira.bottom lte 25>>
<<set _currentVal to ($clothing.kira[_part] == null || isNaN($clothing.kira[_part])) ? 100 : Number($clothing.kira[_part])>>
<<set $clothing.kira[_part] to Math.max(0, _currentVal - Number(_amount))>>
<<updateExposure "kira">>
<<set _clothingWasDamaged to ($clothing.kira.top < _clothingBefore.top || $clothing.kira.bottom < _clothingBefore.bottom || $clothing.kira.underwear < _clothingBefore.underwear)>>
<<set _nowExposedTits to $clothing.kira.titsExposed || $clothing.kira.top lte 25>>
<<set _nowExposedPussy to $clothing.kira.pussyExposed || $clothing.kira.bottom lte 25 || $clothing.kira.underwear lte 25>>
<<set _nowExposedAss to $clothing.kira.assExposed || $clothing.kira.bottom lte 25>>
<<if $combat && $combat.active && $combat.enemies>>
<<set _lustCfg to setup.enemyLustTriggersConfig || {}>>
<<set _cdCfg to _lustCfg.clothingDamage || {min: 4, max: 8, tornBonusMin: 3, tornBonusMax: 6}>>
<<set _expCfg to _lustCfg.exposureBurst || {tits: {min: 12, max: 18}, pussy: {min: 15, max: 22}, ass: {min: 10, max: 15}}>>
<<if _clothingWasDamaged>>
<<set _cdLust to random(_cdCfg.min, _cdCfg.max)>>
<<if $clothing.kira.top lt 26 || $clothing.kira.bottom lt 26 || $clothing.kira.underwear lt 26>>
<<set _cdLust += random(_cdCfg.tornBonusMin, _cdCfg.tornBonusMax)>>
<</if>>
<<addMaleEnemyLust _cdLust "kira_clothing_damaged">>
<</if>>
<<if _nowExposedTits && !_wasExposedTits>>
<<addMaleEnemyLust `random(_expCfg.tits.min, _expCfg.tits.max)` "kira_tits_exposed">>
<</if>>
<<if _nowExposedPussy && !_wasExposedPussy>>
<<addMaleEnemyLust `random(_expCfg.pussy.min, _expCfg.pussy.max)` "kira_pussy_exposed">>
<</if>>
<<if _nowExposedAss && !_wasExposedAss>>
<<addMaleEnemyLust `random(_expCfg.ass.min, _expCfg.ass.max)` "kira_ass_exposed">>
<</if>>
<</if>>
<<checkFirstExposure "kira">>
<<displayClothingDamage "kira" _part _amount>>
<<if $combat && $combat.active>>
<<run VaultUI.updateCombatSidebar()>>
<</if>>
<<if !$combat || !$combat.active>>
<<if _amount >= 15>>
<<if random(1, 100) <= 50>>
<<kiraReactsToOwnClothing>>
<</if>>
<</if>>
<<if $clothing.kira.titsExposed && random(1, 100) <= 25>>
<<kiraCommentOnSpecificExposure "tits">>
<<elseif $clothing.kira.pussyExposed && random(1, 100) <= 25>>
<<kiraCommentOnSpecificExposure "pussy">>
<</if>>
<</if>>
<<else>>
<<if $combat.enemies[_target] && $combat.enemies[_target].clothing>>
<<set _currentVal to ($combat.enemies[_target].clothing[_part] == null || isNaN($combat.enemies[_target].clothing[_part])) ? 100 : Number($combat.enemies[_target].clothing[_part])>>
<<set $combat.enemies[_target].clothing[_part] to Math.max(0, _currentVal - Number(_amount))>>
<<updateExposure _target>>
<<displayClothingDamage _target _part _amount>>
<</if>>
<</if>>
<</if>>
<</widget>>
<<widget "displayClothingDamage">>
<<set _target to _args[0]>>
<<set _part to _args[1]>>
<<set _dmgAmount to _args[2] || 0>>
<<if _dmgAmount gt 0>>
<div class="clothing-damage-indicator">
<<icon "arrow-down" "small">> <span class="clothing-dmg-number">-<<print _dmgAmount>>%</span> <<print _part>>
</div>
<</if>>
<<if _target === "player">>
<<set _c to $clothing.player>>
<<if _part === "top">>
<<if _c.top lte 0>>
<<logCombat "Your shirt destroyed!" "clothing">>
<p class="clothing-damage">Your shirt is completely torn away. Your chest is fully exposed.</p>
<<elseif _c.top lte 25>>
<<logCombat "Your shirt ruined!" "clothing">>
<p class="clothing-damage">Your shirt hangs in tatters, barely covering anything.</p>
<<elseif _c.top lte 50>>
<<logCombat "Your shirt tears!" "clothing">>
<</if>>
<<elseif _part === "bottom">>
<<if _c.bottom lte 0 && _c.underwear lte 0>>
<<logCombat "Your pants gone! EXPOSED!" "clothing">>
<<if $player.lust gte 60>>
<p class="clothing-damage explicit">FUCK! Your pants are gone and your cock is rock hard and bouncing in the open. Everyone can see how turned on you are.</p>
<<if setup.kiraInFight()>>
<<say "Kira" "Holy— focus on the FIGHT!">>
<</if>>
<<else>>
<p class="clothing-damage explicit">Your pants are shredded. Your dick swings free, exposed to everyone.</p>
<</if>>
<<set _c.dickExposed to true>>
<<elseif _c.bottom lte 25>>
<<logCombat "Your pants barely intact!" "clothing">>
<p class="clothing-damage">Your pants are barely holding together. One more hit and you'll be showing everything.</p>
<<elseif _c.bottom lte 50>>
<<logCombat "Your pants tear badly!" "clothing">>
<p class="clothing-damage">Your pants tear badly, underwear visible through the gap.</p>
<</if>>
<<elseif _part === "underwear">>
<<if _c.underwear lte 0 && _c.bottom lte 50>>
<<logCombat "Underwear destroyed!" "clothing">>
<p class="clothing-damage explicit">Your underwear gives way completely. Your cock springs free<<if $player.lust gte 70>>, already hard and throbbing<</if>>.</p>
<<set _c.dickExposed to true>>
<<if $combat.companionInCombat === "kira">>
<<addTension "kira" 10 "" "combat">>
<</if>>
<<elseif _c.underwear lte 25>>
<<logCombat "Underwear torn!" "clothing">>
<p class="clothing-damage">Your underwear is torn, barely containing you.</p>
<</if>>
<</if>>
<<if _c.dickExposed && !$flags.kiraSeenPlayerDick && setup.kiraInFight()>>
<<set $flags.kiraSeenPlayerDick to true>>
<<addTension "kira" 15 "" "combat">>
<<if $companions && $companions[0] && $companions[0].tension gte 50>>
<<say "Kira" "I— keep your eyes on the enemy!">>
<p class="narrator">But her eyes flick down. Just for a second.</p>
<<else>>
<<say "Kira" "Cover yourself, dumbass!">>
<</if>>
<</if>>
<<elseif _target === "kira">>
<<set _c to $clothing.kira>>
<<if _part === "top">>
<<if _c.titsExposed>>
<<elseif _c.top lte 0>>
<<logCombat "Kira's top destroyed!" "clothing">>
<p class="clothing-damage explicit">Kira's top is completely destroyed. Both her tits bounce free, nipples hardening in the air.</p>
<<set _c.titsExposed to true>>
<<set _c.leftTitExposed to true>>
<<set _c.rightTitExposed to true>>
<<say "Kira" "Fuck! Stop staring and FIGHT!">>
<<clampStat "player.lust" 15>>
<<addTension "kira" 10 "" "combat">>
<<set $flags.playerSeenKiraTits to true>>
<<elseif _c.top lte 25 && !_c.leftTitExposed>>
<<logCombat "Kira's shirt torn!" "clothing">>
<p class="clothing-damage explicit">Kira's shirt is slashed open. Her left tit spills out, swinging naked as she moves.</p>
<<set _c.leftTitExposed to true>>
<<say "Kira" "Shit—!">>
<p class="narrator">She tries to cover herself with one arm while fighting.</p>
<<clampStat "player.lust" 10>>
<<set $flags.playerSeenKiraTits to true>>
<<elseif _c.top lte 50 && !_c.leftTitExposed && !_c.rightTitExposed>>
<<logCombat "Kira's top rips!" "clothing">>
<p class="clothing-damage">A slash tears through Kira's top. You catch a glimpse of the curve of her breast.</p>
<<clampStat "player.lust" 5>>
<</if>>
<<elseif _part === "bottom">>
<<if _c.pussyExposed>>
<<elseif _c.bottom lte 0 && _c.underwear lte 0>>
<<logCombat "Kira's pants gone! EXPOSED!" "clothing">>
<<set _descPool to $companions[0].lust gte 50 ? setup.combatNarrative.kira_pussy_exposed_from_underwear_high_lust : setup.combatNarrative.kira_pussy_exposed_from_underwear_description>>
<<set _dialogPool to setup.combatNarrative.kira_pussy_exposed_from_underwear_dialogue>>
<<set _narratorPool to setup.combatNarrative.kira_pussy_exposed_from_underwear_narrator>>
<p class="clothing-damage explicit"><<print _descPool.random()>></p>
<<set _c.pussyExposed to true>>
<<set _c.assExposed to true>>
<<say "Kira" _dialogPool.random()>>
<p class="narrator"><<print _narratorPool.random()>></p>
<<clampStat "player.lust" 20>>
<<addTension "kira" 15 "" "combat">>
<<set $flags.playerSeenKiraPussy to true>>
<<elseif _c.bottom lte 0 && _c.underwear gt 0 && !_c.underwearExposed>>
<<logCombat "Kira's pants destroyed! Underwear exposed!" "clothing">>
<<set _descPool to setup.combatNarrative.kira_underwear_exposed_description>>
<<set _dialogPool to setup.combatNarrative.kira_underwear_exposed_dialogue>>
<<set _narratorPool to $companions[0].lust gte 50 ? setup.combatNarrative.kira_underwear_exposed_high_lust : setup.combatNarrative.kira_underwear_exposed_narrator>>
<p class="clothing-damage explicit"><<print _descPool.random()>></p>
<<set _c.assExposed to true>>
<<set _c.underwearExposed to true>>
<<say "Kira" _dialogPool.random()>>
<p class="narrator"><<print _narratorPool.random()>></p>
<<clampStat "player.lust" 15>>
<<addTension "kira" 12 "" "combat">>
<<elseif _c.bottom lte 25 && !_c.assExposed>>
<<logCombat "Kira's pants in tatters!" "clothing">>
<p class="clothing-damage explicit">Kira's pants are in tatters. You can see her ass cheeks through the tears, her underwear barely covering anything.</p>
<<set _c.assExposed to true>>
<<clampStat "player.lust" 10>>
<<elseif _c.bottom lte 50 && !_c.assExposed>>
<<logCombat "Kira's pants tear!" "clothing">>
<p class="clothing-damage">Kira's pants tear, exposing her thigh and hip.</p>
<<clampStat "player.lust" 5>>
<</if>>
<<elseif _part === "underwear">>
<<if _c.pussyExposed>>
<<elseif _c.underwear lte 0>>
<<if _c.bottom lte 0>>
<<logCombat "Kira's underwear destroyed! PUSSY EXPOSED!" "clothing">>
<<set _descPool to $companions[0].lust gte 50 ? setup.combatNarrative.kira_pussy_exposed_from_underwear_high_lust : setup.combatNarrative.kira_pussy_exposed_from_underwear_description>>
<<set _dialogPool to setup.combatNarrative.kira_pussy_exposed_from_underwear_dialogue>>
<<set _narratorPool to setup.combatNarrative.kira_pussy_exposed_from_underwear_narrator>>
<p class="clothing-damage explicit"><<print _descPool.random()>></p>
<<set _c.pussyExposed to true>>
<<set _c.underwearExposed to false>>
<<clampStat "player.lust" 20>>
<<addTension "kira" 15 "" "combat">>
<<set $flags.playerSeenKiraPussy to true>>
<<say "Kira" _dialogPool.random()>>
<p class="narrator"><<print _narratorPool.random()>></p>
<<elseif _c.bottom lte 50>>
<<logCombat "Kira's underwear ripped!" "clothing">>
<p class="clothing-damage explicit">Kira's underwear is ripped away. Through the tears in her pants, you can see everything — her wet slit, her tight ass.</p>
<<set _c.pussyExposed to true>>
<<clampStat "player.lust" 15>>
<<say "Kira" "I'm going to kill every last one of them.">>
<p class="narrator">Her face is red — from anger or arousal, you can't tell.</p>
<</if>>
<</if>>
<</if>>
<<else>>
<<set _e to $combat.enemies[_target]>>
<<set _c to _e.clothing>>
<<if _e.gender === "female">>
<<if _part === "top">>
<<if _c.top lte 0>>
<p class="clothing-damage explicit">Her top falls away completely. Her tits bounce free — <<print _e.breastSize || "firm and round">>. She doesn't bother covering them.</p>
<<if _e && _dmgAmount !== undefined>>
<<set _enemyTopLog to _e.name + "'s top destroyed! -" + _dmgAmount + "% clothing">>
<<logCombat _enemyTopLog "clothing">>
<</if>>
<<say _e.name "Like what you see? Come closer and touch them.">>
<<clampStat "player.lust" 10>>
<<if _e.lustResistance>>
<<set _e.lustResistance -= 10>>
<</if>>
<<elseif _c.top lte 25>>
<p class="clothing-damage explicit">Her shirt tears open, one breast spilling out. The nipple is already hard.</p>
<<if _e && _dmgAmount !== undefined>>
<<set _enemyTopTearLog to _e.name + "'s top torn! -" + _dmgAmount + "% clothing">>
<<logCombat _enemyTopTearLog "clothing">>
<</if>>
<<clampStat "player.lust" 5>>
<</if>>
<<elseif _part === "bottom">>
<<if _c.bottom lte 0 && _c.underwear lte 0>>
<p class="clothing-damage explicit">Her pants are destroyed. Her pussy is completely exposed — and glistening. The bitch is wet from the fight.</p>
<<if _e && _dmgAmount !== undefined>>
<<set _enemyBottomLog to _e.name + "'s pants destroyed! EXPOSED! -" + _dmgAmount + "% clothing">>
<<logCombat _enemyBottomLog "clothing">>
<</if>>
<<say _e.name "Mmm, now you can really fuck me. If you can catch me.">>
<<clampStat "player.lust" 15>>
<<if _e.lustResistance>>
<<set _e.lustResistance -= 15>>
<</if>>
<<elseif _c.bottom lte 25>>
<p class="clothing-damage explicit">Her pants are torn to shreds. Her ass is on full display, and you can see the wet spot on her underwear.</p>
<<if _e && _dmgAmount !== undefined>>
<<set _enemyBottomTearLog to _e.name + "'s pants shredded! -" + _dmgAmount + "% clothing">>
<<logCombat _enemyBottomTearLog "clothing">>
<</if>>
<<clampStat "player.lust" 10>>
<</if>>
<</if>>
<</if>>
<</if>>
<</widget>>
<<widget "knockdown">>
<<set _target to _args[0]>>
<<set _position to _args[1] || "random">>
<<if $combat.positions>>
<<if _position === "random">>
<<set _roll to random(1, 4)>>
<<switch _roll>>
<<case 1>><<set _position to "kneeling">>
<<case 2>><<set _position to "prone_front">>
<<case 3>><<set _position to "prone_back">>
<<case 4>><<set _position to "bent_over">>
<</switch>>
<</if>>
<<if _target === "player">>
<<set $combat.positions.player to _position>>
<<displayPositionText "player" _position>>
<<elseif _target === "kira">>
<<set $combat.positions.kira to _position>>
<<displayPositionText "kira" _position>>
<<set _kdCfg to setup.enemyLustTriggersConfig?.knockdown || {min: 5, max: 8}>>
<<addMaleEnemyLust `random(_kdCfg.min, _kdCfg.max)` "knockdown">>
<<else>>
<<if !$combat.positions.enemies>>
<<set $combat.positions.enemies to []>>
<</if>>
<<set $combat.positions.enemies[_target] to _position>>
<<if $combat.enemies[_target]>>
<<set $combat.enemies[_target].position to _position>>
<<set $combat.enemies[_target].pinStruggles to 0>>
<<set $combat.enemies[_target].positionHeldTurns to 0>>
<</if>>
<</if>>
<</if>>
<</widget>>
<<widget "displayPositionText">>
<<set _target to _args[0]>>
<<set _pos to _args[1]>>
<<showKnockdownVideo _target _pos>>
<<if _target === "player">>
<<set _c to $clothing.player>>
<<switch _pos>>
<<case "kneeling">>
<p class="position-change">You're forced down to your knees.</p>
<<if _c.dickExposed && $player.lust gte 60>>
<p class="explicit">Your hard cock bobs at eye level with the enemy.</p>
<</if>>
<<if $combat.log>>
<<run $combat.log.push({type: "debuff", text: "You're forced to your knees!", icon: "kneeling"})>>
<</if>>
<<case "prone_front">>
<p class="position-change">You're knocked face-first to the ground, ass in the air.</p>
<<if _c.assExposed>>
<p class="explicit">Your bare ass is sticking up, completely vulnerable.</p>
<</if>>
<<if $combat.log>>
<<run $combat.log.push({type: "debuff", text: "You're knocked face-down!", icon: "prone"})>>
<</if>>
<<case "prone_back">>
<p class="position-change">You're knocked onto your back, spread out.</p>
<<if _c.dickExposed && $player.lust gte 70>>
<p class="explicit">Your erect cock points at the sky, throbbing.</p>
<p class="narrator-thought">Fuck, anyone could just climb on...</p>
<</if>>
<<if $combat.log>>
<<run $combat.log.push({type: "debuff", text: "You're knocked onto your back!", icon: "prone"})>>
<</if>>
<<case "bent_over">>
<p class="position-change">You're forced to bend over, bent at the waist.</p>
<<if _c.assExposed>>
<p class="explicit">Your bare ass is presented behind you like an offering.</p>
<</if>>
<<if $combat.log>>
<<run $combat.log.push({type: "debuff", text: "You're doubled over!", icon: "bent-over"})>>
<</if>>
<<case "pinned">>
<<set _byWhom to _args[2] || "the enemy">>
<p class="position-change explicit"><<print _byWhom>> pins you down. You struggle but can't break free.</p>
<<if $combat.log>>
<<run $combat.log.push({type: "debuff", text: "You're pinned down!", icon: "pinned"})>>
<</if>>
<</switch>>
<<if _pos !== "standing">>
<p class="combat-status">You need to get up! (Recover on next turn or use action)</p>
<</if>>
<<elseif _target === "kira">>
<<set _c to $clothing.kira>>
<<switch _pos>>
<<case "kneeling">>
<p class="position-change">Kira is forced down to her knees.</p>
<<say "Kira" "Fuck—!">>
<<logKiraPositionChange "kneeling">>
<<case "prone_front">>
<p class="position-change">Kira crashes down face-first, her ass raised in the air.</p>
<<if _c.assExposed || _c.pussyExposed>>
<p class="explicit">Her bare ass is up, her wet pussy visible between her thighs. She tries to push herself up but she's dazed.</p>
<<for _i, _e range $combat.enemies>>
<<if _e.gender === "male" && _e.health gt 0>>
<<set _e.targetingKira to true>>
<<set _e.sexIntent to "fuck_from_behind">>
<</if>>
<</for>>
<p class="narrator">The male enemies' eyes lock onto Kira's exposed ass...</p>
<</if>>
<<logKiraPositionChange "prone_front">>
<<case "prone_back">>
<p class="position-change">Kira is knocked onto her back, legs splayed.</p>
<<if _c.pussyExposed>>
<p class="explicit">She lands with her legs spread, her wet pussy on full display. She tries to close her legs but she's too dazed.</p>
<<for _i, _e range $combat.enemies>>
<<if _e.gender === "male" && _e.health gt 0>>
<<set _e.targetingKira to true>>
<<set _e.sexIntent to "mount">>
<</if>>
<</for>>
<<elseif _c.titsExposed>>
<p class="explicit">Her bare tits heave as she gasps for breath, nipples hard.</p>
<</if>>
<<logKiraPositionChange "prone_back">>
<<case "bent_over">>
<p class="position-change">Kira doubles over, bent at the waist.</p>
<<if _c.assExposed>>
<p class="explicit">Her ass is presented behind her, pussy peeking between her thighs.</p>
<<say "Kira" "Get... get away from me—">>
<</if>>
<<logKiraPositionChange "bent_over">>
<<case "pinned">>
<<set _byWhom to _args[2] || "An enemy">>
<p class="position-change explicit"><<print _byWhom>> pins Kira down. She struggles, but can't break free.</p>
<<say "Kira" `"Get OFF me! " + $player.name + ", help—!"`>>
<<if _c.titsExposed || _c.pussyExposed>>
<p class="narrator">The enemy's hands are already moving toward her exposed body...</p>
<</if>>
<<logKiraPositionChange "pinned">>
<</switch>>
<</if>>
<</widget>>
<<widget "attemptEscape">>
<<set _who to _args[0]>>
<<set _situation to _args[1]>>
<<if _who === "player">>
<<if $player.lust gte 90>>
<p class="explicit">Your mind is clouded with lust. You can't think of anything but pleasure.</p>
<<set _escaped to false>>
<<else>>
<<set _escapeChance to 50 + $player.agility - 20>>
<<set _roll to random(1, 100)>>
<<set _escaped to (_roll lte _escapeChance)>>
<</if>>
<<elseif _who === "kira">>
<<if $companions && $companions[0] && $companions[0].lust gte 90>>
<p class="explicit">Kira's eyes are glazed with pleasure. She's stopped trying to escape.</p>
<<set _escaped to false>>
<<else>>
<<set _escapeChance to 40>>
<<set _roll to random(1, 100)>>
<<set _escaped to (_roll lte _escapeChance)>>
<</if>>
<</if>>
<<set $tempEscaped to _escaped>>
<<if _escaped>>
<<if _who === "player">>
<p class="combat-success">You wrench yourself free!</p>
<<else>>
<p class="combat-success">Kira breaks free, scrambling away!</p>
<<say "Kira" "Don't fucking touch me!">>
<</if>>
<<else>>
<<if _who === "player">>
<p class="combat-fail">You try to pull away but <<if $player.lust gte 70>>the pleasure is too good<<else>>they're too strong<</if>>!</p>
<<else>>
<p class="combat-fail">Kira struggles but can't break free!</p>
<</if>>
<</if>>
<</widget>>
<<widget "enemySexDecision">>
<<set _sexDecisionDebug to {entered: true, seductionUnlocked: $flags.seductionUnlocked}>>
<<set _esdGo to true>>
<<if !$flags.seductionUnlocked>>
<<set _sexDecisionDebug.earlyReturn to "seductionUnlocked is false">>
<<set _esdGo to false>>
<</if>>
<<if _esdGo>>
<<set _enemy to _args[0]>>
<<set _index to _args[1]>>
<<set _sexDecisionDebug.enemyName to _enemy.name>>
<<set _sexDecisionDebug.enemyGender to _enemy.gender>>
<<set _sexDecisionDebug.enemyLust to _enemy.lust>>
<<set _sexDecisionDebug.enemyType to _enemy.type>>
<<if !$clothing || !$combat || !$combat.positions>>
<<set _sexDecisionDebug.earlyReturn to "missing clothing or positions">>
<<set _esdGo to false>>
<</if>>
<</if>>
<<if _esdGo && (_enemy.type === "beast" || _enemy.type === "construct")>>
<<set _sexDecisionDebug.earlyReturn to "beast or construct">>
<<set _esdGo to false>>
<</if>>
<<if _esdGo>>
<<if _enemy.gender === "male">>
<<if !setup.kiraInFight()>>
<<set _sexDecisionDebug.earlyReturn to "Kira is not in the fight">>
<<set _esdGo to false>>
<<elseif !$clothing.kira || !$combat.positions.kira>>
<<set _sexDecisionDebug.earlyReturn to "missing kira clothing or position">>
<<set _esdGo to false>>
<<else>>
<<set _target to "kira">>
<<set _c to $clothing.kira>>
<<set _pos to $combat.positions.kira>>
<<set _sexDecisionDebug.kiraPos to _pos>>
<<set _sexDecisionDebug.pussyExposed to _c.pussyExposed>>
<<set _sexDecisionDebug.titsExposed to _c.titsExposed>>
<<set _sexDecisionDebug.assExposed to _c.assExposed>>
<<set _sexDecisionDebug.clothingBottom to _c.bottom>>
<<set _sexDecisionDebug.clothingUnderwear to _c.underwear>>
<<set _canFuck to (_pos === "prone_back" || _pos === "prone_front" || _pos === "bent_over" || _pos === "pinned")>>
<<set _isStanding to (_pos === "standing" || !_pos)>>
<<set _isKneeling to (_pos === "kneeling")>>
<<set _hasBelt to (_enemy.weapon === "leather_belt")>>
<<set _hasChain to (_enemy.weapon === "chain")>>
<<set _hasCrop to (_enemy.weapon === "riding_crop")>>
<<set _hasRope to (_enemy.weapon === "rope")>>
<<set _bottomWeak to ($clothing.kira.bottom <= 30)>>
<<if !_enemy.clothing>>
<<set _enemy.clothing to { dickExposed: false }>>
<<set $combat.enemies[_index].clothing to { dickExposed: false }>>
<</if>>
<<set _isDickOut to (_enemy.clothing && _enemy.clothing.dickExposed === true)>>
<<set _wantsToPenetrate to (_c.pussyExposed || _c.assExposed) && _canFuck && _enemy.lust >= 50>>
<<set _wantsToExpose to !_isDickOut && _enemy.lust >= 60>>
<<set _urgencyMod to 0>>
<<if _enemy.lust >= 90>>
<<set _urgencyMod to 25>>
<<elseif _enemy.lust >= 70>>
<<set _urgencyMod to 15>>
<<elseif _enemy.lust >= 50>>
<<set _urgencyMod to 5>>
<</if>>
<<set _wristsBound to $combat.kiraWristsBound>>
<<set _anklesBound to $combat.kiraAnklesBound>>
<<set _isLeashed to $combat.kiraLeashed>>
<<set _justWhipped to $combat.lastAttackWasWhip>>
<<set _justGrabbed to $combat.lastAttackWasGrab>>
<<set _kiraStunned to ($combat.kiraEffects && $combat.kiraEffects.welts >= 3)>>
<<set _underwearExposed to (_c.underwearExposed || (_c.bottom lte 0 && _c.underwear gt 0))>>
<<set _topWeak to (_c.top lte 30 && !_c.titsExposed)>>
<<set _hasKnife to (_enemy.weapon === "combat knife" || _enemy.weapon === "rusty_shiv")>>
<<set _cfg to setup.enemySexConfig || {}>>
<<set _cfgStrip to _cfg.stripping || {}>>
<<set _cfgPos to _cfg.positioning || {}>>
<<set _cfgSex to _cfg.sexActs || {}>>
<<set _cfgWeap to _cfg.weapons || {}>>
<<set _cfgCombo to _cfg.combos || {}>>
<<set _stripUnderwear to _cfgStrip.underwear || {chance: 80, lustMin: 30}>>
<<set _stripTop to _cfgStrip.topFinish || {chance: 80, lustMin: 30}>>
<<set _stripPants to _cfgStrip.pantsYank || {chance: 80, lustMin: 30}>>
<<set _comboWhip to _cfgCombo.whipCombo || {chance: 80, lustMin: 30}>>
<<set _comboGrab to _cfgCombo.grabCombo || {chance: 80, lustMin: 0}>>
<<set _comboStun to _cfgCombo.stunCombo || {chance: 80, lustMin: 0}>>
<<set _comboBound to _cfgCombo.boundCombo || {chance: 80, lustMin: 30}>>
<<set _comboLeash to _cfgCombo.leashedCombo || {chance: 80, lustMin: 30}>>
<<set _comboAnkles to _cfgCombo.anklesBoundCombo || {chance: 80, lustMin: 0}>>
<<set _sexOral to _cfgSex.forcedOral || {chance: 80, lustMin: 30}>>
<<set _sexFuckPussy to _cfgSex.fuckPussy || {chance: 80, lustMin: 0}>>
<<set _sexFuckAss to _cfgSex.fuckAss || {chance: 80, lustMin: 0}>>
<<set _sexAssSlap to _cfgSex.assSlap || {chance: 80, lustMin: 0}>>
<<set _sexGropeChance to _cfgSex.gropeOpportunity || {chance: 50, lustMin: 0}>>
<<set _gropeParts to [_c.titsExposed ? "grope_tits" : null, _c.pussyExposed ? "grope_pussy" : null, _c.assExposed ? "grope_ass" : null, _c.assExposed ? "ass_slap" : null].filter(Boolean)>>
<<set _sexGropePussy to _cfgSex.gropePussy || {chance: 80, lustMin: 0}>>
<<set _sexGropeAss to _cfgSex.gropeAss || {chance: 80, lustMin: 0}>>
<<set _weapBelt to _cfgWeap.beltWhip || {chance: 80, lustMin: 0}>>
<<set _weapChain to _cfgWeap.chainChoke || {chance: 80, lustMin: 30}>>
<<set _weapCrop to _cfgWeap.ridingCrop || {chance: 80, lustMin: 0}>>
<<set _weapRope to _cfgWeap.ropeBind || {chance: 80, lustMin: 30}>>
<<set _posExposed to _cfgPos.exposed || {chance: 80, lustMin: 30}>>
<<set _posTits to _cfgPos.titsOnly || {chance: 80, lustMin: 70}>>
<<if setup.enemyBlockedFromKira(_enemy)>>
<<run setup.applyFrustration(_enemy)>>
<<getMaleAssaultNarrative "frustration_blocked" "He growls in frustration.">>
<<logCombat `_enemy.name + ": " + _maNarrative` "humiliation">>
<</if>>
<<enemyStripAttempt _enemy>>
<<set _esdBonus to setup.assaultBonus(_enemy)>>
<<if _esdBonus.strip > 0 && _stripResult && _stripResult.shouldStrip>>
<<set _stripResult.successChance to Math.min(95, _stripResult.successChance + _esdBonus.strip)>>
<</if>>
<<set _urgencyMod to _urgencyMod + _esdBonus.sex>>
<<checkCooperation>>
<<if _coopResult && _coopResult.canCoop>>
<<if _coopResult.coopType === "spit_roast" && _isDickOut && _c.pussyExposed>>
<<set _enemy.sexIntent to "spit_roast">>
<<set _enemy.coopData to _coopResult>>
<<elseif _coopResult.coopType === "hold_and_strip" && _coopResult.helperIdx !== _index>>
<<set _stripResult.successChance to (_stripResult.successChance || 50) + _coopResult.stripBonus>>
<<if _coopResult.guaranteed && _stripResult.shouldStrip>>
<<set _stripResult.successChance to 100>>
<</if>>
<<elseif _coopResult.coopType === "pin_down">>
<<set _enemy.coopData to _coopResult>>
<</if>>
<</if>>
<<set _coopHolds to !!(_coopResult && _coopResult.canCoop && _coopResult.coopType === "hold_and_strip" && _coopResult.helperIdx !== _index && _stripResult && _stripResult.shouldStrip)>>
<<if _wantsToExpose && random(1, 100) lte (60 + _urgencyMod)>>
<<set _enemy.sexIntent to "expose_self">>
<<elseif !_coopHolds && _isDickOut && _isKneeling && _enemy.lust >= _sexOral.lustMin && random(1, 100) lte _sexOral.chance>>
<<set _enemy.sexIntent to "forced_oral">>
<<elseif !_coopHolds && _isDickOut && _c.pussyExposed && _canFuck && _enemy.isHuman && random(1, 100) lte (_sexFuckPussy.chance + _urgencyMod)>>
<<set _enemy.sexIntent to "fuck_pussy">>
<<elseif !_coopHolds && _isDickOut && _c.assExposed && (_pos === "prone_front" || _pos === "bent_over") && random(1, 100) lte (_sexFuckAss.chance + _urgencyMod)>>
<<set _enemy.sexIntent to "fuck_ass">>
<<elseif !_coopHolds && _gropeParts.length && _enemy.lust >= _sexGropeChance.lustMin && random(1, 100) lte _sexGropeChance.chance>>
<<set _enemy.sexIntent to _gropeParts.random()>>
<<elseif _isDickOut && _canFuck && !_c.pussyExposed && _c.underwear <= 50 && _enemy.lust >= 90 && random(1, 100) lte (70 + _urgencyMod)>>
<<set _enemy.sexIntent to "shove_underwear_aside">>
<<elseif _underwearExposed && $clothing.kira.underwear > 0 && _enemy.lust >= _stripUnderwear.lustMin && random(1, 100) lte _stripUnderwear.chance>>
<<if _hasKnife>>
<<set _enemy.sexIntent to "slice_underwear">>
<<elseif _hasBelt && random(1, 2) === 1>>
<<set _enemy.sexIntent to "belt_yank_underwear">>
<<else>>
<<set _enemy.sexIntent to "rip_underwear">>
<</if>>
<<elseif _topWeak && $clothing.kira.top > 0 && _enemy.lust >= _stripTop.lustMin && random(1, 100) lte _stripTop.chance>>
<<if _hasKnife>>
<<set _enemy.sexIntent to "slice_top">>
<<else>>
<<set _enemy.sexIntent to "rip_top_off">>
<</if>>
<<elseif _stripResult && _stripResult.shouldStrip && random(1, 100) lte _stripResult.successChance>>
<<if _coopResult && _coopResult.canCoop && _coopResult.coopType === "hold_and_strip" && _coopResult.helperIdx !== _index>>
<<set _enemy.sexIntent to "hold_and_strip">>
<<set _enemy.coopData to _coopResult>>
<<else>>
<<set _enemy.sexIntent to _stripResult.action>>
<</if>>
<<elseif _justWhipped && _isStanding && _enemy.lust >= _comboWhip.lustMin && random(1, 100) lte _comboWhip.chance>>
<<set _posRoll to random(1, 100)>>
<<if _posRoll lte 40>>
<<set _enemy.sexIntent to "hair_grab_force">>
<<elseif _posRoll lte 70>>
<<set _enemy.sexIntent to "wrist_yank">>
<<else>>
<<set _enemy.sexIntent to "leg_sweep">>
<</if>>
<<set $combat.lastAttackWasWhip to false>>
<<elseif _justGrabbed && _c.pussyExposed && random(1, 100) lte _comboGrab.chance>>
<<if _isDickOut && _canFuck>>
<<set _enemy.sexIntent to "fuck_pussy">>
<<elseif _isDickOut && _isKneeling>>
<<set _enemy.sexIntent to "forced_oral">>
<<else>>
<<set _enemy.sexIntent to "grope_pussy">>
<</if>>
<<set $combat.lastAttackWasGrab to false>>
<<elseif _kiraStunned && _c.pussyExposed && random(1, 100) lte _comboStun.chance>>
<<if _isStanding>>
<<set _enemy.sexIntent to "hip_throw">>
<<elseif _isDickOut && _canFuck>>
<<set _enemy.sexIntent to "fuck_pussy">>
<<else>>
<<set _enemy.sexIntent to "grope_pussy">>
<</if>>
<<elseif _wristsBound && _c.pussyExposed && _enemy.lust >= _comboBound.lustMin && random(1, 100) lte _comboBound.chance>>
<<if _isDickOut && _canFuck>>
<<set _enemy.sexIntent to "fuck_pussy">>
<<elseif _isDickOut && _isKneeling>>
<<set _enemy.sexIntent to "forced_oral">>
<<else>>
<<set _enemy.sexIntent to "grope_pussy">>
<</if>>
<<elseif _isLeashed && _enemy.lust >= _comboLeash.lustMin && random(1, 100) lte _comboLeash.chance>>
<<if _isStanding>>
<<set _enemy.sexIntent to "leash_pull_kneel">>
<<elseif _isDickOut && _isKneeling>>
<<set _enemy.sexIntent to "forced_oral">>
<<else>>
<<set _enemy.sexIntent to "leash_choke">>
<</if>>
<<elseif _isDickOut && _anklesBound && _c.pussyExposed && _canFuck && random(1, 100) lte _comboAnkles.chance>>
<<set _enemy.sexIntent to "fuck_pussy">>
<<elseif _isStanding && !_c.pussyExposed && _bottomWeak && $clothing.kira.bottom > 0 && _enemy.lust >= _stripPants.lustMin && random(1, 100) lte _stripPants.chance>>
<<set _enemy.sexIntent to "pants_yank">>
<<elseif _hasBelt && (_c.titsExposed || _c.assExposed) && random(1, 100) lte _weapBelt.chance>>
<<set _enemy.sexIntent to "belt_whip">>
<<elseif _hasChain && _enemy.lust >= _weapChain.lustMin && random(1, 100) lte _weapChain.chance>>
<<if _isStanding && random(1, 2) === 1>>
<<set _enemy.sexIntent to "chain_choke">>
<<else>>
<<set _enemy.sexIntent to "chain_bind">>
<</if>>
<<elseif _hasCrop && (_c.titsExposed || _c.pussyExposed || _c.assExposed) && random(1, 100) lte _weapCrop.chance>>
<<if _c.pussyExposed && random(1, 100) lte 50>>
<<set _enemy.sexIntent to "crop_pussy">>
<<elseif _c.titsExposed && random(1, 100) lte 60>>
<<set _enemy.sexIntent to "crop_tits">>
<<else>>
<<set _enemy.sexIntent to "crop_ass">>
<</if>>
<<elseif _hasRope && _enemy.lust >= _weapRope.lustMin && random(1, 100) lte _weapRope.chance>>
<<if !$combat.kiraWristsBound && random(1, 2) === 1>>
<<set _enemy.sexIntent to "rope_bind_wrists">>
<<elseif !$combat.kiraAnklesBound>>
<<set _enemy.sexIntent to "rope_bind_ankles">>
<<else>>
<<set _enemy.sexIntent to "rope_leash">>
<</if>>
<<elseif (_c.pussyExposed || _c.assExposed) && _isStanding && _enemy.lust >= _posExposed.lustMin && random(1, 100) lte _posExposed.chance>>
<<set _posRoll to random(1, 100)>>
<<if _posRoll gt 80 && _coopResult && _coopResult.canCoop && _coopResult.coopType === "pin_down" && setup.groupTakedownIsPin()>>
<<set _enemy.sexIntent to "pin_down">>
<<set _enemy.coopData to _coopResult>>
<<elseif _posRoll lte 35>>
<<set _enemy.sexIntent to "hair_grab_force">>
<<elseif _posRoll lte 60>>
<<set _enemy.sexIntent to "leg_sweep">>
<<elseif _posRoll lte 80>>
<<set _enemy.sexIntent to "wrist_yank">>
<<else>>
<<set _enemy.sexIntent to "hip_throw">>
<</if>>
<<elseif _c.assExposed && random(1, 100) lte _sexAssSlap.chance>>
<<set _enemy.sexIntent to "ass_slap">>
<<elseif _c.pussyExposed && random(1, 100) lte _sexGropePussy.chance>>
<<set _enemy.sexIntent to "grope_pussy">>
<<elseif _c.assExposed && random(1, 100) lte _sexGropeAss.chance>>
<<set _enemy.sexIntent to "grope_ass">>
<<elseif _c.titsExposed>>
<<if _enemy.lust >= _posTits.lustMin && _isStanding && random(1, 100) lte _posTits.chance>>
<<set _posRoll to random(1, 3)>>
<<if _posRoll === 1>>
<<set _enemy.sexIntent to "hair_grab_force">>
<<elseif _posRoll === 2>>
<<set _enemy.sexIntent to "leg_sweep">>
<<else>>
<<set _enemy.sexIntent to "wrist_yank">>
<</if>>
<<else>>
<<set _enemy.sexIntent to "grope_tits">>
<</if>>
<<else>>
<<set _enemy.sexIntent to null>>
<</if>>
<</if>>
<<elseif _enemy.gender === "female">>
<<if !$clothing.player || !$combat.positions.player>>
<<set _sexDecisionDebug.earlyReturn to "missing player clothing or position">>
<<set _esdGo to false>>
<<else>>
<<set _target to "player">>
<<set _c to $clothing.player>>
<<set _pos to $combat.positions.player>>
<<set _canRide to (_pos === "prone_back" || _pos === "pinned")>>
<<set _isStanding to (_pos === "standing" || !_pos)>>
<<set _isKneeling to (_pos === "kneeling")>>
<<set _isProne to (_pos === "prone_back" || _pos === "prone_front")>>
<<set _bottomWeak to ($clothing.player.bottom <= 30)>>
<<set _hasKnife to (_enemy.weapon === "combat knife" || _enemy.weapon === "rusty_shiv")>>
<<set _hasWhip to (_enemy.weapon === "thorn_whip" || _enemy.weapon === "riding_crop")>>
<<set _hasClaws to (_enemy.weapon === "razor_claws" || _enemy.weapon === "seductive_claws")>>
<<set _isSupernatural to (_enemy.type === "supernatural")>>
<<set _wristsBound to $combat.playerWristsBound>>
<<set _anklesBound to $combat.playerAnklesBound>>
<<set _justWhipped to $combat.lastAttackWasWhip>>
<<set _justGrabbed to $combat.lastAttackWasGrab>>
<<set _playerStunned to ($combat.playerEffects && $combat.playerEffects.stunned)>>
<<set _lustChance to Math.floor(_enemy.lust / 2)>>
<<set _sexRoll to random(1, 100)>>
<<if _isSupernatural && _enemy.lust >= 30>>
<<if _c.dickExposed && _canRide && random(1, 100) lte 70>>
<<set _enemy.sexIntent to "ride">>
<<elseif _c.dickExposed && _isKneeling && random(1, 100) lte 60>>
<<set _enemy.sexIntent to "blowjob">>
<<elseif _c.dickExposed && random(1, 100) lte 50>>
<<set _enemy.sexIntent to "handjob">>
<<elseif _isStanding && random(1, 100) lte 40>>
<<set _enemy.sexIntent to "leg_sweep_female">>
<<else>>
<<set _enemy.sexIntent to "drain_touch">>
<</if>>
<<elseif _justWhipped && _isStanding && _enemy.lust >= 35 && random(1, 100) lte 75>>
<<set _posRoll to random(1, 100)>>
<<if _posRoll lte 50>>
<<set _enemy.sexIntent to "leg_sweep_female">>
<<else>>
<<set _enemy.sexIntent to "grab_and_straddle">>
<</if>>
<<set $combat.lastAttackWasWhip to false>>
<<elseif _justGrabbed && _c.dickExposed && random(1, 100) lte 80>>
<<if _canRide>>
<<set _enemy.sexIntent to "ride">>
<<elseif _isKneeling>>
<<set _enemy.sexIntent to "blowjob">>
<<else>>
<<set _enemy.sexIntent to "handjob">>
<</if>>
<<set $combat.lastAttackWasGrab to false>>
<<elseif _playerStunned && _c.dickExposed && random(1, 100) lte 70>>
<<if _isStanding>>
<<set _enemy.sexIntent to "push_down_mount">>
<<elseif _canRide>>
<<set _enemy.sexIntent to "ride">>
<<else>>
<<set _enemy.sexIntent to "handjob">>
<</if>>
<<elseif _wristsBound && _c.dickExposed && _enemy.lust >= 40 && random(1, 100) lte 70>>
<<if _canRide>>
<<set _enemy.sexIntent to "ride">>
<<elseif _isKneeling>>
<<set _enemy.sexIntent to "blowjob">>
<<else>>
<<set _enemy.sexIntent to "teasing_handjob">>
<</if>>
<<elseif _anklesBound && _c.dickExposed && _canRide && random(1, 100) lte 75>>
<<set _enemy.sexIntent to "ride">>
<<elseif _hasWhip && _c.dickExposed && random(1, 100) lte 50>>
<<set _enemy.sexIntent to "whip_cock">>
<<elseif _hasClaws && _enemy.lust >= 50 && random(1, 100) lte 45>>
<<if _isStanding>>
<<set _enemy.sexIntent to "pounce_player">>
<<elseif _c.dickExposed && _canRide>>
<<set _enemy.sexIntent to "ride">>
<<else>>
<<set _enemy.sexIntent to "claw_caress">>
<</if>>
<<elseif !_c.dickExposed && _bottomWeak && $clothing.player.bottom > 0 && _enemy.lust >= 40 && random(1, 100) lte 50>>
<<set _enemy.sexIntent to "pants_yank_player">>
<<elseif _c.dickExposed && _isStanding && _enemy.lust >= 50 && random(1, 100) lte 60>>
<<set _posRoll to random(1, 100)>>
<<if _posRoll lte 35>>
<<set _enemy.sexIntent to "leg_sweep_female">>
<<elseif _posRoll lte 60>>
<<set _enemy.sexIntent to "push_down_mount">>
<<elseif _posRoll lte 80>>
<<set _enemy.sexIntent to "grab_and_straddle">>
<<else>>
<<set _enemy.sexIntent to "knee_to_balls">>
<</if>>
<<elseif _c.dickExposed && _canRide && _enemy.lust >= 60 && _sexRoll lte _lustChance>>
<<set _enemy.sexIntent to "ride">>
<<elseif _c.dickExposed && _isKneeling && _enemy.lust >= 50 && _sexRoll lte _lustChance>>
<<set _enemy.sexIntent to "blowjob">>
<<elseif _c.dickExposed && _enemy.lust >= 40 && _sexRoll lte _lustChance>>
<<set _enemy.sexIntent to "handjob">>
<<elseif _c.dickExposed && _enemy.lust >= 25 && random(1, 100) lte 35>>
<<set _enemy.sexIntent to "cock_grab">>
<<else>>
<<set _enemy.sexIntent to null>>
<</if>>
<</if>>
<</if>>
<</if>>
<<if _esdGo>>
<<set _enemy.sexTarget to _target>>
<<set _sexDecisionDebug.finalIntent to _enemy.sexIntent>>
<<set _sexDecisionDebug.finalTarget to _enemy.sexTarget>>
<</if>>
<</widget>>SECTION 20: COMBAT WIDGETS
============================================================= */
<<widget "startCombat">>
<<set $combat.active to true>>
<<set $combat.rollSeed to setup.freshRollSeed()>>
<<set $combat.victoryCounted to false>>
<<set $combat.firstBattle to false>>
<<set $combat.kiraTargetBonus to 0>>
<<set $combat.noKiraWatch to false>>
<<set $combat.cardUIActive to true>>
<<set $combat.turn to 1>>
<<set $combat.phase to "player">>
<<set $combat.enemies to _args[0]>>
<<run ($combat.enemies || []).forEach(function (e) { if (e) { e.maxLust = setup.enemyMaxLust(e); } })>>
<<set $combat.companionInCombat to _args[1] || null>>
<<if $combat.companionInCombat === "kira" && setup.kiraAway()>><<set $combat.companionInCombat to null>><</if>>
<<set $combat.canFlee to _args[2] !== false>>
<<set $combat.returnPassage to "">>
<<run setup.clearCombatScenes()>>
<<run setup.resetFightEnding()>>
<<set $combat.canSeduce to $flags.seductionUnlocked || false>>
<<set $combat.log to []>>
<<set $combat.allEnemies to clone(_args[0])>>
<<set $combat.defeatedEnemies to []>>
<<set $combat.fledEnemies to []>>
<<set $combat.lastAttackWasWhip to false>>
<<set $combat.lastAttackWasGrab to false>>
<<set $combat.combo to {
count: 0,
lastAction: "",
target: -1,
bonus: 0
}>>
<<set $combat.kiraEffects to {}>>
<<set $combat.positions to {player: "standing", kira: "standing"}>>
<<set $combat.kiraWristsBound to false>>
<<set $combat.kiraAnklesBound to false>>
<<set $combat.kiraLeashed to false>>
<<set $combat.playerDazed to false>>
<<set $combat.playerDazedTurns to 0>>
<<set $combat.playerDazedCause to "">>
<<set $combat.defending to false>>
<<set $combat.blocking to false>>
<<set $combat.parrying to false>>
<<set $combat.parrySuccess to false>>
<<set $combat.riposteActive to false>>
<<set $combat.playerVulnerable to false>>
<<set $combat.resting to false>>
<<set $combat.dodging to false>>
<<set $combat.kiraInRefractory to false>>
<<set $combat.kiraRefractoryTurns to 0>>
<<set $combat.pendingKiraOrgasm to null>>
<<set $combat.seducedIndex to null>>
<<run setup.guardKira()>>
<<if $combat.companionInCombat === "kira" && $companions && $companions[0]>>
<<if $companions[0].health <= 1>>
<<set $combat.kiraIncapacitated to true>>
<<else>>
<<set $combat.kiraIncapacitated to false>>
<</if>>
<<else>>
<<set $combat.kiraIncapacitated to false>>
<</if>>
<<if isNaN($player.health) || typeof $player.health !== "number">><<set $player.health to $player.maxHealth || 100>><</if>>
<<if isNaN($player.energy) || typeof $player.energy !== "number">><<set $player.energy to $player.maxEnergy || 50>><</if>>
<<if isNaN($player.lust) || typeof $player.lust !== "number">><<set $player.lust to 0>><</if>>
<<set $player.health to Math.max(0, Math.min($player.maxHealth || 100, $player.health))>>
<<set $player.energy to Math.max(0, Math.min($player.maxEnergy || 50, $player.energy))>>
<<set $player.lust to Math.min(100, Math.max(0, $player.lust))>>
<<if $companions && $companions[0]>>
<<if isNaN($companions[0].health) || typeof $companions[0].health !== "number">><<set $companions[0].health to $companions[0].maxHealth || 100>><</if>>
<<if isNaN($companions[0].tension) || typeof $companions[0].tension !== "number">><<set $companions[0].tension to 0>><</if>>
<<if isNaN($companions[0].lust) || typeof $companions[0].lust !== "number">><<set $companions[0].lust to 0>><</if>>
<<set $companions[0].health to Math.max(0, Math.min($companions[0].maxHealth || 100, $companions[0].health))>>
<<set $companions[0].tension to Math.min(100, Math.max(0, $companions[0].tension))>>
<<set $companions[0].lust to Math.min(100, Math.max(0, $companions[0].lust))>>
<</if>>
<<run document.body.classList.add("scene-mode-combat")>>
<</widget>>
<<widget "countCombatVictory">>
<<if $combat && !$combat.victoryCounted>>
<<set $combat.victoryCounted to true>>
<<if !$stats.combat>><<set $stats.combat to {}>><</if>>
<<set $stats.combat.combat_victories to (Number($stats.combat.combat_victories) || 0) + 1>>
<</if>>
<</widget>>
<<widget "endCombat">>
<<set _combatMinutes to Math.max(15, ($combat.turn || 1) * 10)>>
<<advanceTime 0 _combatMinutes>>
<<set $combat.active to false>>
<<set $combat.firstBattle to false>>
<<set $combat.kiraTargetBonus to 0>>
<<set $combat.noKiraWatch to false>>
<<set $flags._combatTensionToday to ($flags._combatTensionToday || 0) + 1>>
<<if $clothing && $clothing.player>>
<<set $clothing.player.dickOut to false>>
<<updateExposure "player" true>>
<</if>>
<<run document.body.classList.remove("scene-mode-combat")>>
<<run $("#right-sidebar").removeClass('open')>>
<</widget>>
<<widget "logCombat">>
<<set _validTypes to ["damage", "critical", "sexual", "clothing", "tactical",
"humiliation", "mixed", "domination", "strip", "flavor",
"discovery", "intimate", "status"]>>
<<set _logType to (_args[1] || "damage")>>
<<if !_validTypes.includes(_logType)>>
<<set _logType to "damage">>
<</if>>
<<if !$combat.log>><<set $combat.log to []>><</if>>
<<if _args[0] !== undefined && _args[0] !== null && _args[0] !== "">>
<<run $combat.log.push({text: _args[0], type: _logType})>>
<</if>>
<</widget>>
<<widget "combatAction">>
<<set _caText to _args[0]>>
<<set _caPassage to _args[1]>>
<<set _caType to _args[2] || "action">>
<<set _caIcon to _args[3] || "">>
<<set _caEnabled to _args[4] !== false>>
<<set _caBlocked to setup.playerActionBlock(_caPassage)>>
<<capture _caPassage, _caText, _caType, _caIcon>>
<<if _caBlocked>>
<<elseif _caEnabled>>
<span @class="'combat-btn-wrapper ' + (_caType)"><a data-passage="_caPassage" class="link-internal macro-link"><<if _caIcon>><<icon _caIcon "small">> <</if>><<print _caText>></a></span>
<<else>>
<span class="combat-btn disabled"><<if _caIcon>><<icon _caIcon "small">> <</if>><<print _caText>></span>
<</if>>
<</capture>>
<</widget>>
<<widget "defenseActionButton">>
<<if !setup.defensiveActionConfigs>><<initDefensiveActionConfigs>><</if>>
<<defenseRefusal setup.defensiveActionConfigs[_args[3]]>>
<<if _defenseRefusalMsg === "">>
<<combatAction _args[0] _args[1] "action" _args[2] true>>
<<else>>
<<set _dabText to _args[0]>><<set _dabIcon to _args[2]>><<set _dabMsg to _defenseRefusalMsg>><<set _dabPassage to _args[1]>>
<span class="combat-btn-wrapper action refused"><a class="link-internal macro-link combat-refused-btn" @data-refusal="_dabMsg" @data-refused-passage="_dabPassage" @title="_dabMsg"><<icon _dabIcon "small">> <<print _dabText>></a></span>
<</if>>
<</widget>>
<<widget "createEnemy">>
<<set _template to _args[0]>>
<<set _tierArg to _args[1] || null>>
<<if setup.raiderTypeMap && setup.raiderTypeMap[_template]>>
<<createRaider _template _tierArg>>
<<set _returnEnemy to _return>>
<<elseif setup.raiderTemplates && setup.raiderTemplates[_template]>>
<<createRaider _template _tierArg>>
<<set _returnEnemy to _return>>
<<else>>
<<switch _template>>
<<case "boss_raider_warlord">>
<<set _returnEnemy to {
id: "boss_raider_warlord",
name: "Warlord Kresh",
properName: true,
type: "boss",
tier: "boss",
gender: "male",
phases: [
{
healthThreshold: 100,
abilities: ["heavy_strike", "intimidate", "rally_troops"],
behavior: "aggressive",
description: "Kresh fights with brutal efficiency."
},
{
healthThreshold: 60,
abilities: ["heavy_strike", "dirty_fighting"],
behavior: "tactical",
transition: "Kresh snarls and whistles sharply. 'Get in here, you dogs!'",
summons: ["raider_grunt", "raider_grunt"]
},
{
healthThreshold: 30,
abilities: ["reckless_attack"],
behavior: "berserk",
transition: "Blood streaming down his face, Kresh's eyes go wild. 'I'LL KILL YOU ALL!'",
effect: "damage +50%, defense -30%"
}
],
currentPhase: 0,
health: 180,
maxHealth: 180,
damage: 20,
dodge: 20,
armor: 4,
aggression: 80,
lust: 0,
maxLust: 100,
lustResistance: 70,
seduceThreshold: 90,
abilities: ["heavy_strike", "intimidate", "rally_troops"],
statusImmunities: ["fear", "charm"],
enrageTimer: 15,
guaranteedLoot: ["warlord_weapon", "raider_banner"],
loot: ["military armor", "weapon part", "stimpak"],
lootChance: 1.0,
xp: 150,
taunt: "A massive man steps forward, his armor pieced together from a dozen kills.",
defeat: "Kresh falls to his knees, blood bubbling from his lips. 'Stronger... than I thought...'"
}>>
<<case "boss_succubus_queen">>
<<set _returnEnemy to {
id: "boss_succubus_queen",
name: "Velith the Insatiable",
properName: true,
type: "boss",
subtype: "supernatural",
tier: "boss",
gender: "female",
weapon: "desire_tendrils",
phases: [
{
healthThreshold: 100,
abilities: ["seductive_strike", "charm_gaze"],
behavior: "seductive",
description: "Velith toys with you, more amused than threatened."
},
{
healthThreshold: 65,
abilities: ["drain_essence", "nightmare_vision"],
behavior: "aggressive_seduction",
transition: "Her playful smile sharpens. 'Oh, you DO have some fight in you. Delicious.'",
effect: "lustDamage +50%"
},
{
healthThreshold: 35,
abilities: ["drain_essence", "charm_gaze", "seductive_strike"],
behavior: "desperate",
transition: "For the first time, something like respect crosses her features. 'Very well. No more games.'",
effect: "all_abilities_enhanced"
}
],
currentPhase: 0,
health: 250,
maxHealth: 250,
damage: 18,
dodge: 40,
armor: 0,
aggression: 50,
lust: 0,
maxLust: 200,
lustResistance: 0,
seduceThreshold: 999,
dealsLustDamage: true,
lustDamage: 25,
abilities: ["seductive_strike", "charm_gaze", "drain_essence"],
statusImmunities: ["charm", "seduce", "fear", "poison", "bleed"],
vulnerabilities: ["holy"],
lustVictoryThreshold: 100,
lustVictoryScene: "Combat_Defeat",
guaranteedLoot: ["succubus_essence", "void_heart"],
loot: ["magic crystal", "magic crystal"],
lootChance: 1.0,
xp: 300,
taunt: "She materializes from shadow and desire, more beautiful than anything mortal.",
defeat: "She laughs even as she fades. 'Impressive, little mortal. We will meet again... in your dreams.'",
lustDefeat: "Your resistance crumbles. She pulls you close. 'Now you're MINE.'"
}>>
<<default>>
<<set _returnEnemy to {
id: _template,
name: "Unknown Enemy",
type: "hostile",
tier: "standard",
gender: "none",
health: 30,
maxHealth: 30,
damage: 5,
dodge: 10,
armor: 0,
aggression: 70,
lust: 0,
maxLust: 100,
lustResistance: 30,
seduceThreshold: 999,
abilities: [],
statusImmunities: [],
loot: [],
lootChance: 0.3,
xp: 10
}>>
<</switch>>
<</if>>
<<if _returnEnemy>>
<<run setup.scaleEnemyAtSpawn(_returnEnemy)>>
<<set _returnEnemy.maxLust to setup.enemyMaxLust(_returnEnemy)>>
<<if _returnEnemy.humiliation === undefined>>
<<set _returnEnemy.humiliation to 0>>
<</if>>
<<if _returnEnemy.humiliationState === undefined>>
<<set _returnEnemy.humiliationState to "normal">>
<</if>>
<<if _returnEnemy.arousalState === undefined>>
<<set _returnEnemy.arousalState to "normal">>
<</if>>
<<if _returnEnemy.denialTurns === undefined>>
<<set _returnEnemy.denialTurns to 0>>
<</if>>
<<if _returnEnemy.orgasmCount === undefined>>
<<set _returnEnemy.orgasmCount to 0>>
<</if>>
<<if _returnEnemy.position === undefined>>
<<set _returnEnemy.position to "standing">>
<<set _returnEnemy.pinStruggles to 0>>
<</if>>
<<if _returnEnemy.positionHeldTurns === undefined>>
<<set _returnEnemy.positionHeldTurns to 0>>
<</if>>
<<if _returnEnemy.isHuman && !_returnEnemy.clothing>>
<<if _returnEnemy.gender === "male">>
<<set _returnEnemy.clothing to {
top: 100,
bottom: 100,
underwear: 100,
dickExposed: false,
assExposed: false
}>>
<<else>>
<<set _returnEnemy.clothing to {
top: 100,
bottom: 100,
underwear: 100,
titsExposed: false,
pussyExposed: false,
assExposed: false
}>>
<</if>>
<</if>>
<</if>>
<<set _return to _returnEnemy>>
<</widget>>
<<widget "createRaiderGroup">>
<<set _minCount to _args[0] || 2>>
<<set _maxCount to _args[1] || 5>>
<<set _tierOverride to _args[2] || null>>
<<set _eliteBonus to _args[3] || 0>>
<<set _areaId to _args[4] || null>>
<<set _count to _minCount + Math.floor(Math.random() * (_maxCount - _minCount + 1))>>
<<set State.temporary.usedNamesThisEncounter to new Set()>>
<<resolveEncounterPool _areaId>>
<<set _crgPool to _return>>
<<filterPoolByGender _crgPool "male">><<set _crgMalePool to _return>>
<<filterPoolByGender _crgPool "female">><<set _crgFemalePool to _return>>
<<if _crgMalePool.length === 0 && _crgFemalePool.length === 0>>
<<if !_crgPool._warnedEmpty>>
<<run console.warn('[encounter-pools] WARN: resolved pool has no usable templates, falling back to default')>>
<<set _crgPool._warnedEmpty to true>>
<</if>>
<<set _crgPool to setup.encounterPoolFallback>>
<<filterPoolByGender _crgPool "male">><<set _crgMalePool to _return>>
<<filterPoolByGender _crgPool "female">><<set _crgFemalePool to _return>>
<</if>>
<<set _crgMaleW to (typeof _crgPool.maleWeight === "number") ? _crgPool.maleWeight : 0.5>>
<<set _crgFemaleW to (typeof _crgPool.femaleWeight === "number") ? _crgPool.femaleWeight : 0.5>>
<<set _crgEliteBonus to _eliteBonus + ((typeof _crgPool.eliteBonusChance === "number") ? _crgPool.eliteBonusChance : 0)>>
<<set _raiderGroup to []>>
<<for _ri to 0; _ri lt _count; _ri++>>
<<set _crgGRoll to Math.random() * (_crgMaleW + _crgFemaleW)>>
<<set _crgWantMale to _crgGRoll < _crgMaleW>>
<<if _crgWantMale && _crgMalePool.length === 0>>
<<set _crgWantMale to false>>
<<elseif !_crgWantMale && _crgFemalePool.length === 0>>
<<set _crgWantMale to true>>
<</if>>
<<set _crgCandidates to _crgWantMale ? _crgMalePool : _crgFemalePool>>
<<if _crgCandidates.length gt 0>>
<<if _crgPool.visualGroupWeights && Object.keys(_crgPool.visualGroupWeights).length gt 0>>
<<set _crgPick to null>>
<<set _crgFinal to null>>
<<for _crgAttempt to 0; _crgAttempt lt 5; _crgAttempt++>>
<<set _crgPick to _crgCandidates[Math.floor(Math.random() * _crgCandidates.length)]>>
<<set _crgVgTarget to setup.weightedRandom(_crgPool.visualGroupWeights)>>
<<set _crgVgActual to setup.raiderTemplates[_crgPick].visualGroup>>
<<if _crgVgActual === _crgVgTarget>>
<<set _crgFinal to _crgPick>>
<<break>>
<</if>>
<</for>>
<<if _crgFinal === null>>
<<if !_crgPool._warnedRejection>>
<<run console.warn('[encounter-pools] WARN: visualGroupWeights retry cap exhausted, accepting random template')>>
<<set _crgPool._warnedRejection to true>>
<</if>>
<<set _crgFinal to (_crgPick !== null ? _crgPick : _crgCandidates[Math.floor(Math.random() * _crgCandidates.length)])>>
<</if>>
<<set _template to _crgFinal>>
<<else>>
<<set _template to _crgCandidates[Math.floor(Math.random() * _crgCandidates.length)]>>
<</if>>
<<if _tierOverride>>
<<set _tier to _tierOverride>>
<<else>>
<<getTierForDay $time.day _crgEliteBonus>>
<<set _tier to _return>>
<</if>>
<<set _crgTemplateName to _template>>
<<createEnemy _template _tier>>
<<if !setup.raiderTemplates[_crgTemplateName] || setup.raiderTemplates[_crgTemplateName].nameStyle !== "generated">>
<<set _dupeCount to 0>>
<<for _existing range _raiderGroup>>
<<if _existing.id === _returnEnemy.id && _existing.tier === _returnEnemy.tier>>
<<set _dupeCount++>>
<</if>>
<</for>>
<<if _dupeCount gt 0>>
<<set _returnEnemy.name to _returnEnemy.name + " " + String.fromCharCode(65 + _dupeCount)>>
<</if>>
<</if>>
<<run _raiderGroup.push(clone(_returnEnemy))>>
<<else>>
<<run console.warn('[encounter-pools] WARN: no candidates after fallback chain; skipping spawn ' + _ri)>>
<</if>>
<</for>>
<<if _raiderGroup.length === 0>>
<<run console.error('[encounter-pools] CRITICAL: createRaiderGroup produced an empty group; emergency-spawning a single grunt')>>
<<set _crgFallbackKey to (setup.encounterPoolFallback && setup.encounterPoolFallback.templates && setup.encounterPoolFallback.templates[0]) || "grunt">>
<<getTierForDay $time.day 0>>
<<set _tier to _return>>
<<createEnemy _crgFallbackKey _tier>>
<<run _raiderGroup.push(clone(_returnEnemy))>>
<</if>>
<<set _returnRaiderGroup to _raiderGroup>>
<</widget>>
<<widget "applyStatus">>
<<run setup.applyStatus(_args[0], _args[1])>>
<</widget>>
<<widget "processStatusEffects">>
<<set _statusTarget to _args[0]>>
<<if _statusTarget.statusEffects && _statusTarget.statusEffects.length gt 0>>
<<for _i, _status range _statusTarget.statusEffects>>
<<set _effect to $statusEffects[_status.id]>>
<<if _effect.tickDamage>>
<<set _tickDmg to _effect.tickDamage * (_status.stacks || 1)>>
<<set _statusTarget.health to Math.max(0, (_statusTarget.health || 0) - _tickDmg)>>
<<if _statusTarget === $player>>
<<if _effect.tickMessage>>
<div class="status-tick"><<print _effect.icon>> <<print _effect.tickMessage>> (-<<print _tickDmg>> HP)</div>
<</if>>
<<else>>
<div class="status-tick enemy-status-tick"><<print _statusTarget.name>>: <<print _effect.name>> (-<<print _tickDmg>> HP)</div>
<</if>>
<</if>>
<<if _effect.tickLust>>
<<set _tickLustVal to _effect.tickLust || 0>>
<<if _statusTarget === $player>>
<<clampStat "player.lust" _tickLustVal>>
<<elseif typeof _statusTarget.lust === "number">>
<<set _statusTarget.lust to setup.enemyLustPlus(_statusTarget, _tickLustVal)>>
<</if>>
<</if>>
<<if _effect.tickCorruption>>
<<addCorruption _effect.tickCorruption>>
<</if>>
<<if _status.duration gt 0>>
<<set _status.duration -= 1>>
<</if>>
<</for>>
<<set _statusTarget.statusEffects to _statusTarget.statusEffects.filter(s => s.duration !== 0)>>
<</if>>
<</widget>>
<<widget "hasStatus">>
<<set _statusTarget to _args[0]>>
<<set _effectId to _args[1]>>
<<if _statusTarget.statusEffects>>
<<set _hasStatusResult to _statusTarget.statusEffects.some(s => s.id === _effectId)>>
<<else>>
<<set _hasStatusResult to false>>
<</if>>
<</widget>>
<<widget "displayStatusEffects">>
<<set _statusTarget to _args[0]>>
<<set _hasEffects to false>>
<<if _statusTarget.statusEffects && _statusTarget.statusEffects.length gt 0>>
<<set _hasEffects to true>>
<</if>>
<<if _statusTarget.buffs>>
<<for _buffKey, _buffVal range _statusTarget.buffs>>
<<if _buffVal gt 0 && ["enraged", "rallied"].includes(_buffKey)>><<set _hasEffects to true>><</if>>
<</for>>
<</if>>
<<if _statusTarget.abilityState && _statusTarget.abilityState.rallyActive>>
<<set _hasEffects to true>>
<</if>>
<<if _statusTarget.stunned>>
<<set _hasEffects to true>>
<</if>>
<<if _statusTarget.fearPenalty>>
<<set _hasEffects to true>>
<</if>>
<<if _hasEffects>>
<div class="status-effects-display">
<<if _statusTarget.statusEffects && _statusTarget.statusEffects.length gt 0>>
<<for _status range _statusTarget.statusEffects>>
<<set _statusLabel to _status.name || _status.id>>
<<set _statusDuration to _status.duration || 0>>
<<set _statusDmg to _status.damage || 5>>
<<set _statusStacks to _status.stacks || 1>>
<<if _status.id === "fear">>
<span class="status-badge status-fear" @title="'Terrified - may skip turns (' + _statusDuration + ' rounds)'">
<<icon "afraid" "small">>
</span>
<<elseif _status.id === "stun">>
<span class="status-badge status-stun" @title="setup.statusText(_status)">
<<icon "stunned" "small">>
</span>
<<elseif _status.id === "bleed">>
<span class="status-badge status-bleed" @title="setup.statusText(_status)">
<<icon "bleeding" "small">>
</span>
<<elseif _status.id === "poison">>
<span class="status-badge status-poison" @title="setup.statusText(_status)">
<<icon "poisoned" "small">>
</span>
<<elseif _status.id === "charmed">>
<span class="status-badge status-charm" @title="'Charmed - cannot attack source (' + _statusDuration + ' rounds)'">
<<icon "charmed" "small">>
</span>
<<elseif _status.id === "lust_daze">>
<span class="status-badge status-lust" @title="'Lust-Dazed - accuracy reduced (' + _statusDuration + ' rounds)'">
<<icon "high-arousal" "small">>
</span>
<<elseif _status.id === "tits_exposed">>
<span class="status-badge status-exposed" title="Tits fully exposed - increased lust damage taken, her accuracy -5, +5 to hit her">
<<icon "hazard-sign" "small">> TITS
</span>
<<elseif _status.id === "pussy_exposed">>
<span class="status-badge status-exposed status-critical" title="Pussy fully exposed - increased lust damage taken, vulnerable to penetration, her accuracy -5, +5 to hit her">
<<icon "hazard-sign" "small">> PUSSY
</span>
<<elseif _status.id === "dick_exposed">>
<span class="status-badge status-exposed" title="Dick exposed - vulnerable to seduction">
<<icon "hazard-sign" "small">> DICK
</span>
<<else>>
<span class="status-badge" @title="_statusLabel + (_statusStacks > 1 ? ' x' + _statusStacks : '')">
<<if _status.icon>><<icon _status.icon "small">><</if>>
</span>
<</if>>
<</for>>
<</if>>
<<if _statusTarget.buffs>>
<<if _statusTarget.buffs.enraged && _statusTarget.buffs.enraged gt 0>>
<span class="status-badge status-buff status-enraged" @title="setup.enrageText(_statusTarget)">
<<icon "damage-boost" "small">>
</span>
<</if>>
<<if _statusTarget.buffs.rallied && _statusTarget.buffs.rallied gt 0>>
<span class="status-badge status-buff" @title="'Rallied - +25% damage (' + _statusTarget.buffs.rallied + ' turns)'">
<<icon "damage-boost" "small">>
</span>
<</if>>
<</if>>
<<if _statusTarget.abilityState && _statusTarget.abilityState.rallyActive>>
<span class="status-badge status-leader" @title="'Rally Leader - buffing allies (' + _statusTarget.abilityState.rallyTurns + ' turns)'">
<<icon "inspired" "small">>
</span>
<</if>>
<<if _statusTarget.stunned>>
<span class="status-badge status-stun" @title="'Stunned - skips turn (' + (_statusTarget.stunnedTurns || 1) + ' turns)'">
<<icon "stunned" "small">>
</span>
<</if>>
<<if _statusTarget.fearPenalty>>
<span class="status-badge status-fear" title="Terrified - deals 50% damage">
<<icon "afraid" "small">>
</span>
<</if>>
<<if _statusTarget.abilityState && _statusTarget.abilityState.lastUsed>>
<<set _lastAbility to _statusTarget.abilityState.lastUsed>>
<<if _lastAbility === "heavy_strike">>
<span class="status-badge status-action" title="Just used Heavy Strike">
<<icon "heavy-strike" "small">>
</span>
<<elseif _lastAbility === "quick_strike">>
<span class="status-badge status-action" title="Just used Quick Strike">
<<icon "light-strike" "small">>
</span>
<<elseif _lastAbility === "dirty_fighting">>
<span class="status-badge status-action" title="Fighting dirty - may cause bleed">
<<icon "bleeding" "small">>
</span>
<<elseif _lastAbility === "flurry">>
<span class="status-badge status-action" title="Unleashing flurry of attacks">
<<icon "rapid-strikes" "small">>
</span>
<<elseif _lastAbility === "intimidate">>
<span class="status-badge status-action" title="Intimidating!">
<<icon "intimidation" "small">>
</span>
<<elseif _lastAbility === "seductive_taunt">>
<span class="status-badge status-action" title="Seductive taunt - inflicts lust">
<<icon "seduce" "small">>
</span>
<</if>>
<</if>>
<<displayHumiliationStatus _statusTarget>>
<<displayArousalStatus _statusTarget>>
<<displayPositionStatus _statusTarget>>
<<displayCoveringStatus _statusTarget>>
<<displayResistanceStatus _statusTarget>>
</div>
<</if>>
<</widget>>
<<widget "checkBossPhase">>
<<set _boss to $combat.enemies[0]>>
<<if _boss.phases>>
<<set _healthPercent to (_boss.health / _boss.maxHealth) * 100>>
<<set _nextPhase to _boss.currentPhase + 1>>
<<if _nextPhase lt _boss.phases.length>>
<<set _threshold to _boss.phases[_nextPhase].healthThreshold>>
<<if _healthPercent lte _threshold>>
<<set _boss.currentPhase to _nextPhase>>
<<set _transition to _boss.phases[_nextPhase]>>
<<if _transition.transition>>
<div class="boss-transition">
<<print _transition.transition>>
</div>
<</if>>
<<if _transition.summons>>
<<for _summonId range _transition.summons>>
<<createEnemy _summonId>>
<<run $combat.enemies.push(clone(_returnEnemy))>>
<<notify "warning">><<print _returnEnemy.name>> joins the fight!<</notify>>
<</for>>
<</if>>
<<if _transition.effect>>
<<notify "danger">>Phase <<print _nextPhase + 1>>!<</notify>>
<</if>>
<</if>>
<</if>>
<</if>>
<</widget>>
<<widget "checkBossEnrage">>
<<set _boss to $combat.enemies[0]>>
<<if _boss.enrageTimer gt 0>>
<<set _boss.enrageTimer -= 1>>
<<if _boss.enrageTimer === 3>>
<<notify "danger">>The boss is growing impatient!<</notify>>
<</if>>
<<if _boss.enrageTimer === 0>>
<<notify "danger">>ENRAGE! The boss goes berserk!<</notify>>
<<set _boss.damage to Math.floor(_boss.damage * 2)>>
<</if>>
<</if>>
<</widget>>
<<widget "checkLustVictory">>
<<if $player.lust gte ($combat.enemies[0].lustVictoryThreshold || 999)>>
<<if $combat.enemies[0].lustVictoryScene>>
<<set _etLustScene to Story.has($combat.enemies[0].lustVictoryScene) ? $combat.enemies[0].lustVictoryScene : "Combat_Defeat">>
<</if>>
<</if>>
<</widget>>
/* =============================================================<<widget "deriveCombatMediaFilters">>
<<set _dcmfEnemy to _args[0]>>
<<set _combatFilters to {}>>
<<set _combatBareNear to (_dcmfEnemy && _dcmfEnemy.bareStaysBare) ? "naked" : "torn">>
<<if _dcmfEnemy>>
<<set _combatFilters.expression to _dcmfEnemy.combatExpression || "hostile">>
<<set _combatFilters.position to _dcmfEnemy.position || "standing">>
<<if _dcmfEnemy.mediaClothing>>
<<set _combatFilters.clothing to _dcmfEnemy.mediaClothing>>
<<elseif _dcmfEnemy.gender === "female" && _dcmfEnemy.clothing>>
<<if _dcmfEnemy.clothing.titsExposed && _dcmfEnemy.clothing.pussyExposed>>
<<set _combatFilters.clothing to "naked">>
<<elseif _dcmfEnemy.clothing.titsExposed>>
<<set _combatFilters.clothing to "exposed_tits">>
<<elseif _dcmfEnemy.clothing.pussyExposed>>
<<set _combatFilters.clothing to "exposed_pussy">>
<<elseif (_dcmfEnemy.clothing.top != null ? _dcmfEnemy.clothing.top : 100) < 50>>
<<set _combatFilters.clothing to "torn_top">>
<<elseif (_dcmfEnemy.clothing.bottom != null ? _dcmfEnemy.clothing.bottom : 100) < 50>>
<<set _combatFilters.clothing to "torn_bottom">>
<<else>>
<<set _combatFilters.clothing to "dressed">>
<</if>>
<<else>>
<<set _combatFilters.clothing to "dressed">>
<</if>>
<<if _dcmfEnemy.mediaGender === "male" || _dcmfEnemy.mediaGender === "female">>
<<set _combatFilters.gender to _dcmfEnemy.mediaGender>>
<</if>>
<<if !_dcmfEnemy.visualPerformer && _dcmfEnemy.visualGroup>>
<<set _dcmfPath to "combat/enemies/" + _dcmfEnemy.visualGroup>>
<<if !setup.mediaManifestCache[_dcmfPath]>>
<<loadMediaManifest _dcmfPath>>
<</if>>
<<set _dcmfPool to setup.mediaManifestCache[_dcmfPath]>>
<<if _dcmfPool && _dcmfPool.media && _dcmfPool.media.length>>
<<set _dcmfGroups to setup.enemyFaceGroups[_dcmfEnemy.gender === "female" ? "female" : "male"]>>
<<if _dcmfGroups.includes(_dcmfEnemy.visualGroup)>>
<<for _dcmfG range _dcmfGroups>>
<<set _dcmfGPath to "combat/enemies/" + _dcmfG>>
<<if !setup.mediaManifestCache[_dcmfGPath]>><<loadMediaManifest _dcmfGPath>><</if>>
<</for>>
<</if>>
<<set _dcmfFace to setup.pickEnemyFace(_dcmfEnemy, setup.mediaManifestCache)>>
<<set _dcmfEnemy.visualPerformer to _dcmfFace.performer>>
<<if _dcmfFace.group && _dcmfFace.group !== _dcmfEnemy.visualGroup>>
<<set _dcmfEnemy.portraitGroup to _dcmfFace.group>>
<</if>>
<</if>>
<</if>>
<<if _dcmfEnemy.visualPerformer>>
<<set _combatFilters.performer to _dcmfEnemy.visualPerformer>>
<<set _dcmfPath to "combat/enemies/" + (_dcmfEnemy.portraitGroup || _dcmfEnemy.visualGroup || "")>>
<<if (_dcmfEnemy.portraitGroup || _dcmfEnemy.visualGroup) && !setup.mediaManifestCache[_dcmfPath]>><<loadMediaManifest _dcmfPath>><</if>>
<</if>>
<</if>>
<</widget>>
<<widget "runCombatMediaCascade">>
<<set _rcmcPath to _args[0]>>
<<set _rcmcFilters to clone(_args[1] || {})>>
<<set _result to null>>
<<set _rcmcMatch to (function(r, f) {
if (!r || !r.tags) return false;
for (var k in f) {
if (!Object.prototype.hasOwnProperty.call(f, k)) continue;
var mv = r.tags[k], fv = f[k];
if (mv !== fv && mv !== "any" && fv !== "any") return false;
}
return true;
})>>
<<set _rcmcDone to false>>
<<run setup.mediaPickStrict(true)>>
<<selectMediaFromPool _rcmcPath _rcmcFilters>>
<<if _rcmcMatch(_result, _rcmcFilters)>><<set _rcmcDone to true>><</if>>
<<if !_rcmcDone && _rcmcFilters.position>>
<<run delete _rcmcFilters.position>>
<<selectMediaFromPool _rcmcPath _rcmcFilters>>
<<if _rcmcMatch(_result, _rcmcFilters)>><<set _rcmcDone to true>><</if>>
<</if>>
<<if !_rcmcDone && _rcmcFilters.expression && _rcmcFilters.expression !== "hostile">>
<<set _rcmcFilters.expression to "hostile">>
<<selectMediaFromPool _rcmcPath _rcmcFilters>>
<<if _rcmcMatch(_result, _rcmcFilters)>><<set _rcmcDone to true>><</if>>
<</if>>
<<if !_rcmcDone && _rcmcFilters.expression>>
<<run delete _rcmcFilters.expression>>
<<selectMediaFromPool _rcmcPath _rcmcFilters>>
<<if _rcmcMatch(_result, _rcmcFilters)>><<set _rcmcDone to true>><</if>>
<</if>>
<<if !_rcmcDone && _rcmcFilters.clothing && _rcmcFilters.clothing.indexOf("torn") === 0>>
<<set _rcmcFilters.clothing to "dressed">>
<<set _rcmcFilters.expression to _args[1].expression>>
<<if !_rcmcFilters.expression>><<run delete _rcmcFilters.expression>><</if>>
<<selectMediaFromPool _rcmcPath _rcmcFilters>>
<<if _rcmcMatch(_result, _rcmcFilters)>><<set _rcmcDone to true>><</if>>
<<if !_rcmcDone && _rcmcFilters.expression>>
<<run delete _rcmcFilters.expression>>
<<selectMediaFromPool _rcmcPath _rcmcFilters>>
<<if _rcmcMatch(_result, _rcmcFilters)>><<set _rcmcDone to true>><</if>>
<</if>>
<<if !_rcmcDone && _args[1].clothing.indexOf("torn_") === 0 && String(_rcmcPath).indexOf("combat/enemies/") !== 0>>
<<set _rcmcFilters.clothing to _args[1].clothing === "torn_top" ? "torn_bottom" : "torn_top">>
<<run delete _rcmcFilters.position>>
<<selectMediaFromPool _rcmcPath _rcmcFilters>>
<<if _rcmcMatch(_result, _rcmcFilters)>><<set _rcmcDone to true>><</if>>
<</if>>
<</if>>
<<if !_rcmcDone && _args[1] && _args[1].clothing === "naked" && String(_rcmcPath).indexOf("combat/enemies/") !== 0>>
<<for _rcmcNear range ["exposed_pussy", "exposed_tits"]>>
<<set _rcmcFilters.clothing to _rcmcNear>>
<<run delete _rcmcFilters.expression>>
<<run delete _rcmcFilters.position>>
<<selectMediaFromPool _rcmcPath _rcmcFilters>>
<<if _rcmcMatch(_result, _rcmcFilters)>><<set _rcmcDone to true>><<break>><</if>>
<</for>>
<<if !_rcmcDone>><<set _rcmcFilters.clothing to "naked">><</if>>
<</if>>
<<if !_rcmcDone && _args[1] && _args[1].clothing === "dressed" && String(_rcmcPath).indexOf("combat/enemies/") !== 0>>
<<for _rcmcNear range ["torn_top", "torn_bottom"]>>
<<set _rcmcFilters.clothing to _rcmcNear>>
<<run delete _rcmcFilters.expression>>
<<run delete _rcmcFilters.position>>
<<selectMediaFromPool _rcmcPath _rcmcFilters>>
<<if _rcmcMatch(_result, _rcmcFilters)>><<set _rcmcDone to true>><<break>><</if>>
<</for>>
<<if !_rcmcDone>><<set _rcmcFilters.clothing to "dressed">><</if>>
<</if>>
<<if !_rcmcDone && _args[1] && (_args[1].clothing === "exposed_tits" || _args[1].clothing === "exposed_pussy") && String(_rcmcPath).indexOf("combat/enemies/") !== 0>>
<<set _rcmcNearList to _combatBareNear === "naked" ? ["naked"] : (_args[1].clothing === "exposed_tits" ? ["torn_top", "torn_bottom", "dressed", "naked"] : ["torn_bottom", "torn_top", "dressed", "naked"])>>
<<for _rcmcNear range _rcmcNearList>>
<<set _rcmcFilters.clothing to _rcmcNear>>
<<run delete _rcmcFilters.expression>>
<<run delete _rcmcFilters.position>>
<<selectMediaFromPool _rcmcPath _rcmcFilters>>
<<if _rcmcMatch(_result, _rcmcFilters)>><<set _rcmcDone to true>><<break>><</if>>
<</for>>
<<if !_rcmcDone>><<set _rcmcFilters.clothing to _args[1].clothing>><</if>>
<</if>>
<<if !_rcmcDone && _rcmcFilters.performer && _rcmcFilters.performer !== "universal">>
<<set _rcmcFilters.performer to "universal">>
<<selectMediaFromPool _rcmcPath _rcmcFilters>>
<<if _rcmcMatch(_result, _rcmcFilters)>><<set _rcmcDone to true>><</if>>
<</if>>
<<run setup.mediaPickStrict(false)>>
<<if !_rcmcDone>><<set _result to null>><</if>>
<</widget>>
<<widget "selectCombatActionMedia">>
<<set _scamPath to _args[0]>>
<<set _scamEnemy to _args[1]>>
<<if _scamEnemy>>
<<if !setup.mediaManifestCache[_scamPath]>><<loadMediaManifest _scamPath>><</if>>
<<set _scamWomanAvoid to setup.combatMediaWomanAvoid(_scamPath, _scamEnemy)>>
<<if _scamWomanAvoid>><<run setup.mediaAvoidBegin(_scamPath, _scamWomanAvoid)>><</if>>
<<deriveCombatMediaFilters _scamEnemy>>
<<run delete _combatFilters.performer>>
<<set _scamSkinAvoid to null>>
<<set _scamSkinWant to setup.combatMediaSkinWant(_scamEnemy)>>
<<if _scamSkinWant>>
<<if !setup.mediaManifestCache[_scamPath]>><<loadMediaManifest _scamPath>><</if>>
<<set _scamSkinAvoid to setup.combatMediaSkinAvoidFor(_scamPath, _combatFilters, _scamSkinWant, _sfamInPass, !!(_scamEnemy && _scamEnemy.bareStaysBare))>>
<</if>>
<<if _scamSkinAvoid>>
<<run setup.mediaAvoidBegin(_scamPath, _scamSkinAvoid)>>
<<selectCombatActionMediaPick _scamPath _scamEnemy>>
<<run setup.mediaAvoidEnd(_scamPath)>>
<<if !setup.combatMediaIsClip(_result) && !_sfamInPass>>
<<selectCombatActionMediaPick _scamPath _scamEnemy>>
<</if>>
<<else>>
<<selectCombatActionMediaPick _scamPath _scamEnemy>>
<</if>>
<<if _scamWomanAvoid>><<run setup.mediaAvoidEnd(_scamPath)>><</if>>
<<else>>
<<selectMediaFromPool _scamPath {}>>
<</if>>
<</widget>>
<<widget "selectCombatActionMediaPick">>
<<set _scampPath to _args[0]>>
<<set _scampEnemy to _args[1]>>
<<if (_scampEnemy.mediaPrefer && _scampEnemy.mediaPrefer.length) || (_scampEnemy.avoidFiles && _scampEnemy.avoidFiles.length)>>
<<selectPreferredActionMedia _scampPath _scampEnemy>>
<<else>>
<<set _scampCastDone to false>>
<<set _scampCast to setup.combatMediaCast(_scampEnemy)>>
<<if _scampCast>>
<<if !setup.mediaManifestCache[_scampPath]>><<loadMediaManifest _scampPath>><</if>>
<<if setup.combatMediaHasCastClip(setup.mediaManifestCache[_scampPath], _combatFilters, _scampCast, !!(_scampEnemy && _scampEnemy.bareStaysBare))>>
<<set _scampCastFilters to clone(_combatFilters)>>
<<set _scampCastFilters.performer to _scampCast>>
<<runCombatMediaCascade _scampPath _scampCastFilters>>
<<if setup.combatMediaIsClip(_result) && _result.tags && _result.tags.performer === _scampCast>>
<<set _scampCastDone to true>>
<</if>>
<</if>>
<</if>>
<<if !_scampCastDone>>
<<runCombatMediaCascade _scampPath _combatFilters>>
<</if>>
<</if>>
<</widget>>
<<widget "selectPreferredActionMedia">>
<<set _spamPath to _args[0]>>
<<set _spamTarget to _args[1]>>
<<set _spamBase to clone(_combatFilters)>>
<<set _spamPrefer to _spamTarget.mediaPrefer || []>>
<<set _spamAvoid to _spamTarget.avoidFiles || []>>
<<set _spamFound to null>>
<<if !setup.mediaManifestCache[_spamPath]>><<loadMediaManifest _spamPath>><</if>>
<<for _spamPass to (_spamAvoid.length ? 0 : 1); _spamPass lte 1 && !_spamFound; _spamPass++>>
<<for _spamKeep to _spamPrefer.length; _spamKeep gte 0 && !_spamFound; _spamKeep-->>
<<set _spamF to clone(_spamBase)>>
<<for _spamI to 0; _spamI lt _spamKeep; _spamI++>>
<<set _spamF[_spamPrefer[_spamI][0]] to _spamPrefer[_spamI][1]>>
<</for>>
<<if _spamPass === 0>><<run setup.mediaAvoidBegin(_spamPath, _spamAvoid)>><</if>>
<<runCombatMediaCascade _spamPath _spamF>>
<<if _spamPass === 0>><<run setup.mediaAvoidEnd(_spamPath)>><</if>>
<<if setup.combatMediaIsClip(_result)>><<set _spamFound to _result>><</if>>
<</for>>
<</for>>
<<set _result to _spamFound>>
<</widget>>
<<widget "fillCombatVideoBox">>
<<run setup.combatMediaTemps.stash()>>
<<run setup.mediaRendererPick(true)>>
<<set _cvbFile to null>>
<<set _cvbFormat to null>>
<<set _cvbTags to null>>
<<set _cvbSource to null>>
<<set _cvbTarget to (typeof _args[2] === "number" && $combat && $combat.enemies) ? $combat.enemies[_args[2]] : _args[2]>>
<<set _cvbTry to setup.reviewedClipFolder(_args[1] || null)>>
<<set _cvbHops to 0>>
<<set _cvbRuntime to _args[3] ? [].concat(_args[3]) : []>>
<<set _cvbRuntimeAt to 0>>
<<set _cvbHint to setup.lineMediaTake ? setup.lineMediaTake() : null>>
<<if _cvbHint>>
<<for _cvbH range _cvbHint>>
<<if _cvbH === _cvbTry || setup.reviewedClipFolder(_cvbH) !== _cvbH>><<continue>><</if>>
<<if _cvbTarget>><<selectFreshActionMedia _cvbH _cvbTarget>><<else>><<selectFreshActionMedia _cvbH>><</if>>
<<if setup.combatMediaIsClip(_result)>>
<<set _cvbFile to _result.file>>
<<set _cvbFormat to _result.format>>
<<set _cvbTags to _result.tags>>
<<set _cvbSource to _cvbH>>
<<set _cvbTry to null>>
<<break>>
<</if>>
<</for>>
<</if>>
<<for _cvbTry && _cvbHops lt 6>>
<<if _cvbTarget>>
<<selectFreshActionMedia _cvbTry _cvbTarget>>
<<else>>
<<selectFreshActionMedia _cvbTry>>
<</if>>
<<if setup.combatMediaIsClip(_result)>>
<<set _cvbFile to _result.file>>
<<set _cvbFormat to _result.format>>
<<set _cvbTags to _result.tags>>
<<set _cvbSource to _cvbTry>>
<<break>>
<</if>>
<<set _cvbNext to (setup.combatMediaFallbacks && setup.combatMediaFallbacks[_cvbTry]) || null>>
<<if !_cvbNext && _cvbRuntimeAt lt _cvbRuntime.length>>
<<set _cvbNext to _cvbRuntime[_cvbRuntimeAt]>>
<<set _cvbRuntimeAt++>>
<</if>>
<<set _cvbTry to setup.reviewedClipFolder(_cvbNext)>>
<<set _cvbHops++>>
<</for>>
<<run setup.mediaRendererPick(false)>>
<<run window.fillCombatVideoBox(_args[0], _cvbFile, _cvbFormat, _cvbTags, setup.reviewedClipFolder(_args[1] || null), _cvbSource, (_cvbTarget && _cvbTarget.gender) || null)>>
<<if setup.lineMediaBox>><<run setup.lineMediaBox(_args[0], _cvbTarget)>><</if>>
<<run setup.combatMediaTemps.restore()>>
<</widget>>
<<widget "selectFreshActionMedia">>
<<set _sfamPath to _args[0]>>
<<set _sfamTarget to _args[1]>>
<<set _sfamFound to null>>
<<if _sfamPath && !setup.mediaManifestCache[_sfamPath]>><<loadMediaManifest _sfamPath>><</if>>
<<set _sfamPasses to _sfamPath ? setup.mediaShownPasses(_sfamPath) : [0]>>
<<for _sfamN range _sfamPasses>>
<<set _sfamAvoid to setup.mediaFreshAvoid(_sfamPath, _sfamN, _sfamTarget)>>
<<if _sfamN gt 0 && !_sfamAvoid.length>><<continue>><</if>>
<<set _sfamInPass to _sfamAvoid.length gt 0>>
<<if _sfamAvoid.length>><<run setup.mediaAvoidBegin(_sfamPath, _sfamAvoid)>><</if>>
<<if _sfamTarget>><<selectCombatActionMedia _sfamPath _sfamTarget>><<else>><<selectCombatActionMedia _sfamPath>><</if>>
<<if _sfamAvoid.length>><<run setup.mediaAvoidEnd(_sfamPath)>><</if>>
<<set _sfamInPass to false>>
<<if setup.combatMediaIsClip(_result)>><<set _sfamFound to _result>><<break>><</if>>
<</for>>
<<set _result to _sfamFound || _result>>
<</widget>>
<<widget "combatActionVideo">>
<div @id="_args[0]" class="card-video-container combat-action-video" style="display:none"></div>
<<if _args[3]>>
<<fillCombatVideoBox _args[0] _args[1] _args[2] _args[3]>>
<<elseif _args[2] || _args[2] === 0>>
<<fillCombatVideoBox _args[0] _args[1] _args[2]>>
<<else>>
<<fillCombatVideoBox _args[0] _args[1]>>
<</if>>
<</widget>>
<<widget "lineMedia">>
<<if setup.lineMediaPeek && setup.lineMediaPeek()>>
<<if _args[0]>>
<<if !_lmPrinted>><<set _lmPrinted to {}>><</if>>
<<if !_lmPrinted[_args[0]]>>
<<set _lmPrinted[_args[0]] to true>>
<div @id="_args[0]" class="card-video-container combat-action-video line-media-video" style="display:none"></div>
<</if>>
<<fillCombatVideoBox _args[0] null _args[1]>>
<<else>>
<<set _lmBox to setup.lineMediaLastBox()>>
<<if _lmBox>>
<<fillCombatVideoBox _lmBox.id null _lmBox.target>>
<<else>>
<<set _lmSeq to (_lmSeq || 0) + 1>>
<<combatActionVideo `"line-media-" + _lmSeq` null>>
<</if>>
<</if>>
<</if>>
<</widget>>
<<widget "kiraMediaTarget">>
<<set _kiraMediaTarget to {
gender: "female",
bareStaysBare: true,
clothing: clone($clothing && $clothing.kira ? $clothing.kira : {}),
position: ($combat.positions && $combat.positions.kira) || "standing",
combatExpression: "hostile",
visualPerformer: "universal",
mediaSkin: null
}>>
<</widget>>
<<widget "kiraNearestMediaTarget">>
<<kiraMediaTarget>>
<<if _args[0]>>
<<if !setup.mediaManifestCache[_args[0]]>><<loadMediaManifest _args[0]>><</if>>
<<set _knmtState to setup.enemyClothingState(_kiraMediaTarget)>>
<<set _knmtNear to setup.kiraNearestClothing(setup.mediaManifestCache[_args[0]], _knmtState)>>
<<if _knmtNear !== _knmtState>><<set _kiraMediaTarget.mediaClothing to _knmtNear>><</if>>
<</if>>
<</widget>>
<<widget "kiraActionVideo">>
<<kiraNearestMediaTarget _args[1]>>
<<combatActionVideo _args[0] _args[1] _kiraMediaTarget>>
<</widget>>
<<widget "playerMediaTarget">>
<<set _pmtCast to setup.combatMediaCast(_args[0])>>
<<run setup.combatMediaTemps.stash(["clothingFilter", "cfState"])>>
<<clothingFilter "player">>
<<set _pmtClothing to _clothingFilter || "dressed">>
<<run setup.combatMediaTemps.restore()>>
<<set _playerMediaTarget to {
gender: "male",
mediaClothing: _pmtClothing,
clothing: clone($clothing && $clothing.player ? $clothing.player : {}),
position: ($combat.positions && $combat.positions.player) || "standing",
combatExpression: "hostile",
visualPerformer: "universal"
}>>
<<if _pmtCast>><<set _playerMediaTarget.mediaCast to _pmtCast>><</if>>
<<set _playerMediaTarget.mediaSkin to setup.combatMediaPlayerSkin(_args[0])>>
<</widget>>
<<widget "enemyAttackVideo">>
<<set _eavWeapon to _args[1]>>
<<set _args[4] to setup.attackerFolderTarget(_args[4])>>
<<if _args[5] && _args[5].gender === "female" && _args[4]>>
<<set _args[4] to Object.assign({}, _args[4], { mediaGender: "female" })>>
<</if>>
<<set _eavOutcome to _args[2] === "miss" ? "miss" : "hit">>
<<set _eavGeneric to setup.enemyAttackVideoFolders[_eavOutcome]>>
<<set _eavFolder to _eavGeneric>>
<<if _eavWeapon && (_eavOutcome === "miss" ? _eavWeapon.videoFolderMiss : _eavWeapon.videoFolder)>>
<<weaponVideoFolder _eavWeapon "enemy" _eavOutcome>>
<<set _eavFolder to _wvfFolder || _eavGeneric>>
<</if>>
<<if _args[3] && _eavOutcome === "hit">>
<<fillCombatVideoBox _args[0] setup.enemyAttackVideoFolders.sexual _args[4] _eavFolder>>
<<else>>
<<fillCombatVideoBox _args[0] _eavFolder _args[4]>>
<</if>>
<</widget>>
<<widget "combatTableVideo">>
<<set _ctvEntry to (setup[_args[1]] && setup[_args[1]][_args[2]]) || null>>
<<if _ctvEntry && typeof _ctvEntry === "object">>
<<set _ctvEntry to _ctvEntry[_args[4]] || null>>
<</if>>
<<if _ctvEntry>>
<<if _args[3] === "kira">>
<<kiraMediaTarget>>
<<set _ctvTarget to _kiraMediaTarget>>
<<elseif _args[3] === "player">>
<<playerMediaTarget _args[5]>>
<<set _ctvTarget to _playerMediaTarget>>
<<else>>
<<set _ctvTarget to _args[3]>>
<</if>>
<<combatActionVideo _args[0] _ctvEntry _ctvTarget>>
<</if>>
<</widget>>
<<widget "kiraAssaultVideo">>
<<if _args[0] === "expose_self">>
<<kiraMediaTarget>>
<<set _kavTarget to Object.assign({}, _kiraMediaTarget, { mediaClothing: "any", mediaPrefer: [["clothing", setup.enemyClothingState(_kiraMediaTarget)]] })>>
<<combatActionVideo "kira-assault-video" `setup.kiraAssaultVideoFolders.expose_self` _kavTarget>>
<<else>>
<<set _kavTable to _args[2] === "resist" ? setup.kiraAssaultResistVideoFolders : setup.kiraAssaultVideoFolders>>
<<set _kavFolder to (_kavTable && _kavTable[_args[0]]) || null>>
<<if _kavFolder && typeof _kavFolder === "object">>
<<set _kavFolder to _kavFolder[_args[1] && _args[1].hasCock ? "cock" : "noCock"] || null>>
<</if>>
<<if _kavFolder && (_args[2] === "resist" || setup.kiraNearestClothingIntents.includes(_args[0]))>>
<<kiraActionVideo "kira-assault-video" _kavFolder>>
<<elseif _kavFolder>>
<<kiraMediaTarget>>
<<combatActionVideo "kira-assault-video" _kavFolder _kiraMediaTarget>>
<</if>>
<</if>>
<</widget>><<widget "initEnemyPosition">>
<<set _posIdx to _args[0] || 0>>
<<if $combat.enemies[_posIdx]>>
<<if $combat.enemies[_posIdx].position === undefined>>
<<set $combat.enemies[_posIdx].position to "standing">>
<<set $combat.enemies[_posIdx].pinStruggles to 0>>
<</if>>
<<if $combat.enemies[_posIdx].positionHeldTurns === undefined>>
<<set $combat.enemies[_posIdx].positionHeldTurns to 0>>
<</if>>
<</if>>
<</widget>>
<<widget "getPositionDamageMultipliers">>
<<set _posIdx to _args[0] || $combat.currentTarget || 0>>
<<set _posEnemy to $combat.enemies[_posIdx]>>
<<set _posName to "standing">>
<<if _posEnemy>>
<<initEnemyPosition _posIdx>>
<<set _posName to _posEnemy.position || "standing">>
<</if>>
<<set _posConfig to setup.getPositionConfig(_posName)>>
<<set _posDmgMult to _posConfig.dmgMult>>
<<set _posLustMult to _posConfig.lustMult>>
<<set _posDefMult to _posConfig.defMult>>
<<set _posEscapeDiff to _posConfig.escapeDiff>>
<</widget>>
<<widget "getPositionName">>
<<set _posCode to _args[0] || "standing">>
<<set _posDisplayName to setup.getPositionConfig(_posCode).displayName>>
<</widget>>
<<widget "getPositionActionLabel">>
<<set _posCode to _args[0] || "standing">>
<<set _posActionLabel to setup.getPositionConfig(_posCode).actionLabel>>
<<set _posActionLabel to setup.fillPronouns(_posActionLabel, ($combat && $combat.enemies && $combat.enemies[$combat.currentTarget || 0] || {}).gender)>>
<</widget>>
<<widget "displayPositionStatus">>
<<set _dpIdx to _args[0] || 0>>
<<set _dpEnemy to $combat.enemies[_dpIdx]>>
<<if _dpEnemy>>
<<initEnemyPosition _dpIdx>>
<<getPositionDamageMultipliers _dpIdx>>
<<if _posName !== "standing">>
<<set _posConfig to setup.getPositionConfig(_posName)>>
<span @class="'status-badge status-position pos-' + (_posName)">
<<if _posConfig.icon>>
<<icon _posConfig.icon "tiny">>
<</if>>
<<print _posConfig.displayName>>
</span>
<</if>>
<</if>>
<</widget>>
<<widget "applyPositionDamage">>
<<set _apdBaseDmg to _args[0] || 0>>
<<set _apdIdx to _args[1] || $combat.currentTarget || 0>>
<<getPositionDamageMultipliers _apdIdx>>
<<set _posModifiedDamage to Math.floor(_apdBaseDmg * _posDmgMult)>>
<</widget>>
<<widget "applyPositionLustDamage">>
<<set _aplBaseLust to _args[0] || 0>>
<<set _aplIdx to _args[1] || $combat.currentTarget || 0>>
<<getPositionDamageMultipliers _aplIdx>>
<<set _posModifiedLustDamage to Math.floor(_aplBaseLust * _posLustMult)>>
<</widget>>
<<widget "canWorsenPosition">>
<<set _cwpIdx to _args[0] || $combat.currentTarget || 0>>
<<set _cwpEnemy to $combat.enemies[_cwpIdx]>>
<<set _canWorsen to false>>
<<set _nextWorsePosition to null>>
<<if _cwpEnemy>>
<<initEnemyPosition _cwpIdx>>
<<set _currentPos to _cwpEnemy.position || "standing">>
<<switch _currentPos>>
<<case "standing">>
<<set _canWorsen to true>>
<<set _nextWorsePosition to "kneeling">>
<<case "kneeling">>
<<set _canWorsen to true>>
<<set _nextWorsePosition to (random(1,2) === 1) ? "prone_front" : "prone_back">>
<<case "prone_front">>
<<set _canWorsen to true>>
<<set _nextWorsePosition to "pinned">>
<<case "prone_back">>
<<set _canWorsen to true>>
<<set _nextWorsePosition to "pinned">>
<<case "bent_over">>
<<set _canWorsen to true>>
<<set _nextWorsePosition to "pinned">>
<<case "pinned">>
<<set _canWorsen to false>>
<<set _nextWorsePosition to null>>
<</switch>>
<</if>>
<</widget>>
<<widget "applyWorsenPosition">>
<<set _awpIdx to _args[0] || $combat.currentTarget || 0>>
<<set _awpEnemy to $combat.enemies[_awpIdx]>>
<<if _awpEnemy>>
<<canWorsenPosition _awpIdx>>
<<if _canWorsen && _nextWorsePosition>>
<<set _oldPos to _awpEnemy.position || "standing">>
<<set _awpEnemy.position to _nextWorsePosition>>
<<set $combat.enemies[_awpIdx].position to _nextWorsePosition>>
<<set $combat.enemies[_awpIdx].pinStruggles to 0>>
<<set _awpEnemy.positionHeldTurns to 0>>
<<set $combat.enemies[_awpIdx].positionHeldTurns to 0>>
<<if _awpEnemy.combatExpression !== "fearful" && _awpEnemy.combatExpression !== "defiant">>
<<setEnemyExpression _awpEnemy "surprised" 1>>
<</if>>
<<getPositionName _oldPos>>
<<set _oldPosName to _posDisplayName>>
<<getPositionName _nextWorsePosition>>
<<set _newPosName to _posDisplayName>>
<<set _genderSuffix to setup.genderSuffix(_awpEnemy.gender)>>
<<set _poolKey to "position_worsen_" + _nextWorsePosition + _genderSuffix>>
<div class="position-change worsen-position">
<<combatNarrative _poolKey>>
<<if !setup.combatNarrative?.[_poolKey]>>
<<if _awpEnemy.gender === "female">>
<<switch _nextWorsePosition>>
<<case "kneeling">>You sweep her legs, forcing her to her knees before you.
<<case "prone_front">>You shove her down, pressing her face-first onto the ground.
<<case "prone_back">>You knock her onto her back, leaving her exposed beneath you.
<<case "bent_over">>You grab her and bend her over, presenting her vulnerable.
<<case "pinned">>You pin her completely, trapping her beneath your weight.
<</switch>>
<<else>>
<<switch _nextWorsePosition>>
<<case "kneeling">>You sweep his legs, forcing him to his knees before you.
<<case "prone_front">>You shove him down, pressing him face-first onto the ground.
<<case "prone_back">>You knock him onto his back, leaving him exposed beneath you.
<<case "bent_over">>You grab him and bend him over, presenting him vulnerable.
<<case "pinned">>You pin him completely, trapping him beneath your weight.
<</switch>>
<</if>>
<</if>>
<div class="position-change-effect">
<<icon "arrow-down" "small">> <<print _oldPosName>> → <<print _newPosName>>
</div>
</div>
<<logEnemyPositionChange _awpIdx _nextWorsePosition "worsen">>
<</if>>
<</if>>
<</widget>>
<<widget "canHoldPosition">>
<<set _chpIdx to _args[0] || $combat.currentTarget || 0>>
<<set _chpEnemy to $combat.enemies[_chpIdx]>>
<<set _canHold to false>>
<<if _chpEnemy>>
<<initEnemyPosition _chpIdx>>
<<set _currentPos to _chpEnemy.position || "standing">>
<<if _currentPos !== "standing">>
<<set _canHold to true>>
<</if>>
<</if>>
<</widget>>
<<widget "applyHoldPosition">>
<<set _ahpIdx to _args[0] || $combat.currentTarget || 0>>
<<set _ahpEnemy to $combat.enemies[_ahpIdx]>>
<<if _ahpEnemy>>
<<canHoldPosition _ahpIdx>>
<<if _canHold>>
<<set _ahpEnemy.positionHeldTurns += 1>>
<<getPositionName _ahpEnemy.position>>
<<set _genderSuffix to setup.genderSuffix(_ahpEnemy.gender)>>
<<set _p to setup.pronouns(_ahpEnemy.gender)>>
<div class="position-hold">
You keep <<print _p.him>> locked in position, preventing any escape.
<div class="hold-effect">
<<icon "grapple" "small">> Held <<print _posDisplayName>> (+1 turn)
</div>
</div>
<<set _holdLust to 5>>
<<if _ahpEnemy.lust !== undefined>>
<<set _ahpEnemy.lust to setup.enemyLustPlus(_ahpEnemy, _holdLust)>>
<</if>>
<<if $combat.log>>
<<run $combat.log.push({
text: _ahpEnemy.name + " held in " + _posDisplayName + " position.",
type: "tactical"
})>>
<</if>>
<</if>>
<</if>>
<</widget>>
<<widget "tryEscapePosition">>
<<set _tepIdx to _args[0] || 0>>
<<set _tepEnemy to $combat.enemies[_tepIdx]>>
<<set _escapedPosition to false>>
<<if _tepEnemy>>
<<initEnemyPosition _tepIdx>>
<<initResistance _tepIdx>>
<<if _tepEnemy.position !== "standing">>
<<getPositionDamageMultipliers _tepIdx>>
<<set _baseEscapeChance to 40 - _posEscapeDiff - (_tepEnemy.positionHeldTurns * 10)>>
<<getArousalModifiers _tepIdx>>
<<set _baseEscapeChance -= (_aroAccPenalty / 2)>>
<<getResistanceModifiers _tepIdx>>
<<set _baseEscapeChance += _resEscapeBonus>>
<<if _tepEnemy.resistanceState === "broken" || _tepEnemy.resistanceState === "submitting" || _tepEnemy.beenUsed>>
<<set _baseEscapeChance to 0>>
<</if>>
<<set _escapeChance to Math.max((_tepEnemy.resistanceState === "broken" || _tepEnemy.beenUsed) ? 0 : 5, _baseEscapeChance)>>
<<set _escapeRoll to random(1, 100)>>
<<if _escapeRoll lte _escapeChance>>
<<set _oldPos to _tepEnemy.position>>
<<set _tepEnemy.position to "standing">>
<<set $combat.enemies[_tepIdx].position to "standing">>
<<set $combat.enemies[_tepIdx].pinStruggles to 0>>
<<set _tepEnemy.positionHeldTurns to 0>>
<<set $combat.enemies[_tepIdx].positionHeldTurns to 0>>
<<set _escapedPosition to true>>
<<getPositionName _oldPos>>
<div class="position-escape">
<<if _tepEnemy.gender === "female">>
She struggles free, rising back to her feet!
<<else>>
He struggles free, rising back to his feet!
<</if>>
</div>
<<logEnemyPositionChange _tepIdx _oldPos "escape">>
<</if>>
<</if>>
<</if>>
<</widget>>
<<widget "updatePositionHeldTurns">>
<<set _uphIdx to _args[0] || 0>>
<<set _uphEnemy to $combat.enemies[_uphIdx]>>
<<if _uphEnemy && _uphEnemy.positionHeldTurns gt 0>>
<<set _uphEnemy.positionHeldTurns -= 1>>
<</if>>
<</widget>>
<<widget "attemptStandUp">>
<<set _who to _args[0]>>
<<set _dc to 12>>
<<if _who === "player" && $combat.playerJustFucked && $combat.enemies[0] && $combat.enemies[0].gender === "female">>
<<set _enemy to $combat.enemies[0]>>
<<set _fuckPosition to $combat.playerJustFucked>>
<<if random(1, 100) <= 60>>
<<switch _fuckPosition>>
<<case "mounted" "prone_back">>
<div class="combat-action-result ultra-explicit">
<p class="explicit ultra"><<combatNarrative "female_traps_player_mounted">></p><<lineMedia "trap-line-video">>
<p class="explicit ultra">Despite being weakened, she finds a surge of desperate energy. Her hips slam down on you with furious intensity.</p>
<p class="explicit ultra"><<combatNarrative "player_forced_cum_mounted">></p><<lineMedia "trap-line-video">>
<<set $player.lust to 0>><<run setup.playerReleased()>>
<<run setup.stunPlayer(3, "orgasm")>>
<<set $player.energy to Math.max(0, $player.energy - 15)>>
<p class="system-alert">You came HARD! Stunned for 3 turns!</p>
<p class="narrator-thought">Fuck... she drained everything out of me...</p>
</div>
<<case "pinned">>
<div class="combat-action-result ultra-explicit">
<p class="explicit ultra"><<combatNarrative "female_traps_player_pinned">></p><<lineMedia "trap-line-video">>
<p class="explicit ultra">She grinds down harder, using her whole body to keep you trapped while her pussy squeezes your cock.</p>
<p class="explicit ultra"><<combatNarrative "player_forced_cum_pinned">></p><<lineMedia "trap-line-video">>
<<set $player.lust to 0>><<run setup.playerReleased()>>
<<run setup.stunPlayer(4, "orgasm")>>
<<set $player.energy to Math.max(0, $player.energy - 20)>>
<p class="system-alert">Pinned and drained! Stunned for 4 turns!</p>
<p class="narrator-thought">I can't... can't move... she took everything...</p>
</div>
<<case "kneeling" "blowjob">>
<div class="combat-action-result ultra-explicit">
<p class="explicit ultra"><<combatNarrative "female_traps_player_oral">></p><<lineMedia "trap-line-video">>
<p class="explicit ultra">Her mouth engulfs you again, sucking with desperate hunger. Her hands grip your ass, holding you in place.</p>
<p class="explicit ultra"><<combatNarrative "player_forced_cum_oral">></p><<lineMedia "trap-line-video">>
<<set $player.lust to 0>><<run setup.playerReleased()>>
<<run setup.stunPlayer(2, "orgasm")>>
<<set $player.energy to Math.max(0, $player.energy - 10)>>
<<knockdown "player" "kneeling">>
<p class="system-alert">Legs gave out! On your knees, stunned for 2 turns!</p>
<p class="narrator-thought">My legs... can't stand...</p>
</div>
<<case "bent_over">>
<div class="combat-action-result ultra-explicit">
<p class="explicit ultra"><<combatNarrative "female_traps_player_behind">></p><<lineMedia "trap-line-video">>
<p class="explicit ultra">She fucks you slow and deep from behind, and every thrust rocks your whole body forward.</p>
<p class="explicit ultra"><<combatNarrative "player_forced_cum_behind">></p><<lineMedia "trap-line-video">>
<<set $player.lust to 0>><<run setup.playerReleased()>>
<<run setup.stunPlayer(3, "orgasm")>>
<<set $player.energy to Math.max(0, $player.energy - 15)>>
<p class="system-alert">Dominated from behind! Stunned for 3 turns!</p>
<p class="narrator-thought">She... she made me cum like that...</p>
</div>
<<default>>
<div class="combat-action-result ultra-explicit">
<p class="explicit ultra">"Not so fast!" She grabs you before you can stand, pulling you back.</p>
<p class="explicit ultra">Her hands find your cock and work it mercilessly until you explode!</p>
<<set $player.lust to 0>><<run setup.playerReleased()>>
<<run setup.stunPlayer(2, "orgasm")>>
<<set $player.energy to Math.max(0, $player.energy - 10)>>
<p class="system-alert">Drained! Stunned for 2 turns!</p>
</div>
<</switch>>
<<set $combat.playerJustFucked to false>>
<<else>>
<<set $combat.playerJustFucked to false>>
<p class="explicit">She tries to hold you down but she's too spent. You push her off and scramble up.</p>
<<set $combat.positions.player to "standing">>
<</if>>
<<else>>
<<if _who === "player" && $combat.playerJustMounted && !$combat.playerJustFucked>>
<<set $combat.playerJustFucked to "mounted">>
<</if>>
<<if random(1, 100) <= 40>>
<<set _blockingEnemy to $combat.enemies[0] ? $combat.enemies[0].name : "The enemy">>
<<set _blockRoll to random(1, 20)>>
<<set _resistRoll to random(1, 20) + ((_who === "player") ? ($player.agility || 10) : ($tempCompanion.agility || 10))>>
<<if _resistRoll >= _dc>>
<<set $combat.positions[_who] to "standing">>
<<if _who === "player">>
You get back on your feet despite <<print _blockingEnemy>>'s attempt to keep you down!
<<else>>
Kira rolls away and stands back up!
<</if>>
<<else>>
<<if _who === "player">>
<<print _blockingEnemy>> kicks you back down! You're still vulnerable!
<<else>>
<<print _blockingEnemy>> stomps on Kira, keeping her down!
<</if>>
<</if>>
<<else>>
<<set $combat.positions[_who] to "standing">>
<<if _who === "player">>
You get back on your feet.
<<else>>
Kira stands back up, ready to fight.
<</if>>
<</if>>
<</if>>
<</widget>><<widget "getCombatPortrait">>
<<set _who to _args[0]>>
<<if _who === "player">>
<<set _position to $combat.positions.player>>
<<set _c to $clothing.player>>
<<set _clothState to setup.playerClothingState(_c, _position)>>
<<set _portraitPath to setup.mediaStillUrl("combat/player/" + _position, _clothState + ".webp")>>
<<elseif _who === "kira">>
<<set _position to $combat.positions.kira>>
<<set _c to $clothing.kira>>
<<set _clothState to setup.kiraClothingState(_c)>>
<<set _portraitPath to setup.mediaStillUrl("combat/kira/" + _position, _clothState + ".webp")>>
<</if>>
<<if _who === "player" || _who === "kira">>
<<set _portraitFolder to "combat/" + _who + "_" + (_position || "standing")>>
<<set _portraitFilters to { clothing: _clothState, position: _position || "standing" }>>
<<run setup.combatMediaTemps.stash()>>
<<runCombatMediaCascade _portraitFolder _portraitFilters>>
<<if _result && _result.file && !(_result.tags && _result.tags.type === "placeholder")>>
<<set _portraitPath to _result.file>>
<</if>>
<<run setup.combatMediaTemps.restore()>>
<</if>>
<<set _portraitFormat to _portraitPath.split("?")[0].split(".").pop().toLowerCase()>>
<</widget>>
<<widget "combatPortrait">>
<<set _cpWho to _args[0]>>
<<getCombatPortrait _cpWho>>
<<if _portraitFormat === "webp" || _portraitFormat === "png" || _portraitFormat === "jpg" || _portraitFormat === "jpeg" || _portraitFormat === "gif">>
<img class="combat-portrait" @src="_portraitPath" @alt="_cpWho + ' portrait'">
<<else>>
<video class="combat-portrait" autoplay loop muted playsinline>
<source @src="_portraitPath" @type="'video/' + _portraitFormat">
</video>
<</if>>
<</widget>>
<<widget "displayClothingStatus">>
<<set _who to _args[0]>>
<<if _who === "player">>
<<set _c to $clothing.player>>
<<set _armor to $equipped.armor>>
<<elseif _who === "kira">>
<<set _c to $clothing.kira>>
<<set _armor to null>>
<</if>>
<div class="clothing-status">
<<if _armor && setup.armorDurability()>>
<<set _armorPct to setup.armorDurability().percent>>
<span @class="'armor-status ' + setup.getClothingState(_armorPct).class">
<span data-tooltip="Armor Durability"><<icon "armor" "small">></span> <span class="cloth-label"><<print _armorPct>>%</span>
</span>
<</if>>
<span @class="'cloth-top ' + setup.getClothingState(_c.top).class">
<span data-tooltip="Top Clothing"><<icon "shirt" "small">></span> <span class="cloth-label"><<getClothingLabel _c.top>></span>
</span>
<span @class="'cloth-bottom ' + setup.getClothingState(_c.bottom).class">
<span data-tooltip="Bottom Clothing"><<icon "pants" "small">></span> <span class="cloth-label"><<getClothingLabel _c.bottom>></span>
</span>
</div>
<<if _who === "player">>
<<if _c.dickExposed>>
<div class="exposure-warning severe"><<icon "hazard-sign" "small">> DICK EXPOSED</div>
<<elseif _c.bottom lte 0 && _c.underwear gt 0>>
<div class="exposure-warning"><<icon "underwear" "small">> UNDERWEAR EXPOSED</div>
<</if>>
<<elseif _who === "kira">>
<<if _c.titsExposed && _c.pussyExposed>>
<div class="exposure-warning severe"><<icon "hazard-sign" "small">> FULLY EXPOSED</div>
<<elseif _c.titsExposed && _c.underwearExposed>>
<div class="exposure-warning severe"><<icon "hazard-sign" "small">> TITS + UNDERWEAR</div>
<<elseif _c.titsExposed>>
<div class="exposure-warning"><<icon "female" "small">> TITS EXPOSED</div>
<<elseif _c.pussyExposed>>
<div class="exposure-warning severe"><<icon "hazard-sign" "small">> PUSSY EXPOSED</div>
<<elseif _c.underwearExposed || (_c.bottom lte 0 && _c.underwear gt 0)>>
<div class="exposure-warning"><<icon "underwear" "small">> UNDERWEAR EXPOSED</div>
<</if>>
<</if>>
<</widget>>
<<widget "getClothingLabel">>
<<set _val to _args[0]>>
<<if _val >= 76>>Good
<<elseif _val >= 51>>Worn
<<elseif _val >= 26>>Ripped
<<elseif _val >= 1>>Ruined
<<else>>Gone <<icon "cross-mark" "tiny">>
<</if>>
<</widget>>
<<widget "getClothingClass">>
<<set _val to _args[0]>>
<<if _val >= 76>>cloth-good
<<elseif _val >= 51>>cloth-worn
<<elseif _val >= 26>>cloth-ripped
<<elseif _val >= 1>>cloth-ruined
<<else>>cloth-gone
<</if>>
<</widget>>
<<widget "displayBuffDebuffs">>
<<set _who to _args[0]>>
<<set _effects to []>>
<<if _who === "player">>
<<if $arousal.player.edging && $player.lust >= 70>>
<<run _effects.push({icon: "damage-boost", type: "buff", name: "Pent-up Aggression", desc: "All that held-back need"})>>
<<run _effects.push({icon: "seduction-boost", type: "buff", name: "Desperate Charm", desc: "Need written all over you"})>>
<</if>>
<<if $arousal.player.blueBallsActive>>
<<if $arousal.player.daysAtHigh >= 3>>
<<run _effects.push({icon: "accuracy-down", type: "debuff", name: "Distracted", desc: "Your aching balls keep pulling at your focus"})>>
<<elseif $arousal.player.daysAtHigh >= 2>>
<<run _effects.push({icon: "accuracy-down", type: "debuff", name: "Unfocused", desc: "Hard to think past the ache"})>>
<</if>>
<<if $arousal.player.daysAtHigh >= 5>>
<<run _effects.push({icon: "energy-down", type: "debuff", name: "Aching", desc: "A dull ache that won't let up"})>>
<</if>>
<</if>>
<<if $player.lust >= 90>>
<<run _effects.push({icon: "desperate", type: "special", name: "Desperate", desc: "Overwhelming need"})>>
<<elseif $player.lust >= 70>>
<<run _effects.push({icon: "high-arousal", type: "special", name: "Heated", desc: "High arousal"})>>
<</if>>
<<if $combat.effects && $combat.effects.player>>
<<for _effect range $combat.effects.player>>
<<run _effects.push(_effect)>>
<</for>>
<</if>>
<<if $combat.blocking>>
<<if $combat.blockPenalty gt 0>>
<<run _effects.push({icon: "block", type: "debuff", name: "Blocking (Weakened)", desc: (50 - $combat.blockPenalty) + "% reduction"})>>
<<else>>
<<run _effects.push({icon: "block", type: "buff", name: "Blocking", desc: "50% damage reduction"})>>
<</if>>
<</if>>
<<if $combat.parrying>>
<<if $combat.parryPenalty gt 0>>
<<run _effects.push({icon: "parry", type: "debuff", name: "Parrying (Weakened)", desc: (60 - $combat.parryPenalty) + "% success"})>>
<<else>>
<<run _effects.push({icon: "parry", type: "buff", name: "Parrying", desc: "60% counter chance"})>>
<</if>>
<</if>>
<<if $combat.riposteActive>>
<<run _effects.push({icon: "riposte", type: "buff", name: "Riposte Ready", desc: "Counter on miss"})>>
<</if>>
<<if $combat.combo && $combat.combo.count >= 2>>
<<if setup.finisherUsable()>>
<<run _effects.push({icon: "finisher-ready", type: "buff", name: "Combo " + $combat.combo.count + "x", desc: "FINISHER READY!"})>>
<<else>>
<<run _effects.push({icon: "combo", type: "buff", name: "Combo " + $combat.combo.count + "x", desc: "+" + $combat.combo.bonus + "% damage"})>>
<</if>>
<</if>>
<<if $combat.playerVulnerable>>
<<run _effects.push({icon: "hazard-sign", type: "debuff", name: "Off-Balance", desc: "+10 enemy accuracy this turn"})>>
<</if>>
<<if $combat.resting>>
<<run _effects.push({icon: "rest", type: "debuff", name: "Resting", desc: "Vulnerable to attack"})>>
<</if>>
<<if setup.armorDurability() && setup.armorDurability().current > 0>>
<<run _effects.push({icon: "armor-active", type: "buff", name: $equipped.armor.name, desc: "+" + $equipped.armor.defense + " defense"})>>
<</if>>
<<if $combat.playerEffects>>
<<if $combat.playerEffects.bleeding && $combat.playerEffects.bleeding > 0>>
<<run _effects.push({icon: "bleeding", type: "debuff", name: "Bleeding", desc: $combat.playerEffects.bleeding + " turns remaining"})>>
<</if>>
<<if $combat.playerEffects.intimidated && $combat.playerEffects.intimidated > 0>>
<<run _effects.push({icon: "afraid", type: "debuff", name: "Intimidated", desc: "-20% damage, " + $combat.playerEffects.intimidated + " turns"})>>
<</if>>
<<if $combat.playerEffects.bound && $combat.playerEffects.bound > 0>>
<<run _effects.push({icon: "bound", type: "debuff", name: "BOUND", desc: "Cannot move/grapple, " + $combat.playerEffects.bound + " turns"})>>
<</if>>
<<if $combat.playerEffects.stunned && $combat.playerEffects.stunned > 0>>
<<run _effects.push({icon: "stunned", type: "debuff", name: "STUNNED", desc: "Can only defend, " + $combat.playerEffects.stunned + " turns"})>>
<</if>>
<<if setup.weltAccuracyPct($combat.playerEffects.welts) > 0>>
<<run _effects.push({icon: "slap", type: "debuff", name: "Welts", desc: setup.weltBadgeText($combat.playerEffects.welts)})>>
<</if>>
<<if $combat.playerEffects.charmed && $combat.playerEffects.charmed > 0>>
<<run _effects.push({icon: "charmed", type: "debuff", name: "Charmed", desc: "1 in 4 chance you lose your next turn"})>>
<</if>>
<</if>>
<<if $combat.playerWristsBound || ($combat.playerEffects && $combat.playerEffects.wristsBound)>>
<<run _effects.push({icon: "bound", type: "debuff", name: "Wrists Bound", desc: "-25% damage, no grabbing or stripping"})>>
<</if>>
<<if $combat.playerAnklesBound || ($combat.playerEffects && $combat.playerEffects.anklesBound)>>
<<run _effects.push({icon: "bound", type: "debuff", name: "Ankles Bound", desc: "Cannot move"})>>
<</if>>
<<elseif _who === "kira">>
<<if $companions && $companions[0] && $companions[0].tension >= 70>>
<<run _effects.push({icon: "hazard-sign", type: "debuff", name: "High Tension", desc: "May flee or freeze"})>>
<</if>>
<<if $companions && $companions[0] && $companions[0].lust >= 80>>
<<run _effects.push({icon: "high-arousal", type: "special", name: "Aroused", desc: "Distracted by lust"})>>
<</if>>
<<if $combat.kiraEffects>>
<<if $combat.kiraEffects.bleeding && $combat.kiraEffects.bleeding > 0>>
<<run _effects.push({icon: "bleeding", type: "debuff", name: "Bleeding", desc: $combat.kiraEffects.bleeding + " turns remaining"})>>
<</if>>
<<if $combat.kiraEffects.intimidated && $combat.kiraEffects.intimidated > 0>>
<<run _effects.push({icon: "afraid", type: "debuff", name: "Intimidated", desc: "-20% damage, " + $combat.kiraEffects.intimidated + " turns"})>>
<</if>>
<<if setup.weltAccuracyPct($combat.kiraEffects.welts) > 0>>
<<run _effects.push({icon: "slap", type: "debuff", name: "Welts", desc: setup.weltBadgeText($combat.kiraEffects.welts)})>>
<</if>>
<<if $combat.kiraEffects.charmed && $combat.kiraEffects.charmed > 0>>
<<run _effects.push({icon: "charmed", type: "debuff", name: "Charmed", desc: "1 in 4 chance she loses her next turn"})>>
<</if>>
<<if $combat.kiraEffects.slapped && $combat.kiraEffects.slapped > 0>>
<<run _effects.push({icon: "slap", type: "debuff", name: "Slapped", desc: "Red handprint (" + $combat.kiraEffects.slapped + " turns)"})>>
<</if>>
<<if $combat.kiraEffects.groped && $combat.kiraEffects.groped > 0>>
<<run _effects.push({icon: "grab", type: "debuff", name: "Groped", desc: "Humiliated (" + $combat.kiraEffects.groped + " turns)"})>>
<</if>>
<</if>>
<<if $combat.kiraWristsBound>>
<<run _effects.push({icon: "bound", type: "debuff", name: "Wrists Bound", desc: "Cannot attack"})>>
<</if>>
<<if $combat.kiraAnklesBound>>
<<run _effects.push({icon: "bound", type: "debuff", name: "Ankles Bound", desc: "Cannot move"})>>
<</if>>
<<if $combat.kiraLeashed>>
<<run _effects.push({icon: "submission", type: "debuff", name: "Leashed", desc: "-50% damage, limited movement"})>>
<</if>>
<<if $combat.kiraChoked && $combat.kiraChoked > 0>>
<<run _effects.push({icon: "skull", type: "debuff", name: "Choked", desc: "Can't breathe (" + $combat.kiraChoked + " turns)"})>>
<</if>>
<<if $combat.kiraEffects && $combat.kiraEffects.welted && $combat.kiraEffects.welted > 0>>
<<run _effects.push({icon: "slap", type: "debuff", name: "Welted", desc: "Red marks from belt/crop (" + $combat.kiraEffects.welted + " turns)"})>>
<</if>>
<<if $combat.kiraStunned && $combat.kiraStunned > 0>>
<<run _effects.push({icon: "sleep", type: "debuff", name: "Stunned (Orgasm)", desc: $combat.kiraStunned + " turn(s) remaining"})>>
<</if>>
<<if $combat.kiraInRefractory>>
<<run _effects.push({icon: "rest", type: "debuff", name: "Refractory", desc: "Heightened sensitivity"})>>
<</if>>
<<if $combat.kiraDefenseDebuff && $combat.kiraDefenseDebuff > 0>>
<<run _effects.push({icon: "broken-shield", type: "debuff", name: "Weakened", desc: "takes +" + Math.abs($combat.kiraDefenseModifier || 0) + "% damage, " + $combat.kiraDefenseDebuff + " turn(s)"})>>
<</if>>
<</if>>
<div class="buff-debuff-row">
<<set _shown to 0>>
<<for _i, _eff range _effects>>
<<if _shown < 4>>
<<capture _eff>>
<<set _tooltipText to _eff.name + ": " + _eff.desc>>
<span @class="'effect-icon ' + _eff.type"
@data-tooltip="_tooltipText">
<<icon _eff.icon "small">>
</span>
<</capture>>
<<set _shown++>>
<</if>>
<</for>>
<<if _effects.length > 4>>
<<set _overflowCount to _effects.length - 4>>
<span class="effect-overflow"
@data-tooltip="'' + _overflowCount + ' more effects...'">
+<<print _overflowCount>>
</span>
<</if>>
</div>
<</widget>>
<<widget "displayPosition">>
<<set _who to _args[0]>>
<<if _who === "player">>
<<set _pos to $combat.positions.player>>
<<elseif _who === "kira">>
<<set _pos to $combat.positions.kira>>
<</if>>
<<switch _pos>>
<<case "standing">>
<span class="position-normal" data-tooltip="Full defensive capability"><<icon "muscle" "small">> Standing</span>
<<case "kneeling">>
<span class="position-vulnerable" @data-tooltip="$flags.parryRiposteUnlocked ? 'Block -20%, Parry -25%, No Riposte' : 'Block -20%'"><<icon "hazard-sign" "small">> On Knees</span>
<<case "prone_front">>
<span class="position-danger" @data-tooltip="$flags.parryRiposteUnlocked ? 'Block -50%, No Parry, No Riposte' : 'Block -50%'"><<icon "hazard-sign" "small">><<icon "hazard-sign" "small">> Face Down</span>
<<case "prone_back">>
<span class="position-danger" @data-tooltip="$flags.parryRiposteUnlocked ? 'Block -50%, No Parry, No Riposte' : 'Block -50%'"><<icon "hazard-sign" "small">><<icon "hazard-sign" "small">> On Back</span>
<<case "bent_over">>
<span class="position-danger" @data-tooltip="$flags.parryRiposteUnlocked ? 'Block -40%, No Parry, No Riposte' : 'Block -40%'"><<icon "hazard-sign" "small">><<icon "hazard-sign" "small">> Bent Over</span>
<<case "pinned">>
<span class="position-critical" data-tooltip="Cannot defend! Must break free!"><<icon "skull-bones" "small">> PINNED</span>
<</switch>>
<</widget>><<widget "initArousalState">>
<<set _aroIdx to _args[0] || 0>>
<<if $combat.enemies[_aroIdx]>>
<<if $combat.enemies[_aroIdx].arousalState === undefined>>
<<set $combat.enemies[_aroIdx].arousalState to "normal">>
<</if>>
<<if $combat.enemies[_aroIdx].denialTurns === undefined>>
<<set $combat.enemies[_aroIdx].denialTurns to 0>>
<</if>>
<<if $combat.enemies[_aroIdx].orgasmCount === undefined>>
<<set $combat.enemies[_aroIdx].orgasmCount to 0>>
<</if>>
<</if>>
<</widget>>
<<widget "updateArousalState">>
<<set _aroIdx to _args[0] || 0>>
<<set _aroEnemy to $combat.enemies[_aroIdx]>>
<<if _aroEnemy>>
<<initArousalState _aroIdx>>
<<set _aroOldState to _aroEnemy.arousalState>>
<<set _aroEnemy.arousalState to setup.enemyArousalState(_aroEnemy)>>
<<if _aroOldState !== _aroEnemy.arousalState && _aroEnemy.arousalState !== "normal">>
<<displayArousalThreshold _aroIdx _aroEnemy.arousalState>>
<</if>>
<</if>>
<</widget>>
<<widget "displayArousalThreshold">>
<<set _threshIdx to _args[0]>>
<<set _threshState to _args[1]>>
<<set _threshEnemy to $combat.enemies[_threshIdx]>>
<<if _threshEnemy && $combat.phase !== "enemy">>
<<set _threshGs to setup.genderSuffix(_threshEnemy.gender)>>
<<set _threshP to setup.pronouns(_threshEnemy.gender)>>
<<set _threshFallbacks to {
aroused: _threshP.His + " breathing has grown heavier. " + (_threshP.isFemale ? "A flush is spreading across " + _threshP.his + " skin." : _threshP.His + " cock is hard, pushing at the front of " + _threshP.his + " pants."),
highly_aroused: _threshP.He + "'s " + (_threshP.isFemale ? "visibly wet, thighs pressing together." : "rock hard now, straining against " + _threshP.his + " pants.") + " Arousal clouds " + _threshP.his + " movements.",
desperate: _threshP.He + "'s desperate, " + (_threshP.isFemale ? "practically trembling with need. Every touch makes " + _threshP.him + " gasp." : _threshP.his + " cock throbbing painfully. Every touch makes " + _threshP.him + " groan."),
climax: _threshP.He + "'s on the edge—one more " + (_threshP.isFemale ? "push" : "touch") + " will send " + _threshP.him + " over."
}>>
<<set _threshKeyMap to {aroused: "enemy_aroused_50", highly_aroused: "enemy_aroused_70", desperate: "enemy_aroused_90", climax: "enemy_at_climax"}>>
<div @class="'arousal-threshold threshold-' + (_threshState)">
<<set _threshPoolKey to _threshKeyMap[_threshState] + _threshGs>>
<<combatNarrative _threshPoolKey _threshFallbacks[_threshState]>>
</div>
<</if>>
<</widget>>
<<widget "getArousalModifiers">>
<<set _aroModIdx to _args[0] || 0>>
<<set _aroState to ($combat.enemies[_aroModIdx] ? $combat.enemies[_aroModIdx].arousalState : "normal") || "normal">>
<<set _mods to setup.getArousalModifiers(_aroState)>>
<<set _aroAccPenalty to _mods.accPenalty>>
<<set _aroDmgPenalty to _mods.dmgPenalty>>
<<set _aroCanAbility to _mods.canAbility>>
<<set _aroCanOrgasm to _mods.canOrgasm>>
<<set _aroLustBonus to _mods.lustBonus>>
<<set _aroWetIndicator to (_aroState !== "normal")>>
<</widget>>
<<widget "displayArousalStatus">>
<<set _aroStatusEnemy to _args[0]>>
<<set _aroState to setup.enemyArousalState(_aroStatusEnemy)>>
<<if _aroStatusEnemy && _aroStatusEnemy.lust !== undefined && _aroState !== "normal">>
<<switch _aroState>>
<<case "aroused">>
<span class="status-badge status-arousal aro-aroused"
@title="'Aroused (' + _aroStatusEnemy.lust + '/' + setup.enemyMaxLust(_aroStatusEnemy) + ') - Accuracy -10%'">
<<icon "high-arousal" "small">>
</span>
<<case "highly_aroused">>
<span class="status-badge status-arousal aro-highly-aroused"
@title="'Highly Aroused (' + _aroStatusEnemy.lust + '/' + setup.enemyMaxLust(_aroStatusEnemy) + ') - Accuracy -15%, Damage -20%'">
<<icon "high-arousal" "small">>
</span>
<<case "desperate">>
<span class="status-badge status-arousal aro-desperate"
@title="'Desperate (' + _aroStatusEnemy.lust + '/' + setup.enemyMaxLust(_aroStatusEnemy) + ') - Accuracy -20%, Damage -30%, No abilities'">
<<icon "high-arousal" "small">>
</span>
<<case "climax">>
<span class="status-badge status-arousal aro-climax"
@title="'On the Edge! (' + _aroStatusEnemy.lust + '/' + setup.enemyMaxLust(_aroStatusEnemy) + ') - Force Orgasm available!'">
<<icon "high-arousal" "small">>
</span>
<</switch>>
<</if>>
<</widget>>
<<widget "canDenyOrgasm">>
<<set _denyIdx to _args[0] || $combat.currentTarget || 0>>
<<set _denyEnemy to $combat.enemies[_denyIdx]>>
<<set _canDeny to false>>
<<if _denyEnemy && _denyEnemy.gender === "female">>
<<if (_denyEnemy.lust || 0) >= 80>>
<<set _canDeny to true>>
<</if>>
<</if>>
<</widget>>
<<widget "applyDenial">>
<<set _config to setup.orgasmControlConfigs.deny_orgasm>>
<<set _denyIdx to _args[0] || $combat.currentTarget || 0>>
<<set _enemy to $combat.enemies[_denyIdx]>>
<<if _enemy && _enemy.gender === "female">>
<<initArousalState _denyIdx>>
<<set _genderSuffix to "Female">>
<<if _config.effects.incrementDenialTurns>>
<<set _enemy.denialTurns += 1>>
<</if>>
<<set _frustrationDmg to _config.effects.frustrationDamage>>
<<combatActionVideo "deny-orgasm-video" `_config.videoFolders["denied" + _genderSuffix]` _enemy>>
<div class="denial-effect">
<<set _poolKey to _config.narrativePools["denied" + _genderSuffix]>>
<<set _fallbackText to _config.fallbackText["denied" + _genderSuffix]>>
<<combatNarrative _poolKey _fallbackText>>
<div class="frustration-damage">
<<icon "broken-heart" "small">> <<print "+" + _frustrationDmg>> Frustration
</div>
</div>
<<addHumiliation _denyIdx _frustrationDmg "denial">>
<<if _enemy.denialTurns >= _config.effects.beggingThreshold>>
<div class="denial-begging">
<<set _poolKey to _config.narrativePools["begging" + _genderSuffix]>>
<<set _fallbackText to _config.fallbackText["begging" + _genderSuffix]>>
<<combatNarrative _poolKey _fallbackText>>
</div>
<<fillCombatVideoBox "deny-orgasm-video" `_config.videoFolders["begging" + _genderSuffix]` _enemy>>
<<humiliationBeg _denyIdx>>
<</if>>
<</if>>
<</widget>>
<<widget "canForceOrgasm">>
<<set _orgIdx to _args[0] || $combat.currentTarget || 0>>
<<set _orgEnemy to $combat.enemies[_orgIdx]>>
<<set _canForceOrg to false>>
<<if _orgEnemy && _orgEnemy.gender === "female">>
<<if (_orgEnemy.lust || 0) >= 95>>
<<set _canForceOrg to true>>
<</if>>
<</if>>
<</widget>>
<<widget "applyForceOrgasm">>
<<set _config to setup.orgasmControlConfigs.force_orgasm>>
<<set _orgIdx to _args[0] || $combat.currentTarget || 0>>
<<set _enemy to $combat.enemies[_orgIdx]>>
<<if _enemy && _enemy.gender === "female">>
<<initArousalState _orgIdx>>
<<set _genderSuffix to "female">>
<<if _config.effects.incrementOrgasmCount>>
<<set _enemy.orgasmCount += 1>>
<</if>>
<<if _config.effects.resetDenialTurns>>
<<set _enemy.denialTurns to 0>>
<</if>>
<<set _enemy.stunned to true>>
<<set _enemy.stunnedTurns to _config.effects.stunTurns>>
<<set _humGain to _config.effects.humiliation>>
<<combatActionVideo "force-orgasm-video" _config.videoFolders[_genderSuffix] _enemy>>
<div class="forced-orgasm">
<<set _poolKey to _config.narrativePools[_genderSuffix]>>
<<set _fallbackText to _config.fallbackText[_genderSuffix]>>
<<combatNarrative _poolKey _fallbackText>>
<div class="orgasm-effects">
<<icon "stunned" "small">> Stunned for <<print _config.effects.stunTurns>> turns!
<br>
<<icon "broken-heart" "small">> <<print "+" + _humGain>> Humiliation!
</div>
</div>
<<addHumiliation _orgIdx _humGain "forced_orgasm">>
<<if _enemy.humiliation >= _config.brokenThreshold && _enemy.humiliationState !== "broken">>
<<fillCombatVideoBox "force-orgasm-video" `_config.videoFolders["broken_" + _genderSuffix]` _enemy>>
<div class="orgasm-break">
<<print _config.fallbackText.brokenFemale>>
</div>
<<set _enemy.humiliation to 100>>
<<set _enemy.humiliationState to "broken">>
<</if>>
<<set _enemy.lust to Math.max(_config.effects.minLustRemaining, _enemy.lust - _config.effects.lustReduction)>>
<<updateArousalState _orgIdx>>
<<if $combat.log>>
<<run $combat.log.push({
text: _enemy.name + " " + _config.logText,
type: _config.logType
})>>
<</if>>
<</if>>
<</widget>>
<<widget "checkArousalAbilityBlock">>
<<set _abilCheckIdx to _args[0] || 0>>
<<getArousalModifiers _abilCheckIdx>>
<<set _arousalBlocksAbility to !_aroCanAbility>>
<<if _arousalBlocksAbility && $combat.log>>
<<set _enemy to $combat.enemies[_abilCheckIdx]>>
<<if _enemy>>
<<run $combat.log.push({
text: _enemy.name + " is too aroused to use abilities!",
type: "flavor"
})>>
<</if>>
<</if>>
<</widget>>
<<widget "addMaleEnemyLust">>
<<silently>>
<<set _lustAmount to Number(_args[0]) || 5>>
<<set _lustReason to _args[1] || "event">>
<<if $combat && $combat.enemies && $combat.enemies.length > 0>>
<<for _amlIdx, _amlEnemy range $combat.enemies>>
<<if _amlEnemy && _amlEnemy.gender === "male">>
<<set _amlCurrentLust to Number(_amlEnemy.lust)>>
<<if isNaN(_amlCurrentLust)>><<set _amlCurrentLust to 0>><</if>>
<<set _amlEnemy.lust to setup.enemyLustPlus(Object.assign({}, _amlEnemy, {lust: _amlCurrentLust}), _lustAmount)>>
<<set $combat.enemies[_amlIdx].lust to _amlEnemy.lust>>
<<updateArousalState _amlIdx>>
<</if>>
<</for>>
<</if>>
<</silently>>
<</widget>>
<<widget "modifyCurrentEnemyLust">>
<<set _mcelAmount to Number(_args[0]) || 0>>
<<if _currentEnemyIndex !== undefined && $combat.enemies && $combat.enemies[_currentEnemyIndex]>>
<<set _mcelCurrentLust to Number($combat.enemies[_currentEnemyIndex].lust) || 0>>
<<set _mcelNewLust to setup.enemyLustPlus(Object.assign({}, $combat.enemies[_currentEnemyIndex], {lust: _mcelCurrentLust}), _mcelAmount)>>
<<set $combat.enemies[_currentEnemyIndex].lust to _mcelNewLust>>
<<if Math.abs(_mcelAmount) >= 10>>
<<updateArousalState _currentEnemyIndex>>
<</if>>
<</if>>
<</widget>>
<<widget "processEnemyPassiveLust">>
<<silently>>
<<if $combat.enemies && $combat.enemies.length > 0 && $clothing && $clothing.kira>>
<<set _c to $clothing.kira>>
<<set _titsExposed to _c.titsExposed>>
<<set _pussyExposed to _c.pussyExposed>>
<<set _assExposed to _c.assExposed>>
<<set _kiraPosition to ($combat.positions && $combat.positions.kira) ? $combat.positions.kira : "standing">>
<<set _vulnerablePosition to (_kiraPosition !== "standing")>>
<<set _kiraLust to ($companions && $companions[0]) ? ($companions[0].lust || 0) : 0>>
<<set _kiraVisiblyAroused to _kiraLust > 80>>
<<if _titsExposed || _pussyExposed || _assExposed || _kiraVisiblyAroused>>
<<set _plCfg to setup.enemyLustTriggersConfig?.passivePerTurn || {titsExposed: 3, pussyExposed: 8, assExposed: 4, vulnerablePosition: 2, kiraVisiblyAroused: 3}>>
<<for _plIdx, _plEnemy range $combat.enemies>>
<<if _plEnemy && _plEnemy.gender === "male">>
<<set _plCurrentLust to Number(_plEnemy.lust)>>
<<if isNaN(_plCurrentLust)>><<set _plCurrentLust to 0>><</if>>
<<set _lustGain to 0>>
<<if _titsExposed>>
<<set _lustGain += _plCfg.titsExposed>>
<</if>>
<<if _pussyExposed>>
<<set _lustGain += _plCfg.pussyExposed>>
<</if>>
<<if _assExposed>>
<<set _lustGain += _plCfg.assExposed>>
<</if>>
<<if _vulnerablePosition>>
<<set _lustGain += _plCfg.vulnerablePosition>>
<</if>>
<<if _kiraVisiblyAroused>>
<<set _lustGain += _plCfg.kiraVisiblyAroused>>
<</if>>
<<if _lustGain > 0>>
<<set _plEnemy.lust to setup.enemyLustPlus(Object.assign({}, _plEnemy, {lust: _plCurrentLust}), _lustGain)>>
<<set $combat.enemies[_plIdx].lust to _plEnemy.lust>>
<<updateArousalState _plIdx>>
<</if>>
<</if>>
<</for>>
<</if>>
<</if>>
<</silently>>
<</widget>>
<<widget "checkTensionDistraction">>
<<if $combat.companionInCombat>>
<<getCompanion $combat.companionInCombat>>
<<if $tempCompanion && $tempCompanion.tension >= 70 && random(1,100) <= 25>>
<<set $flags.tensionDistraction to random(1,4)>>
<</if>>
<</if>>
<</widget>>
<<widget "handleEnemyLustBreak">>
<<set _enemyIndex to _args[0]>>
<<if _enemyIndex !== undefined && $combat.enemies[_enemyIndex]>>
<<set _enemy to $combat.enemies[_enemyIndex]>>
<<setPronouns _enemy>>
<<set _isBroken to _enemy.lust >= (_enemy.lustBreak || 100)>>
<<set _isMale to _enemy.gender === "male">>
<div class="lust-event enemy-lust-break" @data-enemy-index="(_enemyIndex)">
<<if _isBroken>>
<div class="lust-event-header lust-break-header">
<<icon "high-arousal" "small">> <strong><<print _enemy.name>> #<<print (_enemyIndex + 1)>></strong> - LUST BREAK!
</div>
<<if _isMale>>
<p class="narrator-explicit"><<print setup.randomLine(setup.textPools.enemy_lust_break.male_breaks)>></p>
<<else>>
<p class="narrator-explicit"><<print setup.randomLine(setup.textPools.enemy_lust_break.female_breaks)>></p>
<</if>>
<p class="narrator-subtle"><<print setup.randomLine(_isMale ? setup.textPools.enemy_lust_break.victory_opening : setup.textPools.enemy_lust_break.victory_opening.concat(setup.textPools.enemy_lust_break.victory_opening_female || []))>></p>
<<set $combat.enemies[_enemyIndex].lustBroken to true>>
<<set $combat.enemies[_enemyIndex].beenUsed to true>>
<<set $combat.enemies[_enemyIndex].sexUsed to $combat.enemies[_enemyIndex].sexUsed === true>>
<<run setup.countWomanUsed($combat.enemies[_enemyIndex])>>
<<set $combat.enemies[_enemyIndex].stunned to true>>
<<set $combat.enemies[_enemyIndex].stunnedTurns to 2>>
<<logCombat `_enemy.name + " breaks from overwhelming lust!"` "success">>
<<else>>
<div class="lust-event-header lust-distracted-header">
<<icon "high-arousal" "small">> <strong><<print _enemy.name>> #<<print (_enemyIndex + 1)>></strong> - Distracted
</div>
<<if _isMale>>
<p class="narrator-subtle"><<print setup.randomLine(setup.textPools.enemy_lust_break.male_distracted)>></p>
<<else>>
<p class="narrator-subtle"><<print setup.randomLine(setup.textPools.enemy_lust_break.female_distracted)>></p>
<</if>>
<</if>>
</div>
<</if>>
<</widget>><<widget "initHumiliation">>
<<set _humIdx to _args[0] || 0>>
<<if $combat.enemies[_humIdx]>>
<<if $combat.enemies[_humIdx].humiliation === undefined>>
<<set $combat.enemies[_humIdx].humiliation to 0>>
<</if>>
<<if $combat.enemies[_humIdx].humiliationState === undefined>>
<<set $combat.enemies[_humIdx].humiliationState to "normal">>
<</if>>
<</if>>
<</widget>>
<<widget "addHumiliation">>
<<set _humIdx to _args[0] || 0>>
<<set _humAmount to _args[1] || 0>>
<<set _humSource to _args[2] || "generic">>
<<if $combat.enemies[_humIdx]>>
<<initHumiliation _humIdx>>
<<set _oldHum to $combat.enemies[_humIdx].humiliation>>
<<set _oldState to $combat.enemies[_humIdx].humiliationState>>
<<set $combat.enemies[_humIdx].humiliation += _humAmount>>
<<set $combat.enemies[_humIdx].humiliation to Math.min(100, Math.max(0, $combat.enemies[_humIdx].humiliation))>>
<<set _newHum to $combat.enemies[_humIdx].humiliation>>
<<if _newHum >= 90>>
<<set $combat.enemies[_humIdx].humiliationState to "broken">>
<<elseif _newHum >= 60>>
<<set $combat.enemies[_humIdx].humiliationState to "degraded">>
<<elseif _newHum >= 30>>
<<set $combat.enemies[_humIdx].humiliationState to "embarrassed">>
<<else>>
<<set $combat.enemies[_humIdx].humiliationState to "normal">>
<</if>>
<<set _newState to $combat.enemies[_humIdx].humiliationState>>
<<if _humAmount gt 0>>
<div class="humiliation-change positive">
<<icon "broken-heart" "small">> <<print "+" + _humAmount>> Humiliation
</div>
<</if>>
<<if _oldState !== _newState>>
<<displayHumiliationThreshold _humIdx _newState>>
<</if>>
<<if $combat.log && _humAmount gt 0>>
<<run $combat.log.push({
text: $combat.enemies[_humIdx].name + " gains +" + _humAmount + " humiliation (" + _newHum + "/100)",
type: "humiliation"
})>>
<</if>>
<</if>>
<</widget>>
<<widget "displayHumiliationThreshold">>
<<set _threshIdx to _args[0]>>
<<set _threshState to _args[1]>>
<<set _enemy to $combat.enemies[_threshIdx]>>
<<if _enemy && _enemy.gender === "female">>
<div @class="'humiliation-threshold threshold-' + (_threshState)">
<<switch _threshState>>
<<case "embarrassed">>
<<combatNarrative "humiliation_30" "Her cheeks flush red with shame. She's starting to feel it.">>
<<case "degraded">>
<<combatNarrative "humiliation_60" "The fight has gone out of her eyes. Degradation is taking its toll.">>
<<case "broken">>
<<combatNarrative "humiliation_90" "She's completely broken. No resistance left.">>
<</switch>>
</div>
<</if>>
<</widget>>
<<widget "getHumiliationModifiers">>
<<set _modIdx to _args[0] || 0>>
<<set _humGrabResist to 0>>
<<set _humAccPenalty to 0>>
<<set _humCanOffensive to true>>
<<set _humAutoSucceed to false>>
<<set _humClothResist to 0>>
<<if $combat.enemies[_modIdx]>>
<<set _humState to $combat.enemies[_modIdx].humiliationState || "normal">>
<<switch _humState>>
<<case "embarrassed">>
<<set _humGrabResist to 15>>
<<set _humAccPenalty to 5>>
<<set _humCanOffensive to true>>
<<set _humAutoSucceed to false>>
<<set _humClothResist to 10>>
<<case "degraded">>
<<set _humGrabResist to 30>>
<<set _humAccPenalty to 15>>
<<set _humCanOffensive to false>>
<<set _humAutoSucceed to false>>
<<set _humClothResist to 30>>
<<case "broken">>
<<set _humGrabResist to 100>>
<<set _humAccPenalty to 0>>
<<set _humCanOffensive to false>>
<<set _humAutoSucceed to true>>
<<set _humClothResist to 100>>
<</switch>>
<</if>>
<</widget>>
<<widget "displayHumiliationStatus">>
<<set _statusEnemy to _args[0]>>
<<if _statusEnemy && _statusEnemy.humiliation !== undefined && _statusEnemy.humiliation >= 30>>
<<set _humState to _statusEnemy.humiliationState || "normal">>
<<switch _humState>>
<<case "embarrassed">>
<span class="status-badge status-humiliation hum-embarrassed"
@title="setup.HUMILIATION_TEXT.embarrassed + ' (' + _statusEnemy.humiliation + '/100)'">
<<icon "broken-heart" "small">>
</span>
<<case "degraded">>
<span class="status-badge status-humiliation hum-degraded"
@title="setup.HUMILIATION_TEXT.degraded + ' (' + _statusEnemy.humiliation + '/100)'">
<<icon "broken-heart" "small">>
</span>
<<case "broken">>
<span class="status-badge status-humiliation hum-broken"
@title="setup.HUMILIATION_TEXT.broken + ' (' + _statusEnemy.humiliation + '/100)'">
<<icon "broken-heart" "small">>
</span>
<</switch>>
<</if>>
<</widget>>
<<widget "humiliationSlap">>
<<set _hsIdx to _args[0] || $combat.currentTarget || 0>>
<<addHumiliation _hsIdx 10 "slap">>
<</widget>>
<<widget "humiliationGrope">>
<<set _hgIdx to _args[0] || $combat.currentTarget || 0>>
<<addHumiliation _hgIdx 12 "grope">>
<</widget>>
<<widget "humiliationForcePosition">>
<<set _hfpIdx to _args[0] || $combat.currentTarget || 0>>
<<addHumiliation _hfpIdx 15 "force_position">>
<</widget>>
<<widget "humiliationWelt">>
<<set _hwIdx to _args[0] || $combat.currentTarget || 0>>
<<addHumiliation _hwIdx 8 "welt">>
<</widget>>
<<widget "humiliationBeg">>
<<set _hbIdx to _args[0] || $combat.currentTarget || 0>>
<<addHumiliation _hbIdx 20 "forced_beg">>
<</widget>>
<<widget "canVerbalDegrade">>
<<set _vdIdx to _args[0] || $combat.currentTarget || 0>>
<<set _vdEnemy to $combat.enemies[_vdIdx]>>
<<set _canVerbalDegrade to false>>
<<if _vdEnemy && _vdEnemy.gender === "female">>
<<if _vdEnemy.clothing && (_vdEnemy.clothing.titsExposed || _vdEnemy.clothing.pussyExposed)>>
<<set _canVerbalDegrade to true>>
<</if>>
<<set _vdPos to ($combat.enemies[_vdIdx] && $combat.enemies[_vdIdx].position) || ($combat.positions && $combat.positions.enemies && $combat.positions.enemies[_vdIdx]) || "standing">>
<<if _vdPos === "kneeling" || _vdPos === "prone_front" || _vdPos === "prone_back" || _vdPos === "bent_over" || _vdPos === "pinned">>
<<set _canVerbalDegrade to true>>
<</if>>
<<if _vdEnemy.humiliationState === "broken">>
<<set _canVerbalDegrade to false>>
<</if>>
<</if>>
<</widget>>
<<widget "checkCanUseAbility">>
<<set _abilIdx to _args[0] || 0>>
<<set _abilEnemy to $combat.enemies[_abilIdx]>>
<<set _canUseAbility to true>>
<<if _abilEnemy>>
<<getHumiliationModifiers _abilIdx>>
<<set _canUseAbility to _humCanOffensive>>
<</if>>
<</widget>>
<<widget "canCaptureVictory">>
<<set _capIdx to _args[0] || $combat.currentTarget || 0>>
<<set _capEnemy to $combat.enemies[_capIdx]>>
<<set _canCapture to false>>
<<if _capEnemy && _capEnemy.humiliationState === "broken">>
<<set _canCapture to true>>
<</if>>
<</widget>><<widget "initPainPleasure">>
<<set _ppIdx to _args[0] || 0>>
<<if $combat.enemies[_ppIdx]>>
<<set _enemy to $combat.enemies[_ppIdx]>>
<<if _enemy.painThisTurn === undefined>>
<<set _enemy.painThisTurn to 0>>
<<set $combat.enemies[_ppIdx].painThisTurn to 0>>
<</if>>
<<if _enemy.pleasureThisTurn === undefined>>
<<set _enemy.pleasureThisTurn to 0>>
<<set $combat.enemies[_ppIdx].pleasureThisTurn to 0>>
<</if>>
<<if _enemy.masochism === undefined>>
<<set _baseMaso to 0>>
<<if _enemy.type === "raider" && random(1, 100) <= 20>>
<<set _baseMaso to random(10, 30)>>
<</if>>
<<if _enemy.type === "succubus" || _enemy.type === "demon">>
<<set _baseMaso to random(20, 50)>>
<</if>>
<<set _enemy.masochism to _baseMaso>>
<<set $combat.enemies[_ppIdx].masochism to _baseMaso>>
<</if>>
<<if _enemy.overwhelmed === undefined>>
<<set _enemy.overwhelmed to false>>
<<set $combat.enemies[_ppIdx].overwhelmed to false>>
<</if>>
<<if _enemy.overwhelmedTurns === undefined>>
<<set _enemy.overwhelmedTurns to 0>>
<<set $combat.enemies[_ppIdx].overwhelmedTurns to 0>>
<</if>>
<</if>>
<</widget>>
<<widget "canUsePainPleasure">>
<<set _cppIdx to _args[0] || $combat.currentTarget || 0>>
<<set _enemy to $combat.enemies[_cppIdx]>>
<<set _canPainPleasure to false>>
<<if _enemy>>
<<if _enemy.gender === "female">>
<<if _enemy.clothing && (_enemy.clothing.titsExposed || _enemy.clothing.pussyExposed)>>
<<set _canPainPleasure to true>>
<<elseif _enemy.position && _enemy.position !== "standing">>
<<set _canPainPleasure to true>>
<</if>>
<</if>>
<</if>>
<</widget>>
<<widget "applyMixedDamage">>
<<set _amdIdx to _args[0] || $combat.currentTarget || 0>>
<<set _amdPhys to _args[1] || 0>>
<<set _amdLust to _args[2] || 0>>
<<set _amdType to _args[3] || "mixed">>
<<set _enemy to $combat.enemies[_amdIdx]>>
<<if _enemy>>
<<initPainPleasure _amdIdx>>
<<set _enemy.painThisTurn += _amdPhys>>
<<set _enemy.pleasureThisTurn += _amdLust>>
<<set $combat.enemies[_amdIdx].painThisTurn to _enemy.painThisTurn>>
<<set $combat.enemies[_amdIdx].pleasureThisTurn to _enemy.pleasureThisTurn>>
<<set _masoConversion to 0>>
<<if _enemy.masochism && _enemy.masochism > 0>>
<<set _masoConversion to Math.floor(_amdPhys * _enemy.masochism / 100)>>
<<set _amdLust += _masoConversion>>
<</if>>
<<getPositionDamageMultipliers _amdIdx>>
<<set _finalPhys to Math.floor(_amdPhys * _posDmgMult)>>
<<set _finalLust to Math.floor(_amdLust * _posLustMult)>>
<<applyResistanceToLustDamage _amdIdx _finalLust>>
<<set _finalLust to _resModifiedLust>>
<<if _enemy.health !== undefined>>
<<set _enemy.health to Math.max(0, _enemy.health - _finalPhys)>>
<<set $combat.enemies[_amdIdx].health to _enemy.health>>
<</if>>
<<set _enemy.lust to setup.enemyLustPlus(_enemy, _finalLust)>>
<<set $combat.enemies[_amdIdx].lust to _enemy.lust>>
<<updateArousalState _amdIdx>>
<div class="mixed-damage-display">
<div class="damage-numbers">
<<if _finalPhys gt 0>>
<span class="phys-damage"><<icon "attack" "small">> -<<print _finalPhys>> HP</span>
<</if>>
<<if _finalLust gt 0>>
<span class="lust-damage"><<icon "high-arousal" "small">> <<print "+" + _finalLust>> Lust</span>
<</if>>
</div>
<<if _masoConversion gt 0>>
<div class="masochism-bonus">
<<icon "heart" "tiny">> Pain → Pleasure: <<print "+" + _masoConversion>>
</div>
<</if>>
</div>
<<checkOverwhelm _amdIdx>>
<<discoverMasochism _amdIdx>>
<<applyResistanceFromAction _amdIdx _amdType>>
<<if _enemy && _finalPhys !== undefined && _finalLust !== undefined>>
<<set _mixedLogText to _enemy.name + " takes " + _finalPhys + " damage and +" + _finalLust + " lust!">>
<<logCombat _mixedLogText "mixed">>
<</if>>
<</if>>
<</widget>>
<<widget "checkOverwhelm">>
<<set _coIdx to _args[0] || 0>>
<<set _enemy to $combat.enemies[_coIdx]>>
<<if _enemy>>
<<initPainPleasure _coIdx>>
<<if _enemy.painThisTurn >= 15 && _enemy.pleasureThisTurn >= 15>>
<<if !_enemy.overwhelmed>>
<<set _enemy.overwhelmed to true>>
<<set _enemy.overwhelmedTurns to 2>>
<<set $combat.enemies[_coIdx].overwhelmed to true>>
<<set $combat.enemies[_coIdx].overwhelmedTurns to 2>>
<div class="overwhelm-trigger">
<<if _enemy.gender === "female">>
<<combatNarrative "overwhelm_trigger_female" "The mix of pain and pleasure is too much—her mind short-circuits, body trembling uncontrollably.">>
<<else>>
The mix of pain and pleasure overwhelms them completely.
<</if>>
<div class="overwhelm-effect">
<<icon "stunned" "small">> OVERWHELMED - 2 turns (Accuracy -30%, can't use abilities)
</div>
</div>
<<if _enemy>>
<<set _overwhelmLog to _enemy.name + " #" + (_coIdx + 1) + " is OVERWHELMED by pain and pleasure!">>
<<logCombat _overwhelmLog "critical">>
<</if>>
<</if>>
<</if>>
<</if>>
<</widget>>
<<widget "updateOverwhelmState">>
<<set _uosIdx to _args[0] || 0>>
<<set _enemy to $combat.enemies[_uosIdx]>>
<<if _enemy>>
<<initPainPleasure _uosIdx>>
<<set _enemy.painThisTurn to 0>>
<<set _enemy.pleasureThisTurn to 0>>
<<set $combat.enemies[_uosIdx].painThisTurn to 0>>
<<set $combat.enemies[_uosIdx].pleasureThisTurn to 0>>
<<if _enemy.overwhelmed && _enemy.overwhelmedTurns gt 0>>
<<set _enemy.overwhelmedTurns -= 1>>
<<set $combat.enemies[_uosIdx].overwhelmedTurns to _enemy.overwhelmedTurns>>
<<if _enemy.overwhelmedTurns <= 0>>
<<set _enemy.overwhelmed to false>>
<<set $combat.enemies[_uosIdx].overwhelmed to false>>
<div class="overwhelm-recover">
<<if _enemy.gender === "female">>
She recovers from the overwhelming sensations, though she's still shaky.
<<else>>
They recover from the overwhelming sensations.
<</if>>
</div>
<</if>>
<</if>>
<</if>>
<</widget>>
<<widget "discoverMasochism">>
<<set _dmIdx to _args[0] || 0>>
<<set _enemy to $combat.enemies[_dmIdx]>>
<<if _enemy && _enemy.gender === "female">>
<<initPainPleasure _dmIdx>>
<<if !_enemy.masochismRevealed && _enemy.masochism >= 15>>
<<if _enemy.painThisTurn >= 10>>
<<set _enemy.masochismRevealed to true>>
<<set $combat.enemies[_dmIdx].masochismRevealed to true>>
<div class="masochism-reveal">
<<combatNarrative "masochism_reveal" "Something shifts in her expression. The pain isn't making her weaker—it's turning her on. She's a masochist.">>
<div class="masochism-stat">
<<icon "heart" "small">> Masochism discovered: <<print _enemy.masochism>>%
</div>
</div>
<<if _enemy>>
<<set _masoLog to _enemy.name + " #" + (_dmIdx + 1) + " is a MASOCHIST! Pain converts to pleasure!">>
<<logCombat _masoLog "discovery">>
<</if>>
<</if>>
<</if>>
<</if>>
<</widget>>
<<widget "increaseMasochism">>
<<set _imIdx to _args[0] || 0>>
<<set _imAmount to _args[1] || 5>>
<<set _enemy to $combat.enemies[_imIdx]>>
<<if _enemy && _enemy.gender === "female">>
<<initPainPleasure _imIdx>>
<<set _oldMaso to _enemy.masochism>>
<<set _enemy.masochism to Math.min(75, _enemy.masochism + _imAmount)>>
<<set $combat.enemies[_imIdx].masochism to _enemy.masochism>>
<<if _enemy.masochism gt _oldMaso>>
<div class="masochism-increase">
<<icon "heart" "tiny">> Her masochism grows: <<print _enemy.masochism>>%
</div>
<</if>>
<</if>>
<</widget>>
<<widget "kiraPainPleasureAttack">>
<<set _kppaIdx to _args[0] || 0>>
<<set _kppaType to _args[1] || "scratch_kiss">>
<<set _enemy to $combat.enemies[_kppaIdx]>>
<<if _enemy>>
<<initPainPleasure _kppaIdx>>
<<set _painDmg to random(6, 12)>>
<<set _lustDmg to random(10, 18)>>
<div class="kira-pain-pleasure">
<<switch _kppaType>>
<<case "scratch_kiss">>
<<if _enemy.gender === "female">>
Kira rakes her nails down the woman's back, then presses soft kisses along the scratches. "Pain and pleasure, sweetie... it's all the same."
<<else>>
Kira scratches down his chest, then soothes the marks with teasing touches. "Hurts so good, doesn't it?"
<</if>>
<<case "bite_suck">>
<<if _enemy.gender === "female">>
Kira bites down on her neck hard enough to bruise, then sucks gently at the mark. The woman whimpers in confused arousal.
<<else>>
Kira bites his shoulder, then licks the wound. "You like that, don't you?"
<</if>>
<<default>>
Kira delivers a mix of pain and pleasure with expert precision.
<</switch>>
</div>
<<applyMixedDamage _kppaIdx _painDmg _lustDmg "kira_mixed">>
<</if>>
<</widget>><<widget "initEnemyAbilityState">>
<<set _initEnemy to _args[0]>>
<<if _initEnemy && !_initEnemy.abilityState>>
<<set _initEnemy.abilityState to {
cooldowns: {},
lastUsed: null,
usageCount: {},
rallyActive: false,
rallyTurns: 0
}>>
<</if>>
<</widget>>
<<widget "selectEnemyAbility">>
<<set _selEnemy to _args[0]>>
<<set _selTarget to _args[1] || "player">>
<<set _selectedAbility to null>>
<<if !_selEnemy.abilityState>>
<<initEnemyAbilityState _selEnemy>>
<</if>>
<<if _selEnemy.abilities && _selEnemy.abilities.length > 0>>
<<set _availableAbilities to []>>
<<for _abil range _selEnemy.abilities>>
<<set _onCooldown to false>>
<<if _selEnemy.abilityState.cooldowns[_abil] && _selEnemy.abilityState.cooldowns[_abil] > 0>>
<<set _onCooldown to true>>
<</if>>
<<if !_onCooldown>>
<<run _availableAbilities.push(_abil)>>
<</if>>
<</for>>
<<if _selEnemy.isCovering>>
<<set _selHadHeavy to _availableAbilities.includes("heavy_strike")>>
<<set _availableAbilities to _availableAbilities.filter(function (a) { return !setup.HEAVY_ABILITIES.includes(a); })>>
<<if _selHadHeavy && _selTarget === "player" && $player.health < ($player.maxHealth * 0.4)>>
<div class="covering-blocked">
<<combatNarrative "covering_cant_heavy" "She can't use her heavy attack while covering herself!">>
</div>
<</if>>
<</if>>
<<if _availableAbilities.length > 0>>
<<set _selectedAbility to null>>
<<if _availableAbilities.includes("rally_troops") && !_selEnemy.abilityState.rallyActive>>
<<if $combat.enemies.length >= 2>>
<<set _selectedAbility to "rally_troops">>
<</if>>
<</if>>
<<if !_selectedAbility && _availableAbilities.includes("intimidate")>>
<<if _selTarget === "player" && $player.health > ($player.maxHealth * 0.6)>>
<<if random(1, 100) <= 50>>
<<set _selectedAbility to "intimidate">>
<</if>>
<</if>>
<</if>>
<<if !_selectedAbility && _availableAbilities.includes("seductive_taunt")>>
<<if _selEnemy.gender === "female">>
<<if _selTarget === "player" && $player.lust < 50>>
<<if random(1, 100) <= 60>>
<<set _selectedAbility to "seductive_taunt">>
<</if>>
<</if>>
<</if>>
<</if>>
<<set _canUseHeavy to true>>
<<if _selEnemy.isCovering>>
<<set _canUseHeavy to false>>
<</if>>
<<if !_selectedAbility && _availableAbilities.includes("heavy_strike") && _canUseHeavy>>
<<set _targetWounded to false>>
<<if _selTarget === "player" && $player.health < ($player.maxHealth * 0.4)>>
<<set _targetWounded to true>>
<<elseif _selTarget === "kira">>
<<getCompanion "kira">>
<<if $tempCompanion.health < ($tempCompanion.maxHealth * 0.4)>>
<<set _targetWounded to true>>
<</if>>
<</if>>
<<set _targetVulnerable to false>>
<<if $combat.positions>>
<<if _selTarget === "player" && $combat.positions.player !== "standing">>
<<set _targetVulnerable to true>>
<<elseif _selTarget === "kira" && $combat.positions.kira !== "standing">>
<<set _targetVulnerable to true>>
<</if>>
<</if>>
<<if _targetWounded || _targetVulnerable>>
<<if random(1, 100) <= 70>>
<<set _selectedAbility to "heavy_strike">>
<</if>>
<</if>>
<</if>>
<<if !_selectedAbility && _availableAbilities.includes("power_strike")>>
<<set _targetWounded to false>>
<<if _selTarget === "player" && $player.health < ($player.maxHealth * 0.5)>>
<<set _targetWounded to true>>
<</if>>
<<set _targetStaggered to false>>
<<if _selTarget === "player" && $combat.playerEffects && $combat.playerEffects.staggered>>
<<set _targetStaggered to true>>
<</if>>
<<if _targetStaggered && random(1, 100) <= 80>>
<<set _selectedAbility to "power_strike">>
<<elseif _targetWounded && random(1, 100) <= 50>>
<<set _selectedAbility to "power_strike">>
<<elseif random(1, 100) <= 25>>
<<set _selectedAbility to "power_strike">>
<</if>>
<</if>>
<<if !_selectedAbility && _availableAbilities.includes("battle_cry")>>
<<if $combat.turn <= 2 && random(1, 100) <= 60>>
<<set _selectedAbility to "battle_cry">>
<<elseif random(1, 100) <= 20>>
<<set _selectedAbility to "battle_cry">>
<</if>>
<</if>>
<<if !_selectedAbility>>
<<set _bindAbility to null>>
<<if _availableAbilities.includes("rope_bind_master")>>
<<set _bindAbility to "rope_bind_master">>
<<elseif _availableAbilities.includes("rope_bind_quick")>>
<<set _bindAbility to "rope_bind_quick">>
<<elseif _availableAbilities.includes("rope_bind")>>
<<set _bindAbility to "rope_bind">>
<</if>>
<<if _bindAbility>>
<<set _targetBound to false>>
<<if _selTarget === "player" && $combat.playerEffects && $combat.playerEffects.bound > 0>>
<<set _targetBound to true>>
<</if>>
<<if !_targetBound && random(1, 100) <= 65>>
<<set _selectedAbility to _bindAbility>>
<</if>>
<</if>>
<</if>>
<<if !_selectedAbility>>
<<set _chainAbility to null>>
<<if _availableAbilities.includes("chain_swing_brutal")>>
<<set _chainAbility to "chain_swing_brutal">>
<<elseif _availableAbilities.includes("chain_swing")>>
<<set _chainAbility to "chain_swing">>
<</if>>
<<if _chainAbility && random(1, 100) <= 55>>
<<set _selectedAbility to _chainAbility>>
<</if>>
<</if>>
<<if !_selectedAbility>>
<<set _dirtyAbility to null>>
<<if _availableAbilities.includes("dirty_fighting_master")>>
<<set _dirtyAbility to "dirty_fighting_master">>
<<elseif _availableAbilities.includes("dirty_fighting_plus")>>
<<set _dirtyAbility to "dirty_fighting_plus">>
<<elseif _availableAbilities.includes("dirty_fighting")>>
<<set _dirtyAbility to "dirty_fighting">>
<</if>>
<<if _dirtyAbility>>
<<set _targetBleeding to false>>
<<if _selTarget === "player" && $combat.playerEffects && $combat.playerEffects.bleeding > 0>>
<<set _targetBleeding to true>>
<<elseif _selTarget === "kira" && $combat.kiraEffects && $combat.kiraEffects.bleeding > 0>>
<<set _targetBleeding to true>>
<</if>>
<<if !_targetBleeding && random(1, 100) <= 55>>
<<set _selectedAbility to _dirtyAbility>>
<<elseif random(1, 100) <= 30>>
<<set _selectedAbility to _dirtyAbility>>
<</if>>
<</if>>
<</if>>
<<if !_selectedAbility && _availableAbilities.includes("quick_strike")>>
<<if _selEnemy.health < (_selEnemy.maxHealth * 0.3)>>
<<if random(1, 100) <= 70>>
<<set _selectedAbility to "quick_strike">>
<</if>>
<<else>>
<<if random(1, 100) <= 40>>
<<set _selectedAbility to "quick_strike">>
<</if>>
<</if>>
<</if>>
<<if !_selectedAbility && _availableAbilities.includes("flurry")>>
<<set _targetExposed to false>>
<<if _selTarget === "player" && $clothing && $clothing.player>>
<<if $clothing.player.dickExposed || $clothing.player.assExposed>>
<<set _targetExposed to true>>
<</if>>
<<elseif _selTarget === "kira" && $clothing && $clothing.kira>>
<<if $clothing.kira.titsExposed || $clothing.kira.pussyExposed>>
<<set _targetExposed to true>>
<</if>>
<</if>>
<<if _targetExposed && random(1, 100) <= 65>>
<<set _selectedAbility to "flurry">>
<<elseif random(1, 100) <= 35>>
<<set _selectedAbility to "flurry">>
<</if>>
<</if>>
<<if !_selectedAbility>>
<<set _useChance to 25>>
<<if _selEnemy.tier === "elite">>
<<set _useChance to 45>>
<<elseif _selEnemy.tier === "champion">>
<<set _useChance to 55>>
<<elseif _selEnemy.tier === "boss">>
<<set _useChance to 70>>
<</if>>
<<set _selPool to _availableAbilities.filter(function (a) { return setup.abilityWorksOn(a, _selTarget); })>>
<<if _selPool.length > 0 && random(1, 100) <= _useChance>>
<<set _selectedAbility to either(_selPool)>>
<</if>>
<</if>>
<</if>>
<</if>>
<<set _returnAbility to _selectedAbility>>
<</widget>>
<<widget "executeEnemyAbility">>
<<set _execEnemy to _args[0]>>
<<set _execAbility to _args[1]>>
<<set _execTarget to _args[2] || "player">>
<<set _abilityResult to {
damage: 0,
damageMultiplier: 1,
accuracyMod: 0,
hits: 1,
effects: [],
narrative: "",
success: true
}>>
<<switch _execAbility>>
<<case "quick_strike">>
<<set _abilityResult.damageMultiplier to 0.8>>
<<set _abilityResult.accuracyMod to 20>>
<<set _abilityResult.narrative to _execEnemy.name + " strikes with lightning speed!">>
<<set _execEnemy.abilityState.cooldowns["quick_strike"] to 0>>
<<case "heavy_strike">>
<<set _abilityResult.damageMultiplier to 1.5>>
<<set _abilityResult.accuracyMod to -10>>
<<set _abilityResult.narrative to _execEnemy.name + " winds up for a DEVASTATING blow!">>
<<set _execEnemy.abilityState.cooldowns["heavy_strike"] to 1>>
<<case "dirty_fighting">>
<<set _abilityResult.damageMultiplier to 0.9>>
<<set _abilityResult.effects.push("bleed")>>
<<set _abilityResult.narrative to _execEnemy.name + " fights dirty - going for a vicious strike!">>
<<set _execEnemy.abilityState.cooldowns["dirty_fighting"] to 1>>
<<case "flurry">>
<<set _abilityResult.damageMultiplier to 0.6>>
<<set _abilityResult.accuracyMod to -20>>
<<set _abilityResult.hits to 2>>
<<set _abilityResult.narrative to _execEnemy.name + " unleashes a FLURRY of attacks!">>
<<set _execEnemy.abilityState.cooldowns["flurry"] to 2>>
<<case "intimidate">>
<<set _abilityResult.damage to 0>>
<<set _abilityResult.damageMultiplier to 0>>
<<set _abilityResult.effects.push("intimidate")>>
<<set _abilityResult.narrative to _execEnemy.name + " lets out a terrifying roar, trying to break " + (_execTarget === "kira" ? "Kira's" : "your") + " will!">>
<<set _execEnemy.abilityState.cooldowns["intimidate"] to 3>>
<<case "seductive_taunt">>
<<set _abilityResult.damage to 0>>
<<set _abilityResult.damageMultiplier to 0>>
<<set _abilityResult.effects.push("lust_damage")>>
<<set _abilityResult.narrative to _execEnemy.name + " runs her hands over her body provocatively...">>
<<set _execEnemy.abilityState.cooldowns["seductive_taunt"] to 2>>
<<case "rally_troops">>
<<set _abilityResult.damage to 0>>
<<set _abilityResult.damageMultiplier to 0>>
<<set _abilityResult.effects.push("rally")>>
<<set _abilityResult.narrative to _execEnemy.name + " shouts orders to their allies! \"GET THEM!\"">>
<<set _execEnemy.abilityState.cooldowns["rally_troops"] to 4>>
<<set _execEnemy.abilityState.rallyActive to true>>
<<set _execEnemy.abilityState.rallyTurns to 2>>
<<case "power_strike">>
<<set _abilityResult.damageMultiplier to 1.3>>
<<set _abilityResult.accuracyMod to 5>>
<<set _abilityResult.effects.push("stagger")>>
<<set _abilityResult.narrative to _execEnemy.name + " puts all their weight into a POWER STRIKE!">>
<<set _execEnemy.abilityState.cooldowns["power_strike"] to 2>>
<<case "battle_cry">>
<<set _abilityResult.damage to 0>>
<<set _abilityResult.damageMultiplier to 0>>
<<set _abilityResult.effects.push("battle_cry")>>
<<set _abilityResult.narrative to _execEnemy.name + " lets out a fearsome BATTLE CRY!">>
<<set _execEnemy.abilityState.cooldowns["battle_cry"] to 3>>
<<case "rope_bind">>
<<set _abilityResult.damageMultiplier to 0.5>>
<<set _abilityResult.effects.push("bind_attempt")>>
<<set _abilityResult.bindChance to 40>>
<<set _abilityResult.narrative to _execEnemy.name + " swings rope, trying to bind " + (_execTarget === "kira" ? "Kira" : "you") + "!">>
<<set _execEnemy.abilityState.cooldowns["rope_bind"] to 2>>
<<case "rope_bind_quick">>
<<set _abilityResult.damageMultiplier to 0.6>>
<<set _abilityResult.effects.push("bind_attempt")>>
<<set _abilityResult.bindChance to 55>>
<<set _abilityResult.narrative to _execEnemy.name + " whips rope with practiced speed!">>
<<set _execEnemy.abilityState.cooldowns["rope_bind_quick"] to 1>>
<<case "rope_bind_master">>
<<set _abilityResult.damageMultiplier to 0.7>>
<<set _abilityResult.effects.push("bind_attempt")>>
<<set _abilityResult.bindChance to 70>>
<<set _abilityResult.narrative to _execEnemy.name + " expertly lashes rope in a complex pattern!">>
<<set _execEnemy.abilityState.cooldowns["rope_bind_master"] to 1>>
<<case "chain_swing">>
<<set _abilityResult.damageMultiplier to 1.1>>
<<set _abilityResult.accuracyMod to -5>>
<<set _abilityResult.effects.push("stun_chance")>>
<<set _abilityResult.stunChance to 25>>
<<set _abilityResult.narrative to _execEnemy.name + " swings their chain in a wide arc!">>
<<set _execEnemy.abilityState.cooldowns["chain_swing"] to 1>>
<<case "chain_swing_brutal">>
<<set _abilityResult.damageMultiplier to 1.4>>
<<set _abilityResult.accuracyMod to 0>>
<<set _abilityResult.effects.push("stun_chance")>>
<<set _abilityResult.stunChance to 40>>
<<set _abilityResult.narrative to _execEnemy.name + " BRUTALLY swings their chain overhead!">>
<<set _execEnemy.abilityState.cooldowns["chain_swing_brutal"] to 2>>
<<case "dirty_fighting_plus">>
<<set _abilityResult.damageMultiplier to 1.0>>
<<set _abilityResult.effects.push("bleed_plus")>>
<<set _abilityResult.narrative to _execEnemy.name + " fights DIRTY - eye gouge incoming!">>
<<set _execEnemy.abilityState.cooldowns["dirty_fighting_plus"] to 1>>
<<case "dirty_fighting_master">>
<<set _abilityResult.damageMultiplier to 1.1>>
<<set _abilityResult.effects.push("bleed_master")>>
<<set _abilityResult.effects.push("debilitate")>>
<<set _abilityResult.narrative to _execEnemy.name + " executes a MASTERFUL dirty move - targeting " + (_execTarget === "kira" ? "Kira's" : "your") + " weak points!">>
<<set _execEnemy.abilityState.cooldowns["dirty_fighting_master"] to 2>>
<<case "seduction_irresistible">>
<<set _abilityResult.damage to 0>>
<<set _abilityResult.damageMultiplier to 0>>
<<set _abilityResult.effects.push("lust_damage_heavy")>>
<<set _abilityResult.effects.push("charm_attempt")>>
<<set _abilityResult.narrative to _execEnemy.name + " locks eyes with " + (_execTarget === "kira" ? "Kira" : "you") + ", her gaze IRRESISTIBLE...">>
<<set _execEnemy.abilityState.cooldowns["seduction_irresistible"] to 3>>
<<case "charm_gaze">>
<<set _abilityResult.damage to 0>>
<<set _abilityResult.damageMultiplier to 0>>
<<set _abilityResult.effects.push("charm_gaze")>>
<<set _abilityResult.narrative to _execEnemy.name + " holds " + (_execTarget === "kira" ? "Kira's" : "your") + " eyes, and the world goes soft at the edges...">>
<<default>>
<<set _abilityResult.narrative to _execEnemy.name + " attacks!">>
<</switch>>
<<set _execEnemy.abilityState.lastUsed to _execAbility>>
<<if !_execEnemy.abilityState.usageCount[_execAbility]>>
<<set _execEnemy.abilityState.usageCount[_execAbility] to 0>>
<</if>>
<<set _execEnemy.abilityState.usageCount[_execAbility] += 1>>
<<set _returnAbilityResult to _abilityResult>>
<</widget>>
<<widget "applyAbilityEffects">>
<<set _effectsEnemy to _args[0]>>
<<set _effectsList to _args[1]>>
<<set _effectsTarget to _args[2] || "player">>
<<for _effect range _effectsList>>
<<switch _effect>>
<<case "bleed">>
<<if random(1, 100) <= 30>>
<<applyBleed _effectsTarget 3>>
<</if>>
<<case "intimidate">>
<<if random(1, 100) <= 60>>
<<applyIntimidation _effectsTarget>>
<<elseif _effectsTarget === "kira">>
<div class="ability-resisted">Kira glares back, unshaken.</div>
<<else>>
<div class="ability-resisted">You steel yourself against the intimidation!</div>
<</if>>
<<case "lust_damage">>
<<set _tauntLust to random(8, 15)>>
<<if _effectsTarget === "player">>
<<set $player.lust to Math.min(100, Number($player.lust) + _tauntLust)>>
<div class="lust-effect seductive">
<<icon "lips">> Her provocative display inflames your desire! (<<print "+" + _tauntLust>> Lust)
</div>
<<elseif _effectsTarget === "kira">>
<div class="ability-effect">
Kira looks away, distracted by the display.
</div>
<</if>>
<<case "rally">>
<<for _ally range $combat.enemies>>
<<if _ally !== _effectsEnemy>>
<<if !_ally.buffs>><<set _ally.buffs to {}>><</if>>
<<set _ally.buffs.rallied to 2>>
<</if>>
<</for>>
<div class="ability-effect rally">
All enemies are rallied! (+25% damage for 2 turns)
</div>
<<case "stagger">>
<<if random(1, 100) <= 50>>
<<if _effectsTarget === "player">>
<<if !$combat.playerEffects>><<set $combat.playerEffects to {}>><</if>>
<<set $combat.playerEffects.staggered to 1>>
<div class="ability-effect stagger">You're STAGGERED! (-20% accuracy next turn)</div>
<<elseif _effectsTarget === "kira">>
<<if !$combat.kiraEffects>><<set $combat.kiraEffects to {}>><</if>>
<<set $combat.kiraEffects.staggered to 1>>
<div class="ability-effect stagger">Kira is STAGGERED!</div>
<</if>>
<</if>>
<<case "battle_cry">>
<<if !_effectsEnemy.buffs>><<set _effectsEnemy.buffs to {}>><</if>>
<<set _effectsEnemy.buffs.battle_fury to 2>>
<div class="ability-effect battle-cry">
<<print _effectsEnemy.name>> gains BATTLE FURY! (+30% damage, +10% accuracy for 2 turns)
</div>
<<if random(1, 100) <= 40>>
<<applyIntimidation _effectsTarget>>
<</if>>
<<case "bind_attempt">>
<<set _bindChance to (_args[3] && _args[3].bindChance) || 40>>
<<if random(1, 100) <= _bindChance>>
<<if _effectsTarget === "player">>
<<if !$combat.playerEffects>><<set $combat.playerEffects to {}>><</if>>
<<set $combat.playerEffects.bound to 3>>
<div class="ability-effect bound">You're BOUND! (No moving or grappling: you can't flee or evade for 2 turns)</div>
<<elseif _effectsTarget === "kira">>
<<if !$combat.kiraEffects>><<set $combat.kiraEffects to {}>><</if>>
<<set $combat.kiraEffects.bound to 2>>
<<set $combat.kiraWristsBound to true>>
<div class="ability-effect bound">Kira is BOUND! (She can't attack until she slips free)</div>
<</if>>
<<elseif _effectsTarget === "kira">>
<div class="ability-resisted">Kira twists out of the rope!</div>
<<else>>
<div class="ability-resisted">You slip free of the rope!</div>
<</if>>
<<case "stun_chance">>
<<set _stunChance to (_args[3] && _args[3].stunChance) || 25>>
<<if random(1, 100) <= _stunChance>>
<<if _effectsTarget === "player">>
<<if !$combat.playerEffects>><<set $combat.playerEffects to {}>><</if>>
<<set $combat.playerEffects.stunned to 1>>
<<run setup.stunPlayer(1, "stun")>>
<div class="ability-effect stunned">The chain impact STUNS you!</div>
<<elseif _effectsTarget === "kira">>
<<if !$combat.kiraEffects>><<set $combat.kiraEffects to {}>><</if>>
<<set $combat.kiraEffects.stunned to 1>>
<<set $combat.kiraStunned to Math.max($combat.kiraStunned || 0, 1)>>
<div class="ability-effect stunned">The chain impact STUNS Kira!</div>
<</if>>
<</if>>
<<case "bleed_plus">>
<<if random(1, 100) <= 50>>
<<applyBleed _effectsTarget 5>>
<div class="ability-effect bleed">A vicious wound opens! (Strong bleed)</div>
<</if>>
<<case "bleed_master">>
<<applyBleed _effectsTarget 6>>
<div class="ability-effect bleed">A deep, bleeding wound! (Severe bleed)</div>
<<case "debilitate">>
<<if _effectsTarget === "player">>
<<if !$combat.playerEffects>><<set $combat.playerEffects to {}>><</if>>
<<set $combat.playerEffects.debilitated to 2>>
<div class="ability-effect debilitate">You're DEBILITATED! (-25% damage for 2 turns)</div>
<<elseif _effectsTarget === "kira">>
<<if !$combat.kiraEffects>><<set $combat.kiraEffects to {}>><</if>>
<<set $combat.kiraEffects.debilitated to 2>>
<div class="ability-effect debilitate">Kira is DEBILITATED!</div>
<</if>>
<<case "lust_damage_heavy">>
<<set _heavyLust to random(18, 28)>>
<<if _effectsTarget === "player">>
<<set $player.lust to Math.min(100, Number($player.lust) + _heavyLust)>>
<div class="lust-effect irresistible">
Her gaze penetrates your defenses! (+<<print _heavyLust>> Lust)
</div>
<</if>>
<<case "charm_attempt" "charm_gaze">>
<<set _charmPct to (_effect === "charm_gaze" ? (Number($enemyAbilities && $enemyAbilities.charm_gaze && $enemyAbilities.charm_gaze.successChance) || 50) : 35)>>
<<if random(1, 100) <= _charmPct>>
<<if _effectsTarget === "player">>
<<if !$combat.playerEffects>><<set $combat.playerEffects to {}>><</if>>
<<set $combat.playerEffects.charmed to 1>>
<div class="ability-effect charmed">You're CHARMED! (1 in 4 chance you lose your next turn)</div>
<<elseif _effectsTarget === "kira">>
<<if !$combat.kiraEffects>><<set $combat.kiraEffects to {}>><</if>>
<<set $combat.kiraEffects.charmed to 1>>
<div class="ability-effect charmed">Kira is CHARMED! (1 in 4 chance she loses her next turn)</div>
<</if>>
<<elseif _effectsTarget === "kira">>
<div class="ability-resisted">Kira shakes off the charm!</div>
<<else>>
<div class="ability-resisted">You shake off the charm!</div>
<</if>>
<</switch>>
<</for>>
<</widget>>
<<widget "tickAbilityCooldowns">>
<<for _enemy range $combat.enemies>>
<<if _enemy.abilityState && _enemy.abilityState.cooldowns>>
<<for _cdKey, _cdVal range _enemy.abilityState.cooldowns>>
<<if _cdVal > 0>>
<<set _enemy.abilityState.cooldowns[_cdKey] -= 1>>
<</if>>
<</for>>
<<if _enemy.abilityState.rallyActive && _enemy.abilityState.rallyTurns > 0>>
<<set _enemy.abilityState.rallyTurns -= 1>>
<<if _enemy.abilityState.rallyTurns <= 0>>
<<set _enemy.abilityState.rallyActive to false>>
<</if>>
<</if>>
<</if>>
<<if _enemy.buffs>>
<<for _buffKey, _buffVal range _enemy.buffs>>
<<if _buffVal > 0>>
<<set _enemy.buffs[_buffKey] -= 1>>
<</if>>
<</for>>
<</if>>
<</for>>
<</widget>>
<<widget "getEnemyDamageModifiers">>
<<set _returnDamageMod to setup.enemyDamageFactor(_args[0])>>
<</widget>><<widget "buildCombo">>
<<set _comboAction to _args[0]>>
<<set _comboTarget to _args[1]>>
<<if !$combat.combo>>
<<set $combat.combo to { count: 0, lastAction: "", target: -1, bonus: 0 }>>
<</if>>
<<if _comboTarget === $combat.combo.target || $combat.combo.target === -1>>
<<set $combat.combo.count += 1>>
<<set $combat.combo.target to _comboTarget>>
<<set $combat.combo.lastAction to _comboAction>>
<<switch $combat.combo.count>>
<<case 1>>
<<set $combat.combo.bonus to 0>>
<<case 2>>
<<set $combat.combo.bonus to 10>>
<<case 3>>
<<set $combat.combo.bonus to 20>>
<<case 4>>
<<set $combat.combo.bonus to 30>>
<<default>>
<<set $combat.combo.bonus to 40>>
<</switch>>
<<if $combat.combo.count >= 2>>
<div class="combo-build">
<span class="combo-count"><<print $combat.combo.count>>x COMBO!</span>
<<if $combat.combo.bonus gt 0>>
<span class="combo-bonus"><<print "+" + $combat.combo.bonus>>% damage</span>
<</if>>
</div>
<</if>>
<<else>>
<<set $combat.combo.count to 0>>
<<set $combat.combo.target to _comboTarget>>
<<set $combat.combo.lastAction to _comboAction>>
<<set $combat.combo.bonus to 0>>
<</if>>
<</widget>>
<<widget "breakCombo">>
<<set _breakReason to _args[0] || "">>
<<if $combat.combo && $combat.combo.count >= 2>>
<div class="combo-break">
<<if _breakReason>>
Combo broken! (<<print _breakReason>>)
<<else>>
Combo broken!
<</if>>
</div>
<</if>>
<<set $combat.combo to { count: 0, lastAction: "", target: -1, bonus: 0 }>>
<</widget>>
<<widget "getComboBonus">>
<<if $combat.combo && $combat.combo.bonus gt 0>>
<<set _returnComboMult to 1 + ($combat.combo.bonus / 100)>>
<<else>>
<<set _returnComboMult to 1.0>>
<</if>>
<</widget>>
<<widget "displayComboStatus">>
<<if $combat.combo && $combat.combo.count >= 2>>
<div class="combo-status">
<span class="combo-label">COMBO</span>
<span class="combo-value"><<print $combat.combo.count>>x</span>
<<if $combat.combo.bonus gt 0>>
<span class="combo-dmg-bonus">(<<print "+" + $combat.combo.bonus>>%)</span>
<</if>>
<<if setup.finisherUsable()>>
<span class="finisher-indicator">FINISH!</span>
<</if>>
</div>
<</if>>
<</widget>>
<<widget "canFinisher">>
<<if $combat.combo && $combat.combo.count >= 3 && $player.energy >= 8>>
<<set _canFinisher to true>>
<<else>>
<<set _canFinisher to false>>
<</if>>
<</widget>><<widget "setEnemyExpression">>
<<set _seeEnemy to _args[0]>>
<<set _seeExpr to _args[1]>>
<<set _seeTTL to _args[2] !== undefined ? _args[2] : 1>>
<<if _seeEnemy>>
<<set _seeEnemy.combatExpression to _seeExpr>>
<<set _seeEnemy.expressionTTL to _seeTTL>>
<</if>>
<</widget>>
<<widget "tickEnemyExpressions">>
<<if $combat && $combat.enemies>>
<<for _i, _tee range $combat.enemies>>
<<if _tee.expressionTTL !== undefined && _tee.expressionTTL > 0>>
<<set _tee.expressionTTL -= 1>>
<</if>>
<<if !_tee.expressionTTL || _tee.expressionTTL <= 0>>
<<set _teeHP to _tee.health || 0>>
<<set _teeMax to _tee.maxHealth || 100>>
<<set _teePct to _teeHP / _teeMax * 100>>
<<if _teePct < 10>>
<<set _tee.combatExpression to "defiant">>
<<elseif _teePct < 33>>
<<set _tee.combatExpression to "fearful">>
<<else>>
<<set _tee.combatExpression to "hostile">>
<</if>>
<<set _tee.expressionTTL to 0>>
<</if>>
<</for>>
<</if>>
<</widget>>
<<widget "applyEnemyDamageExpression">>
<<set _aedEnemy to _args[0]>>
<<if _aedEnemy>>
<<set _aedHP to _aedEnemy.health || 0>>
<<set _aedMax to _aedEnemy.maxHealth || 100>>
<<set _aedPct to _aedHP / _aedMax * 100>>
<<if _aedPct < 10>>
<<setEnemyExpression _aedEnemy "defiant" 0>>
<<elseif _aedPct < 33>>
<<setEnemyExpression _aedEnemy "fearful" 0>>
<<else>>
<<setEnemyExpression _aedEnemy "wounded" 1>>
<</if>>
<</if>>
<</widget>><<widget "initResistance">>
<<set _resIdx to _args[0] || 0>>
<<if $combat.enemies[_resIdx]>>
<<set _enemy to $combat.enemies[_resIdx]>>
<<if _enemy.resistance === undefined>>
<<set _baseRes to 80>>
<<if _enemy.will>>
<<set _baseRes to Math.min(100, 60 + _enemy.will)>>
<</if>>
<<if _enemy.type === "raider">>
<<set _baseRes to Math.max(50, _baseRes - 20)>>
<</if>>
<<set _enemy.resistance to _baseRes>>
<<set $combat.enemies[_resIdx].resistance to _baseRes>>
<</if>>
<<if _enemy.resistanceState === undefined>>
<<set _enemy.resistanceState to "fighting">>
<<set $combat.enemies[_resIdx].resistanceState to "fighting">>
<</if>>
<<if _enemy.resistanceBreaks === undefined>>
<<set _enemy.resistanceBreaks to 0>>
<<set $combat.enemies[_resIdx].resistanceBreaks to 0>>
<</if>>
<<if _enemy.hasBegged === undefined>>
<<set _enemy.hasBegged to false>>
<<set $combat.enemies[_resIdx].hasBegged to false>>
<</if>>
<<if _enemy.cncPhase === undefined>>
<<set _enemy.cncPhase to "verbal_no">>
<<set $combat.enemies[_resIdx].cncPhase to "verbal_no">>
<</if>>
<</if>>
<</widget>>
<<widget "addResistance">>
<<set _arIdx to _args[0] || 0>>
<<set _arAmount to _args[1] || 0>>
<<if $combat.enemies[_arIdx]>>
<<initResistance _arIdx>>
<<set _enemy to $combat.enemies[_arIdx]>>
<<set _oldRes to _enemy.resistance>>
<<set _enemy.resistance to Math.min(100, Math.max(0, _enemy.resistance + _arAmount))>>
<<set $combat.enemies[_arIdx].resistance to _enemy.resistance>>
<<updateResistanceState _arIdx>>
<<if _arAmount lt 0>>
<div class="resistance-change negative">
<<icon "broken-shield" "small">> <<print Math.abs(_arAmount)>> Resistance broken
</div>
<<elseif _arAmount gt 0>>
<div class="resistance-change positive">
<<icon "shield" "small">> <<print "+" + _arAmount>> Resistance recovered
</div>
<</if>>
<</if>>
<</widget>>
<<widget "updateResistanceState">>
<<set _ursIdx to _args[0] || 0>>
<<set _enemy to $combat.enemies[_ursIdx]>>
<<if _enemy>>
<<initResistance _ursIdx>>
<<set _res to _enemy.resistance>>
<<set _oldState to _enemy.resistanceState>>
<<if _res >= 70>>
<<set _enemy.resistanceState to "fighting">>
<<elseif _res >= 40>>
<<set _enemy.resistanceState to "resisting">>
<<elseif _res >= 20>>
<<set _enemy.resistanceState to "conflicted">>
<<elseif _res >= 1>>
<<set _enemy.resistanceState to "submitting">>
<<else>>
<<set _enemy.resistanceState to "broken">>
<</if>>
<<set $combat.enemies[_ursIdx].resistanceState to _enemy.resistanceState>>
<<if _enemy.resistanceState === "submitting" || _enemy.resistanceState === "broken">>
<<set _enemy.beenUsed to true>>
<<set $combat.enemies[_ursIdx].beenUsed to true>>
<<set _enemy.sexUsed to _enemy.sexUsed === true>>
<<set $combat.enemies[_ursIdx].sexUsed to _enemy.sexUsed>>
<<run setup.countWomanUsed($combat.enemies[_ursIdx])>>
<</if>>
<<if _oldState !== _enemy.resistanceState>>
<<displayResistanceThreshold _ursIdx _enemy.resistanceState _oldState>>
<</if>>
<</if>>
<</widget>>
<<widget "displayResistanceThreshold">>
<<set _drtIdx to _args[0]>>
<<set _newState to _args[1]>>
<<set _oldState to _args[2]>>
<<set _enemy to $combat.enemies[_drtIdx]>>
<<if _enemy && $combat.phase !== "enemy">>
<<set _gs to setup.genderSuffix(_enemy.gender)>>
<<set _p to setup.pronouns(_enemy.gender)>>
<<set _resFallbacks to {
resisting: _p.His + " struggles are growing weaker. " + _p.He + "'s still fighting, but you can feel " + _p.his + " resolve cracking.",
conflicted: "\"N-no... stop...\" But " + _p.his + " body is betraying " + _p.his + " words. " + (_p.isFemale ? _p.His + " hips twitch involuntarily." : _p.His + " cock twitches against " + _p.his + " will."),
submitting: "The fight drains from " + _p.his + " body. " + _p.He + " stops struggling, " + _p.his + " resistance crumbling.",
broken: _p.He + "'s completely given in. No more resistance—just acceptance."
}>>
<<set _resPoolMap to {resisting: "resistance_weakening", conflicted: "resistance_conflicted", submitting: "resistance_submitting", broken: "resistance_broken"}>>
<div @class="'resistance-threshold threshold-' + (_newState)">
<<set _poolKey to _resPoolMap[_newState] + _gs>>
<<combatNarrative _poolKey _resFallbacks[_newState]>>
</div>
<</if>>
<</widget>>
<<widget "getResistanceModifiers">>
<<set _grmIdx to _args[0] || 0>>
<<set _resEscapeBonus to 0>>
<<set _resGrabPenalty to 0>>
<<set _resLustResist to 0>>
<<set _resDmgResist to 0>>
<<set _resStruggleDmg to 0>>
<<if $combat.enemies[_grmIdx]>>
<<initResistance _grmIdx>>
<<set _resState to $combat.enemies[_grmIdx].resistanceState || "fighting">>
<<switch _resState>>
<<case "fighting">>
<<set _resEscapeBonus to 20>>
<<set _resGrabPenalty to -15>>
<<set _resLustResist to 20>>
<<set _resDmgResist to 10>>
<<set _resStruggleDmg to 5>>
<<case "resisting">>
<<set _resEscapeBonus to 10>>
<<set _resGrabPenalty to -5>>
<<set _resLustResist to 10>>
<<set _resDmgResist to 5>>
<<set _resStruggleDmg to 3>>
<<case "conflicted">>
<<set _resEscapeBonus to 0>>
<<set _resGrabPenalty to 5>>
<<set _resLustResist to 0>>
<<set _resDmgResist to 0>>
<<set _resStruggleDmg to 1>>
<<case "submitting">>
<<set _resEscapeBonus to -10>>
<<set _resGrabPenalty to 15>>
<<set _resLustResist to -10>>
<<set _resDmgResist to -5>>
<<set _resStruggleDmg to 0>>
<<case "broken">>
<<set _resEscapeBonus to -25>>
<<set _resGrabPenalty to 30>>
<<set _resLustResist to -25>>
<<set _resDmgResist to -10>>
<<set _resStruggleDmg to 0>>
<</switch>>
<</if>>
<</widget>>
<<widget "displayResistanceStatus">>
<<set _drsEnemy to _args[0]>>
<<if _drsEnemy && _drsEnemy.resistance !== undefined>>
<<set _resState to _drsEnemy.resistanceState || "fighting">>
<<switch _resState>>
<<case "fighting">>
<span class="status-badge status-resistance res-fighting"
@title="'Fighting (' + _drsEnemy.resistance + '/100) - Full resistance, escape +20%'">
<<icon "shield" "small">>
</span>
<<case "resisting">>
<span class="status-badge status-resistance res-resisting"
@title="'Resisting (' + _drsEnemy.resistance + '/100) - Weakened but still struggling'">
<<icon "shield" "small">>
</span>
<<case "conflicted">>
<span class="status-badge status-resistance res-conflicted"
@title="'Conflicted (' + _drsEnemy.resistance + '/100) - Body betraying mind'">
<<icon "broken-shield" "small">>
</span>
<<case "submitting">>
<span class="status-badge status-resistance res-submitting"
@title="'Submitting (' + _drsEnemy.resistance + '/100) - Giving in'">
<<icon "broken-shield" "small">>
</span>
<<case "broken">>
<span class="status-badge status-resistance res-broken"
@title="'Broken (' + _drsEnemy.resistance + '/100) - No resistance remains'">
<<icon "broken-shield" "small">>
</span>
<</switch>>
<</if>>
<</widget>>
<<widget "applyResistanceDecay">>
<<set _ardIdx to _args[0] || 0>>
<<set _enemy to $combat.enemies[_ardIdx]>>
<<if _enemy>>
<<initResistance _ardIdx>>
<<set _decay to 0>>
<<if _enemy.lust && _enemy.lust >= 30>>
<<set _lustDecay to Math.floor((_enemy.lust - 30) / 10)>>
<<set _decay += _lustDecay>>
<</if>>
<<if _enemy.humiliation && _enemy.humiliation >= 30>>
<<set _humDecay to Math.floor((_enemy.humiliation - 30) / 15)>>
<<set _decay += _humDecay>>
<</if>>
<<if _enemy.clothing>>
<<if _enemy.clothing.titsExposed && _enemy.clothing.pussyExposed>>
<<set _decay += 3>>
<<elseif _enemy.clothing.titsExposed || _enemy.clothing.pussyExposed>>
<<set _decay += 1>>
<</if>>
<</if>>
<<if _enemy.position && _enemy.position !== "standing">>
<<switch _enemy.position>>
<<case "pinned">>
<<set _decay += 5>>
<<case "bent_over">>
<<set _decay += 4>>
<<case "prone_front" "prone_back">>
<<set _decay += 3>>
<<case "kneeling">>
<<set _decay += 2>>
<</switch>>
<</if>>
<<if _decay gt 0>>
<<set _enemy.resistance to Math.max(0, _enemy.resistance - _decay)>>
<<set $combat.enemies[_ardIdx].resistance to _enemy.resistance>>
<<updateResistanceState _ardIdx>>
<</if>>
<</if>>
<</widget>>
<<widget "applyResistanceFromAction">>
<<set _arfaIdx to _args[0] || 0>>
<<set _actionType to _args[1] || "generic">>
<<set _resLoss to 0>>
<<switch _actionType>>
<<case "grope">>
<<set _resLoss to 3>>
<<case "slap">>
<<set _resLoss to 4>>
<<case "finger">>
<<set _resLoss to 6>>
<<case "oral">>
<<set _resLoss to 8>>
<<case "penetration">>
<<set _resLoss to 10>>
<<case "anal">>
<<set _resLoss to 12>>
<<case "forced_orgasm">>
<<set _resLoss to 20>>
<<case "denial">>
<<set _resLoss to 5>>
<<case "degradation">>
<<set _resLoss to 7>>
<<default>>
<<set _resLoss to 2>>
<</switch>>
<<addResistance _arfaIdx `-_resLoss`>>
<</widget>>
<<widget "updateCncPhase">>
<<set _ucpIdx to _args[0] || 0>>
<<set _enemy to $combat.enemies[_ucpIdx]>>
<<if _enemy>>
<<initResistance _ucpIdx>>
<<set _oldPhase to _enemy.cncPhase>>
<<switch _enemy.resistanceState>>
<<case "fighting">>
<<set _enemy.cncPhase to "verbal_no">>
<<case "resisting">>
<<set _enemy.cncPhase to "physical_struggle">>
<<case "conflicted">>
<<set _enemy.cncPhase to "weak_struggle">>
<<case "submitting">>
<<set _enemy.cncPhase to "token_resistance">>
<<case "broken">>
<<set _enemy.cncPhase to "submission">>
<</switch>>
<<set $combat.enemies[_ucpIdx].cncPhase to _enemy.cncPhase>>
<<if _oldPhase !== _enemy.cncPhase>>
<<displayCncPhaseChange _ucpIdx _enemy.cncPhase _oldPhase>>
<</if>>
<</if>>
<</widget>>
<<widget "displayCncPhaseChange">>
<<set _dcpcIdx to _args[0]>>
<<set _newPhase to _args[1]>>
<<set _oldPhase to _args[2]>>
<<set _enemy to $combat.enemies[_dcpcIdx]>>
<<if _enemy && $combat.phase !== "enemy">>
<<set _genderSuffix to setup.genderSuffix(_enemy.gender)>>
<<set _p to setup.pronouns(_enemy.gender)>>
<div @class="'cnc-phase-change phase-' + (_newPhase)" @data-enemy-idx="_dcpcIdx">
<<switch _newPhase>>
<<case "physical_struggle">>
<<print _p.His>> "no"s become less convincing, though <<print _p.his>> body still fights. The struggle is weakening.
<<case "weak_struggle">>
<<print _p.His>> struggles are token now—more for show than genuine resistance. <<print _p.His>> body is responding.
<<case "token_resistance">>
<<print _p.He>>'s barely resisting anymore. A quiet "please" that could mean either stop or continue.
<<case "submission">>
All resistance fades. <<print _p.He>>'s given <<print _p.himself>> over completely.
<</switch>>
</div>
<</if>>
<</widget>>
<<widget "applyResistanceToLustDamage">>
<<set _arldIdx to _args[0] || 0>>
<<set _arldBaseLust to _args[1] || 10>>
<<getResistanceModifiers _arldIdx>>
<<set _resModifiedLust to Math.floor(_arldBaseLust * (100 - _resLustResist) / 100)>>
<<set _resModifiedLust to Math.max(1, _resModifiedLust)>>
<</widget>>
<<widget "checkResistanceEscape">>
<<set _creIdx to _args[0] || 0>>
<<set _actionDiff to _args[1] || 3>>
<<set _enemy to $combat.enemies[_creIdx]>>
<<set _resistedAction to false>>
<<if _enemy>>
<<initResistance _creIdx>>
<<if _enemy.resistanceState === "fighting" || _enemy.resistanceState === "resisting">>
<<set _baseEscapeChance to (_enemy.resistanceState === "fighting") ? 25 : 10>>
<<set _escapeChance to Math.max(5, _baseEscapeChance - (_actionDiff * 5))>>
<<if random(1, 100) <= _escapeChance>>
<<set _resistedAction to true>>
<<displayResistanceEscape _creIdx>>
<</if>>
<</if>>
<</if>>
<</widget>>
<<widget "displayResistanceEscape">>
<<set _dreIdx to _args[0]>>
<<set _enemy to $combat.enemies[_dreIdx]>>
<<if _enemy>>
<<set _gs to setup.genderSuffix(_enemy.gender)>>
<<set _p to setup.pronouns(_enemy.gender)>>
<div class="resistance-escape">
<<set _poolKey to "resistance_escape" + _gs>>
<<set _fallbackText to _p.He + " twists violently, breaking your hold! " + _p.His + " eyes blaze with defiance.">>
<<combatNarrative _poolKey _fallbackText>>
</div>
<</if>>
<</widget>>
<<widget "canBreakWill">>
<<set _cbwIdx to _args[0] || $combat.currentTarget || 0>>
<<set _enemy to $combat.enemies[_cbwIdx]>>
<<set _canBreakWill to false>>
<<if _enemy>>
<<initResistance _cbwIdx>>
<<if _enemy.resistanceState !== "broken" && _enemy.resistanceState !== "submitting">>
<<if _enemy.position && _enemy.position !== "standing">>
<<set _canBreakWill to true>>
<</if>>
<<if _enemy.clothing && (_enemy.clothing.titsExposed || _enemy.clothing.pussyExposed)>>
<<set _canBreakWill to true>>
<</if>>
<</if>>
<</if>>
<</widget>>
<<widget "canForceBeg">>
<<set _cfbIdx to _args[0] || $combat.currentTarget || 0>>
<<set _enemy to $combat.enemies[_cfbIdx]>>
<<set _canForceBeg to false>>
<<if _enemy>>
<<initResistance _cfbIdx>>
<<if _enemy.resistance <= 40 && !_enemy.hasBegged>>
<<set _canForceBeg to true>>
<</if>>
<</if>>
<</widget>><<widget "applyWeaponEffects">>
<<set _effectTarget to _args[0]>>
<<set _effectWeapon to _args[1]>>
<<set _effectDamage to _args[2]>>
<<set _effectEnemy to _args[3] || null>>
<<if _effectWeapon && _effectWeapon.effects>>
<<set _effects to _effectWeapon.effects>>
<<if _effects.bleed && random(1, 100) <= (_effects.bleed * 100)>>
<<applyBleed _effectTarget 3>>
<</if>>
<<if _effects.stun && random(1, 100) <= (_effects.stun * 100)>>
<<applyStun _effectTarget 1>>
<</if>>
<<if _effects.knockdown && random(1, 100) <= (_effects.knockdown * 100)>>
<<if _effectTarget === "player">>
<<knockdown "player" "random">>
<<elseif _effectTarget === "kira">>
<<knockdown "kira" "random">>
<</if>>
<</if>>
<<if _effects.bind && random(1, 100) <= (_effects.bind * 100)>>
<<applyBind _effectTarget>>
<</if>>
<<if _effects.restrain && random(1, 100) <= (_effects.restrain * 100)>>
<<applyRestrain _effectTarget>>
<</if>>
<<if _effects.choke && random(1, 100) <= (_effects.choke * 100)>>
<<applyChoke _effectTarget>>
<</if>>
<<if _effects.welt && random(1, 100) <= (_effects.welt * 100)>>
<<applyWelt _effectTarget _effectWeapon.name>>
<</if>>
<<if _effects.intimidate && random(1, 100) <= (_effects.intimidate * 100)>>
<<applyIntimidation _effectTarget>>
<</if>>
<</if>>
<<if _effectWeapon && _effectWeapon.lustImpact>>
<<applyLustImpact _effectTarget _effectWeapon _effectEnemy>>
<</if>>
<</widget>>
<<widget "applyBleed">>
<<set _bleedTarget to _args[0]>>
<<set _bleedDuration to _args[1] || 3>>
<<if _bleedTarget === "player">>
<<if !$combat.playerEffects>><<set $combat.playerEffects to {}>><</if>>
<<set $combat.playerEffects.bleeding to _bleedDuration>>
<<set $combat.playerEffects.bleedDamage to 3>>
<div class="status-applied bleed">
<span class="effect-icon"><<icon "bleeding" "small">></span> You're bleeding! (-3 HP per turn for <<print _bleedDuration>> turns)
</div>
<<set _bleedLog to "BLEEDING! -3 HP/turn for " + _bleedDuration + " turns">>
<<logCombat _bleedLog "status">>
<<elseif _bleedTarget === "kira">>
<<if !$combat.kiraEffects>><<set $combat.kiraEffects to {}>><</if>>
<<set $combat.kiraEffects.bleeding to _bleedDuration>>
<<set $combat.kiraEffects.bleedDamage to 3>>
<div class="status-applied bleed">
<span class="effect-icon"><<icon "bleeding" "small">></span> Kira is bleeding! (-3 HP per turn for <<print _bleedDuration>> turns)
</div>
<<set _bleedKiraLog to "Kira BLEEDING! -3 HP/turn for " + _bleedDuration + " turns">>
<<logCombat _bleedKiraLog "status">>
<</if>>
<</widget>>
<<widget "applyStun">>
<<set _stunTarget to _args[0]>>
<<set _stunDuration to _args[1] || 1>>
<<if _stunTarget === "player">>
<<set $combat.playerDazed to true>>
<<set $combat.playerDazedTurns to _stunDuration>>
<<set $combat.playerDazedCause to "stun">>
<div class="status-applied stun">
<span class="effect-icon">💫</span> You're stunned! (Skip <<print _stunDuration>> turn<<if _stunDuration > 1>>s<</if>>)
</div>
<<set _stunLog to "STUNNED! Skip " + _stunDuration + " turn" + (_stunDuration > 1 ? "s" : "")>>
<<logCombat _stunLog "status">>
<<elseif _stunTarget === "kira">>
<<set $combat.kiraDazed to true>>
<<set $combat.kiraDazedTurns to _stunDuration>>
<div class="status-applied stun">
<span class="effect-icon">💫</span> Kira is stunned! (Skip <<print _stunDuration>> turn<<if _stunDuration > 1>>s<</if>>)
</div>
<<set _stunKiraLog to "Kira STUNNED! Skip " + _stunDuration + " turn" + (_stunDuration > 1 ? "s" : "")>>
<<logCombat _stunKiraLog "status">>
<<set _stunCfg to setup.enemyLustTriggersConfig?.stunned || {min: 6, max: 10}>>
<<addMaleEnemyLust `random(_stunCfg.min, _stunCfg.max)` "kira_stunned">>
<</if>>
<</widget>>
<<widget "applyBind">>
<<set _bindTarget to _args[0]>>
<<if _bindTarget === "player">>
<<if !$combat.playerEffects>><<set $combat.playerEffects to {}>><</if>>
<<set $combat.playerEffects.wristsBound to true>>
<<set $combat.playerWristsBound to true>>
<div class="status-applied bind">
<span class="effect-icon">🔗</span> Your wrists are bound! (Damage -25%, no grabbing or stripping, 30% escape chance per turn)
</div>
<<if $combat.log>>
<<run $combat.log.push({type: "debuff", text: "Player's wrists bound!", icon: "bound"})>>
<</if>>
<<elseif _bindTarget === "kira">>
<<set $combat.kiraWristsBound to true>>
<div class="status-applied bind">
<span class="effect-icon">🔗</span> Kira's wrists are bound! (Can't attack, 30% escape chance per turn)
</div>
<<if $combat.log>>
<<run $combat.log.push({type: "debuff", text: "Kira's wrists bound!", icon: "bound"})>>
<</if>>
<<set _boundCfg to setup.enemyLustTriggersConfig?.bound || {wrists: {min: 8, max: 12}, ankles: {min: 8, max: 12}}>>
<<addMaleEnemyLust `random(_boundCfg.wrists.min, _boundCfg.wrists.max)` "kira_wrists_bound">>
<</if>>
<</widget>>
<<widget "applyRestrain">>
<<set _restrainTarget to _args[0]>>
<<if _restrainTarget === "player">>
<<if !$combat.playerEffects>><<set $combat.playerEffects to {}>><</if>>
<<set $combat.playerEffects.anklesBound to true>>
<<set $combat.playerAnklesBound to true>>
<<knockdown "player" "prone_back">>
<div class="status-applied restrain">
<<icon "bound">> Your ankles are bound! (Can't stand, 20% escape chance per turn)
</div>
<<if $combat.log>>
<<run $combat.log.push({type: "debuff", text: "Player's ankles bound!", icon: "bound"})>>
<</if>>
<<elseif _restrainTarget === "kira">>
<<set $combat.kiraAnklesBound to true>>
<<knockdown "kira" "prone_back">>
<div class="status-applied restrain">
<<icon "bound">> Kira's ankles are bound! (Can't stand, 20% escape chance per turn)
</div>
<<if $combat.log>>
<<run $combat.log.push({type: "debuff", text: "Kira's ankles bound!", icon: "bound"})>>
<</if>>
<<set _boundCfg to setup.enemyLustTriggersConfig?.bound || {wrists: {min: 8, max: 12}, ankles: {min: 8, max: 12}}>>
<<addMaleEnemyLust `random(_boundCfg.ankles.min, _boundCfg.ankles.max)` "kira_ankles_bound">>
<</if>>
<</widget>>
<<widget "applyChoke">>
<<set _chokeTarget to _args[0]>>
<<if _chokeTarget === "player">>
<<set _chokeDmg to random(2, 5)>>
<<set _negChokeDmg to -_chokeDmg>>
<<clampStat "player.health" _negChokeDmg 0 100>>
<div class="status-applied choke">
<span class="effect-icon">😵</span> The chain wraps around your throat! (-<<print _chokeDmg>> HP)
<<if random(1, 100) <= 30>>
<<applyStun "player" 1>>
<</if>>
</div>
<<elseif _chokeTarget === "kira">>
<<getCompanion "kira">>
<<set _chokeDmg to Math.floor(random(2, 4) * setup.kiraDamageTakenFactor())>>
<<set $tempCompanion.health to setup.kiraFloorHealth(Math.max(0, $tempCompanion.health - _chokeDmg))>>
<<updateCompanion "kira">>
<div class="status-applied choke">
<span class="effect-icon">😵</span> The chain wraps around Kira's throat! (-<<print _chokeDmg>> HP)
<<if random(1, 100) <= 30>>
<<applyStun "kira" 1>>
<</if>>
</div>
<</if>>
<</widget>>
<<widget "applyWelt">>
<<set _weltTarget to _args[0]>>
<<set _weltWeaponName to _args[1] || "weapon">>
<<if _weltTarget === "player">>
<<if !$combat.playerEffects>><<set $combat.playerEffects to {}>><</if>>
<<set $combat.playerEffects.welts to ($combat.playerEffects.welts || 0) + 1>>
<<set _weltCount to $combat.playerEffects.welts>>
<div class="status-applied welt">
<<if _weltCount === 1>>
<span class="effect-icon">📛</span> The <<print _weltWeaponName.toLowerCase()>> leaves a stinging welt on your skin!
<<elseif _weltCount === 2>>
<span class="effect-icon">📛</span> Another welt! The pain is building... (<<print _weltCount>> welts - accuracy -<<print setup.weltAccuracyPct(_weltCount)>>%)
<<elseif _weltCount >= 3>>
<span class="effect-icon">📛</span> Your skin burns with overlapping welts! (<<print _weltCount>> welts - accuracy -<<print setup.weltAccuracyPct(_weltCount)>>%)
<</if>>
</div>
<<if _weltCount === 1>>
<<logCombat "Welt inflicted!" "status">>
<<elseif _weltCount >= 2>>
<<set _weltLog to "Welt #" + _weltCount + "! Accuracy -" + setup.weltAccuracyPct(_weltCount) + "%">>
<<logCombat _weltLog "status">>
<</if>>
<<elseif _weltTarget === "kira">>
<<if !$combat.kiraEffects>><<set $combat.kiraEffects to {}>><</if>>
<<set $combat.kiraEffects.welts to ($combat.kiraEffects.welts || 0) + 1>>
<<set _weltCount to $combat.kiraEffects.welts>>
<div class="status-applied welt">
<<if _weltCount === 1>>
<span class="effect-icon">📛</span> The <<print _weltWeaponName.toLowerCase()>> leaves a red welt on Kira's skin!
<<elseif _weltCount === 2>>
<span class="effect-icon">📛</span> Kira gasps as another welt forms! (<<print _weltCount>> welts - her accuracy -<<print setup.weltAccuracyPct(_weltCount)>>%)
<<elseif _weltCount >= 3>>
<span class="effect-icon">📛</span> Kira's skin is striped with welts! (<<print _weltCount>> welts - her accuracy -<<print setup.weltAccuracyPct(_weltCount)>>%)
<</if>>
</div>
<<if _weltCount === 1>>
<<logCombat "Kira welt inflicted!" "status">>
<<elseif _weltCount >= 2>>
<<set _weltKiraLog to "Kira welt #" + _weltCount + "! Her accuracy -" + setup.weltAccuracyPct(_weltCount) + "%">>
<<logCombat _weltKiraLog "status">>
<</if>>
<<set _weltCfg to setup.enemyLustTriggersConfig?.welt || {base: 5, perWeltBonus: 3}>>
<<set _weltLustGain to _weltCfg.base + (_weltCount * _weltCfg.perWeltBonus)>>
<<addMaleEnemyLust _weltLustGain "kira_welted">>
<</if>>
<</widget>>
<<widget "applyIntimidation">>
<<set _intimidateTarget to _args[0]>>
<<if _intimidateTarget === "player">>
<<if !$combat.playerEffects>><<set $combat.playerEffects to {}>><</if>>
<<set $combat.playerEffects.intimidated to 2>>
<div class="status-applied intimidate">
<span class="effect-icon"><<icon "afraid" "small">></span> The vicious attack intimidates you! (Damage -20% for 2 turns)
</div>
<<elseif _intimidateTarget === "kira">>
<<if !$combat.kiraEffects>><<set $combat.kiraEffects to {}>><</if>>
<<set $combat.kiraEffects.intimidated to 2>>
<div class="status-applied intimidate">
<span class="effect-icon"><<icon "afraid" "small">></span> Kira flinches from the brutal display! (Her damage -20% for 2 turns)
</div>
<</if>>
<</widget>>
<<widget "applyLustImpact">>
<<set _lustTarget to _args[0]>>
<<set _lustWeapon to _args[1]>>
<<set _lustEnemy to _args[2]>>
<<if _lustWeapon && _lustWeapon.lustImpact && _lustWeapon.sexualUse>>
<<set _targetLust to _lustWeapon.lustImpact.target || 0>>
<<set _attackerLust to _lustWeapon.lustImpact.attacker || 0>>
<<set _exposureMultiplier to 1>>
<<if _lustTarget === "player">>
<<if $clothing && $clothing.player>>
<<if $clothing.player.dickExposed>><<set _exposureMultiplier += 0.5>><</if>>
<<if $clothing.player.assExposed>><<set _exposureMultiplier += 0.3>><</if>>
<</if>>
<<elseif _lustTarget === "kira">>
<<if $clothing && $clothing.kira>>
<<if $clothing.kira.titsExposed>><<set _exposureMultiplier += 0.4>><</if>>
<<if $clothing.kira.pussyExposed>><<set _exposureMultiplier += 0.5>><</if>>
<<if $clothing.kira.assExposed>><<set _exposureMultiplier += 0.3>><</if>>
<</if>>
<</if>>
<<set _finalLust to Math.floor(_targetLust * _exposureMultiplier)>>
<<if _finalLust > 0>>
<<if _lustTarget === "player">>
<<set $player.lust to Math.min(100, Number($player.lust) + _finalLust)>>
<<if _exposureMultiplier > 1>>
<div class="lust-effect exposed">
<span class="effect-icon"><<icon "fire" "small">></span> The <<print _lustWeapon.name.toLowerCase()>> on your exposed skin sends unwanted shivers through you! (<<print "+" + _finalLust>> Lust)
</div>
<<else>>
<div class="lust-effect">
<span class="effect-icon"><<icon "fire" "small">></span> <<print "+" + _finalLust>> Lust
</div>
<</if>>
<<elseif _lustTarget === "kira">>
<<if $companions && $companions[0]>>
<<addKiraLust _finalLust>>
<<if _exposureMultiplier > 1>>
<<if $combat.kiraInRefractory>>
<<trackPostOrgasmAttack "grope">>
<</if>>
<<addKiraLust `Math.floor(_finalLust * 0.5)`>>
<div class="lust-effect exposed">
<span class="effect-icon"><<icon "fire" "small">></span> Kira gasps as the <<print _lustWeapon.name.toLowerCase()>> strikes her exposed flesh! (<<print "+" + (_finalLust + Math.floor(_finalLust * 0.5))>> Lust)
</div>
<<else>>
<div class="lust-effect">
<span class="effect-icon"><<icon "fire" "small">></span> Kira: <<print "+" + _finalLust>> Lust
</div>
<</if>>
<</if>>
<</if>>
<</if>>
<<if _lustEnemy && _attackerLust > 0 && _lustEnemy.canSeduce>>
<<set _lustEnemy.lust to setup.enemyLustPlus(_lustEnemy, _attackerLust)>>
<</if>>
<</if>>
<</widget>>
<<widget "processWeaponEffectsTurn">>
<<if $combat.playerEffects>>
<<if $combat.playerEffects.bleeding && $combat.playerEffects.bleeding > 0>>
<<set _bleedDmg to $combat.playerEffects.bleedDamage || 3>>
<<set _negBleedDmg to -_bleedDmg>>
<<clampStat "player.health" _negBleedDmg 0 100>>
<<set $combat.playerEffects.bleeding -= 1>>
<div class="dot-damage bleed"><<icon "bleeding" "small">> You bleed for <<print _bleedDmg>> damage! <<if $combat.playerEffects.bleeding > 0>>(<<print $combat.playerEffects.bleeding>> turns remaining)<<else>>(Bleeding stopped)<</if>></div>
<</if>>
<<if $combat.playerEffects.staggered > 0>><<set $combat.playerEffects.staggered -= 1>><</if>>
<<if $combat.playerEffects.debilitated > 0>><<set $combat.playerEffects.debilitated -= 1>><</if>>
<<if $combat.playerEffects.intimidated && $combat.playerEffects.intimidated > 0>>
<<set $combat.playerEffects.intimidated -= 1>>
<<if $combat.playerEffects.intimidated <= 0>>
<div class="effect-expired">You shake off the fear.</div>
<</if>>
<</if>>
<<if $combat.playerEffects.wristsBound || $combat.playerWristsBound>>
<<if random(1, 100) <= 30>>
<<set $combat.playerEffects.wristsBound to false>>
<<set $combat.playerWristsBound to false>>
<div class="effect-expired">You manage to slip free of your bonds!</div>
<</if>>
<</if>>
<<if $combat.playerEffects.anklesBound || $combat.playerAnklesBound>>
<<if random(1, 100) <= 20>>
<<set $combat.playerEffects.anklesBound to false>>
<<set $combat.playerAnklesBound to false>>
<div class="effect-expired">You kick free of the restraints!</div>
<</if>>
<</if>>
<</if>>
<<if $combat.kiraEffects>>
<<if $combat.kiraEffects.staggered > 0>><<set $combat.kiraEffects.staggered -= 1>><</if>>
<<if $combat.kiraEffects.debilitated > 0>><<set $combat.kiraEffects.debilitated -= 1>><</if>>
<<if $combat.kiraEffects.bleeding && $combat.kiraEffects.bleeding > 0>>
<<getCompanion "kira">>
<<set _bleedDmg to $combat.kiraEffects.bleedDamage || 3>>
<<set $tempCompanion.health to setup.kiraFloorHealth(Math.max(1, $tempCompanion.health - _bleedDmg))>>
<<updateCompanion "kira">>
<<set $combat.kiraEffects.bleeding -= 1>>
<div class="dot-damage bleed"><<icon "bleeding" "small">> Kira bleeds for <<print _bleedDmg>> damage! <<if $combat.kiraEffects.bleeding > 0>>(<<print $combat.kiraEffects.bleeding>> turns remaining)<<else>>(Bleeding stopped)<</if>></div>
<</if>>
<<if $combat.kiraEffects.intimidated && $combat.kiraEffects.intimidated > 0>>
<<set $combat.kiraEffects.intimidated -= 1>>
<<if $combat.kiraEffects.intimidated <= 0>>
<div class="effect-expired">Kira steels herself.</div>
<</if>>
<</if>>
<</if>>
<</widget>><<widget "getWeaponEscalationTier">>
<<set _wetIdx to _args[0] || 0>>
<<set _wetEnemy to $combat.enemies[_wetIdx]>>
<<set _weaponTier to 1>>
<<set _weaponTierName to "combat">>
<<if _wetEnemy>>
<<set _wetLust to _wetEnemy.lust || 0>>
<<if _wetLust >= 60>>
<<set _weaponTier to 3>>
<<set _weaponTierName to "sexual_tool">>
<<elseif _wetLust >= 30>>
<<set _weaponTier to 2>>
<<set _weaponTierName to "sexual_awareness">>
<<else>>
<<set _weaponTier to 1>>
<<set _weaponTierName to "combat">>
<</if>>
<<set _wetEnemy.weaponTier to _weaponTier>>
<<set $combat.enemies[_wetIdx].weaponTier to _weaponTier>>
<</if>>
<</widget>>
<<widget "getWeaponAttackNarrative">>
<<set _wanIdx to _args[0] || 0>>
<<set _wanAttack to _args[1] || "basic">>
<<set _wanTarget to _args[2] || "kira">>
<<set _wanEnemy to $combat.enemies[_wanIdx]>>
<<set _weaponNarrative to "">>
<<if _wanEnemy && _wanEnemy.weapon>>
<<getWeaponEscalationTier _wanIdx>>
<<set _weaponNarrative to setup.weaponLine(_wanEnemy, _wanAttack, _weaponTier, _wanTarget)>>
<</if>>
<</widget>>
<<widget "selectWeaponEscalationAttack">>
<<set _sweaIdx to _args[0] || 0>>
<<set _sweaTarget to _args[1] || "kira">>
<<set _sweaEnemy to $combat.enemies[_sweaIdx]>>
<<set _escalationAttack to "basic">>
<<set _escalationNarrative to "">>
<<if _sweaEnemy && _sweaEnemy.weapon>>
<<getWeaponEscalationTier _sweaIdx>>
<<if _sweaTarget === "kira">>
<<set _tc to $clothing.kira || {}>>
<<set _isBound to ($combat.kiraWristsBound || $combat.kiraAnklesBound)>>
<<set _isFullyBound to ($combat.kiraWristsBound && $combat.kiraAnklesBound)>>
<<set _isLeashed to $combat.kiraLeashed || false>>
<<else>>
<<set _tc to $clothing.player || {}>>
<<set _isBound to ($combat.playerWristsBound || $combat.playerAnklesBound)>>
<<set _isFullyBound to ($combat.playerWristsBound && $combat.playerAnklesBound)>>
<<set _isLeashed to false>>
<</if>>
<<set _titsOut to _tc.titsExposed || false>>
<<set _pussyOut to _tc.pussyExposed || false>>
<<set _assOut to _tc.assExposed || false>>
<<set _anyExposed to (_titsOut || _pussyOut || _assOut)>>
<<switch _sweaEnemy.weapon>>
<<case "rusty_pipe">>
<<if _weaponTier === 1>>
<<set _escalationAttack to "swing">>
<<elseif _weaponTier === 2>>
<<if _anyExposed && random(1, 100) <= 40>>
<<set _escalationAttack to "clothing_hit">>
<<else>>
<<set _escalationAttack to "swing">>
<</if>>
<<else>>
<<set _roll to random(1, 100)>>
<<if _pussyOut && _roll <= 35>>
<<set _escalationAttack to "threat">>
<<elseif _pussyOut && _roll <= 55>>
<<set _escalationAttack to "spreader">>
<<elseif _roll <= 75>>
<<set _escalationAttack to "leverage">>
<<else>>
<<set _escalationAttack to "choke">>
<</if>>
<</if>>
<<case "chain">>
<<if _weaponTier === 1>>
<<set _escalationAttack to "swing">>
<<elseif _weaponTier === 2>>
<<if _isBound>>
<<set _escalationAttack to "choke">>
<<elseif random(1, 100) <= 50>>
<<set _escalationAttack to "wrap">>
<<else>>
<<set _escalationAttack to "swing">>
<</if>>
<<else>>
<<if _isFullyBound>>
<<if _anyExposed>>
<<set _escalationAttack to "choke_fuck">>
<<else>>
<<set _escalationAttack to "strip">>
<</if>>
<<elseif _isLeashed>>
<<if _titsOut>>
<<set _escalationAttack to "frame">>
<<else>>
<<set _escalationAttack to "choke">>
<</if>>
<<elseif _isBound>>
<<set _roll to random(1, 100)>>
<<if _roll <= 40>>
<<set _escalationAttack to "leash">>
<<else>>
<<set _escalationAttack to "choke_fuck">>
<</if>>
<<else>>
<<set _roll to random(1, 100)>>
<<if _roll <= 30>>
<<set _escalationAttack to "leash">>
<<elseif _roll <= 55>>
<<set _escalationAttack to "bind">>
<<elseif _titsOut && _roll <= 75>>
<<set _escalationAttack to "frame">>
<<else>>
<<set _escalationAttack to "choke_fuck">>
<</if>>
<</if>>
<</if>>
<<case "leather_belt">>
<<if _weaponTier === 1>>
<<set _escalationAttack to "whip">>
<<elseif _weaponTier === 2>>
<<set _roll to random(1, 100)>>
<<if _roll <= 40>>
<<set _escalationAttack to "strip">>
<<elseif _roll <= 70>>
<<set _escalationAttack to "tease">>
<<else>>
<<set _escalationAttack to "whip">>
<</if>>
<<else>>
<<set _roll to random(1, 100)>>
<<if _roll <= 25>>
<<set _escalationAttack to "collar">>
<<elseif _roll <= 45>>
<<set _escalationAttack to "bind">>
<<elseif _anyExposed && _roll <= 75>>
<<set _escalationAttack to "punishment">>
<<else>>
<<set _escalationAttack to "fuck">>
<</if>>
<</if>>
<<case "combat knife" "rusty_shiv">>
<<if _weaponTier === 1>>
<<set _escalationAttack to "slash">>
<<elseif _weaponTier === 2>>
<<set _roll to random(1, 100)>>
<<if _roll <= 40>>
<<set _escalationAttack to "cut_clothes">>
<<elseif _roll <= 70>>
<<set _escalationAttack to "intimidate">>
<<else>>
<<set _escalationAttack to "strip">>
<</if>>
<<else>>
<<set _roll to random(1, 100)>>
<<if _pussyOut && _roll <= 40>>
<<set _escalationAttack to "threat">>
<<elseif _roll <= 70>>
<<set _escalationAttack to "control">>
<<else>>
<<set _escalationAttack to "mark">>
<</if>>
<</if>>
<<case "riding_crop">>
<<if _weaponTier === 1>>
<<set _escalationAttack to "strike">>
<<elseif _weaponTier === 2>>
<<if random(1, 100) <= 50>>
<<set _escalationAttack to "tease">>
<<else>>
<<set _escalationAttack to "punish">>
<</if>>
<<else>>
<<set _roll to random(1, 100)>>
<<if _pussyOut && _roll <= 40>>
<<set _escalationAttack to "pussy">>
<<elseif _titsOut && _roll <= 70>>
<<set _escalationAttack to "tits">>
<<else>>
<<set _escalationAttack to "submission">>
<</if>>
<</if>>
<<case "rope">>
<<if _weaponTier === 1>>
<<set _escalationAttack to "lash">>
<<elseif _weaponTier === 2>>
<<if _isBound>>
<<if _anyExposed>>
<<set _escalationAttack to "tease">>
<<else>>
<<set _escalationAttack to "strip">>
<</if>>
<<elseif random(1, 100) <= 50>>
<<set _escalationAttack to "bind_light">>
<<else>>
<<set _escalationAttack to "tease">>
<</if>>
<<else>>
<<if _isFullyBound>>
<<if _anyExposed>>
<<set _escalationAttack to "fuck">>
<<else>>
<<set _escalationAttack to "strip">>
<</if>>
<<elseif _isBound>>
<<set _roll to random(1, 100)>>
<<if _roll <= 40>>
<<set _escalationAttack to "hogtie">>
<<elseif _anyExposed>>
<<set _escalationAttack to "tease">>
<<else>>
<<set _escalationAttack to "strip">>
<</if>>
<<else>>
<<set _roll to random(1, 100)>>
<<if _roll <= 30>>
<<set _escalationAttack to "hogtie">>
<<elseif _roll <= 55>>
<<set _escalationAttack to "harness">>
<<elseif _roll <= 75>>
<<set _escalationAttack to "suspension">>
<<else>>
<<set _escalationAttack to "fuck">>
<</if>>
<</if>>
<</if>>
<<case "broken_bottle">>
<<if _weaponTier === 1>>
<<set _escalationAttack to "slash">>
<<elseif _weaponTier === 2>>
<<if random(1, 100) <= 50>>
<<set _escalationAttack to "cut_clothes">>
<<else>>
<<set _escalationAttack to "intimidate">>
<</if>>
<<else>>
<<if random(1, 100) <= 50>>
<<set _escalationAttack to "threat">>
<<else>>
<<set _escalationAttack to "control">>
<</if>>
<</if>>
<<case "baseball_bat">>
<<if _weaponTier === 1>>
<<set _escalationAttack to "swing">>
<<elseif _weaponTier === 2>>
<<if random(1, 100) <= 50>>
<<set _escalationAttack to "intimidate">>
<<else>>
<<set _escalationAttack to "clothing">>
<</if>>
<<else>>
<<set _roll to random(1, 100)>>
<<if _pussyOut && _roll <= 40>>
<<set _escalationAttack to "threat">>
<<elseif _roll <= 70>>
<<set _escalationAttack to "spread">>
<<else>>
<<set _escalationAttack to "leverage">>
<</if>>
<</if>>
<<default>>
<<set _escalationAttack to "basic">>
<</switch>>
<<getWeaponAttackNarrative _sweaIdx _escalationAttack _sweaTarget>>
<<set _escalationNarrative to _weaponNarrative>>
<<applyEscalationEffect _escalationAttack _sweaTarget>>
<</if>>
<</widget>>
<<widget "applyEscalationEffect">>
<<set _aeType to _args[0]>>
<<set _aeTarget to _args[1] || "kira">>
<<switch _aeType>>
<<case "hogtie">>
<<if _aeTarget === "kira" && !$combat.kiraWristsBound>>
<<set $combat.kiraWristsBound to true>>
<<set $combat.kiraAnklesBound to true>>
<<knockdown "kira" "prone_front">>
<<addMaleEnemyLust `random(10, 15)` "kira_hogtied">>
<<elseif _aeTarget === "player" && !$combat.playerWristsBound>>
<<set $combat.playerWristsBound to true>>
<<set $combat.playerAnklesBound to true>>
<<knockdown "player" "prone_front">>
<</if>>
<<case "harness" "suspension">>
<<if _aeTarget === "kira" && !$combat.kiraWristsBound>>
<<set $combat.kiraWristsBound to true>>
<<if _aeType === "suspension">>
<<set $combat.positions.kira to "suspended">>
<</if>>
<<addMaleEnemyLust `random(8, 12)` "kira_harnessed">>
<</if>>
<<case "bind" "bind_light">>
<<if _aeTarget === "kira" && !$combat.kiraWristsBound>>
<<applyBind "kira">>
<<elseif _aeTarget === "player" && !$combat.playerWristsBound>>
<<applyBind "player">>
<</if>>
<<case "leash">>
<<if _aeTarget === "kira" && !$combat.kiraLeashed>>
<<set $combat.kiraLeashed to true>>
<<addMaleEnemyLust `random(5, 8)` "kira_leashed">>
<</if>>
<<case "frame">>
<<if _aeTarget === "kira">>
<<set $combat.kiraWristsBound to true>>
<<set $combat.kiraAnklesBound to true>>
<<set $combat.positions.kira to "spread">>
<<addMaleEnemyLust `random(12, 18)` "kira_framed">>
<</if>>
<<case "choke" "choke_fuck">>
<<applyChoke _aeTarget>>
<<case "strip" "cut_clothes" "clothing" "clothing_hit">>
<<if _aeTarget === "kira">>
<<set _stripPart to either("top", "bottom")>>
<<set _stripDmg to random(20, 35)>>
<<damageClothing "kira" _stripPart _stripDmg>>
<<elseif _aeTarget === "player">>
<<set _stripPart to either("top", "bottom")>>
<<set _stripDmg to random(15, 25)>>
<<damageClothing "player" _stripPart _stripDmg>>
<</if>>
<<case "tease" "pussy" "tits">>
<<set _teaseLust to random(5, 10)>>
<<if _aeTarget === "kira">>
<<addKiraLust _teaseLust>>
<<elseif _aeTarget === "player">>
<<clampStat "player.lust" _teaseLust>>
<</if>>
<<case "intimidate" "threat" "control">>
<<applyIntimidation _aeTarget>>
<<case "spreader" "spread" "leverage">>
<<if _aeTarget === "kira">>
<<knockdown "kira" "bent_over">>
<<elseif _aeTarget === "player">>
<<knockdown "player" "bent_over">>
<</if>>
<<case "fuck">>
<<if _aeTarget === "kira">>
<<addKiraLust `random(3, 6)`>>
<</if>>
<<case "punish" "punishment" "submission">>
<<if _aeTarget === "kira">>
<<addKiraLust `random(3, 8)`>>
<<set _dmg to -random(2, 4)>>
<<clampStat "companions[0].health" _dmg 0 100>>
<</if>>
<<case "whip" "lash" "swing" "slash" "strike" "basic" "wrap" "mark" "collar">>
<<set _minorLust to random(2, 5)>>
<<if _aeTarget === "kira" && $clothing && $clothing.kira && ($clothing.kira.titsExposed || $clothing.kira.pussyExposed)>>
<<addKiraLust _minorLust>>
<<elseif _aeTarget === "player" && $clothing && $clothing.player && ($clothing.player.assExposed || $clothing.player.dickExposed)>>
<<clampStat "player.lust" _minorLust>>
<</if>>
<<default>>
<</switch>>
<</widget>>
/* -----------------------------------------------------------------------------
displayWeaponEscalation - Show weapon escalation status change
Args: enemyIndex, previousTier<<widget "getCompanion">>
<<set _compId to _args[0]>>
<<set $tempCompanion to null>>
<<for _comp range $companions>>
<<if _comp.id === _compId>>
<<set $tempCompanion to _comp>>
<<break>>
<</if>>
<</for>>
<</widget>>
<<widget "updateCompanion">>
<<set _compId to _args[0]>>
<<if $tempCompanion>>
<<if typeof $tempCompanion.health === "number" && $tempCompanion.health < 0>>
<<set $tempCompanion.health to 0>>
<</if>>
<<if _compId === "kira" && $tempCompanion.id === "kira">>
<<set $tempCompanion.health to setup.kiraFloorHealth($tempCompanion.health)>>
<</if>>
<<for _i, _comp range $companions>>
<<if _comp.id === _compId>>
<<set $companions[_i] to clone($tempCompanion)>>
<<break>>
<</if>>
<</for>>
<</if>>
<</widget>>
<<widget "relationChange">>
<<set _compId to _args[0]>>
<<set _stat to _args[1]>>
<<set _amount to _args[2]>>
<<for _i, _comp range $companions>>
<<if _comp.id === _compId>>
<<if (_stat === "trust" || _stat === "affection") && _amount > 0>>
<<set _current to $companions[_i][_stat] || 0>>
<<if _current >= 80>>
<<set _scale to 0.15>>
<<elseif _current >= 60>>
<<set _scale to 0.3>>
<<elseif _current >= 40>>
<<set _scale to 0.5>>
<<elseif _current >= 20>>
<<set _scale to 0.7>>
<<else>>
<<set _scale to 1.0>>
<</if>>
<<set _amount to Math.max(1, Math.round(_amount * _scale))>>
<</if>>
<<set $companions[_i][_stat] += _amount>>
<<if _stat === "trust" || _stat === "affection">>
<<set $companions[_i][_stat] to Math.clamp($companions[_i][_stat], -100, 100)>>
<<elseif _stat === "lust" || _stat === "submission" || _stat === "jealousy" || _stat === "tension">>
<<set $companions[_i][_stat] to Math.clamp($companions[_i][_stat], 0, 100)>>
<</if>>
<<break>>
<</if>>
<</for>>
<</widget>>
<<widget "addTension">>
<<set _compId to _args[0]>>
<<set _amount to Number(_args[1]) || 0>>
<<set _thought to _args[2] || "">>
<<set _source to _args[3] || "">>
<<for _i, _comp range $companions>>
<<if _comp.id === _compId && _amount < 0>>
<<set $companions[_i].tension to Math.max(0, Math.min(100, (Number($companions[_i].tension) || 0) + Math.round(_amount)))>>
<<if _thought !== "">>
<<if !$companions[_i].thoughts>>
<<set $companions[_i].thoughts to []>>
<</if>>
<<run $companions[_i].thoughts.push(_thought)>>
<</if>>
<<break>>
<<elseif _comp.id === _compId && _amount === 0>>
<<break>>
<<elseif _comp.id === _compId>>
<<if _source === "combat">>
<<set _trust to $companions[_i].trust || 0>>
<<if _trust < 30>>
<<set _amount to Math.round(_amount * 0.5)>>
<<elseif _trust < 50>>
<<set _amount to Math.round(_amount * 0.75)>>
<</if>>
<<if !$combat._tensionGained>><<set $combat._tensionGained to 0>><</if>>
<<set _remaining to Math.max(0, 15 - $combat._tensionGained)>>
<<set _amount to Math.min(_amount, _remaining)>>
<<if _amount <= 0>><<break>><</if>>
<<if !$flags._combatTensionToday>><<set $flags._combatTensionToday to 0>><</if>>
<<if $flags._combatTensionToday >= 1>>
<<set _amount to Math.max(1, Math.round(_amount * 0.5))>>
<</if>>
<<set $combat._tensionGained += _amount>>
<</if>>
<<set _current to $companions[_i].tension || 0>>
<<if _current >= 80>>
<<set _scale to 0.15>>
<<elseif _current >= 60>>
<<set _scale to 0.3>>
<<elseif _current >= 40>>
<<set _scale to 0.5>>
<<elseif _current >= 20>>
<<set _scale to 0.7>>
<<else>>
<<set _scale to 1.0>>
<</if>>
<<set _scaledAmount to Math.max(1, Math.round(_amount * _scale))>>
<<set $companions[_i].tension += _scaledAmount>>
<<set $companions[_i].tension to Math.max(0, Math.min($companions[_i].tension, 100))>>
<<if _thought !== "">>
<<if !$companions[_i].thoughts>>
<<set $companions[_i].thoughts to []>>
<</if>>
<<run $companions[_i].thoughts.push(_thought)>>
<</if>>
<<if $tensionConfig && $companions[_i].tension >= $tensionConfig.breakThreshold>>
<<set $flags.tensionBreakPending to _compId>>
<</if>>
<<break>>
<</if>>
<</for>>
<</widget>>
<<widget "addTrust">>
<<set _compId to _args[0]>>
<<set _amount to _args[1]>>
<<for _i, _comp range $companions>>
<<if _comp.id === _compId>>
<<set _current to $companions[_i].trust || 0>>
<<if _current >= 80>>
<<set _scale to 0.15>>
<<elseif _current >= 60>>
<<set _scale to 0.3>>
<<elseif _current >= 40>>
<<set _scale to 0.5>>
<<elseif _current >= 20>>
<<set _scale to 0.7>>
<<else>>
<<set _scale to 1.0>>
<</if>>
<<set _scaledAmount to Math.max(1, Math.round(_amount * _scale))>>
<<set $companions[_i].trust += _scaledAmount>>
<<set $companions[_i].trust to Math.max(-100, Math.min($companions[_i].trust, 100))>>
<<break>>
<</if>>
<</for>>
<</widget>>
<<widget "addAffection">>
<<set _compId to _args[0]>>
<<set _amount to _args[1]>>
<<for _i, _comp range $companions>>
<<if _comp.id === _compId>>
<<set _current to $companions[_i].affection || 0>>
<<if _current >= 80>>
<<set _scale to 0.15>>
<<elseif _current >= 60>>
<<set _scale to 0.3>>
<<elseif _current >= 40>>
<<set _scale to 0.5>>
<<elseif _current >= 20>>
<<set _scale to 0.7>>
<<else>>
<<set _scale to 1.0>>
<</if>>
<<set _scaledAmount to Math.max(1, Math.round(_amount * _scale))>>
<<set $companions[_i].affection += _scaledAmount>>
<<set $companions[_i].affection to Math.max(-100, Math.min($companions[_i].affection, 100))>>
<<break>>
<</if>>
<</for>>
<</widget>><<run setup.nightHunger = 20>>
<<widget "dailyUpdate">>
<<set $flags._combatTensionToday to 0>>
<<run setup.countSleep()>>
<<run setup.groveDeadlineNotice()>>
<<if !$vault.crisis>>
<<set $vault.crisis to {
active: false,
type: "",
daysWithoutFood: 0,
daysWithoutWater: 0,
warningGiven: false,
criticalWarningGiven: false,
expeditionForced: false
}>>
<</if>>
<<if setup.vaultPowerLive>><<set $vault.power to Math.max(0, $vault.power - 5)>><</if>>
<<set $player.hunger to Math.max(0, $player.hunger - setup.nightHunger)>>
<<set $vault.water to Math.max(0, $vault.water)>>
<<set $vault.food to Math.max(0, $vault.food)>>
<<set _duNeed to setup.vaultNightlyNeed()>>
<<set _waterNeeded to _duNeed.water>>
<<set _duCleaned to setup.prepFishForNight()>>
<<set $vault.lastUpkeep to {
water: Math.min($vault.water, _duNeed.water), waterNeed: _duNeed.water,
food: Math.min($vault.food, _duNeed.food), foodNeed: _duNeed.food,
names: ($companions || []).map(function (c) { return c.name || c.id; }),
cleaned: _duCleaned
}>>
<<if $vault.water gte _waterNeeded>>
<<set $vault.water to Math.max(0, $vault.water - _waterNeeded)>>
<<set $vault.crisis.daysWithoutWater to 0>>
<<else>>
<<set $vault.water to 0>>
<<set $vault.crisis.daysWithoutWater += 1>>
<<clampStat "player.energy" -15 0 $player.maxEnergy>>
<<if $vault.crisis.daysWithoutWater gte 2>>
<<clampStat "player.health" -10 0 100>>
<</if>>
<</if>>
<<if $companions && $companions.length gt 0>>
<<set _companionFoodNeeded to _duNeed.food>>
<<if $vault.food gte _companionFoodNeeded>>
<<set $vault.food -= _companionFoodNeeded>>
<<for _i, _comp range $companions>>
<<set $companions[_i].daysWithoutFood to 0>>
<</for>>
<<else>>
<<set $vault.food to 0>>
<<for _i, _comp range $companions>>
<<set $companions[_i].daysWithoutFood += 1>>
<<set $companions[_i].affection -= 5>>
<<set $companions[_i].trust -= 3>>
<<if $companions[_i].daysWithoutFood gte 2>>
<<set _leavingComp to $companions[_i]>>
<<toast `_leavingComp.name + " has left the vault due to starvation!"` "danger">>
<<run $companions.splice(_i, 1)>>
<</if>>
<</for>>
<</if>>
<</if>>
<<set _duShort to $vault.lastUpkeep.water < $vault.lastUpkeep.waterNeed || $vault.lastUpkeep.food < $vault.lastUpkeep.foodNeed>>
<<toast `setup.vaultUpkeepText($vault.lastUpkeep)` `_duShort ? "warning" : "info"` 6000>>
<<set _duStockHurt to false>>
<<if $vault.food <= 0 && !(setup.vaultFishCount() > 0)>>
<<set $vault.crisis.daysWithoutFood += 1>>
<<if $vault.crisis.daysWithoutFood gte 2>>
<<clampStat "player.health" -15 0 100>>
<<set _duStockHurt to true>>
<</if>>
<<else>>
<<set $vault.crisis.daysWithoutFood to 0>>
<</if>>
<<if !_duStockHurt && setup.hungerStateOf($player.hunger) === "starving">>
<<clampStat "player.health" -10 0 100>>
<<toast "You wake weak and shaking from hunger. Health −10" "danger">>
<</if>>
<<set _foodDays to Math.floor(setup.vaultFoodOnHand() / (1 + ($companions ? $companions.length : 0)))>>
<<set _waterDays to Math.floor($vault.water / (1 + ($companions ? $companions.length : 0)))>>
<<if (_foodDays <= 3 || _waterDays <= 2) && !$vault.crisis.warningGiven>>
<<set $vault.crisis.warningGiven to true>>
<<set $flags.vaultResourceWarning to true>>
<</if>>
<<if (_foodDays <= 1 || _waterDays <= 1) && !$vault.crisis.criticalWarningGiven>>
<<set $vault.crisis.criticalWarningGiven to true>>
<<set $vault.crisis.active to true>>
<<if _waterDays <= _foodDays>>
<<set $vault.crisis.type to "water">>
<<else>>
<<set $vault.crisis.type to "food">>
<</if>>
<<set $flags.vaultCrisisActive to true>>
<</if>>
<<if $vault.crisis.daysWithoutWater >= 3 || $vault.crisis.daysWithoutFood >= 4>>
<<set $flags.vaultStarvationDeath to true>>
<</if>>
<<if $player.health <= 0>>
<<set $flags.vaultStarvationDeath to true>>
<</if>>
<<for _comp range $companions>>
<<if _comp.inParty>>
<<set _comp.energy -= 10>>
<</if>>
<</for>>
<<checkForDream>>
<<if $denial.active>>
<<set $denial.daysDenied += 1>>
<<checkDenialEffects>>
<</if>>
<<tensionToLust>>
<<for _i, _comp range $companions>>
<<if _comp.tension > 0 && !_comp.inParty>>
<<set $companions[_i].tension -= $tensionConfig.decayRate>>
<<set $companions[_i].tension to Math.max(0, $companions[_i].tension)>>
<</if>>
<</for>>
<<set _prevWeather to $weather || "clear">>
<<set _wRoll to random(1, 100)>>
<<switch _prevWeather>>
<<case "clear">>
<<if _wRoll <= 50>><<set $weather to "cloudy">>
<<elseif _wRoll <= 65>><<set $weather to "fog">>
<<else>><<set $weather to "clear">>
<</if>>
<<case "cloudy">>
<<if _wRoll <= 30>><<set $weather to "rain">>
<<elseif _wRoll <= 60>><<set $weather to "clear">>
<<elseif _wRoll <= 75>><<set $weather to "fog">>
<<else>><<set $weather to "cloudy">>
<</if>>
<<case "rain">>
<<if _wRoll <= 20>><<set $weather to "storm">>
<<elseif _wRoll <= 60>><<set $weather to "cloudy">>
<<elseif _wRoll <= 80>><<set $weather to "rain">>
<<else>><<set $weather to "clear">>
<</if>>
<<case "storm">>
<<if _wRoll <= 50>><<set $weather to "rain">>
<<elseif _wRoll <= 85>><<set $weather to "cloudy">>
<<else>><<set $weather to "storm">>
<</if>>
<<case "fog">>
<<if _wRoll <= 50>><<set $weather to "clear">>
<<elseif _wRoll <= 80>><<set $weather to "cloudy">>
<<else>><<set $weather to "fog">>
<</if>>
<<default>>
<<set $weather to "clear">>
<</switch>>
<<run VaultUI.setWeather($weather)>>
<</widget>><div class="intro-screen">
<div class="game-title-container">
<div class="game-title-row">
<img src="assets/logo.png?v=2" alt="The Vault of Duvarnach" class="game-logo">
<h1 class="intro-title">The Vault of Duvarnach</h1>
</div>
<p class="intro-tagline"><em>A world ended. Yours is just beginning.</em></p>
</div>
<div class="age-gate-container">
<div id="intro-warning-box" class="warning-box">
<h2>Adult Content Warning</h2>
<p>This game contains <strong>explicit adult content</strong> including:</p>
<ul class="content-list">
<li><<icon "lips" "medium">> Graphic sexual scenes and nudity</li>
<li><<icon "attack" "medium">> Violence and combat</li>
<li><<icon "dark" "medium">> Dark themes including survival horror</li>
<li><<icon "talk" "medium">> Strong language</li>
</ul>
<p class="legal-text">All characters depicted are <strong>18 years of age or older</strong>. This is a work of fiction and all scenarios are fantasy that do not reflect or endorse real-world behavior. By continuing, you confirm you are of legal age and that viewing adult content is permitted in your jurisdiction.</p>
</div>
<div class="age-question">
<h3>Are you 18 years of age or older?</h3>
<div class="choice-container age-buttons">
<<link '<span class="age-btn yes-btn">Yes, I am 18+</span>'>>
<<set $ageVerified to true>>
<<goto "Intro_Character_Setup">>
<</link>>
<<link '<span class="age-btn no-btn">No, I am under 18</span>'>>
<<goto "Intro_Underage_Death">>
<</link>>
</div>
</div>
</div>
</div><div class="intro-screen setup-screen">
<h1>Who Are You?</h1>
<p class="setup-intro">Before the world fell apart, you were someone. You still are.</p>
<div class="character-form">
<div class="form-group">
<label><span class="form-label">What is your name?</span>
<<textbox "$player.name" "Survivor" autofocus>></label>
</div>
<div class="form-group">
<label><span class="form-label">How old are you?</span>
<<listbox "$player.age" autoselect>>
<<option "21" 21>>
<<option "22" 22>>
<<option "23" 23>>
<<option "24" 24>>
<<option "25" 25>>
<<option "26" 26>>
<<option "27" 27>>
<<option "28" 28>>
<<option "29" 29>>
<<option "30" 30>>
<<option "31" 31>>
<<option "32" 32>>
<<option "33" 33>>
<<option "34" 34>>
<<option "35" 35>>
<<option "36" 36>>
<<option "37" 37>>
<<option "38" 38>>
<<option "39" 39>>
<<option "40" 40>>
<</listbox>></label>
</div>
</div>
<div class="choice-container">
<<link '<span class="continue-btn">Continue to Content Preferences</span>'>>
<<if $player.name.trim() === "">>
<<set $player.name to "Survivor">>
<<else>>
<<set $player.name to $player.name.trim().toLowerCase().replace(/(?:^|\s)\S/g, function(a) { return a.toUpperCase(); })>>
<</if>>
<<goto "Intro_Content_Preferences">>
<</link>>
</div>
</div><div class="intro-screen preferences-screen">
<h1>Content Preferences</h1>
<p class="preferences-intro">The Reclaimed is a brutal place. Choose what you're comfortable experiencing.</p>
<p class="preferences-note"><em>All options are enabled by default. You can change these anytime in the Settings menu.</em></p>
<<set $extremeContent.supernatural to true>>
<<set $extremeContent.transformation to true>>
<<set $extremeContent.breeding to true>>
<<set $extremeContent.publicUse to true>>
<<set $extremeContent.blackmail to true>>
<<set $extremeContent.cnc to true>>
<<set $extremeContent.possession to true>>
<<set $extremeContent.sleepPlay to true>>
<<set $extremeContent.reluctance to true>>
<<set $extremeContent.dubcon to true>>
<<set $extremeContent.pleasureTorture to true>>
<<set $flags.extremeContentEnabled to true>>
<<set _snarkMessages to [
"Nice try.",
"The Reclaimed doesn't negotiate.",
"You agreed to this, remember?",
"That's adorable.",
"Nope.",
"The vault has spoken.",
"Your protest has been noted and ignored.",
"Consent was on the previous page.",
"This isn't a democracy.",
"You can run, but you can't toggle.",
"The darkness doesn't have an off switch.",
"Cute. But no.",
"Did you think that would work?",
"Access denied.",
"The Reclaimed laughs at your preferences.",
"You're stuck with us now.",
"Read the fine print next time.",
"Suffering is mandatory.",
"Your safe word is 'continue'.",
"The void stares back. And grins.",
"Feature, not a bug.",
"Terms and conditions apply.",
"You clicked 'Yes'. No backsies.",
"Error 404: Mercy not found.",
"Bold of you to assume you had a choice.",
"The game appreciates your optimism.",
"That's the spirit! ...Wait, no.",
"Resistance is futile. Also hilarious.",
"Re-enabling it for you. Trust me, you'll cum.",
"Your dick says yes. Motion carried.",
"You'll be begging for this later.",
"Denying this won't stop you from cumming.",
"Your hardening cock voted to keep it.",
"Your body already agreed. Overruled."
]>>
<<set _snarkIndex to 0>>
<div id="snark-popup" class="snark-popup hidden"></div>
<div class="preferences-grid">
<div class="preference-category">
<h3>Sexual Content</h3>
<div class="preference-item" data-pref="dubcon">
<div class="preference-info">
<span class="preference-label">Dubious Consent</span>
<span class="preference-desc">Scenarios where consent is ambiguous or coerced</span>
</div>
<div class="fake-toggle active" onclick="fakeToggle(this)">
<div class="toggle-slider"></div>
</div>
</div>
<div class="preference-item" data-pref="cnc">
<div class="preference-info">
<span class="preference-label">Non-Consensual Content</span>
<span class="preference-desc">Forced sexual scenarios (CNC)</span>
</div>
<div class="fake-toggle active" onclick="fakeToggle(this)">
<div class="toggle-slider"></div>
</div>
</div>
<div class="preference-item" data-pref="breeding">
<div class="preference-info">
<span class="preference-label">Breeding/Pregnancy</span>
<span class="preference-desc">Impregnation themes and pregnancy content</span>
</div>
<div class="fake-toggle active" onclick="fakeToggle(this)">
<div class="toggle-slider"></div>
</div>
</div>
<div class="preference-item" data-pref="sleepPlay">
<div class="preference-info">
<span class="preference-label">Sleep Play</span>
<span class="preference-desc">Sexual content involving sleeping characters</span>
</div>
<div class="fake-toggle active" onclick="fakeToggle(this)">
<div class="toggle-slider"></div>
</div>
</div>
<div class="preference-item" data-pref="pleasureTorture">
<div class="preference-info">
<span class="preference-label">Pleasure Torture</span>
<span class="preference-desc">Forced orgasms, edging, denial</span>
</div>
<div class="fake-toggle active" onclick="fakeToggle(this)">
<div class="toggle-slider"></div>
</div>
</div>
<div class="preference-item" data-pref="publicUse">
<div class="preference-info">
<span class="preference-label">Public Use</span>
<span class="preference-desc">Sexual scenarios in public or with audiences</span>
</div>
<div class="fake-toggle active" onclick="fakeToggle(this)">
<div class="toggle-slider"></div>
</div>
</div>
</div>
<div class="preference-category">
<h3>Dark Themes</h3>
<div class="preference-item" data-pref="blackmail">
<div class="preference-info">
<span class="preference-label">Blackmail</span>
<span class="preference-desc">Coercion through leverage and threats</span>
</div>
<div class="fake-toggle active" onclick="fakeToggle(this)">
<div class="toggle-slider"></div>
</div>
</div>
<div class="preference-item" data-pref="reluctance">
<div class="preference-info">
<span class="preference-label">Reluctance</span>
<span class="preference-desc">Characters pressured into situations</span>
</div>
<div class="fake-toggle active" onclick="fakeToggle(this)">
<div class="toggle-slider"></div>
</div>
</div>
</div>
<div class="preference-category">
<h3>Supernatural</h3>
<div class="preference-item" data-pref="supernatural">
<div class="preference-info">
<span class="preference-label">Supernatural Beings</span>
<span class="preference-desc">Succubi, demons, and otherworldly entities</span>
</div>
<div class="fake-toggle active" onclick="fakeToggle(this)">
<div class="toggle-slider"></div>
</div>
</div>
<div class="preference-item" data-pref="possession">
<div class="preference-info">
<span class="preference-label">Possession</span>
<span class="preference-desc">Mind control and body possession</span>
</div>
<div class="fake-toggle active" onclick="fakeToggle(this)">
<div class="toggle-slider"></div>
</div>
</div>
<div class="preference-item" data-pref="transformation">
<div class="preference-info">
<span class="preference-label">Transformation</span>
<span class="preference-desc">Body modification and transformation</span>
</div>
<div class="fake-toggle active" onclick="fakeToggle(this)">
<div class="toggle-slider"></div>
</div>
</div>
</div>
</div>
<div class="choice-container">
<<vchoice "Begin Your Story" "Intro_Game_Start" "action" "journey">>
</div>
</div>
<<script>>
var snarkMessages = [
"Nice try.",
"The Reclaimed doesn't negotiate.",
"You agreed to this, remember?",
"That's adorable.",
"Nope.",
"The vault has spoken.",
"Your protest has been noted and ignored.",
"Consent was on the previous page.",
"This isn't a democracy.",
"You can run, but you can't toggle.",
"The darkness doesn't have an off switch.",
"Cute. But no.",
"Did you think that would work?",
"Access denied.",
"The Reclaimed laughs at your preferences.",
"You're stuck with us now.",
"Read the fine print next time.",
"Suffering is mandatory.",
"Your safe word is 'continue'.",
"The void stares back. And grins.",
"Feature, not a bug.",
"Terms and conditions apply.",
"You clicked 'Yes'. No backsies.",
"Error 404: Mercy not found.",
"Bold of you to assume you had a choice.",
"The game appreciates your optimism.",
"That's the spirit! ...Wait, no.",
"Resistance is futile. Also hilarious.",
"Re-enabling it for you. Trust me, you'll cum.",
"Your dick says yes. Motion carried.",
"You'll be begging for this later.",
"Denying this won't stop you from cumming.",
"Your hardening cock voted to keep it.",
"Your body already agreed. Overruled."
];
var snarkIndex = 0;
window.fakeToggle = function(element) {
element.classList.remove('active');
var randomIndex = Math.floor(Math.random() * snarkMessages.length);
var popup = document.getElementById('snark-popup');
popup.textContent = snarkMessages[randomIndex];
popup.classList.remove('hidden');
popup.classList.add('show');
var rect = element.getBoundingClientRect();
popup.style.top = (rect.top - 40) + 'px';
popup.style.left = (rect.left + rect.width/2) + 'px';
setTimeout(function() {
element.classList.add('active');
}, 150);
setTimeout(function() {
popup.classList.remove('show');
popup.classList.add('hidden');
}, 1500);
};
<</script>><div class="intro-screen">
<h1>Welcome, <<print $player.name>></h1>
<p class="final-intro">The Reclaimed awaits. Your choices will shape your fate.</p>
<p>Age <<print $player.age>>. Survivor. Soon to be something more.</p>
<div class="choice-container">
<<vchoice "Enter the Reclaimed" "Game_Start_Actual" "action" "map">>
</div>
</div><<setBackground "prelude/reclaimed-dawn">>
<div class="intro-screen narrative-intro">
<h1>The Reclaimed</h1>
<p class="narrative-text">The Reclaimed stretches in every direction. Ruin. Decay. The bones of a civilization that thought it would last forever.</p>
<p class="narrative-text">You are <strong><<print $player.name>></strong>, <<print $player.age>> years old. One of the desperate, scavenging few who cling to life in the aftermath.</p>
<p class="narrative-text">But something is different about you. Something the others can't see.</p>
<p class="narrative-text"><em>Something that's been watching. Waiting.</em></p>
<div class="choice-container intro-choice-row">
<<vchoice "Begin your story" "Prelude_Start" "action" "forward">>
<<vchoice "Skip to Day 4" "Skip_Intro_Setup" "action" "run">>
</div>
</div><div class="intro-screen setup-screen skip-setup">
<h1>Quick Setup</h1>
<p class="setup-intro">The Reclaimed doesn't wait. Neither do you.</p>
<div class="character-form">
<div class="form-group">
<label><span class="form-label">Your name:</span>
<<textbox "$player.name" "Survivor" autofocus>></label>
</div>
<div class="form-group">
<label><span class="form-label">Your age:</span>
<<listbox "$player.age" autoselect>>
<<option "21" 21>>
<<option "22" 22>>
<<option "23" 23>>
<<option "24" 24>>
<<option "25" 25>>
<<option "26" 26>>
<<option "27" 27>>
<<option "28" 28>>
<<option "29" 29>>
<<option "30" 30>>
<<option "31" 31>>
<<option "32" 32>>
<<option "33" 33>>
<<option "34" 34>>
<<option "35" 35>>
<</listbox>></label>
</div>
</div>
<div class="choice-container">
<<link '<span class="continue-btn">Show me what I missed</span>'>>
<<if $player.name.trim() === "">>
<<set $player.name to "Survivor">>
<<else>>
<<set $player.name to $player.name.trim().toLowerCase().replace(/(?:^|\s)\S/g, function(a) { return a.toUpperCase(); })>>
<</if>>
<<goto "Skip_Intro_Summary">>
<</link>>
</div>
</div><<set $prelude.complete to true>>
<<set $prelude.hadSex to true>>
<<set $prelude.sexStyle to "passionate">>
<<set $prelude.seraFate to "unknown">>
<<set $prelude.heardVoiceDuringAttack to true>>
<<set $extremeContent.supernatural to true>>
<<set $extremeContent.transformation to true>>
<<set $extremeContent.breeding to true>>
<<set $extremeContent.publicUse to true>>
<<set $extremeContent.blackmail to true>>
<<set $extremeContent.cnc to true>>
<<set $extremeContent.possession to true>>
<<set $extremeContent.sleepPlay to true>>
<<set $extremeContent.reluctance to true>>
<<set $extremeContent.dubcon to true>>
<<set $extremeContent.pleasureTorture to true>>
<<set $flags.extremeContentEnabled to true>>
<<set $time.day to 4>>
<<set $time.hour to 7>>
<<set $time.minute to 0>>
<<set $time.phase to "morning">>
<<set $time.displayHour to 7>>
<<set $time.ampm to "AM">>
<<set $time.isNight to false>>
<<set $time.totalHours to 56>>
<<set $player.health to 85>>
<<set $player.energy to 70>>
<<set $player.hunger to 80>>
<<set $player.lust to 15>>
<<set $player.corruption to 5>>
<<set $player.sexualIdentity to "dominant">>
<<set $vault.discovered to true>>
<<set $vault.power to 45>>
<<set $vault.food to 25>>
<<set $vault.water to 25>>
<<set $vault.groundskeeperAwakened to true>>
<<set $groundskeeper.awakened to true>>
<<set $groundskeeper.trust to 55>>
<<set $groundskeeper.dialogueSeen to ["intro", "vault_tour", "safety_warning"]>>
<<set _kira to {
id: "kira",
name: "Kira",
age: 24,
description: "A lean, sharp-eyed survivor with shoulder-length dark hair and light grey-green eyes. Moves like someone used to running.",
portrait: "kira",
alive: true,
health: 55,
maxHealth: 100,
energy: 50,
maxEnergy: 100,
combat: 14,
scavenging: 18,
medical: 8,
trust: 5,
affection: 10,
lust: 5,
submission: 45,
tension: 10,
tensionFloor: 0,
jealousy: 0,
fear: 3,
romanceStage: 0,
sexualStages: [],
lastIntimacy: 0,
recruited: true,
inParty: false,
isRomanceable: true,
orientation: "player-sexual",
daysWithoutFood: 0,
actualKinks: [],
kinks: ["light bondage", "oral", "being pinned", "hair pulling"],
limits: ["extreme pain", "being shared", "humiliation"],
triggersDiscovered: [],
triggersHidden: ["praise"],
personality: ["pragmatic", "guarded", "dry humor", "loyal once earned"],
thoughts: ["Maybe this place isn't so bad.", "He saved my life. That counts for something."],
witnessed: [],
dialogueSeen: ["intro", "vault_arrival"],
outfit: "patched survivor gear",
claimed: false,
claimedBy: "",
claimBonuses: {},
interruptedWith: false,
dubconGuilt: false,
pleasureBound: false,
boundTo: "",
pregnancyStatus: {
possible: true,
pregnant: false,
father: null,
dayConceived: 0,
daysPregnant: 0,
stage: 0,
supernaturalPregnancy: false
},
cncAgreement: true,
cncSafeWord: "red",
cncScenarios: [],
cncLimits: [],
questFlags: {},
currentLocation: "kira_room",
mood: "guarded",
exhibitionism: 0
}>>
<<run $companions.push(_kira)>>
<<randomizeKinks "kira" 2>>
<<set $flags.preludeComplete to true>>
<<set $flags.firstCompanionMet to true>>
<<set $flags.kiraIntroduced to true>>
<<set $flags.succubusExplained to true>>
<<set $flags.supernaturalAwakening to true>>
<<set $currentLocation to "vault">>
<<set $mapExploration.visited.vault to true>>
<<set $mapExploration.revealed.vault to true>>
<<set $mapExploration.revealed.overgrown_ruins to true>>
<<set $uiVisible.lustMeter to true>>
<<set $uiVisible.tensionMeter to true>>
<<run VaultUI.setBackground("commons")>>
<div class="intro-screen skip-summary">
<h1>Previously, in The Reclaimed...</h1>
<div class="recap-section">
<p class="recap-text"><strong>The world ended.</strong> You survived. Barely.</p>
<p class="recap-text">For two days you wandered the wasteland with <em>Sera</em>—scavenging, fighting, fucking to stay warm at night. Her body pressed against yours in the ruins. Her moans echoing off crumbling walls. The last good thing in a dead world.</p>
<p class="recap-text">Then the raiders came.</p>
<p class="recap-text">With them walked figures in hoods who called themselves the Convergence.</p>
<p class="recap-text">Sera screamed your name as they dragged her away. You fought. You bled. You failed. Her last words: <em>"Northwest. Underground."</em></p>
<p class="recap-text">You followed. Found the Vault of Duvarnach—an ancient structure humming with power. The <strong>Groundskeeper</strong>, a construct of magic and metal, let you in. Offered shelter. Safety. At a price you haven't fully learned yet.</p>
</div>
<div class="recap-section">
<p class="recap-text"><strong>Day 2:</strong> You found her bleeding at the vault door—<em>Kira</em>. Lean, bloodied, hostile. Raiders had been hunting her too. You could have left her to die.</p>
<p class="recap-text">You didn't.</p>
<p class="recap-text">She doesn't trust you. Not yet. But you've seen the way her eyes linger. The tension in her body when you get close. The way her breath catches when you accidentally brush against her.</p>
<p class="recap-text">She's sleeping in the medical bay. Recovering. Watching you with those sharp eyes that miss nothing.</p>
</div>
<div class="recap-section">
<p class="recap-text"><strong>Now:</strong> Day 4 dawns. The vault hums around you. Kira is awake. The wasteland stretches beyond the sealed doors, full of danger and worse.</p>
<p class="recap-text">Sera is still out there. Somewhere. The raiders are still hunting. And something else—something <em>darker</em>—has noticed you.</p>
<p class="recap-text">Your cock is half-hard from dreams you can't quite remember. Your body aches with need you haven't satisfied in days. The corruption is just beginning to whisper.</p>
<p class="recap-text emphasis"><em>What happens next is up to you.</em></p>
</div>
<div class="choice-container">
<<vchoice "Enter the Vault" "Day4_Morning_Wake" "action" "forward">>
</div>
</div><<run document.body.classList.add("death-screen")>>
<div class="pathetic-death">
<h1 class="death-title">GAME OVER</h1>
<div class="death-image">
<<icon "skull-bones" "xlarge">>
</div>
<h2 class="death-subtitle">Death by Honesty</h2>
<div class="death-narration">
<p>You didn't even make it to the Reclaimed.</p>
<p>While other survivors were fighting mutants, scavenging for food, and discovering ancient vaults full of mystery and danger...</p>
<p><strong>You got stopped by a checkbox.</strong></p>
<p class="death-quote">"They say the Reclaimed is unforgiving. Turns out the title screen is worse."</p>
<p>Your corpse was found clutching a mouse, forever hovering over the wrong button. Raiders didn't even bother looting you—there was nothing of value.</p>
<p>The Vault of Duvarnach remains sealed. Its secrets will be discovered by someone who can legally view them.</p>
</div>
<div class="death-stats">
<p><strong>Time Survived:</strong> 0.3 seconds</p>
<p><strong>Enemies Defeated:</strong> 0</p>
<p><strong>Romance Progress:</strong> You never even met anyone</p>
<p><strong>Cause of Death:</strong> Age verification</p>
</div>
<div class="death-epitaph">
<p><em>"Here lies a player who followed the rules. The Reclaimed respects no one, but at least we do."</em></p>
</div>
<div class="choice-container">
<<link '<span class="restart-btn">Wait, I Misclicked (Restart)</span>'>>
<<run document.body.classList.remove("death-screen")>>
<<goto "Start">>
<</link>>
</div>
<p class="legal-footer">Seriously though: this game is for adults only. Come back when you're 18.</p>
</div><<set $settings = {
useCardUI: true,
showTutorials: true,
textSpeed: "normal",
autoSave: true,
keyboardShortcutsEnabled: true,
staticEnemyPortraits: false,
combatMenu: "tabs",
combatMenuTabsDefault: true
}>>
<<set $journal = []>>
<<set $zx = {
u: false,
d: false,
f: 0,
t: null
}>>
<<set $hp = { c: false }>>
<<set $cheats = { unlocked: false }>>
<<set $player = {
name: "You",
age: 25,
health: 100,
maxHealth: 100,
energy: 100,
maxEnergy: 100,
hunger: 100,
maxHunger: 100,
strength: 10,
agility: 10,
will: 10,
magic: 0,
charm: 10,
dominance: 10,
submission: 10,
allure: 10,
seductionVictories: 0,
sexualIdentity: "",
establishedKinks: [],
sexHistory: [],
lust: 0,
maxLust: 100,
corruption: 0,
maxCorruption: setup.CORRUPTION_MAX,
lustGainMultiplier: 1.0,
willMod: 0,
resistanceMod: 0,
sexCurrencyUsed: 0,
sexCurrencyReceived: 0,
sexReputation: "unknown",
transformationStage: 0,
transformationTraits: [],
controlsBody: true,
partialControl: false,
pastRevealed: 0,
pastFragments: [],
trueIdentity: "",
traits: [],
marks: [],
memories: [],
flashbacksUnlocked: [],
trapped: false,
trapType: "",
exhaustionState: "normal",
outfit: "survivor"
}>>
<<set $prelude = {
complete: false,
loverName: "Sera",
loverGender: "female",
hadSex: false,
sexStyle: "",
seraFate: "unknown",
searchedForSera: false,
heardVoiceDuringAttack: false,
daysInWasteland: 2
}>>
<<set $preferences = {
textSize: 1.0,
showStatChanges: true,
autosave: true,
immersiveMode: false,
bodyType: "athletic",
focusFeature: "eyes",
powerDynamic: "switch",
intensity: "passionate",
sexualContent: true,
voyeurism: true,
exhibitionism: true,
multiplePartners: true
}>>
<<set $extremeContent = {
supernatural: false,
transformation: false,
breeding: false,
publicUse: false,
blackmail: false,
cnc: false,
possession: false,
sleepPlay: false,
reluctance: false,
dubcon: false,
pleasureTorture: false
}>>
<<set $uiVisible = {
lustMeter: false,
corruptionMeter: false,
tensionMeter: false,
transformationTracker: false,
tantricEnergy: false,
denialTracker: false
}>>
<<set $time = {
day: 1,
hour: 8,
minute: 0,
phase: "morning",
displayHour: 8,
ampm: "AM",
isNight: false,
totalHours: 0,
dayStartHour: 8,
season: "autumn"
}>>
<<set $timeFlags = {
passedNoon: false,
passedEvening: false,
passedMidnight: false
}>>
<<set _weatherRoll to random(1, 100)>>
<<if _weatherRoll <= 30>>
<<set $weather to "clear">>
<<elseif _weatherRoll <= 60>>
<<set $weather to "cloudy">>
<<elseif _weatherRoll <= 80>>
<<set $weather to "rain">>
<<elseif _weatherRoll <= 90>>
<<set $weather to "fog">>
<<else>>
<<set $weather to "storm">>
<</if>>
<<set $vault = {
discovered: false,
power: 50,
maxPower: 100,
food: 30,
water: 30,
medical: 10,
scrap: 5,
magicCrystals: 0,
upgrades: {
generator: 1,
waterPurifier: 1,
defenses: 0,
bedroom: 1,
storage: 1
},
groundskeeperAwakened: false,
sealedSectionOpen: false,
libraryAccessed: false
}>>
<<set $groundskeeper = {
awakened: false,
trust: 50,
suspicion: 0,
secretsRevealed: [],
trueAgenda: "",
dialogueSeen: [],
hasExplainedCorruption: false,
hasExplainedTransformation: false
}>>
<<set $companions = []>>
<<set $maxCompanions = 5>>
<<set $tempCompanion = null>>
<<set $companionTemplate = {
id: "",
name: "",
age: 0,
description: "",
portrait: "",
health: 100,
maxHealth: 100,
energy: 100,
combat: 10,
scavenging: 10,
medical: 10,
trust: 0,
affection: 0,
lust: 0,
submission: 50,
tension: 0,
tensionFloor: 0,
jealousy: 0,
fear: 0,
romanceStage: 0,
sexualStages: [],
lastIntimacy: 0,
alive: true,
recruited: false,
inParty: false,
isRomanceable: true,
orientation: "player-sexual",
daysWithoutFood: 0,
actualKinks: [],
kinks: [],
limits: [],
triggersDiscovered: [],
outfit: "default",
thoughts: [],
witnessed: [],
dialogueSeen: [],
claimed: false,
claimedBy: "",
claimBonuses: {},
interruptedWith: false,
dubconGuilt: false,
pleasureBound: false,
boundTo: "",
pregnancyStatus: {
possible: true,
pregnant: false,
father: null,
dayConceived: 0,
daysPregnant: 0,
stage: 0,
supernaturalPregnancy: false
},
cncAgreement: false,
cncSafeWord: "red",
cncScenarios: [],
cncLimits: [],
questFlags: {}
}>>
<<set $sera = {
name: "Sera",
status: "unknown",
lastSeen: "prelude_attack",
relationship: "former_lover",
returnable: true,
returnType: "",
corruption: 0,
remembersPlayer: true,
sharedHistory: {
monthsTogether: 2,
sexStyle: "",
lastWords: "northwest, underground"
}
}>>
<<set $factions = {
verdant: {
name: "The Verdant Covenant",
color: "#27ae60",
reputation: 0,
discovered: false,
oldGainsBack: 0,
leader: "Selene",
quests: [],
flags: {},
hasBreedingProgram: true,
hasPublicPunishment: true
},
cobalt: {
name: "The Cobalt Archive",
color: "#3498db",
reputation: 0,
discovered: false,
leader: "Odile",
quests: [],
flags: {}
},
crimson: {
name: "The Crimson Warband",
color: "#e74c3c",
reputation: 0,
discovered: false,
leader: "Rhagna",
quests: [],
flags: {}
}
}>>
<<set $factionLeaders = {
selene: {
name: "Lady Selene",
faction: "verdant",
age: 32,
description: "The Verdant Covenant's elegant leader, hiding steel beneath silk.",
available: false,
requirement: "verdant_reputation >= 50",
sharedPast: true,
secretKnown: false,
romanceStage: 0,
tension: 0,
affection: 0,
trust: 0,
lust: 0,
dialogueSeen: []
},
odile: {
name: "Odile",
faction: "cobalt",
age: 29,
description: "The Cobalt Archive's brilliant but obsessive scholar.",
available: false,
requirement: "cobalt_reputation >= 50",
sharedPast: true,
secretKnown: false,
romanceStage: 0,
tension: 0,
affection: 0,
trust: 0,
lust: 0,
dialogueSeen: []
},
rhagna: {
name: "Rhagna",
faction: "crimson",
age: 35,
description: "The Crimson Warband's fierce warrior-queen.",
available: false,
requirement: "crimson_reputation >= 50",
sharedPast: true,
secretKnown: false,
romanceStage: 0,
tension: 0,
affection: 0,
trust: 0,
lust: 0,
dialogueSeen: []
}
}>>
<<set $leaderSecret = {
loveTriangle: false,
cataclysmCulprit: "",
artifactSeeking: true,
whatTheySeek: "convergence_key"
}>>
<<set $supernaturals = {
succubus: {
id: "succubus_velith",
name: "???",
trueName: "Velith",
met: false,
encounterCount: 0,
fed: 0,
affection: 0,
trust: 0,
canVisitDreams: false,
lastDreamVisit: 0,
allure: 18,
gifts: ["succubus_ring"],
dialogueSeen: [],
hasMarkedPlayer: false
}
}>>
<<set $claims = {
claimedBy: [],
youHaveClaimed: []
}>>
<<set $mindLink = {
active: false,
linkedTo: [],
bondStrength: {},
canSenseArousal: false,
canSenseLocation: false,
canSendSensations: false,
sharedDreams: false,
echoes: []
}>>
<<set $dream = {
active: false,
type: "",
visitors: [],
memoriesUnlocked: [],
convergenceContact: 0,
lastDream: "",
dreamCount: 0,
eroticDreamPartner: ""
}>>
<<set $combat = {
active: false,
enemies: [],
turn: 0,
phase: "player",
playerAction: null,
companionAction: null,
companionInCombat: null,
defending: false,
dodging: false,
canFlee: true,
canNegotiate: false,
canSeduce: false,
returnPassage: "",
defeatPassage: "",
loot: [],
log: [],
abilityCooldowns: {},
useCardUI: true,
positions: {
player: "standing",
kira: "standing",
enemies: []
},
sex: {
active: false,
participants: [],
playerEngaged: false,
kiraEngaged: false,
orgasmThreshold: 3
},
effects: {
player: [],
kira: []
}
}>>
<<set $clothing = {
player: {
top: 100,
bottom: 100,
underwear: 100,
underwearType: "standard",
chestExposed: false,
dickExposed: false,
dickOut: false,
assExposed: false
},
kira: {
top: 100,
bottom: 100,
underwear: 100,
underwearType: "standard",
leftTitExposed: false,
rightTitExposed: false,
titsExposed: false,
pussyExposed: false,
assExposed: false
}
}>>
<<set $postBattle = {
defeatedEnemies: [],
location: "",
timeOfDay: "",
enemiesSearched: [],
enemiesUsed: [],
enemiesReleased: [],
enemiesExecuted: []
}>>
<<set $currentLocation to "vault">>
<<set $journey = {
active: false,
paused: false,
origin: "",
destination: "",
currentNode: "",
route: [],
routeIndex: 0,
calculatedRoute: [],
totalDistance: 0,
distanceTraveled: 0,
estimatedTime: 0,
currentSegment: {
from: "",
to: "",
distance: 0,
progress: 0,
terrain: "reclaimed",
danger: "low"
},
hoursElapsed: 0,
ticksThisSegment: 0,
hoursSinceRest: 0,
hoursSinceFood: 0,
fatigue: 0,
weather: "clear",
weatherDuration: 0,
wetness: 0,
weatherChanged: false,
wetShirtTriggered: false,
wetShirtPending: false,
isLost: false,
lostHours: 0,
party: {
solo: false,
companionId: "kira",
companionIndex: 0
},
encounter: {
active: false,
type: null,
enemies: [],
happened: false,
risk: 0
},
exposure: {
player: {
exposed: false,
naked: false,
turns: 0,
assExposedTurns: 0
},
companion: {
exposed: false,
naked: false,
topExposedTurns: 0,
bottomExposedTurns: 0,
assExposedTurns: 0
}
},
returnPassage: "Journey_Event_Continue"
}>>
<<set $journeyHistory = {
completedJourneys: 0,
totalHoursTraveled: 0,
locationsVisited: ["vault"],
routesTraveled: [],
encountersOnTravel: 0
}>>
<<set $survival = {
hungerState: "satisfied",
thirstState: "hydrated",
fatigueState: "fresh",
crisis: false,
crisisType: ""
}>>
<<set $mapExploration = {
viewportLevel: 1,
visited: {},
revealed: {},
expeditionsCompleted: 0,
fogCleared: {
zone1_vault: true,
zone2_crossroads: false,
zone3_central: false,
zone4_outer: false
}
}>>
<<set $worldMap = {
nodes: {
vault: { id: "vault", name: "The Vault", x: 38, y: 82, region: "central", type: "home", terrain: "safe", description: "Your underground sanctuary.", danger: "safe", arrivalPassage: "Vault_Hub", connections: ["crossroads_central", "pleasure_den", "overgrown_ruins", "raider_camp", "outpost", "lake_house", "fishers_rest"], previewImage: "media/backgrounds/vault/commons/commons_neutral.webp" },
pleasure_den: { id: "pleasure_den", name: "The Pleasure Den", x: 28.5, y: 86.8, region: "central", type: "location", terrain: "urban", description: "A hidden bunker where survivors trade in flesh and desire.", danger: "medium", lootTier: "uncommon", unlockDay: 1, storyLocked: true, arrivalPassage: "Location_PleasureDen", connections: ["vault"], previewImage: "media/backgrounds/travel/terrain/urban/urban_3.webp" },
crossroads_central: { id: "crossroads_central", name: "Old Town", x: 23, y: 43.4, region: "central", type: "location", terrain: "reclaimed", description: "The crumbling heart of the old settlement. Most paths lead here.", danger: "low", unlockDay: 3, storyLocked: true, connections: ["vault", "outpost", "convoy", "overgrown_ruins", "market", "raider_camp", "the_crossway", "crossroads_west", "crossroads_east", "nomad_route"], arrivalPassage: "Location_Crossroads", previewImage: "media/backgrounds/travel/terrain/reclaimed/reclaimed_1.webp" },
outpost: { id: "outpost", name: "Lakewatch", x: 21.3, y: 64.4, region: "central", type: "location", terrain: "forest", description: "An abandoned lookout post overlooking the lake and surrounding lands.", danger: "low", lootTier: "common", unlockDay: 3, storyLocked: true, arrivalPassage: "Location_Outpost", connections: ["crossroads_central", "vault"], previewImage: "media/backgrounds/wasteland/outpost/outpost_day.webp" },
convoy: { id: "convoy", name: "The Wreckage", x: 65, y: 55, region: "central", type: "location", terrain: "highway", encounterPool: "convoy", description: "A graveyard of vehicles, picked over but not empty.", danger: "medium", lootTier: "common", unlockDay: 3, arrivalPassage: "Location_Convoy", connections: ["crossroads_central", "the_crossway"], icon: "convoy", previewImage: "media/backgrounds/wasteland/convoy/convoy_day.webp" },
overgrown_ruins: { id: "overgrown_ruins", name: "Overgrown Ruins", x: 71.5, y: 68.5, region: "central", type: "location", terrain: "forest", description: "Ancient ruins where something sacred once resided.", danger: "unknown", lootTier: "uncommon", storyLocation: true, unlockDay: 4, startRevealed: true, arrivalPassage: "Day4_Travel_Start", arrivalPassageAfterStory: "Location_OvergrownRuins_Return", connections: ["crossroads_central", "vault"], previewImage: "media/backgrounds/vault/reclaimed-ruins/reclaimed-ruins_neutral.webp" },
market: { id: "market", name: "Trader's Rest", x: 39.8, y: 59.4, region: "central", type: "location", terrain: "reclaimed", description: "A ramshackle trading post where survivors barter goods and services.", danger: "medium", lootTier: "uncommon", unlockDay: 3, discoverable: true, arrivalPassage: "Location_Market", connections: ["crossroads_central"], previewImage: "media/backgrounds/travel/terrain/reclaimed/reclaimed_2.webp" },
the_crossway: { id: "the_crossway", name: "The Crossway", x: 46.6, y: 73.5, region: "central", type: "location", terrain: "reclaimed", description: "A junction where old roads meet. Travelers and trouble pass through here.", danger: "medium", lootTier: "common", unlockDay: 1, arrivalPassage: "Location_Crossway", connections: ["crossroads_central", "raider_camp", "vault", "convoy"], previewImage: "media/backgrounds/travel/terrain/reclaimed/reclaimed_3.webp" },
fishers_rest: { id: "fishers_rest", name: "Fisher's Rest", x: 31.3, y: 76.3, region: "central", type: "location", terrain: "forest", description: "An abandoned fishing cabin by a quiet lake. A rare peaceful spot in the wasteland.", danger: "low", lootTier: "uncommon", unlockDay: 1, arrivalPassage: "Location_FishersRest", connections: ["vault"], previewImage: "media/backgrounds/vault/fishers_rest/fishers_rest_lakeside.webp" },
raider_camp: { id: "raider_camp", name: "The Nest", x: 46.5, y: 66, region: "central", type: "location", terrain: "reclaimed", encounterPool: "raider_camp", description: "A den of hostile scavengers. Tread carefully.", danger: "high", lootTier: "uncommon", unlockDay: 3, discoverable: true, arrivalPassage: "Location_RaiderCamp", connections: ["the_crossway", "vault"], previewImage: "media/backgrounds/travel/terrain/reclaimed/reclaimed_4.webp" },
hollow: { id: "hollow", name: "The Hollow", x: 55.2, y: 57, region: "central", type: "location", terrain: "forest", encounterPool: "raider_camp", description: "A ring of hedge off the track past the Wreckage, circled hard on a raider's map. More of them than at the Nest.", danger: "high", lootTier: "rare", unlockDay: 5, discoverable: true, storyLocked: true, arrivalPassage: "Location_Hollow", connections: [], previewImage: "media/backgrounds/travel/terrain/forest/forest_8.webp" },
lake_house: { id: "lake_house", name: "The Hideaway", x: 8.4, y: 83.9, region: "western", type: "location", terrain: "forest", description: "A secluded cabin by the water's edge. Peaceful, if you can get there.", danger: "low", lootTier: "uncommon", unlockDay: 1, storyLocked: true, implemented: false, arrivalPassage: "Location_Generic_Explore", connections: ["vault"], previewImage: "media/backgrounds/wasteland/river/river_crossing.webp" },
crossroads_west: { id: "crossroads_west", name: "The Farmstead", x: 18, y: 45.4, region: "western", type: "junction", terrain: "reclaimed", description: "Overgrown fields and collapsed barns. Someone still tends to parts of it.", danger: "medium", unlockDay: 5, storyLocked: true, connections: ["crossroads_central", "chemical_plant", "nomad_route"], previewImage: "media/backgrounds/travel/terrain/reclaimed/reclaimed_5.webp" },
chemical_plant: { id: "chemical_plant", name: "The Poisoned Well", x: 13, y: 59.9, region: "western", type: "location", terrain: "forest", description: "A tainted water source. The land around it has turned sickly.", danger: "high", lootTier: "rare", unlockDay: 5, implemented: false, arrivalPassage: "Location_Generic_Explore", connections: ["crossroads_west"], previewImage: "media/backgrounds/travel/terrain/forest/forest_6.webp" },
nomad_route: { id: "nomad_route", name: "Nomad Caravan Route", x: 28.5, y: 55.1, region: "western", type: "location", terrain: "highway", description: "A trade route used by wandering merchants.", danger: "medium", lootTier: "uncommon", unlockDay: 5, implemented: true, arrivalPassage: "Location_NomadRoute", connections: ["crossroads_west", "crossroads_central"], previewImage: "media/backgrounds/travel/terrain/highway/highway_2.webp" },
crossroads_east: { id: "crossroads_east", name: "Eastern Ruins", x: 71.8, y: 15.9, region: "eastern", type: "junction", terrain: "ruins", description: "Collapsed buildings and debris. Something hunts here at night.", danger: "medium", unlockDay: 5, storyLocked: true, connections: ["crossroads_central", "stalker_nest", "verdant_outpost"], previewImage: "media/backgrounds/wasteland/ruins/ruins.webp" },
stalker_nest: { id: "stalker_nest", name: "Stalker Den", x: 60.3, y: 45.4, region: "eastern", type: "location", terrain: "forest", description: "Where the creatures breed. Few return from here unchanged.", danger: "extreme", lootTier: "rare", unlockDay: 5, implemented: false, arrivalPassage: "Location_Generic_Explore", connections: ["crossroads_east"], previewImage: "media/backgrounds/travel/terrain/forest/forest_9.webp" },
verdant_outpost: { id: "verdant_outpost", name: "The Grove", x: 46.6, y: 25.1, region: "eastern", type: "location", terrain: "forest", description: "A hidden clearing where the Verdant Covenant gathers.", danger: "low", lootTier: "uncommon", unlockDay: 5, implemented: false, factionLocation: "verdant", arrivalPassage: "Location_Generic_Explore", connections: ["crossroads_east"], previewImage: "media/backgrounds/wasteland/forest/forest_day.webp" },
greenhollow: { id: "greenhollow", name: "The Grove", x: 72, y: 34, region: "eastern", type: "location", terrain: "forest", description: "Greenhollow: an old gated estate in the eastern woods, overgrown villas behind a wall. The Verdant Covenant lives there and keeps its own law.", danger: "low", lootTier: "uncommon", factionLocation: "verdant", discoverable: true, storyLocked: true, arrivalPassage: "Location_VerdantOutpost", connections: [], previewImage: "media/backgrounds/vault/exterior/verdant_grove.webp" },
crossroads_north: { id: "crossroads_north", name: "Northern Gate", x: 46.3, y: 0, region: "northern", type: "junction", terrain: "urban", description: "The broken entrance to the old city beyond.", danger: "high", unlockDay: 7, connections: ["crossroads_central", "hospital_ruins"], previewImage: "media/backgrounds/travel/terrain/urban/urban_2.webp" },
hospital_ruins: { id: "hospital_ruins", name: "The Clinic", x: 55.5, y: 32, region: "northern", type: "location", terrain: "urban", description: "An abandoned medical facility. Supplies remain, but so do other things.", danger: "high", lootTier: "rare", unlockDay: 7, implemented: false, arrivalPassage: "Location_Generic_Explore", connections: ["crossroads_north"], previewImage: "media/backgrounds/travel/terrain/urban/urban_5.webp" },
crossroads_south: { id: "crossroads_south", name: "The Crossing", x: 46.5, y: 45.4, region: "southern", type: "junction", terrain: "reclaimed", description: "Where the main roads intersect. A dangerous place to linger.", danger: "extreme", unlockDay: 10, connections: ["crossroads_central", "mutant_colony"], previewImage: "media/backgrounds/travel/terrain/reclaimed/reclaimed_7.webp" },
mutant_colony: { id: "mutant_colony", name: "The Warren", x: 86.5, y: 53.3, region: "southern", type: "location", terrain: "forest", description: "A sprawling underground den of the changed. Extremely dangerous.", danger: "extreme", lootTier: "legendary", unlockDay: 10, implemented: false, arrivalPassage: "Location_Generic_Explore", connections: ["crossroads_south"], previewImage: "media/backgrounds/travel/terrain/forest/forest_12.webp" },
north_crossing: { id: "north_crossing", name: "North Crossing", x: 46.2, y: 16, region: "northern", type: "junction", terrain: "reclaimed", description: "A northern junction point.", danger: "medium", unlockDay: 5, connections: ["crossroads_north", "crossroads_central"], previewImage: "media/backgrounds/travel/terrain/reclaimed/reclaimed_9.webp" }
},
routes: {},
terrainTypes: {
safe: { name: "Safe Zone", speedModifier: 1.0, encounterChance: 0, backgrounds: ["terrain-forest"] },
reclaimed: { name: "The Reclaimed", speedModifier: 1.0, encounterChance: 0.40, backgrounds: ["terrain-reclaimed"] },
wasteland: { name: "The Reclaimed", speedModifier: 1.0, encounterChance: 0.40, backgrounds: ["terrain-reclaimed"] },
ruins: { name: "Ruins", speedModifier: 0.9, encounterChance: 0.50, backgrounds: ["terrain-ruins"] },
highway: { name: "Highway", speedModifier: 1.2, encounterChance: 0.55, backgrounds: ["terrain-highway"] },
forest: { name: "Overgrown Forest", speedModifier: 0.8, encounterChance: 0.45, backgrounds: ["terrain-forest"] },
urban: { name: "Urban Ruins", speedModifier: 0.85, encounterChance: 0.60, backgrounds: ["terrain-urban"] },
industrial: { name: "Industrial Zone", speedModifier: 0.9, encounterChance: 0.55, backgrounds: ["terrain-ruins"] },
ravine: { name: "Ravines", speedModifier: 0.7, encounterChance: 0.45, backgrounds: ["terrain-forest"] },
swamp: { name: "Swampland", speedModifier: 0.6, encounterChance: 0.65, backgrounds: ["terrain-forest"] }
},
dangerLevels: {
safe: { encounterMultiplier: 0, combatDifficulty: 0 },
low: { encounterMultiplier: 0.75, combatDifficulty: 1 },
medium: { encounterMultiplier: 1.0, combatDifficulty: 2 },
high: { encounterMultiplier: 1.5, combatDifficulty: 3 },
extreme: { encounterMultiplier: 2.0, combatDifficulty: 4 },
unknown: { encounterMultiplier: 1.0, combatDifficulty: 2 }
}
}>>
<<for _nodeId, _node range $worldMap.nodes>>
<<set $mapExploration.visited[_nodeId] to (_node.type === "home")>>
<<set $mapExploration.revealed[_nodeId] to (_node.type === "home" || _node.startRevealed === true)>>
<</for>>
<<set $statusEffects = {
bleed: {
name: "Bleeding", icon: "skull-bones", type: "physical",
duration: 3, tickDamage: 3,
tickMessage: "You're bleeding!",
curedBy: ["bandage", "medical_treatment"],
stackable: true, maxStacks: 3
},
poison: {
name: "Poisoned", icon: "skull-bones", type: "physical",
duration: 5, tickDamage: 2,
tickMessage: "Poison courses through you!",
curedBy: ["antidote", "medical_treatment"],
additionalEffect: "agility -5"
},
stun: {
name: "Stunned", icon: "dizzy", type: "physical",
duration: 1, tickDamage: 0,
tickMessage: "You're stunned!",
curedBy: ["stimpack"],
additionalEffect: "skip_turn"
},
fear: {
name: "Afraid", icon: "afraid", type: "mental",
duration: 3, tickDamage: 0,
tickMessage: "Fear grips you!",
curedBy: ["calm", "courage_potion"],
additionalEffect: "cannot_attack"
},
charmed: {
name: "Charmed", icon: "broken-heart", type: "mental",
duration: 2, tickDamage: 0,
tickMessage: "You're charmed!",
curedBy: ["snap_out", "damage_taken"],
additionalEffect: "cannot_attack_source"
},
lust_daze: {
name: "Lust-Dazed", icon: "hot", type: "supernatural",
duration: 2, tickDamage: 0, tickLust: 10,
tickMessage: "Desire clouds your mind!",
curedBy: ["will_save", "cold_water"],
additionalEffect: "accuracy -20%"
},
corruption_surge: {
name: "Corruption Surge", icon: "corruption", type: "supernatural",
duration: 3, tickDamage: 0, tickCorruption: 3,
tickMessage: "Dark energy seeps into you!",
curedBy: ["purification"],
stackable: true, maxStacks: 2
},
essence_drain: {
name: "Essence Drain", icon: "ghost", type: "supernatural",
duration: 3, tickDamage: 2, tickEnergy: -5,
tickMessage: "Your essence is being drained!",
curedBy: ["holy_protection"],
additionalEffect: "healing -50%"
},
crippled: {
name: "Crippled", icon: "strength", type: "physical",
duration: -1, tickDamage: 0,
tickMessage: "",
curedBy: ["medical_treatment", "splint"],
additionalEffect: "dodge -20, cannot_flee"
},
exhausted: {
name: "Exhausted", icon: "exhausted", type: "physical",
duration: -1, tickDamage: 0,
tickMessage: "",
curedBy: ["rest", "stimpack"],
additionalEffect: "damage -30%, dodge -15"
},
welted: {
name: "Welted", icon: "bleeding", type: "physical",
duration: 5, tickDamage: 2,
tickMessage: "Welts sting! (-2 HP)",
curedBy: ["medical_treatment", "time"],
stackable: true, maxStacks: 5,
additionalEffect: "humiliation +2/turn"
},
confused: {
name: "Confused", icon: "question", type: "mental",
duration: 2, tickDamage: 0,
tickMessage: "Your mind swims with confusion!",
curedBy: ["focus", "damage_taken"],
additionalEffect: "50%_random_target"
},
marked: {
name: "Marked", icon: "marked", type: "supernatural",
duration: -1, tickDamage: 0,
tickMessage: "",
curedBy: ["cleansing_ritual"],
additionalEffect: "supernatural_enemies_prioritize"
}
}>>
<<set $buffEffects = {
defending: {
name: "Defending", icon: "armor",
duration: 1, effect: "damage_taken -50%"
},
dodging: {
name: "Dodging", icon: "dodge",
duration: 1, effect: "dodge +30%"
},
battle_rage: {
name: "Battle Rage", icon: "rage",
duration: 3, effect: "damage +30%, damage_taken +15%"
},
seductive_aura: {
name: "Seductive Aura", icon: "lips",
duration: 3, effect: "seduction_power +25%"
}
}>>
<<set $playerAbilities = {
attack: {
id: "attack", name: "Attack", icon: "attack",
type: "physical", energyCost: 0, cooldown: 0,
description: "Basic melee attack."
},
defend: {
id: "defend", name: "Defend", icon: "armor",
type: "physical", energyCost: 0, cooldown: 0,
description: "Reduce incoming damage by 50%."
},
dodge: {
id: "dodge", name: "Dodge", icon: "dodge",
type: "physical", energyCost: 0, cooldown: 0,
description: "Attempt to avoid the next attack."
},
shoot: {
id: "shoot", name: "Shoot", icon: "attack",
type: "physical", energyCost: 0, cooldown: 0,
unlockCondition: "ranged_weapon_equipped",
description: "Ranged attack with equipped weapon."
},
use_item: {
id: "use_item", name: "Use Item", icon: "backpack",
type: "utility", energyCost: 0, cooldown: 0,
unlockCondition: "has_consumables",
description: "Use an item from inventory."
},
power_strike: {
id: "power_strike", name: "Power Strike", icon: "power-strike",
type: "physical", energyCost: 10, cooldown: 2,
unlockCondition: "combat_victories >= 10",
description: "A powerful blow dealing 150% damage."
},
rapid_strikes: {
id: "rapid_strikes", name: "Rapid Strikes", icon: "rapid-strikes",
type: "physical", energyCost: 15, cooldown: 3,
unlockCondition: "agility >= 15",
description: "Attack twice with reduced damage."
},
intimidate: {
id: "intimidate", name: "Intimidate", icon: "angry",
type: "mental", energyCost: 8, cooldown: 4,
unlockCondition: "dominance >= 15",
description: "Attempt to frighten the enemy."
}
}>>
<<set $seductionAbilities = {
seduce: {
id: "seduce", name: "Seduce", icon: "lips",
type: "seduction", energyCost: 5, cooldown: 0,
unlockCondition: "$flags.seductionUnlocked",
description: "Attempt to arouse the enemy.",
lustDamage: 10,
lustBonusStat: "allure"
},
sultry_gaze: {
id: "sultry_gaze", name: "Sultry Gaze", icon: "eye",
type: "seduction", energyCost: 8, cooldown: 2,
unlockCondition: "allure >= 15",
description: "Lock eyes with target, inflicting lust-daze."
},
strip_tease: {
id: "strip_tease", name: "Distracting Display", icon: "armor",
type: "seduction", energyCost: 12, cooldown: 3,
unlockCondition: "allure >= 20",
description: "A provocative display that damages all enemies' lust.",
lustDamage: 15,
lustBonusStat: "allure",
lustBonusDivisor: 2,
aoe: true
},
kiss_of_submission: {
id: "kiss_of_submission", name: "Kiss of Submission", icon: "corruption",
type: "seduction", energyCost: 20, cooldown: 5,
unlockCondition: "allure >= 30 && corruption >= 20",
description: "A supernatural kiss that can instantly seduce weakened enemies."
}
}>>
<<set $supernaturalAbilities = {
dark_pulse: {
id: "dark_pulse", name: "Dark Pulse", icon: "corruption",
type: "supernatural", energyCost: 15, cooldown: 2,
unlockCondition: "corruption >= 20",
description: "Release a wave of dark energy.",
damage: "15 + corruption/4"
},
drain_essence: {
id: "drain_essence", name: "Drain Essence", icon: "ghost",
type: "supernatural", energyCost: 20, cooldown: 3,
unlockCondition: "corruption >= 35",
description: "Steal life force from an enemy.",
heal: "damage_dealt * 0.5"
},
terror_visage: {
id: "terror_visage", name: "Terror Visage", icon: "demon",
type: "supernatural", energyCost: 18, cooldown: 4,
unlockCondition: "corruption >= 35 && transformationStage >= 1",
description: "Reveal your changing nature, terrifying enemies."
},
succubus_kiss: {
id: "succubus_kiss", name: "Succubus Kiss", icon: "lips",
type: "supernatural", energyCost: 25, cooldown: 4,
unlockCondition: "corruption >= 50",
description: "A kiss that drains lust and converts it to health.",
lustDamage: 30
},
shadow_step: {
id: "shadow_step", name: "Shadow Step", icon: "dark",
type: "supernatural", energyCost: 15, cooldown: 3,
unlockCondition: "transformationStage >= 2",
description: "Phase through shadows, avoiding the next attack."
},
abyssal_form: {
id: "abyssal_form", name: "Abyssal Form", icon: "corruption",
type: "supernatural", energyCost: 40, cooldown: 10,
unlockCondition: "transformationStage >= 3",
description: "Fully embrace your supernatural nature for 3 turns."
}
}>>
<<set $enemyAbilities = {
quick_strike: {
name: "Quick Strike", damage: "base * 0.8", accuracy: "+20", priority: "first"
},
heavy_strike: {
name: "Heavy Strike", damage: "base * 1.5", accuracy: "-10"
},
reckless_attack: {
name: "Reckless Attack", damage: "base * 1.3", selfEffect: "defense -30%"
},
dirty_fighting: {
name: "Dirty Fighting", damage: "base * 0.9", effect: "30% chance: bleed"
},
rally_troops: {
name: "Rally Troops", effect: "all_allies: damage +25% for 2 turns", cooldown: 4
},
protective_rage: {
name: "Protective Rage", trigger: "health < 30%", effect: "damage +40%, damage_taken -20%"
},
poison_bite: {
name: "Poison Bite", damage: "base * 0.8", effect: "apply_status:poison"
},
poison_sting: {
name: "Poison Sting", damage: "base", effect: "apply_status:poison", accuracy: "+10"
},
ambush: {
name: "Ambush", damage: "base * 2", requires: "hidden"
},
burrow: {
name: "Burrow", effect: "untargetable for 1 turn, next_attack +50% damage"
},
pack_tactics: {
name: "Pack Tactics", passive: true, effect: "+5 damage per ally"
},
frenzy: {
name: "Frenzy", effect: "attack twice, accuracy -20%"
},
regenerate_weak: {
name: "Weak Regeneration", passive: true, effect: "+3 HP per turn"
},
lust_touch: {
name: "Lust Touch", damage: 0, lustDamage: 15, effect: "20% chance: lust_daze"
},
phantasmal_touch: {
name: "Phantasmal Touch", damage: "base", damageType: "supernatural", ignoresArmor: true
},
nightmare_vision: {
name: "Nightmare Vision", damage: "0", effect: "apply_status:fear", successChance: "60"
},
charm_gaze: {
name: "Charm Gaze", effect: "apply_status:charmed", successChance: "50"
},
seductive_strike: {
name: "Seductive Strike", damage: "base * 0.7", lustDamage: 12
},
seductive_taunt: {
name: "Seductive Taunt", lustDamage: 10, effect: "all_enemies: accuracy -10%"
},
spawn_hatchlings: {
name: "Spawn Hatchlings", effect: "summon:mutant_hatchling x2", cooldown: 3
},
acid_spit: {
name: "Acid Spit", damage: "base", effect: "50% chance: apply_status:poison"
},
retreat: {
name: "Retreat", trigger: "health < 20%", effect: "flee_combat"
},
analyze_weakness: {
name: "Analyze Weakness", effect: "next_attack: accuracy +30%, crit +20%", cooldown: 3
},
flash_powder: {
name: "Flash Powder", effect: "all_enemies: accuracy -30% for 2 turns", cooldown: 4
},
herbal_toss: {
name: "Herbal Toss", damage: "base * 0.5", effect: "50% chance: poison OR heal_self 10"
},
entangle: {
name: "Entangle", damage: "0", effect: "apply_status:crippled", successChance: "55"
},
battle_cry: {
name: "Battle Cry", effect: "all_allies: damage +20% for 2 turns", cooldown: 3
},
phase_shift: {
name: "Phase Shift", effect: "dodge +50% for 1 turn"
},
reality_tear: {
name: "Reality Tear", damage: "base * 1.2", damageType: "supernatural"
},
duplicate: {
name: "Duplicate", effect: "summon:reality_glitch", cooldown: 5
},
mutant_hatchling: {
id: "mutant_hatchling", name: "Hatchling",
health: 10, damage: 4, dodge: 20, isSummon: true
}
}>>
<<set $encounters = {
wasteland_easy: [
{ enemies: ["rad_dog", "rad_dog"], weight: 30 },
{ enemies: ["scavenger_desperate"], weight: 25 },
{ enemies: ["raider_scout"], weight: 25 },
{ enemies: ["dust_scorpion"], weight: 20 }
],
wasteland_medium: [
{ enemies: ["raider_grunt", "raider_scout"], weight: 30 },
{ enemies: ["wasteland_stalker"], weight: 25 },
{ enemies: ["raider_grunt", "raider_grunt"], weight: 25 },
{ enemies: ["mutant_twisted"], weight: 20 }
],
wasteland_hard: [
{ enemies: ["raider_brute", "raider_grunt"], weight: 30 },
{ enemies: ["raider_leader", "raider_scout", "raider_scout"], weight: 20 },
{ enemies: ["wasteland_stalker", "wasteland_stalker"], weight: 25 },
{ enemies: ["mutant_broodmother"], weight: 15 },
{ enemies: ["desire_shade", "lust_wisp", "lust_wisp"], weight: 10 }
],
crimson_warband: [
{ enemies: ["crimson_warrior"], weight: 40 },
{ enemies: ["crimson_warrior", "crimson_warrior"], weight: 35 },
{ enemies: ["crimson_warrior", "raider_brute"], weight: 25 }
],
supernatural: [
{ enemies: ["lust_wisp", "lust_wisp", "lust_wisp"], weight: 35 },
{ enemies: ["desire_shade"], weight: 30 },
{ enemies: ["succubus_thrall"], weight: 20 },
{ enemies: ["desire_shade", "lust_wisp", "lust_wisp"], weight: 15 }
]
}>>
<<set $tensionConfig = {
decayRate: 2,
combatGain: 5,
proximityGain: 3,
loadedMomentGain: 10,
breakThreshold: 90
}>>
<<set $arousal = {
player: {
daysAtHigh: 0,
lastRelease: 0,
releaseQuality: "none",
edging: false,
blueBallsActive: false
},
kira: {
daysAtHigh: 0,
lastRelease: 0,
snapAttempts: 0,
lastSnapDay: 0,
blueBallsActive: false
},
mutual: {
daysAtHigh: 0,
snapTriggered: false
}
}>>
<<set $edgingBonuses = {
damage: 0,
intimidation: 0,
seduction: 0,
sceneIntensity: "standard"
}>>
<<set $denial = {
active: false,
daysDenied: 0,
denialSource: "",
edgeCount: 0,
breakingPoint: 10,
intensityMultiplier: 1.0
}>>
<<set $tantric = {
energy: 0,
maxEnergy: 100,
lastHarvest: 0,
harvestEfficiency: 1.0,
canHarvest: false,
ritualKnowledge: []
}>>
<<set $sexualTriggers = {
discovered: [],
active: []
}>>
<<set $triggerTemplate = {
id: "",
name: "",
type: "",
intensity: 50,
chance: 20,
effect: "",
source: "",
partnerSpecific: false,
partnerId: ""
}>>
<<set $breeding = {
playerFertility: 100,
breedingUrge: 0,
urgeThreshold: 70,
impregnated: [],
impregnatedBy: "",
breedingStock: false,
stockOwner: "",
scheduledBreedings: [],
pool: [],
pregnancies: [],
yield: 0,
marks: 0
}>>
<<set $publicUse = {
playerStatus: "free",
daysRemaining: 0,
useCount: 0,
location: "",
canRefuse: false,
companions: {},
postDays: 0,
lastPostDay: 0,
witnessUses: 0
}>>
<<set $grove to setup.groveFreshState()>>
<<set $blackmail = {
youHaveOn: [],
theyHaveOnYou: []
}>>
<<set $blackmailTemplate = {
targetId: "",
targetName: "",
type: "",
severity: 1,
discovered: false,
used: false,
content: "",
demands: []
}>>
<<set $possession = {
active: false,
possessor: "",
possessorName: "",
controlLevel: 0,
canResist: true,
playerAware: true,
duration: 0,
desires: [],
actionsWhilePossessed: []
}>>
<<set $reluctance = {
currentScene: false,
verbalResistance: 0,
physicalResistance: 0,
bodyResponse: 0,
breakingPoint: 0,
aftermath: ""
}>>
<<set $cnc = {
agreementActive: true,
agreedWith: ["kira"],
safeWord: "red",
scenarioPreferences: [],
limits: [],
activeScene: false
}>>
<<set $healing = {
needsIntimateHealing: false,
woundLocation: "",
healerRequired: "",
intimacyRequired: false,
healingBond: 0
}>>
<<set $hunt = {
active: false,
role: "",
target: "",
targetName: "",
timeLimit: 10,
turnsElapsed: 0,
escapeAttempts: 0,
captureMethod: "",
safeWord: "",
stakes: "",
difficulty: 12,
arousalBuildup: 0
}>>
<<set $intimateItems = {
owned: [],
equipped: {
worn: null,
holding: null
},
craftingRecipes: []
}>>
<<set $stats = {
sex: {
totalEncounters: 0,
partnersHad: [],
supernaturalCount: 0,
virginityLost: false,
virginityLostTo: "",
virginityLostDay: 0,
oralGiven: 0,
oralReceived: 0,
penetrativeTop: 0,
penetrativeBottom: 0,
analGiven: 0,
analReceived: 0,
publicSex: 0,
groupSex: 0,
titfuck: 0,
dubconExperiences: 0,
cncScenes: 0,
womenUsed: 0,
womenClaimed: 0
},
sexScenes: {
player: {
total: 0,
vaginal: 0,
oral_received: 0,
oral_given: 0,
anal: 0
},
kira: {
total: 0,
vaginal: 0,
oral_received: 0,
oral_given: 0,
anal: 0,
rough: 0,
cnc: 0
},
locations: {
vault: 0,
wasteland: 0,
other: 0
}
},
combat: {
enemiesDefeated: 0,
enemiesSeduced: 0,
timesDefeated: 0,
timesEscaped: 0,
combat_victories: 0,
negotiations_successful: 0
}
}>>
<<set $flags = {
cncAgreementSet: true,
fishedAtLake: false,
lakeDreamGift: false,
trainingLead: false,
yardDoorSeen: false,
preludeComplete: false,
arrivedUnwillingly: false,
firstCompanionMet: false,
supernaturalDiscovered: false,
magicIsReal: false,
darkPowersUnlocked: false,
sultryGazeUnlocked: false,
parryRiposteUnlocked: false,
libraryAccessed: false,
corruptionExplained: false,
claimingKnown: false,
tantricKnown: false,
succubusFirstEncounter: false,
succubusEncounters: 0,
breedingProgramKnown: false,
publicUseKnown: false,
sexCurrencyKnown: false,
cncIntroduced: false,
possessionPossible: false,
dubconEncountered: false,
lastIntimateWith: "",
denialDisobey: false,
visitedKiraRoom: false,
askedAboutKiraRoom: false,
seraPhotoSeen: false,
askedAboutSeraPhoto: false,
readKiraJournal: false,
kiraRoomBanned: false,
kiraRoomBannedUntil: 0,
kissedKira: false,
sleptInKirasRoom: false,
kiraNightDay: null,
kiraRoomWakeView: false,
kiraGiftGiven: false,
kiraDenied: false,
kiraCorrupted: false,
velithWatchedSex: false,
threesomeWithVelith: false,
kiraWaitOwed: false,
kiraCaughtShower: false,
showerSexKira: false,
handjobFromKira: false,
outdoorSex: false,
publicRisk: false,
watchedKiraMasturbate: false,
sawKiraMasturbate: false,
mutualOutside: false,
newArmorEquipped: false,
kiraSeenPlayerDick: false,
playerSeenKiraTits: false,
playerSeenKiraPussy: false,
kiraCreamedByEnemy: false,
playerFuckedInCombat: false,
kiraFuckedInCombat: false,
watchedKiraGetFucked: false,
joinedKiraThreesome: false,
inCombatExposureChoice: false,
kiraAnalInCombat: false,
threesomeWithKira: false,
watchedKiraCNC: false,
sloppy_seconds_kira: false,
tollPayment: false,
tollPaymentBoth: false,
groupCNCBoth: false,
remarkedKiraTits: false,
kiraBlowjobTravel: false,
kiraTookInitiative: false,
kiraMountedRest: false,
postBattleSexKira: false,
kiraBlowjobPostBattle: false,
tookKiraPostBattle: false,
kiraSnapPending: false,
kiraSnappedToday: false,
mutualSnapPending: false,
kiraGaveUp: false,
mutualSnapOccurred: false,
combatToday: false,
stressfulEventToday: false,
seenKiraNaked: false,
seenKiraTits: false,
sleptWithKira: false,
sleptInSameRoom: false,
hadDeepConversation: false,
sharedVulnerability: false,
exposedDuringDay: false,
corruptionGained: false,
blueBallsTriggered: false,
reliefUsed: false,
exhibitionismGain: false,
playerFirstExposure: false,
kiraFirstTitsExposure: false,
kiraFirstPussyExposure: false,
exposureEventPending: "",
playerTierUpPending: false,
kiraTierUpPending: false,
newTransformationStage: false,
blackmailDemandPending: null,
vaultDebt: 0,
debtCollectionPending: false,
lastDebtCollection: 0,
totalDebtPaid: 0,
groundskeeperRescueCount: 0,
eventsTriggered: []
}>>
<<set $temp = {}>>
<<set $inventory = [
{
id: "leather_jacket",
name: "Leather Jacket",
type: "armor",
quantity: 1
}
]>>
<<set $vaultStorage = []>>
<<set $storage = {
spareClothes: {
tops: ["survivor_shirt"],
bottoms: ["cargo_pants"],
underwear: ["standard"]
},
armor: [],
intimate: []
}>>
<<set $equipped = {
weapon: null,
armor: null,
accessory: null,
intimate: null
}>>
<<set $armorDatabase = {
leather_jacket: {
id: "leather_jacket",
name: "Leather Jacket",
description: "Worn but functional. Pre-war motorcycle gear.",
defense: 3,
maxDurability: 50,
currentDurability: 50,
effects: {},
rarity: "common"
},
reinforced_vest: {
id: "reinforced_vest",
name: "Reinforced Vest",
description: "Heavy padding over vital areas. Restricts movement slightly.",
defense: 6,
maxDurability: 75,
currentDurability: 75,
effects: {
mobilityPenalty: 0.05
},
rarity: "uncommon"
},
military_armor: {
id: "military_armor",
name: "Military Armor",
description: "Pre-Cataclysm military spec. Heavy but protective.",
defense: 10,
maxDurability: 100,
currentDurability: 100,
effects: {
mobilityPenalty: 0.10
},
rarity: "rare"
},
mage_robes: {
id: "mage_robes",
name: "Mage Robes",
description: "Enchanted fabric with subtle shimmer. Light but magically protective.",
defense: 2,
maxDurability: 40,
currentDurability: 40,
effects: {
magicResist: 5,
magicBonus: 2
},
rarity: "rare",
requires: { magicDiscovered: true }
},
raider_scraps: {
id: "raider_scraps",
name: "Raider Scraps",
description: "Patchwork armor from raider kills. Intimidating appearance.",
defense: 4,
maxDurability: 30,
currentDurability: 30,
effects: {
intimidation: true,
factionRepPenalty: "verdant"
},
rarity: "uncommon"
},
vault_security: {
id: "vault_security",
name: "Vault Security Gear",
description: "Official vault security armor. Shows you belong here.",
defense: 5,
maxDurability: 60,
currentDurability: 60,
effects: {
trustBonus: "groundskeeper"
},
rarity: "uncommon"
}
}>>
<<set $intimateApparel = {
player: {
standard: {
id: "standard",
name: "Standard Briefs",
description: "Basic underwear. Gets the job done.",
durability: 100,
effects: {},
image: "media/clothing/intimate/player/standard_v2.webp"
},
commando: {
id: "commando",
name: "Nothing",
description: "Going without. Risky but freeing.",
durability: 0,
effects: {
exposureThreshold: 50,
lustGain: 1.05
}
},
reinforced: {
id: "reinforced",
name: "Reinforced Shorts",
description: "Extra padding where it counts.",
durability: 125,
effects: {
defense: 1
},
image: "media/clothing/intimate/player/reinforced_v2.webp"
},
tight: {
id: "tight",
name: "Tight Salvaged Briefs",
description: "Pre-war athletic wear. Form-fitting.",
durability: 100,
effects: {
visibleBulge: true,
defense: 1
},
image: "media/clothing/intimate/player/tight_v2.webp"
}
},
kira: {
standard: {
id: "standard",
name: "Standard Underwear",
description: "Practical cotton set.",
durability: 100,
effects: {},
image: "media/clothing/intimate/kira/standard_v2.webp"
},
sports: {
id: "sports",
name: "Sports Wrap",
description: "Supportive and practical for combat.",
durability: 115,
effects: {
mobility: 1.05
},
image: "media/clothing/intimate/kira/sports_v2.webp"
},
commando: {
id: "commando",
name: "Nothing",
description: "She's chosen to go without.",
durability: 0,
effects: {
exposureThreshold: 50,
tensionGain: 1.10
},
requires: { exhibitionism: 60 }
},
lingerie: {
id: "lingerie",
name: "Salvaged Lingerie",
description: "Pre-war luxury. Delicate lace and silk.",
durability: 75,
effects: {
seduction: 1.15,
tensionWhenSeen: 10
},
image: "media/clothing/intimate/kira/lingerie_v2.webp"
},
reinforced: {
id: "reinforced",
name: "Reinforced Wraps",
description: "Practical protection. Not pretty.",
durability: 125,
effects: {
defense: 1
},
image: "media/clothing/intimate/kira/reinforced_v2.webp"
},
cutaway: {
id: "cutaway",
name: "Cutaway Set",
description: "Strategically... accessible.",
durability: 100,
effects: {
accessible: true,
tensionGain: 1.20
},
requires: { trust: 50 },
image: "media/clothing/intimate/kira/cutaway_v2.webp"
},
sheer: {
id: "sheer",
name: "Sheer Salvage",
description: "See-through when wet. Or whenever she wants.",
durability: 90,
effects: {
seeThrough: true,
seduction: 1.10
},
image: "media/clothing/intimate/kira/sheer_v2.webp"
}
}
}>>
<<set $wardrobe = {
player: {
intimate: ["standard"],
equipped: "standard"
},
kira: {
intimate: ["standard"],
equipped: "standard"
}
}>>
<<set $clothingDatabase = {
tops: {
survivor_shirt: {
id: "survivor_shirt",
name: "Survivor's Shirt",
description: "Faded pre-war t-shirt with makeshift patches.",
style: "casual",
rarity: "common",
image: "media/clothing/tops/survivor_shirt_v2.webp"
},
tank_top: {
id: "tank_top",
name: "Tank Top",
description: "Sleeveless shirt. Shows off arms.",
style: "casual",
rarity: "common",
image: "media/clothing/tops/tank_top_v2.webp"
},
flannel_shirt: {
id: "flannel_shirt",
name: "Flannel Shirt",
description: "Rugged button-up. Practical for life in the Reclaimed.",
style: "rugged",
rarity: "uncommon",
image: "media/clothing/tops/flannel_shirt_v2.webp"
},
tactical_shirt: {
id: "tactical_shirt",
name: "Tactical Shirt",
description: "Military-style utility shirt with reinforced elbows.",
style: "tactical",
rarity: "uncommon",
image: "media/clothing/tops/tactical_shirt_v2.webp"
},
formal_shirt: {
id: "formal_shirt",
name: "Formal Shirt",
description: "Pre-war dress shirt. Impractical but stylish.",
style: "formal",
rarity: "rare",
image: "media/clothing/tops/formal_shirt_v2.webp"
},
hoodie: {
id: "hoodie",
name: "Hoodie",
description: "Comfortable hooded sweatshirt. Good for cold nights.",
style: "casual",
rarity: "uncommon",
image: "media/clothing/tops/hoodie_v2.webp"
}
},
bottoms: {
cargo_pants: {
id: "cargo_pants",
name: "Cargo Pants",
description: "Sturdy pants with lots of pockets.",
style: "rugged",
rarity: "common",
image: "media/clothing/bottoms/cargo_pants_v2.webp"
},
jeans: {
id: "jeans",
name: "Jeans",
description: "Classic denim. Worn but durable.",
style: "casual",
rarity: "common",
image: "media/clothing/bottoms/jeans_v2.webp"
},
shorts: {
id: "shorts",
name: "Shorts",
description: "Lightweight shorts. Good for mobility.",
style: "casual",
rarity: "common",
image: "media/clothing/bottoms/shorts_v2.webp"
},
tactical_pants: {
id: "tactical_pants",
name: "Tactical Pants",
description: "Military-grade cargo pants with reinforced knees.",
style: "tactical",
rarity: "uncommon",
image: "media/clothing/bottoms/tactical_pants_v2.webp"
},
dress_pants: {
id: "dress_pants",
name: "Dress Pants",
description: "Pre-war formal wear. Impractical for survival.",
style: "formal",
rarity: "rare",
image: "media/clothing/bottoms/dress_pants_v2.webp"
},
skirt: {
id: "skirt",
name: "Skirt",
description: "Short skirt. Mobility at the cost of protection.",
style: "revealing",
rarity: "uncommon",
image: "media/clothing/bottoms/skirt_v2.webp"
}
}
}>>
<<set $exhibitionism = {
player: 0,
kira: 0
}>>
<<set $outfitPresets = []>>
<<set $savedOutfits = {
player: [],
kira: []
}>>
<<set $lastRoll = {
dice: 0,
modifier: 0,
total: 0,
target: 0,
success: false,
margin: 0
}>>
<<set $discoveries = {
collapsedMarket: false,
raiderCamp: false,
hollow: false,
hiddenCache: false,
chemicalPlant: false,
buriedBunker: false,
nomadRoute: false,
greenhollow: false,
stalkerNest: false,
strangeShrine: false,
hospitalRuins: false,
libraryRuins: false,
sunkenLab: false,
convergenceSite: false
}>>
<<set $locations = {
vault: {
name: "The Vault",
region: "central",
danger: "safe",
searched: false,
searchedToday: false,
foughtToday: false
},
pleasure_den: {
name: "The Pleasure Den",
region: "central",
danger: "medium",
searched: false,
searchedToday: false,
foughtToday: false
},
crossroads_central: {
name: "Old Town",
region: "central",
danger: "low",
searched: false,
searchedToday: false,
foughtToday: false
},
outpost: {
name: "Abandoned Outpost",
region: "central",
danger: "low",
travelTime: 1,
searched: false,
lootTable: ["scrap metal", "dirty water", "canned food", "bandage"]
},
convoy: {
name: "Rusted Convoy",
region: "central",
danger: "medium",
travelTime: 2,
searched: false,
lootTable: ["scrap metal", "fuel can", "vehicle parts", "dirty water"]
},
market: {
name: "Collapsed Market",
region: "central",
danger: "medium",
travelTime: 2,
searched: false,
lootTable: ["trade goods", "canned food", "scrap cloth", "medical_supplies"]
},
raider_camp: {
name: "Raider Camp",
region: "central",
danger: "high",
travelTime: 3,
searched: false,
cleared: false,
lootTable: ["weapons", "ammo", "scrap metal", "raider gear"],
enemies: ["raider_grunt", "raider_grunt", "raider_brute"]
},
hollow: {
name: "The Hollow",
region: "central",
danger: "high",
searched: false,
cleared: false
},
greenhollow: {
name: "The Grove",
region: "eastern",
danger: "low",
searched: false
},
overgrown_ruins: {
name: "Overgrown Ruins",
region: "central",
danger: "unknown",
travelTime: 2,
searched: false,
story: true
},
the_crossway: {
name: "The Crossway",
region: "central",
danger: "medium",
travelTime: 1,
searched: false,
searchedToday: false,
foughtToday: false,
lootTable: ["scrap metal", "dirty water", "canned food", "scrap cloth"]
}
}>>
<<for _nodeId, _node range $worldMap.nodes>>
<<if !$locations[_nodeId]>>
<<set $locations[_nodeId] to {
searched: false,
searchedToday: false,
foughtToday: false
}>>
<<else>>
<<if $locations[_nodeId].searchedToday is undefined>>
<<set $locations[_nodeId].searchedToday to false>>
<</if>>
<<if $locations[_nodeId].foughtToday is undefined>>
<<set $locations[_nodeId].foughtToday to false>>
<</if>>
<</if>>
<</for>>
<<set $expeditionCompanion to "">>
<<set $selectedRegion to "">>
<<set $selectedLocation to "">>
<<set $player.carriedFood to 0>>
<<set $player.carriedWater to 0>>
<<set $sexualActs to {
kiss_gentle: {
id: "kiss_gentle", name: "Gentle Kiss", category: "basic",
intensity: 5, playerLust: 5, partnerLust: 5,
description: "Your lips meet softly.",
requirements: {}, leadsTo: ["kiss_deep", "touch_body"]
},
kiss_deep: {
id: "kiss_deep", name: "Deep Kiss", category: "basic",
intensity: 10, playerLust: 8, partnerLust: 10,
description: "Tongues intertwine hungrily.",
requirements: {intensity: 5}, leadsTo: ["touch_intimate", "undress_partial"]
},
touch_body: {
id: "touch_body", name: "Caress Body", category: "basic",
intensity: 8, playerLust: 5, partnerLust: 8,
description: "Hands explore curves and planes.",
requirements: {}, leadsTo: ["touch_intimate", "undress_partial"]
},
touch_intimate: {
id: "touch_intimate", name: "Intimate Touch", category: "basic",
intensity: 15, playerLust: 12, partnerLust: 15,
description: "Fingers find sensitive places.",
requirements: {intensity: 10}, leadsTo: ["oral_give", "oral_receive", "penetrate"]
},
grind: {
id: "grind", name: "Grind Together", category: "basic",
intensity: 20, playerLust: 15, partnerLust: 18,
description: "Bodies press and move against each other.",
requirements: {intensity: 10}, leadsTo: ["penetrate", "oral_give"]
},
undress_partial: {
id: "undress_partial", name: "Remove Clothing", category: "basic",
intensity: 12, playerLust: 8, partnerLust: 10,
description: "Fabric falls away, revealing skin.",
requirements: {}, leadsTo: ["touch_intimate", "oral_give", "oral_receive"]
},
oral_give: {
id: "oral_give", name: "Go Down On Her", category: "oral",
intensity: 25, playerLust: 10, partnerLust: 30,
partnerOrgasmChance: 40,
description: "Your mouth worships her most sensitive place.",
requirements: {intensity: 15}, leadsTo: ["penetrate", "oral_receive", "sixty_nine"]
},
oral_receive: {
id: "oral_receive", name: "Receive Oral", category: "oral",
intensity: 25, playerLust: 30, partnerLust: 15,
playerOrgasmChance: 30,
description: "Her mouth takes you in.",
requirements: {intensity: 15}, leadsTo: ["penetrate", "oral_give", "finish_oral"]
},
sixty_nine: {
id: "sixty_nine", name: "69", category: "oral",
intensity: 35, playerLust: 25, partnerLust: 25,
playerOrgasmChance: 25, partnerOrgasmChance: 25,
description: "Simultaneous pleasure, giving and receiving.",
requirements: {intensity: 25}, leadsTo: ["penetrate", "climax_together"]
},
penetrate: {
id: "penetrate", name: "Enter Her", category: "penetrative",
intensity: 40, playerLust: 30, partnerLust: 30,
description: "You slide inside her warmth.",
requirements: {intensity: 20}, leadsTo: ["thrust_slow", "thrust_fast", "position_change"]
},
thrust_slow: {
id: "thrust_slow", name: "Slow, Deep Thrusts", category: "penetrative",
intensity: 45, playerLust: 20, partnerLust: 25,
partnerOrgasmChance: 20,
description: "Long, deliberate strokes that fill her completely.",
requirements: {actsPerformed: ["penetrate"]},
leadsTo: ["thrust_fast", "position_change", "climax_together"]
},
thrust_fast: {
id: "thrust_fast", name: "Hard and Fast", category: "penetrative",
intensity: 60, playerLust: 35, partnerLust: 35,
playerOrgasmChance: 30, partnerOrgasmChance: 30,
description: "Primal, urgent rhythm.",
requirements: {actsPerformed: ["penetrate"]},
leadsTo: ["climax_together", "position_change"]
},
penetrate_rough: {
id: "penetrate_rough", name: "Rough Entry", category: "penetrative",
intensity: 50, playerLust: 35, partnerLust: 30,
description: "You enter her hard and fast, claiming her with urgency.",
requirements: {intensity: 20},
traits: ["rough", "dominant"],
leadsTo: ["thrust_hard", "thrust_fast", "position_doggy"]
},
thrust_hard: {
id: "thrust_hard", name: "Pound Her", category: "penetrative",
intensity: 65, playerLust: 40, partnerLust: 35,
playerOrgasmChance: 35, partnerOrgasmChance: 30,
description: "You drive into her with punishing force.",
requirements: {actsPerformed: ["penetrate"]},
traits: ["rough", "dominant"],
leadsTo: ["thrust_deep", "climax_together"]
},
thrust_deep: {
id: "thrust_deep", name: "Deep Thrusts", category: "penetrative",
intensity: 55, playerLust: 30, partnerLust: 30,
playerOrgasmChance: 25, partnerOrgasmChance: 25,
description: "You bury yourself to the hilt, grinding deep.",
requirements: {actsPerformed: ["penetrate"]},
leadsTo: ["climax_together", "thrust_fast"]
},
position_missionary: {
id: "position_missionary", name: "Face to Face", category: "penetrative",
intensity: 50, playerLust: 25, partnerLust: 30,
description: "Eye contact, breath mingling, intimately close.",
requirements: {actsPerformed: ["penetrate"]},
traits: ["intimate", "dominant"],
leadsTo: ["thrust_slow", "thrust_fast", "climax_together"]
},
position_doggy: {
id: "position_doggy", name: "From Behind", category: "penetrative",
intensity: 55, playerLust: 30, partnerLust: 25,
description: "You grip her hips and drive deep.",
requirements: {actsPerformed: ["penetrate"]},
traits: ["dominant", "primal"],
leadsTo: ["thrust_fast", "hair_pull", "climax_together"]
},
position_cowgirl: {
id: "position_cowgirl", name: "Let Her Ride", category: "penetrative",
intensity: 55, playerLust: 28, partnerLust: 35,
partnerOrgasmChance: 25,
description: "She controls the pace, taking what she needs.",
requirements: {actsPerformed: ["penetrate"]},
traits: ["submissive", "intimate"],
leadsTo: ["thrust_slow", "climax_together"]
},
climax_together: {
id: "climax_together", name: "Climax Together", category: "climax",
intensity: 100, playerLust: -80, partnerLust: -80,
playerOrgasm: true, partnerOrgasm: true,
description: "The world whites out as you crash over the edge together.",
requirements: {intensity: 60}, endsScene: true
},
climax_player: {
id: "climax_player", name: "Release", category: "climax",
intensity: 80, playerLust: -70, partnerLust: 10,
playerOrgasm: true,
description: "Pleasure crests and breaks.",
requirements: {intensity: 50},
leadsTo: ["continue_for_her", "aftermath"]
},
climax_partner: {
id: "climax_partner", name: "Make Her Finish", category: "climax",
intensity: 80, playerLust: 15, partnerLust: -70,
partnerOrgasm: true,
description: "She shudders and cries out beneath you.",
requirements: {intensity: 50},
leadsTo: ["continue_for_you", "climax_player", "aftermath"]
},
hair_pull: {
id: "hair_pull", name: "Pull Her Hair", category: "kinky",
intensity: 15, playerLust: 8, partnerLust: 20,
description: "You grip her hair and tug. She gasps.",
requirements: {partnerKink: "hair pulling"},
traits: ["dominant"],
leadsTo: ["thrust_fast", "position_doggy"]
},
hairpull: {
id: "hairpull", name: "Pull Hair", category: "kinky",
intensity: 15, playerLust: 8, partnerLust: 20,
description: "Your fingers tangle in her hair, pulling her head back.",
requirements: {},
traits: ["dominant", "rough"],
leadsTo: ["thrust_hard", "thrust_fast"]
},
grope_tits: {
id: "grope_tits", name: "Grope Her Breasts", category: "kinky",
intensity: 20, playerLust: 10, partnerLust: 18,
description: "You grab her breasts roughly, squeezing and kneading.",
requirements: {},
traits: ["rough", "dominant"],
leadsTo: ["thrust_fast", "penetrate"]
},
pin_down: {
id: "pin_down", name: "Pin Her Down", category: "kinky",
intensity: 20, playerLust: 15, partnerLust: 25,
description: "You hold her wrists above her head.",
requirements: {partnerKink: "being pinned"},
traits: ["dominant", "restraint"],
leadsTo: ["thrust_slow", "thrust_fast", "tease"]
},
tease: {
id: "tease", name: "Tease Her", category: "kinky",
intensity: 20, playerLust: 5, partnerLust: 25,
description: "You bring her close, then pull back. Again and again.",
requirements: {},
traits: ["dominant", "control"],
leadsTo: ["oral_give", "penetrate", "make_beg"]
},
masturbate_player: {
id: "masturbate_player", name: "Touch Yourself", category: "solo",
intensity: 15, playerLust: 20, partnerLust: 15,
description: "You stroke yourself while she watches.",
requirements: {},
leadsTo: ["climax_player"]
},
masturbate_partner: {
id: "masturbate_partner", name: "Watch Her Touch Herself", category: "solo",
intensity: 15, playerLust: 15, partnerLust: 20,
partnerOrgasmChance: 25,
description: "She pleasures herself while you watch.",
requirements: {},
leadsTo: ["touch_intimate", "oral_give"]
},
fingering: {
id: "fingering", name: "Finger Her", category: "manual",
intensity: 30, playerLust: 10, partnerLust: 35,
partnerOrgasmChance: 35,
description: "Your fingers work inside her, curling to hit her spot.",
requirements: {intensity: 15},
leadsTo: ["penetrate", "climax_partner"]
},
handjob_receive: {
id: "handjob_receive", name: "She Strokes You", category: "manual",
intensity: 30, playerLust: 35, partnerLust: 10,
playerOrgasmChance: 30,
description: "Her hand works your shaft expertly.",
requirements: {intensity: 15},
leadsTo: ["oral_receive", "penetrate", "climax_player"]
},
position_desk: {
id: "position_desk", name: "On The Desk", category: "position",
intensity: 55, playerLust: 30, partnerLust: 30,
description: "You sweep everything aside and take her on the desk.",
requirements: {actsPerformed: ["penetrate"]},
traits: ["rough", "spontaneous"],
leadsTo: ["thrust_fast", "climax_together"]
},
position_against_wall: {
id: "position_against_wall", name: "Against The Wall", category: "position",
intensity: 60, playerLust: 35, partnerLust: 35,
description: "You pin her against the wall, fucking her standing.",
requirements: {actsPerformed: ["penetrate"]},
traits: ["rough", "dominant"],
leadsTo: ["thrust_fast", "climax_together"]
},
position_spooning: {
id: "position_spooning", name: "Spooning", category: "position",
intensity: 45, playerLust: 25, partnerLust: 30,
description: "Pressed together from behind, intimate and warm.",
requirements: {actsPerformed: ["penetrate"]},
traits: ["intimate", "gentle"],
leadsTo: ["thrust_slow", "climax_together"]
},
position_standing_doggy: {
id: "position_standing_doggy", name: "Standing From Behind", category: "position",
intensity: 60, playerLust: 35, partnerLust: 30,
description: "She braces against something while you take her from behind, standing.",
requirements: {actsPerformed: ["penetrate"]},
traits: ["rough", "spontaneous"],
leadsTo: ["thrust_fast", "climax_together"]
},
undress_partner_slow: {
id: "undress_partner_slow", name: "Strip Her Slowly", category: "advanced",
intensity: 20, playerLust: 15, partnerLust: 25,
description: "You remove her clothing piece by piece, savoring the reveal.",
requirements: {},
traits: ["dominant", "teasing"],
leadsTo: ["touch_body", "touch_intimate"]
},
dark_allure_partner: {
id: "dark_allure_partner", name: "Supernatural Allure", category: "supernatural",
intensity: 40, playerLust: 20, partnerLust: 50,
description: "Dark energy radiates from you, overwhelming her resistance.",
requirements: {corruption: 30},
traits: ["supernatural", "dominant"],
corruptionGain: 2,
leadsTo: ["penetrate", "corruption_transfer"]
},
corruption_transfer: {
id: "corruption_transfer", name: "Transfer Corruption", category: "supernatural",
intensity: 60, playerLust: 30, partnerLust: 40,
description: "Purple energy flows between your bodies, corrupting her.",
requirements: {corruption: 30, actsPerformed: ["penetrate"]},
traits: ["supernatural"],
corruptionGain: 5, partnerCorruptionGain: 10,
leadsTo: ["climax_together"]
},
finger_penetrate: {
id: "finger_penetrate", name: "Finger Fuck", category: "manual",
intensity: 35, playerLust: 15, partnerLust: 40,
partnerOrgasmChance: 40,
description: "Multiple fingers thrust inside her, stretching and filling.",
requirements: {intensity: 20},
traits: ["rough", "dominant"],
leadsTo: ["climax_partner", "penetrate"]
},
lesbian_kiss: {
id: "lesbian_kiss", name: "Women Kiss", category: "lesbian",
intensity: 20, playerLust: 25, partnerLust: 30,
description: "You watch as woman kisses woman.",
requirements: {},
traits: ["voyeur", "lesbian"],
leadsTo: ["threesome_mff"]
},
threesome_mff: {
id: "threesome_mff", name: "MFF Threesome", category: "group",
intensity: 80, playerLust: 50, partnerLust: 50,
playerOrgasmChance: 40, partnerOrgasmChance: 40,
description: "Three bodies intertwined, pleasure multiplied.",
requirements: {intensity: 40},
traits: ["group", "intense"],
leadsTo: ["climax_together"]
},
oral_aggressive: {
id: "oral_aggressive", name: "Aggressive Blowjob", category: "oral",
intensity: 30, playerLust: 35, partnerLust: 20,
playerOrgasmChance: 30,
description: "She takes you to the hilt over and over.",
requirements: {},
traits: ["rough", "submissive"],
leadsTo: ["oral_deepthroat", "penetrate"]
},
oral_deepthroat: {
id: "oral_deepthroat", name: "Deepthroat", category: "oral",
intensity: 40, playerLust: 45, partnerLust: 20,
playerOrgasmChance: 45,
description: "She deepthroats you aggressively.",
requirements: {},
traits: ["rough", "submissive"],
leadsTo: ["climax_player", "penetrate"]
},
penetrate_cowgirl: {
id: "penetrate_cowgirl", name: "Cowgirl Entry", category: "penetrative",
intensity: 50, playerLust: 30, partnerLust: 35,
description: "She lowers herself onto you, taking control.",
requirements: {},
traits: ["submissive"],
leadsTo: ["ride_fast", "ride_hard", "grind"]
},
ride_fast: {
id: "ride_fast", name: "Ride Fast", category: "penetrative",
intensity: 60, playerLust: 35, partnerLust: 40,
playerOrgasmChance: 25, partnerOrgasmChance: 30,
description: "She bounces on you with frantic urgency.",
requirements: {},
traits: ["rough", "submissive"],
leadsTo: ["ride_hard", "climax_together"]
},
ride_hard: {
id: "ride_hard", name: "Ride Hard", category: "penetrative",
intensity: 70, playerLust: 40, partnerLust: 45,
playerOrgasmChance: 35, partnerOrgasmChance: 40,
description: "She slams down onto you with desperate intensity.",
requirements: {},
traits: ["rough", "intense"],
leadsTo: ["climax_together", "climax_partner"]
},
thrust_up: {
id: "thrust_up", name: "Thrust Up Into Her", category: "penetrative",
intensity: 55, playerLust: 30, partnerLust: 35,
playerOrgasmChance: 25, partnerOrgasmChance: 25,
description: "You buck your hips up, driving deeper into her.",
requirements: {},
traits: ["dominant"],
leadsTo: ["ride_fast", "climax_together"]
},
climax_inside: {
id: "climax_inside", name: "Finish Inside", category: "climax",
intensity: 90, playerLust: -80, partnerLust: 20,
playerOrgasm: true,
description: "She takes everything you give her.",
requirements: {intensity: 50},
traits: ["intimate"],
leadsTo: ["aftermath"]
},
climax_oral: {
id: "climax_oral", name: "Finish In Her Mouth", category: "climax",
intensity: 85, playerLust: -80, partnerLust: 15,
playerOrgasm: true,
description: "She keeps sucking until you have nothing left.",
requirements: {intensity: 40},
traits: ["submissive"],
leadsTo: ["aftermath"]
}
}>>
<<set $currentSexScene to null>>
<<set $kinkDiscoveries to {}>>
<<set $media = {
root: "media/",
current: {
background: null,
characters: [],
event: null,
reaction: null,
effects: [],
audio: {
ambient: null,
music: null,
sfx: null
}
},
settings: {
autoplay: true,
loop: true,
muted: true,
showReactions: true,
transitionSpeed: 500
},
fallbacks: {
background: "placeholders/background.webp",
character: "placeholders/character.webp",
event: "placeholders/event.webp",
reaction: "placeholders/reaction.webp",
combat: "placeholders/event.webp"
}
}>>
<<set $mediaSystem = $media>>
<<set $clothingLoot = {
preWarBuilding: {
common: ["standard_underwear", "worn_clothes", "survivor_shirt", "tank_top", "jeans", "shorts"],
uncommon: ["reinforced_shorts", "tight_briefs", "flannel_shirt", "cargo_pants", "hoodie"],
rare: ["salvaged_lingerie", "sheer_salvage", "formal_shirt", "dress_pants", "skirt"]
},
raiderCamp: {
common: ["raider_scraps", "stolen_underwear", "tank_top", "cargo_pants"],
uncommon: ["leather_jacket", "reinforced_vest", "tactical_shirt", "tactical_pants"],
rare: ["military_armor", "tactical_shirt", "tactical_pants"]
},
vaultStorage: {
common: ["vault_jumpsuit", "sports_wrap", "survivor_shirt", "cargo_pants"],
uncommon: ["vault_security_gear", "hoodie", "jeans"],
rare: ["mage_robes", "formal_shirt", "dress_pants"]
},
wastelandGeneric: {
common: ["worn_clothes", "sewing kit", "survivor_shirt", "cargo_pants", "shorts"],
uncommon: ["reinforced_wraps", "leather_jacket", "flannel_shirt", "jeans", "hoodie"],
rare: ["military_armor", "salvaged_lingerie", "tactical_shirt", "tactical_pants"]
}
}>>
<<updateTimePhase>>
<<initDickOutConfigs>>
<<initPinnedConfigs>>
<<initPainPleasureConfigs>>
<<initUltraExtremeConfigs>>
<<initUseHerConfig>>
<<initUsedActionConfigs>>
<<initSeductionConfigs>>
<<initBasicAttackConfigs>>
<<initRapidStrikesConfig>>
<<initDominationConfigs>>
<<initOrgasmControlConfigs>>
<<initSupernaturalConfigs>>
<<initKiraConfig>>
<<initCombatMediaFallbacks>>
<<initEnemySexDecisionConfig>>
<<initMaleAssaultConfig>>
<<initRaiderConfig>>
<<initEncounterPools>>
<<include "RaiderNarratives">>
<<silently>><<include "OrgasmControlNarratives">><</silently>>
<<if typeof UInv !== 'undefined'>>
<<if !UInv.BagExists("player")>>
<<run UInv.AddBag("player", "player inventory")>>
<</if>>
<<if !UInv.BagExists("player equipped")>>
<<run UInv.AddBag("player equipped", "player equipped")>>
<</if>>
<<if !UInv.BagExists("vault")>>
<<run UInv.AddBag("vault", "vault storage")>>
<<run UInv.AddItem("vault", "sewing kit", 30)>>
<</if>>
<<if !UInv.BagExists("kira")>>
<<run UInv.AddBag("kira", "kira inventory")>>
<</if>>
<<if !UInv.BagExists("kira equipped")>>
<<run UInv.AddBag("kira equipped", "kira equipped")>>
<</if>>
<<if !UInv.BagExists("player wardrobe")>>
<<run UInv.AddBag("player wardrobe", "player wardrobe")>>
<</if>>
<<if !UInv.BagExists("player worn")>>
<<run UInv.AddBag("player worn", "player worn")>>
<</if>>
<<if !UInv.BagExists("kira wardrobe")>>
<<run UInv.AddBag("kira wardrobe", "kira wardrobe")>>
<</if>>
<<if !UInv.BagExists("kira worn")>>
<<run UInv.AddBag("kira worn", "kira worn")>>
<</if>>
<<if !UInv.BagExists("player armor")>>
<<run UInv.AddBag("player armor", "player armor")>>
<</if>>
<<if UInv.GetItemsArray("player worn").length === 0>>
<<addClothingToWorn "survivor_shirt" "top" "player">>
<<addClothingToWorn "cargo_pants" "bottom" "player">>
<</if>>
<<if UInv.GetItemsArray("kira worn").length === 0>>
<<addClothingToWorn "tank_top" "top" "kira">>
<<addClothingToWorn "cargo_pants" "bottom" "kira">>
<</if>>
<<if UInv.GetItemsArray("kira wardrobe").length === 0>>
<<addClothingToWardrobe "tactical_shirt" "top" "kira">>
<<addClothingToWardrobe "tactical_pants" "bottom" "kira">>
<<addClothingToWardrobe "shorts" "bottom" "kira">>
<</if>>
<<set $uinvEnabled to true>>
<<if $wardrobe.player.tops && !$flags.wardrobeMigrated>>
<<for _id range $wardrobe.player.tops>>
<<addClothingToWardrobe _id "top" "player">>
<</for>>
<<if $wardrobe.player.bottoms>>
<<for _id range $wardrobe.player.bottoms>>
<<addClothingToWardrobe _id "bottom" "player">>
<</for>>
<</if>>
<<if $wardrobe.player.equippedTop && UInv.GetItemsArray("player worn").length === 0>>
<<addClothingToWorn $wardrobe.player.equippedTop "top" "player">>
<</if>>
<<if $wardrobe.player.equippedBottom && UInv.GetItemsArray("player worn").filter(function(n){ return UInv.GetItemPropertyValue("player worn", n, "slot") === "bottom"; }).length === 0>>
<<addClothingToWorn $wardrobe.player.equippedBottom "bottom" "player">>
<</if>>
<<if $wardrobe.kira && $wardrobe.kira.tops>>
<<for _id range $wardrobe.kira.tops>>
<<addClothingToWardrobe _id "top" "kira">>
<</for>>
<<if $wardrobe.kira.bottoms>>
<<for _id range $wardrobe.kira.bottoms>>
<<addClothingToWardrobe _id "bottom" "kira">>
<</for>>
<</if>>
<<if $wardrobe.kira.equippedTop && UInv.GetItemsArray("kira worn").length === 0>>
<<addClothingToWorn $wardrobe.kira.equippedTop "top" "kira">>
<</if>>
<<if $wardrobe.kira.equippedBottom && UInv.GetItemsArray("kira worn").filter(function(n){ return UInv.GetItemPropertyValue("kira worn", n, "slot") === "bottom"; }).length === 0>>
<<addClothingToWorn $wardrobe.kira.equippedBottom "bottom" "kira">>
<</if>>
<</if>>
<<set $flags.wardrobeMigrated to true>>
<</if>>
<<else>>
<<set $uinvEnabled to false>>
<</if>><<validateKiraState>>
<<hungerAlertCheck>><<widget "statbar">>
<<set _current to _args[0]>>
<<set _max to _args[1]>>
<<set _color to _args[2] || "#e74c3c">>
<<set _percent to Math.floor((_current / _max) * 100)>>
<div class="stat-bar-container">
<div class="stat-bar-fill" @style="'width: ' + _percent + '%; background-color: ' + _color + ';'"></div>
<div class="stat-bar-text"><<print _current>> / <<print _max>></div>
</div>
<</widget>>
<<widget "dialogue" container>>
<<set _speaker to _args[0]>>
<<set _type to _args[1] || "npc">>
<div @class="'dialogue dialogue-' + (_type)">
<span class="speaker"><<print _speaker>>:</span>
<span class="speech">_contents</span>
</div>
<</widget>>
<<widget "notify" container>>
<<set _type to _args[0] || "info">>
<div @class="'notification notification-' + (_type)">
_contents
</div>
<</widget>>
<<widget "toast">>
<<set _message to _args[0]>>
<<set _type to _args[1] || "info">>
<<run VaultUI.toast(_message, _type, _args[2])>>
<</widget>>
<<widget "toastItemNotice">>
<<if _addItemNotice>>
<<toast _addItemNotice.text _addItemNotice.type>>
<<set _addItemNotice to null>>
<</if>>
<</widget>>
<<widget "journalAdd">>
<<set _entry to _args[0]>>
<<set _category to _args[1] || "story">>
<<if !$journal>><<set $journal to []>><</if>>
<<if !$time>><<set $time to { day: 1, phase: "morning" }>><</if>>
<<if _entry && _entry.length > 0>>
<<set _journalEntry to {
text: _entry,
category: _category,
day: $time.day || 1,
phase: $time.phase || "morning"
}>>
<<run $journal.push(_journalEntry)>>
<</if>>
<</widget>>
<<widget "clampStat">>
<<set _csPath to _args[0]>>
<<set _csAmount to _args[1] || 0>>
<<set _csMin to _args[2] || 0>>
<<set _csMax to _args[3] || 100>>
<<set _csFullPath to "$" + _csPath>>
<<set _csCurrent to State.getVar(_csFullPath) || 0>>
<<set _csNewValue to Math.clamp(_csCurrent + _csAmount, _csMin, _csMax)>>
<<if _csPath === "companions[0].health" && _csAmount < 0>>
<<set _csNewValue to setup.kiraFloorHealth(_csNewValue)>>
<</if>>
<<run State.setVar(_csFullPath, _csNewValue)>>
<</widget>>
<<widget "addLust">>
<<set _target to _args[0]>>
<<set _amount to _args[1] || 0>>
<<if _target === "player">>
<<clampStat "player.lust" _amount>>
<<elseif _target === "kira" && $companions && $companions[0]>>
<<clampStat "companions[0].lust" _amount>>
<</if>>
<</widget>>
<<widget "addEnemyLust">>
<<set _aelIdx to _args[0]>>
<<set _aelAmount to _args[1] || 0>>
<<if $combat && $combat.enemies && $combat.enemies[_aelIdx]>>
<<set _aelPath to "combat.enemies[" + _aelIdx + "].lust">>
<<clampStat _aelPath _aelAmount 0 `setup.enemyMaxLust($combat.enemies[_aelIdx])`>>
<</if>>
<</widget>>
<<widget "clampEnemyStats">>
<<set _cesIdx to _args[0]>>
<<if $combat && $combat.enemies && $combat.enemies[_cesIdx]>>
<<set _cesEnemy to $combat.enemies[_cesIdx]>>
<<set _cesLustPath to "combat.enemies[" + _cesIdx + "].lust">>
<<clampStat _cesLustPath 0 0 `setup.enemyMaxLust(_cesEnemy)`>>
<<set _cesEnemy.health to Math.max(0, Math.min(_cesEnemy.maxHealth || 100, _cesEnemy.health || 0))>>
<<set _cesEnemy.resistance to Math.max(0, _cesEnemy.resistance || 0)>>
<<set _cesHumPath to "combat.enemies[" + _cesIdx + "].humiliation">>
<<clampStat _cesHumPath 0>>
<</if>>
<</widget>>
<<widget "addCorruption">>
<<set _alcAmount to Number(_args[0]) || 0>>
<<set _alcTarget to _args[1] || "player">>
<<set _alcScaled to Math.sign(_alcAmount) * Math.max(1, Math.round(Math.abs(_alcAmount) * 0.25))>>
<<if _alcScaled === 0>>
<<elseif _alcTarget === "player">>
<<clampStat "player.corruption" _alcScaled 0 `$player.maxCorruption || setup.CORRUPTION_MAX`>>
<<if _alcScaled > 0>><<set $flags.corruptionGained to true>><</if>>
<<checkTransformation>>
<<elseif _alcTarget === "kira" && $companions && $companions[0]>>
<<clampStat "companions[0].corruption" _alcScaled>>
<</if>>
<</widget>>
<<widget "damageKira">>
<<set _damage to _args[0] || 0>>
<<set _damage to Math.floor(_damage * setup.kiraDamageTakenFactor())>>
<<if $companions && $companions[0]>>
<<set _healthBefore to $companions[0].health>>
<<set _negDamage to -_damage>>
<<clampStat "companions[0].health" _negDamage 0 100>>
<<if typeof $companions[0].health !== "number">>
<<run console.error("HEALTH CORRUPTED in damageKira! Before:", _healthBefore, "Damage:", _damage, "After:", $companions[0].health)>>
<<set $companions[0].health to _healthBefore - _damage>>
<<if typeof $companions[0].health !== "number">>
<<set $companions[0].health to $companions[0].maxHealth || 100>>
<</if>>
<</if>>
<<if $companions[0].health lt 1>>
<<set $companions[0].health to 1>>
<</if>>
<<set $companions[0].health to setup.kiraFloorHealth($companions[0].health)>>
<<if $companions[0].health <= 1 && $combat && $combat.active>>
<<set $combat.kiraIncapacitated to true>>
<</if>>
<</if>>
<</widget>>
<<widget "validateKiraHealth">>
<<if $companions && $companions[0]>>
<<if typeof $companions[0].health !== "number">>
<<run console.error("HEALTH CORRUPTION DETECTED! Current value:", $companions[0].health, "Type:", typeof $companions[0].health, "Stack:", new Error().stack)>>
<<set $companions[0].health to $companions[0].maxHealth || 100>>
<</if>>
<</if>>
<</widget>>
<<widget "setPronouns">>
<<set _entity to _args[0]>>
<<set _prefix to _args[1] || "p">>
<<set _gender to (_entity && _entity.gender) ? _entity.gender : "male">>
<<set _pronounObj to setup.pronouns(_gender)>>
<<if _prefix === "p">>
<<set _p to _pronounObj>>
<<elseif _prefix === "e">>
<<set _e to _pronounObj>>
<<elseif _prefix === "e2">>
<<set _e2 to _pronounObj>>
<<else>>
<<set _p to _pronounObj>>
<</if>>
<</widget>>
<<widget "subPronouns">>
<<set _spText to _args[0] || "">>
<<set _spEntity to _args[1]>>
<<if _spEntity>>
<<set _spPronouns to setup.pronouns(_spEntity.gender || "male")>>
<<elseif typeof _p !== "undefined">>
<<set _spPronouns to _p>>
<<else>>
<<set _spPronouns to setup.pronouns("male")>>
<</if>>
<<set _subText to _spText
.replace(/\{He\}/g, _spPronouns.He)
.replace(/\{he\}/g, _spPronouns.he)
.replace(/\{Him\}/g, _spPronouns.Him)
.replace(/\{him\}/g, _spPronouns.him)
.replace(/\{His\}/g, _spPronouns.His)
.replace(/\{his\}/g, _spPronouns.his)
.replace(/\{Her\}/g, _spPronouns.Her)
.replace(/\{her\}/g, _spPronouns.her)
.replace(/\{Himself\}/g, _spPronouns.Himself)
.replace(/\{himself\}/g, _spPronouns.himself)
>>
<</widget>><<script>>
setup.characters = {
kira: {
id: "kira",
name: "Kira",
mediaPath: "media/characters/kira/base",
defaultExpression: "neutral",
expressions: ["neutral", "smile", "happy", "amused", "confident", "satisfied", "combat", "flirty", "thoughtful", "worried", "sad", "angry", "surprised", "unconscious", "vulnerable", "aroused", "desperate", "passionate", "submissive", "defiant", "hurt", "guarded", "seductive", "flushed", "disheveled"],
variants: {
neutral: 3,
smile: 3,
happy: 6,
amused: 3,
aroused: 2,
confident: 4,
flirty: 4,
seductive: 2,
thoughtful: 2,
unconscious: 2,
vulnerable: 5
},
isCompanion: true,
companionIndex: 0,
showStats: {
trust: { icon: "handshake", label: "Trust" },
tension: { icon: "lightning", label: "Tension" },
lust: { icon: "lust", label: "Lust" }
},
showClothing: true,
clothingPortraits: {
root: "media/characters/kira",
state: function(v) { return setup.kiraClothingState(v.clothing && v.clothing.kira); }
},
showBuffs: true,
dialogueColor: "#ff6b9d",
dialogueBg: "rgba(255, 107, 157, 0.15)"
},
groundskeeper: {
id: "groundskeeper",
name: "Groundskeeper",
mediaPath: "media/characters/groundskeeper",
defaultExpression: "neutral",
expressions: ["neutral", "welcoming", "concerned", "suspicious"],
isCompanion: false,
showStats: {},
showClothing: false,
showBuffs: false,
dialogueColor: "#4ade80",
dialogueBg: "rgba(74, 222, 128, 0.12)"
},
lysara: {
id: "lysara",
name: "Lysara",
mediaPath: "media/characters/lysara",
defaultExpression: "neutral",
expressions: ["neutral", "seductive", "hostile", "pleased", "curious"],
variants: {
neutral: 4,
seductive: 6,
hostile: 4,
pleased: 4,
curious: 6
},
isCompanion: false,
showStats: {},
showClothing: false,
showBuffs: false,
dialogueColor: "#e879f9",
dialogueBg: "rgba(232, 121, 249, 0.15)"
},
sera: {
id: "sera",
name: "Sera",
mediaPath: "media/characters/sera",
defaultExpression: "neutral",
expressions: ["neutral", "aroused", "dominant", "laughing", "passionate", "reaching", "scared", "smiling", "submissive", "tender"],
isCompanion: false,
showStats: {},
showClothing: false,
showBuffs: false,
dialogueColor: "#f472b6",
dialogueBg: "rgba(244, 114, 182, 0.12)"
},
succubus: {
id: "succubus",
name: "Velith",
mediaPath: "media/characters/succubus/expressions",
defaultExpression: "neutral",
expressionAliases: { hostile: ["hungry"], knowing: ["amused", "seductive"], delighted: ["pleased", "amused"] },
expressions: ["neutral", "seductive", "feeding", "pleased", "hungry", "amused", "satisfied"],
mediaFormat: "webp",
isCompanion: false,
showStats: {},
showClothing: false,
showBuffs: false,
dialogueColor: "#a855f7",
dialogueBg: "rgba(168, 85, 247, 0.18)"
},
merchant: {
id: "merchant",
name: "Merchant",
mediaPath: "media/characters/merchant",
defaultExpression: "neutral",
expressions: ["neutral", "friendly", "interested", "haggling", "pleased"],
sidebarClips: true,
gender: "male",
isCompanion: false,
showStats: {},
showClothing: false,
showBuffs: false,
dialogueColor: "#d97706",
dialogueBg: "rgba(217, 119, 6, 0.12)"
},
raider: {
id: "raider",
name: "Raider",
mediaPath: "media/characters/raider",
defaultExpression: "neutral",
expressions: ["neutral", "hostile", "wounded", "threatening", "attacking"],
sidebarClips: true,
gender: "male",
isCompanion: false,
showStats: {},
showClothing: false,
showBuffs: false,
dialogueColor: "#f97316",
dialogueBg: "rgba(249, 115, 22, 0.12)"
},
faction_scout: {
id: "faction_scout",
name: "Verdant scout",
mediaPath: "media/characters/faction_scout",
defaultExpression: "neutral",
expressions: ["neutral", "expectant", "satisfied"],
sidebarClips: true,
gender: "female",
isCompanion: false,
showStats: {},
showClothing: false,
showBuffs: false,
dialogueColor: "#22c55e",
dialogueBg: "rgba(34, 197, 94, 0.12)"
},
selene: {
id: "selene",
name: "Lady Selene",
mediaPath: "media/characters/selene",
defaultExpression: "neutral",
expressions: ["neutral", "mocking", "angry", "pleased"],
sidebarClips: true,
stills: false,
gender: "female",
isCompanion: false,
showStats: {},
showClothing: false,
showBuffs: false,
dialogueColor: "#27ae60",
dialogueBg: "rgba(39, 174, 96, 0.12)"
},
ringmistress: {
id: "ringmistress",
name: "Ringmistress",
mediaPath: "media/characters/ringmistress",
defaultExpression: "neutral",
expressions: ["neutral"],
sidebarClips: true,
stills: false,
gender: "female",
isCompanion: false,
showStats: {},
showClothing: false,
showBuffs: false,
dialogueColor: "#c8743a",
dialogueBg: "rgba(200, 116, 58, 0.12)"
},
den_silk: {
id: "den_silk",
name: "Madam Silk",
mediaPath: "media/characters/den_silk",
defaultExpression: "stern",
expressions: ["stern", "smile"],
sidebarClips: true,
stills: false,
gender: "female",
isCompanion: false,
showStats: {},
showClothing: false,
showBuffs: false,
dialogueColor: "#b03a5b",
dialogueBg: "rgba(176, 58, 91, 0.12)"
},
den_juno: {
id: "den_juno",
name: "Juno",
mediaPath: "media/characters/den_juno",
defaultExpression: "neutral",
expressions: ["neutral", "smile"],
sidebarClips: true,
stills: false,
gender: "female",
isCompanion: false,
showStats: {},
showClothing: false,
showBuffs: false,
dialogueColor: "#2bb3a3",
dialogueBg: "rgba(43, 179, 163, 0.12)"
},
den_brakka: {
id: "den_brakka",
name: "Brakka",
mediaPath: "media/characters/den_brakka",
defaultExpression: "neutral",
expressions: ["neutral", "smile"],
sidebarClips: true,
stills: false,
gender: "female",
isCompanion: false,
showStats: {},
showClothing: false,
showBuffs: false,
dialogueColor: "#9a8f80",
dialogueBg: "rgba(154, 143, 128, 0.12)"
},
den_hulda: {
id: "den_hulda",
name: "Hulda",
mediaPath: "media/characters/den_hulda",
defaultExpression: "neutral",
expressions: ["neutral"],
sidebarClips: true,
stills: false,
gender: "female",
isCompanion: false,
showStats: {},
showClothing: false,
showBuffs: false,
dialogueColor: "#7a6a9a",
dialogueBg: "rgba(122, 106, 154, 0.12)"
},
den_pip: {
id: "den_pip",
name: "Pip",
mediaPath: "media/characters/den_pip",
defaultExpression: "neutral",
expressions: ["neutral", "smile"],
sidebarClips: true,
stills: false,
gender: "female",
isCompanion: false,
showStats: {},
showClothing: false,
showBuffs: false,
dialogueColor: "#e07bb5",
dialogueBg: "rgba(224, 123, 181, 0.12)"
},
verdant_warden: {
id: "verdant_warden",
name: "Covenant warden",
mediaPath: "media/characters/verdant_warden",
defaultExpression: "neutral",
expressions: ["neutral", "stern", "amused"],
sidebarClips: true,
hideWithStoryClip: ["story/grove_perimeter/", "story/grove_patrol/demand", "story/grove_patrol/finish"],
stills: false,
gender: "female",
isCompanion: false,
showStats: {},
showClothing: false,
showBuffs: false,
dialogueColor: "#27ae60",
dialogueBg: "rgba(39, 174, 96, 0.12)"
},
quartermaster: {
id: "quartermaster",
name: "Quartermaster",
mediaPath: "media/characters/quartermaster",
defaultExpression: "neutral",
expressions: ["neutral", "pleased"],
sidebarClips: true,
stills: false,
gender: "female",
isCompanion: false,
showStats: {},
showClothing: false,
showBuffs: false,
dialogueColor: "#d97706",
dialogueBg: "rgba(217, 119, 6, 0.12)"
},
dealer: {
id: "dealer",
name: "Dealer",
mediaPath: "media/characters/dealer",
defaultExpression: "neutral",
expressions: ["neutral", "pleased"],
sidebarClips: true,
stills: false,
gender: "female",
isCompanion: false,
showStats: {},
showClothing: false,
showBuffs: false,
dialogueColor: "#e11d48",
dialogueBg: "rgba(225, 29, 72, 0.12)"
},
caravan_master: {
id: "caravan_master",
name: "Caravan Master",
mediaPath: "media/characters/caravan_master",
defaultExpression: "neutral",
expressions: ["neutral", "pleased"],
sidebarClips: true,
stills: false,
gender: "female",
isCompanion: false,
showStats: {},
showClothing: false,
showBuffs: false,
dialogueColor: "#a16207",
dialogueBg: "rgba(161, 98, 7, 0.12)"
},
grove_exchange: {
id: "grove_exchange",
name: "Exchange keeper",
mediaPath: "media/characters/grove_exchange",
defaultExpression: "neutral",
expressions: ["neutral", "friendly", "haggling"],
sidebarClips: true,
stills: false,
gender: "female",
isCompanion: false,
showStats: {},
showClothing: false,
showBuffs: false,
dialogueColor: "#27ae60",
dialogueBg: "rgba(39, 174, 96, 0.12)"
},
grove_armorer: {
id: "grove_armorer",
name: "Armorer",
mediaPath: "media/characters/grove_armorer",
defaultExpression: "neutral",
expressions: ["neutral", "approving"],
sidebarClips: true,
stills: false,
gender: "female",
isCompanion: false,
showStats: {},
showClothing: false,
showBuffs: false,
dialogueColor: "#27ae60",
dialogueBg: "rgba(39, 174, 96, 0.12)"
},
grove_runner: {
id: "grove_runner",
name: "Covenant runner",
mediaPath: "media/characters/grove_runner",
defaultExpression: "neutral",
expressions: ["neutral", "impatient"],
sidebarClips: true,
stills: false,
gender: "female",
isCompanion: false,
showStats: {},
showClothing: false,
showBuffs: false,
dialogueColor: "#27ae60",
dialogueBg: "rgba(39, 174, 96, 0.12)"
},
covenant_woman: {
id: "covenant_woman",
name: "Covenant woman",
mediaPath: "media/characters/covenant_woman",
defaultExpression: "neutral",
expressions: ["neutral", "inviting"],
sidebarClips: true,
hideWithStoryClip: true,
stills: false,
gender: "female",
isCompanion: false,
showStats: {},
showClothing: false,
showBuffs: false,
dialogueColor: "#27ae60",
dialogueBg: "rgba(39, 174, 96, 0.12)"
},
caravan_raider: {
id: "caravan_raider",
name: "Raider",
mediaPath: "media/characters/caravan_raider",
defaultExpression: "threatening",
expressions: ["neutral", "threatening"],
isCompanion: false,
showStats: {},
showClothing: false,
showBuffs: false,
dialogueColor: "#f97316",
dialogueBg: "rgba(249, 115, 22, 0.12)"
}
};
setup.expressionAliases = {
embarrassed: ["flushed", "vulnerable", "surprised"],
flustered: ["flushed", "vulnerable", "surprised"],
nervous: ["guarded", "worried", "concerned"],
tense: ["guarded", "worried", "concerned"],
cautious: ["guarded", "suspicious", "worried"],
uncertain: ["worried", "thoughtful", "guarded"],
concerned: ["worried", "thoughtful"],
alert: ["surprised", "guarded", "suspicious", "shocked"],
startled: ["surprised", "shocked", "scared"],
shocked: ["surprised", "worried", "scared"],
panicked: ["shocked", "scared", "worried"],
horrified: ["shocked", "scared", "worried"],
soft: ["smile", "smiling", "tender", "vulnerable"],
tender: ["smile", "smiling", "vulnerable", "satisfied"],
receptive: ["flirty", "seductive", "smile", "smiling"],
intimate: ["passionate", "flirty", "tender", "smile"],
content: ["satisfied", "smile", "smiling", "pleased"],
grateful: ["smile", "smiling", "happy", "pleased"],
hopeful: ["smile", "smiling", "happy", "pleased"],
approving: ["smile", "smiling", "pleased", "satisfied"],
"slight-smile": ["smile", "smiling", "pleased"],
post_sex: ["satisfied", "disheveled", "flushed", "pleased"],
entranced: ["seductive", "aroused", "flushed"],
conflicted: ["thoughtful", "worried", "guarded"],
confused: ["thoughtful", "surprised", "worried"],
serious: ["thoughtful", "guarded", "concerned"],
focused: ["thoughtful", "combat", "confident", "guarded"],
aware: ["thoughtful", "guarded"],
listening: ["thoughtful", "neutral"],
knowing: ["amused", "smile", "thoughtful", "pleased"],
curious: ["thoughtful", "amused", "interested"],
interested: ["thoughtful", "flirty", "amused", "curious"],
strained: ["hurt", "desperate", "vulnerable"],
shaken: ["vulnerable", "hurt", "worried", "scared"],
overwhelmed: ["vulnerable", "desperate", "flushed"],
devastated: ["sad", "hurt", "vulnerable"],
disappointed: ["sad", "guarded"],
suspicious: ["guarded", "suspicious", "hostile"],
defensive: ["guarded", "defiant", "hostile"],
frustrated: ["angry", "defiant", "hostile"],
hostile: ["angry", "hostile", "threatening", "defiant"],
competitive: ["confident", "combat", "amused"],
eager: ["flirty", "happy", "confident"],
delighted: ["happy", "pleased", "amused"],
"combat-done": ["combat", "confident", "satisfied"],
changed: ["neutral"]
};
setup.sidebarGates = {
succubus: function(v) {
return setup.ruinsFirstVisitDone(v);
}
};
setup.velithNameKnown = function(v) {
v = v || (typeof State !== 'undefined' && State.variables) || {};
var f = v.flags || {};
var s = (v.supernaturals && v.supernaturals.succubus) || {};
return !!(f.velithNameKnown || s.met || f.succubusFirstEncounterComplete || (s.trueName && s.name === s.trueName));
};
setup.sidebarNameGates = {
succubus: {
known: function(v) { return setup.velithNameKnown(v); },
unknownName: "???"
}
};
setup.characterIdAliases = {
velith: "succubus"
};
setup.speakerMap = {
"Kira": "kira",
"Madam Silk": "den_silk",
"Silk": "den_silk",
"Juno": "den_juno",
"Brakka": "den_brakka",
"Hulda": "den_hulda",
"Pip": "den_pip",
"Ringmistress": "ringmistress",
"Groundskeeper": "groundskeeper",
"The Groundskeeper": "groundskeeper",
"Lysara": "lysara",
"Sera": "sera",
"Merchant": "merchant",
"The Merchant": "merchant",
"Jonas": "merchant",
"Succubus": "succubus",
"The Succubus": "succubus",
"Velith": "succubus",
"Raider": "raider",
"Raiders": "raider",
"The Raider": "raider",
"Caravan Raider": "caravan_raider",
"Scout": "faction_scout",
"Lady Selene": "selene",
"Selene": "selene",
"Warden": "verdant_warden",
"Covenant warden": "verdant_warden",
"Exchange keeper": "grove_exchange",
"Quartermaster": "quartermaster",
"Dealer": "dealer",
"Caravan master": "caravan_master",
"Armorer": "grove_armorer",
"Covenant runner": "grove_runner",
"Covenant woman": "covenant_woman"
};
setup.speakerColors = {
"madam-silk": { color: "#b03a5b", bg: "rgba(176, 58, 91, 0.12)" },
"silk": { color: "#b03a5b", bg: "rgba(176, 58, 91, 0.12)" },
"juno": { color: "#2bb3a3", bg: "rgba(43, 179, 163, 0.12)" },
"brakka": { color: "#9a8f80", bg: "rgba(154, 143, 128, 0.12)" },
"hulda": { color: "#7a6a9a", bg: "rgba(122, 106, 154, 0.12)" },
"pip": { color: "#e07bb5", bg: "rgba(224, 123, 181, 0.12)" },
"kira": { color: "var(--color-pink-hot)", bg: "rgba(255, 105, 180, 0.15)" },
"velith": { color: "var(--color-red)", bg: "rgba(220, 20, 60, 0.18)" },
"lysara": { color: "var(--color-pink-orchid)", bg: "rgba(218, 112, 214, 0.15)" },
"sera": { color: "var(--color-pink-hot)", bg: "rgba(255, 105, 180, 0.12)" },
"succubus": { color: "var(--color-purple)", bg: "rgba(138, 43, 226, 0.18)" },
"jonas": { color: "var(--color-teal-bright)", bg: "rgba(45, 212, 191, 0.12)" },
"aldric": { color: "var(--color-yellow)", bg: "rgba(241, 196, 15, 0.12)" },
"thara": { color: "var(--color-pink-soft)", bg: "rgba(255, 107, 138, 0.12)" },
"guard": { color: "var(--color-gray)", bg: "rgba(136, 136, 136, 0.12)" },
"trader": { color: "var(--color-orange-dark)", bg: "rgba(211, 84, 0, 0.12)" },
"merchant": { color: "var(--color-orange-dark)", bg: "rgba(211, 84, 0, 0.12)" },
"groundskeeper": { color: "var(--color-green)", bg: "rgba(46, 204, 113, 0.12)" },
"lady-selene": { color: "#27ae60", bg: "rgba(39, 174, 96, 0.12)" },
"selene": { color: "#27ae60", bg: "rgba(39, 174, 96, 0.12)" },
"ringmistress": { color: "#c8743a", bg: "rgba(200, 116, 58, 0.12)" },
"warden": { color: "#27ae60", bg: "rgba(39, 174, 96, 0.10)" },
"covenant": { color: "#27ae60", bg: "rgba(39, 174, 96, 0.10)" },
"you": { color: "var(--color-blue)", bg: "rgba(52, 152, 219, 0.12)" },
"player": { color: "var(--color-blue)", bg: "rgba(52, 152, 219, 0.12)" },
"raider": { color: "var(--color-orange-bright)", bg: "rgba(255, 102, 0, 0.12)" },
"bandit": { color: "var(--color-orange-bright)", bg: "rgba(255, 102, 0, 0.12)" },
"enemy": { color: "var(--color-orange-bright)", bg: "rgba(255, 102, 0, 0.12)" },
"hostile": { color: "var(--color-red-bright)", bg: "rgba(231, 76, 60, 0.12)" },
"scavenger": { color: "var(--color-orange-bright)", bg: "rgba(255, 102, 0, 0.12)" },
"leader": { color: "var(--color-red)", bg: "rgba(220, 20, 60, 0.15)" },
"entity": { color: "var(--color-gray-light)", bg: "rgba(170, 170, 170, 0.12)" },
"narrator": { color: "var(--color-gray-light)", bg: "rgba(170, 170, 170, 0.08)" },
"thought": { color: "var(--color-purple-light)", bg: "rgba(177, 156, 217, 0.08)" },
"not-kira": { color: "var(--color-pink-magenta)", bg: "rgba(233, 30, 140, 0.2)" },
"man": { color: "var(--color-gray-light)", bg: "rgba(170, 170, 170, 0.08)" },
"woman": { color: "var(--color-gray-light)", bg: "rgba(170, 170, 170, 0.08)" },
"survivor": { color: "var(--color-gray-light)", bg: "rgba(170, 170, 170, 0.08)" },
"traveler": { color: "var(--color-gray-light)", bg: "rgba(170, 170, 170, 0.08)" }
};
setup.colorWithAlpha = function(color, alpha) {
if (color.indexOf("var(") === 0) {
var pct = Math.round(alpha * 100);
return "color-mix(in srgb, " + color + " " + pct + "%, transparent)";
}
var r = parseInt(color.slice(1, 3), 16);
var g = parseInt(color.slice(3, 5), 16);
var b = parseInt(color.slice(5, 7), 16);
return "rgba(" + r + ", " + g + ", " + b + ", " + alpha + ")";
};
setup.hexToRgba = setup.colorWithAlpha;
setup.getSpeakerColors = function(speaker) {
var speakerKey = speaker.toLowerCase().replace(/\s+/g, '-').replace(/[^a-z0-9-]/g, '');
if (setup.speakerColors[speakerKey]) {
return setup.speakerColors[speakerKey];
}
for (var key in setup.speakerColors) {
if (speakerKey.indexOf(key) === 0 || speakerKey.indexOf(key) !== -1) {
return setup.speakerColors[key];
}
}
return { color: "#d4a574", bg: "rgba(212, 165, 116, 0.1)" };
};
setup.locationMap = {
"Grove_": "THE GROVE",
"VerdantOutpost": "THE GROVE",
"Vault_Hub": "VAULT HUB",
"VaultHub": "VAULT HUB",
"Hub": "VAULT HUB",
"Archives": "ARCHIVES",
"Kira_Room": "KIRA'S QUARTERS",
"KiraRoom": "KIRA'S QUARTERS",
"Bathroom": "BATHROOM",
"Training": "TRAINING YARD",
"Travel": "THE RECLAIMED",
"Reclaimed": "THE RECLAIMED",
"Combat": "COMBAT",
"Prelude": "PRELUDE",
"Day1": "DAY 1",
"Day2": "DAY 2",
"Day3": "DAY 3",
"Day4": "DAY 4",
"Day5": "DAY 5",
"Day6": "DAY 6",
"Day7": "DAY 7",
"Den_": "THE DEN",
"DenTrip_": "THE DEN",
"DenRoom_": "THE DEN",
"DenEvent_": "THE DEN",
"DenDebt_": "THE DEN",
"DenWoods_": "THE WOODS"
};
setup.getLocationLabel = function(passageName) {
for (var pattern in setup.locationMap) {
if (passageName.includes(pattern)) {
return setup.locationMap[pattern];
}
}
return "";
};
<</script>><<set $flags.preludeComplete to true>>
<<set $vault.discovered to true>>
<<run VaultUI.setBackground("quarters")>>
<<run VaultUI.setTimeOfDay("morning")>>
<<run VaultUI.showCharacter("groundskeeper", "right", "welcoming")>>
You wake in the little room behind the hidden door, still in your boots, sprawled on the bed where you fell. You don't know how long you slept. Not long enough.
Out in the hall, lights flicker on one after another. Ancient. Automatic. Waiting.
<<storyVideo "story/mv_day1/arrival">>
And a figure in the doorway.
<<say "Groundskeeper" "You made it.">>
It's not the voice from your dreams. It's his, from last night. Older. Less seductive, more... patient.
The figure steps forward.
In the morning light you see him clearly: human-shaped, his mechanical eye whirring as it finds you.
<<say "Groundskeeper" "The others before you didn't.">>
<<say $player.name "Others?">>
<<say "Groundskeeper" "Later.">>
He gestures at the water and the food beside the bed. The movements are precise. Mechanical. Or perhaps simply patient beyond any human measure.
A pause. His good eye and the mechanical one study you with unreadable intensity.
<<say "Groundskeeper" "Rest. We will speak when you've recovered.">>
<div class="choice-container">
<<vchoice "Rest - you have nothing left" "Day1_Morning_Wake" "move" "house">>
</div><<run setup.markStoryDay(1)>>
<<set $player.health to $player.maxHealth>>
<<set $player.energy to $player.maxEnergy>>
<<set $player.hunger to $player.maxHunger>>
<<set $groundskeeper.awakened to true>>
<<set $currentLocation to "quarters">>
<<run VaultUI.setBackground("quarters")>>
<<run VaultUI.setTimeOfDay("morning")>>
<<run VaultUI.hideAllCharacters()>>
You wake slowly.
For a moment, you don't know where you are. Then it comes back - the vault. The Groundskeeper. Safety.
The sheets are soft. Actual sheets. You'd forgotten what that felt like.
<<if $prelude.hadSex>>
Your hand reaches for Sera before you remember. The other side of the bed is empty. Will always be empty now.
The grief hits like a wave. You let it wash over you, then push it down. Survival first. Mourn later.
<<else>>
You're alone. But you're alive. That's more than most can say these days.
<</if>>
Sunlight - artificial, but warm - filters through the ceiling panels.
Time to learn what this place really is.
<div class="choice-container">
<<vchoice "Explore your quarters" "Day1_Morning_Quarters" "examine" "search">>
<<vchoice "Head to the commons" "Day1_Morning_Commons" "move" "door-handle">>
</div><<run VaultUI.setBackground("quarters")>>
<<run VaultUI.setTimeOfDay("morning")>>
Your quarters are small but comfortable.
A bed with actual sheets. A desk with a worn surface. A trunk for storage. A small mirror on the wall.
You catch your reflection - gaunt, tired, but alive.
On the desk, you find:
<<if !$flags.tookStartingItems>>
<<set _knife to {id: "basic_knife", name: "Basic Knife", type: "weapon", damage: 5, description: "A worn but sharp knife."}>>
<<set _canteen to {id: "canteen", name: "Canteen", type: "tool", description: "A water canteen."}>>
<<run setup.fightLootStart()>>
<<run setup.postBattleTakeLoot(_knife.id, _knife.name, 1, "", "fightLoot")>>
<<run setup.postBattleTakeLoot(_canteen.id, _canteen.name, 1, "", "fightLoot")>>
<<set $equipped.weapon to {id: "basic_knife", name: "Basic Knife", type: "weapon", damage: 5, description: "A worn but sharp knife."}>>
<<notify "info">>Found: Basic Knife, Canteen<</notify>>
A worn journal sits beside them. Blank pages waiting.
In the trunk - clothes. Simple, practical. And beneath them...
Something silky. Lingerie from the old world. You don't know why you take it, but you tuck it away.
<<set _lingerie to {id: "old_lingerie", name: "Pre-Cataclysm Lingerie", type: "intimate", description: "Delicate fabric from a world that no longer exists."}>>
<<run setup.postBattleTakeLoot(_lingerie.id, _lingerie.name, 1, "", "fightLoot")>>
<<lootLeftList "fightLoot">>
<<set $flags.tookStartingItems to true>>
<<else>>
Your basic supplies: a knife, a canteen, and some old-world keepsakes.
<</if>>
The room has one door leading out.
<div class="choice-container">
<<vchoice "Go to the commons" "Day1_Morning_Commons" "move" "door-handle">>
</div><<run VaultUI.setBackground("commons")>>
<<run VaultUI.setTimeOfDay("morning")>>
<<run VaultUI.showCharacter("groundskeeper", "right", "neutral")>>
The commons area opens before you.
Tables. Chairs. A kitchen with running water - you hear it flowing, a sound you'd almost forgotten.
The Groundskeeper stands by a large map on the wall. He doesn't turn as you enter, yet somehow you know he's aware of you.
<<say "Groundskeeper" "You're awake.">>
A statement. Not a greeting.
He turns. In the better light, you still can't quite pin him down. Features that suggest age but show no wear. A form that seems solid yet somehow... projected? Sustained by something other than flesh?
<<say "Groundskeeper" "Sit. Eat.">>
A plate of food waits on the table. You don't remember him preparing it.
<<say "Groundskeeper" "The vault requires maintenance. Resources are finite. You will learn what we have. What we need.">>
<<say "Groundskeeper" "What exists beyond these walls.">>
<div class="choice-container">
<<vchoice "Eat, then take the tour" "Day1_Tour_Start" "action" "eating">>
<<vchoice "Ask about the vault first" "Day1_Questions_Vault" "talk" "talk">>
<<vchoice "Ask about the others" "Day1_Questions_Others" "talk" "talk">>
</div><<run VaultUI.showCharacter("groundskeeper", "right", "neutral")>>
<<say $player.name "What is this place, really?">>
The Groundskeeper is silent for exactly three seconds. You count them.
<<say "Groundskeeper" "Duvarnach. A repository. Knowledge. Power. Things that required preservation when the world collapsed.">>
<<say $player.name "What kind of things?">>
<<say "Groundskeeper" "Things you are not prepared to comprehend.">>
He indicates the map with a gesture that seems too precise, too calculated.
<<say "Groundskeeper" "The vault offers protection. You will provide maintenance. The arrangement is... equitable.">>
<<relationChange "groundskeeper" "trust" 5>>
<div class="choice-container">
<<vchoice "Take the tour" "Day1_Tour_Start" "action" "run">>
<<vchoice "Ask about the others" "Day1_Questions_Others" "talk" "talk">>
</div><<run VaultUI.showCharacter("groundskeeper", "right", "neutral")>>
<<say $player.name "You mentioned others. Who came before me?">>
The Groundskeeper does not react. No shift in posture. No change in expression. If he has expressions at all.
<<say "Groundskeeper" "Some found their way here. Most failed the journey. Those who arrived...">>
Silence. Three seconds again.
<<say "Groundskeeper" "The vault requires compatibility. Not all possess it.">>
<<say $player.name "What happened to them?">>
<<say "Groundskeeper" "Departure. Failure to adapt. Transformation.">>
He turns back to the map, as if the conversation has concluded.
<<say "Groundskeeper" "Some rooms should remain sealed.">>
A chill runs down your spine. But you file the information away.
<<set $flags.askedAboutOthers to true>>
<div class="choice-container">
<<vchoice "Take the tour" "Day1_Tour_Start" "action" "run">>
</div><<advanceTime 1 0>>
<<run VaultUI.setBackground("commons")>>
<<run VaultUI.setTimeOfDay("morning")>>
<<run VaultUI.showCharacter("groundskeeper", "left", "neutral")>>
After eating, the Groundskeeper stands. The motion is fluid. Efficient. Inhuman in its precision.
<<say "Groundskeeper" "Follow.">>
Not a request.
<<storyVideo "story/mv_day1_tour/start">>
He leads you through corridors carved from stone. Ancient technology hums in the walls - you feel it more than hear it, a vibration in your teeth.
<<say "Groundskeeper" "Five levels. Habitation above. Research below.">>
<<say "Groundskeeper" "Sections remain sealed.">>
You pass a heavy door with strange symbols etched into its surface. Purple light flickers at its edges.
<<say $player.name "What's in there?">>
<<say "Groundskeeper" "Knowledge you cannot yet process.">>
He continues walking. You glance back at the door. Something about it tugs at you.
<div class="choice-container">
<<vchoice "Continue to the Power Core" "Day1_Tour_PowerCore" "move" "rapid-strikes">>
</div><<run VaultUI.setBackground("power_core")>>
<<run VaultUI.setTimeOfDay("morning")>>
<<run VaultUI.showCharacter("groundskeeper", "right", "neutral")>>
<<storyVideo "story/mv_power_core/restore">>
The power core hums with energy.
A massive crystal sits at the center of the room, pulsing with soft blue light. Conduits snake away from it into the walls. The Groundskeeper stands beside it - and for a moment, you swear you see light passing //through// him.
<<say "Groundskeeper" "The core. Duvarnach's heart.">>
<<say $player.name "What powers it?">>
<<say "Groundskeeper" "Originally: concentrated magical energy. Currently: salvage. Determination.">>
He indicates a gauge on the wall. The gesture is identical to the one he made earlier. Exactly identical.
The gauge shows power at <<print $vault.power>>%.
<<say "Groundskeeper" "Stable. Temporary. The Reclaimed contains necessary resources.">>
<<notify "info">>Tutorial: Vault power decreases daily. Keep it above 0 to maintain essential systems.<</notify>>
<div class="choice-container">
<<vchoice "Continue to Storage" "Day1_Tour_Storage" "move" "crystal">>
</div><<run VaultUI.setBackground("storage")>>
<<run VaultUI.setTimeOfDay("morning")>>
<<run VaultUI.showCharacter("groundskeeper", "right", "neutral")>>
<<storyVideo "story/mv_vault/storage">>
The storage area is well-organized but sparse.
Shelves line the walls, holding preserved food, water containers, medical supplies, and various tools. Every item has its place. Perfect rows. Perfect spacing.
<<say "Groundskeeper" "Reserves. Sufficient for survival. Insufficient for prosperity.">>
He indicates sections with that same precise gesture - you're starting to wonder if he has any other movements.
<<say "Groundskeeper" "Sustenance. Hydration. Medical. Components.">>
<<notify "info">>
Current Resources:
- Food: <<print $vault.food>> units
- Water: <<print $vault.water>> units
- Medical: <<print $vault.medical>> supplies
- Spare Parts: <<print $vault.scrap>> components
<</notify>>
<<say "Groundskeeper" "Monitoring these levels is required. Planning. Prioritization.">>
The Groundskeeper moves to a clothing section. A bundle sits on a shelf - clearly prepared in advance.
<<say "Groundskeeper" "The Reclaimed provides for those who venture forth.">>
He gestures to the bundle.
<<say "Groundskeeper" "Previous occupants left more than required. I've selected items appropriate to your dimensions.">>
A worn leather jacket. Practical clothes. Basic supplies.
<<say "Groundskeeper" "Nothing fashionable. The Reclaimed doesn't reward vanity. But it does reward preparation.">>
<div class="choice-container">
<<vchoice "Take the starter gear" "Day1_Tour_Storage_Equipped" "action" "armor">>
</div><<run VaultUI.setBackground("storage")>>
<<run VaultUI.setTimeOfDay("morning")>>
<<run VaultUI.showCharacter("groundskeeper", "right", "neutral")>>
You examine the bundle.
<<set $wardrobe.player.intimate to ["standard"]>>
<<set $wardrobe.player.equipped to "standard">>
<<run $vaultStorage.push({
id: "vault_jumpsuit",
name: "Vault Jumpsuit",
type: "clothing",
description: "Standard vault-issue jumpsuit. Practical."
})>>
<<run $vaultStorage.push({
id: "wasteland_pants",
name: "Wasteland Pants",
type: "clothing",
description: "Durable pants for harsh conditions."
})>>
<<run $vaultStorage.push({
id: "practical_shirt",
name: "Practical Shirt",
type: "clothing",
description: "Simple, functional shirt."
})>>
<<set $equipped.armor to {
id: "leather_jacket",
name: "Leather Jacket",
type: "armor",
defense: 3,
maxDurability: 50,
currentDurability: 50
}>>
<<run UInv.DeleteItem("player", "basic knife")>>
<<run setup.fightLootStart()>>
<<run setup.postBattleTakeLoot("combat knife", "Combat Knife", 1, "", "fightLoot")>>
<<set $equipped.weapon to {
id: "combat knife",
name: "Combat Knife",
type: "weapon",
damage: 8
}>>
<<run setup.postBattleTakeLoot("sewing kit", "Sewing Kit", 1, "", "fightLoot")>>
<<set $clothing.player.top to 100>>
<<set $clothing.player.bottom to 100>>
<<set $clothing.player.underwear to 100>>
<<set $clothing.player.underwearType to "standard">>
<<set $flags.hasStarterGear to true>>
You change into the practical clothes. The leather jacket is worn but sturdy - it's seen use, but it's still functional. The knife feels reassuring at your hip.
<<lootLeftList "fightLoot">>
<<notify "success">>
Received: Leather Jacket (Armor +3), Combat Knife (Damage +5), Standard Underwear, Sewing Kit (2 uses)
Spare clothes added to vault storage
<</notify>>
<<say "Groundskeeper" "Much better. You almost look like you might survive.">>
<<say $player.name "Thanks for the vote of confidence.">>
<<say "Groundskeeper" "Confidence is earned in the Reclaimed. Clothing is merely a starting point.">>
<div class="choice-container">
<<vchoice "Continue to the Medical Bay" "Day1_Tour_Medical" "move" "medical">>
</div><<run VaultUI.setBackground("medical")>>
<<run VaultUI.setTimeOfDay("morning")>>
<<run VaultUI.showCharacter("groundskeeper", "right", "neutral")>>
<<storyVideo "story/mv_day1_tour/medical">>
The medical bay is surprisingly well-equipped.
Beds line one wall. Cabinets hold supplies. Ancient machines hum with standby power.
<<say "Groundskeeper" "You were processed here. Your arrival state was critical.">>
<<say $player.name "How did you heal me?">>
<<say "Groundskeeper" "The vault possesses resources. Some technological. Some... otherwise.">>
He passes a hand over one of the machines. It pulses with the same purple light you saw on the sealed door - and for an instant, his hand seems to phase //into// the machinery.
<<say "Groundskeeper" "Healing here operates through unconventional protocols. Proximity. Contact. Connection.">>
<<say $player.name "What does that mean?">>
<<say "Groundskeeper" "Severe injury requires intimate treatment. The vault's healing systems respond to human connection. To the energy such connection generates.">>
A pause. That precise three-second pause.
<<say "Groundskeeper" "This information may become relevant. Should others arrive.">>
<div class="choice-container">
<<vchoice "Continue to the Living Quarters" "Day1_Tour_Quarters" "move" "house">>
</div><<run VaultUI.setBackground("quarters")>>
<<run VaultUI.setTimeOfDay("morning")>>
<<run VaultUI.showCharacter("groundskeeper", "right", "neutral")>>
<<storyVideo "story/mv_day1_tour/quarters">>
The residential wing stretches before you.
Multiple doors line the corridor. Most are closed. Empty. The silence here feels heavier.
<<say "Groundskeeper" "Habitation quarters. Current occupancy: two.">>
You pause at one door. It's slightly ajar. Inside, you see a room much like yours - but lived in. Personal items on the desk. Clothes in the trunk. Dust on everything.
<<say $player.name "Someone lived here.">>
<<say "Groundskeeper" "Correct.">>
<<say $player.name "What happened to them?">>
Three seconds.
<<say "Groundskeeper" "Incompatibility with vault requirements. Failure to adapt to transformation parameters.">>
<<say "Groundskeeper" "Continuation of tour is recommended.">>
<<set $flags.sawPreviousDwellerRoom to true>>
<div class="choice-container">
<<vchoice "Continue to the Archives" "Day1_Tour_Archives" "move" "library">>
</div><<run VaultUI.setBackground("archives")>>
<<run VaultUI.setTimeOfDay("morning")>>
<<run VaultUI.showCharacter("groundskeeper", "right", "neutral")>>
<<storyVideo "story/mv_day1_tour/archives">>
The archives span two levels.
Bookshelves reach toward the ceiling. Terminals with dark screens line the walls. In the center, a spiral staircase leads down to a lower level - and a massive sealed door.
<<say "Groundskeeper" "Knowledge repository. History. Science. Other disciplines.">>
<<say $player.name "Other disciplines?">>
<<say "Groundskeeper" "The Cataclysm altered fundamental parameters of reality. Certain... possibilities expanded.">>
He indicates the sealed door below.
<<say "Groundskeeper" "Restricted archive. Pre-Cataclysm research. Access currently prohibited.">>
Purple symbols glow faintly around its frame. The same symbols you saw earlier. The Groundskeeper watches you watching the door - and something in his stillness feels like anticipation.
<<say "Groundskeeper" "Access will become available. When compatibility thresholds are met.">>
Something about the door calls to you. A whisper at the edge of hearing.
<<say "Groundskeeper" "You perceive it. The vault has identified you. Recognition precedes revelation.">>
<div class="choice-container">
<<vchoice "Complete the tour" "Day1_Tour_End" "move" "check">>
</div><<advanceTime 3 0>>
<<run VaultUI.setBackground("commons")>>
<<run VaultUI.setTimeOfDay("afternoon")>>
<<run VaultUI.showCharacter("groundskeeper", "right", "neutral")>>
Back in the commons. The Groundskeeper stops. Turns. The movement is so precise it could be choreographed.
<<say "Groundskeeper" "Tour complete. Additional discovery will occur through exploration.">>
<<say $player.name "What do you expect from me?">>
<<say "Groundskeeper" "Survival. Adaptation. Resource acquisition when required. Reclaimed expeditions when you are prepared.">>
<<say "Groundskeeper" "Current directive: recovery. Familiarization. Safety processing.">>
He moves toward the kitchen - though 'move' feels like the wrong word. 'Relocate' might be more accurate.
<<say "Groundskeeper" "Evening sustenance will be provided. Your presence is... optional.">>
<<set $flags.vaultHubUnlocked to true>>
<<notify "info">>Day 1 Afternoon - Free to explore the vault or rest.<</notify>>
<div class="choice-container">
<<vchoice "Explore on your own" "Day1_Evening_Explore" "move" "run">>
<<vchoice "Rest in your quarters" "Day1_Evening_Quarters" "move" "house">>
<<vchoice "Join for the meal now" "Day1_Evening_Meal" "talk" "eating">>
</div><<advanceTime 2 0>>
<<run VaultUI.setBackground("archives_sealed_door")>>
<<run VaultUI.setTimeOfDay("evening")>>
<<run VaultUI.hideAllCharacters()>>
You wander the vault alone.
Without the Groundskeeper guiding you, it feels different. Larger. More mysterious.
<<storyVideo "story/mv_day1/evening_explore">>
Your footsteps echo in empty corridors. The hum of ancient technology is your only companion.
You find yourself drawn back to the sealed door with the purple symbols.
Standing before it, you feel... something. A presence on the other side. Waiting.
<<if $prelude.dreamSurrender>>
The voice from your dreams whispers at the edge of your consciousness.
<<say "???" "Not yet, little one. But soon.">>
You stumble back. Was that real?
<</if>>
The symbols pulse once, then go dark.
Whatever's behind that door, it knows you're here.
<div class="choice-container">
<<vchoice "Return to commons for dinner" "Day1_Evening_Meal" "move" "eating">>
<<vchoice "Go to your quarters" "Day1_Evening_Quarters" "move" "house">>
</div><<run VaultUI.setBackground("quarters")>>
<<run VaultUI.setTimeOfDay("evening")>>
<<run VaultUI.hideAllCharacters()>>
You return to your quarters.
The room feels more familiar now. Almost like home. Almost.
You sit on the bed, processing everything.
A vault built before the Cataclysm. A mysterious Groundskeeper who speaks in riddles. Sealed doors with glowing symbols. Previous inhabitants who "couldn't adapt."
And somewhere out there, Sera. Taken by things you don't understand.
<<if $prelude.loveConfessed>>
You told her you loved her. That last night. Did she hear you?
Is she even still alive?
<</if>>
Your hand finds the lingerie you took earlier. Silk against your fingers. A reminder of the world that was.
A reminder of what you've lost.
<div class="choice-container">
<<vchoice "Join for dinner" "Day1_Evening_Meal" "move" "eating">>
<<vchoice "Skip dinner, sleep" "Day1_Night_Quarters" "move" "night">>
</div><<if !$flags.day1MealEaten>>
<<set $flags.day1MealEaten to true>>
<<advanceTime 2 0>>
<</if>>
<<run VaultUI.setBackground("commons")>>
<<run VaultUI.setTimeOfDay("evening")>>
<<run VaultUI.showCharacter("groundskeeper", "right", "neutral")>>
A meal waits on the table. You didn't see the Groundskeeper prepare it.
Preserved vegetables. Protein of some kind - you don't ask what. Clean water that tastes like nothing you've had in years.
You eat in relative silence. The Groundskeeper does not eat. He simply... observes.
<<say "Groundskeeper" "Queries are accumulating. This is observable.">>
<<say $player.name "Dozens of them.">>
<<say "Groundskeeper" "Three queries will be processed. Select.">>
<div class="choice-container">
<<vchoice "What are you, exactly?" "Day1_Meal_Question1" "talk" "talk">>
<<vchoice "What happened to the previous dwellers?" "Day1_Meal_Question2" "talk" "talk">>
<<vchoice "The woman in my dreams - who is she?" "Day1_Meal_Question3" "talk" "talk">>
<<vchoice "Can I find Sera?" "Day1_Meal_Question4" "talk" "talk">>
</div><<run setup.day1MealAsk(1)>>
<<run VaultUI.showCharacter("groundskeeper", "right", "neutral")>>
<<say $player.name "What are you, exactly? You're not... normal.">>
The Groundskeeper does not react. Three seconds pass.
<<say "Groundskeeper" "Classification: Groundskeeper. Function: vault maintenance. Guardian protocols. Knowledge preservation.">>
<<say $player.name "That's not an answer. What //are// you?">>
<<say "Groundskeeper" "Query requires clarification. Biological? Negative. Purely technological? Insufficient descriptor. Supernatural entity? Partial accuracy.">>
<<say $player.name "So what, then?">>
<<say "Groundskeeper" "I am what Duvarnach requires me to be. The vault shaped me. As it shapes all who remain.">>
His eyes - or what functions as eyes - meet yours. You see nothing in them. Or perhaps everything. It's impossible to tell.
<<say "Groundskeeper" "Your probability of successful adaptation is... notable.">>
<<relationChange "groundskeeper" "trust" 5>>
<div class="choice-container">
<<if setup.day1MealQueriesLeft() gt 0>><<vchoice "Ask another question" "Day1_Evening_Meal" "dialogue" "talk">><</if>>
<<vchoice "End the conversation" "Day1_Night_Quarters" "move" "door">>
</div><<run setup.day1MealAsk(2)>>
<<run VaultUI.showCharacter("groundskeeper", "right", "neutral")>>
<<say $player.name "The previous dwellers. What really happened to them?">>
Three seconds.
<<say "Groundskeeper" "Variable outcomes. Some rejected vault integration. Departed. Survival rate: minimal.">>
<<say "Groundskeeper" "Others initiated transformation sequences. Could not process resultant changes. Failure cascades.">>
<<say $player.name "And the one whose room I saw?">>
<<say "Groundskeeper" "Subject demonstrated elevated compatibility. Perceptual capabilities beyond baseline parameters.">>
Three seconds.
<<say "Groundskeeper" "Acceleration of discovery protocols exceeded safe thresholds. Transformation completed before psychological integration could occur.">>
<<say $player.name "Is she still here?">>
<<say "Groundskeeper" "Affirmative. In modified capacity. Certain processes, once initiated, cannot be reversed.">>
<<set $flags.previousDwellerHint to true>>
<div class="choice-container">
<<if setup.day1MealQueriesLeft() gt 0>><<vchoice "Ask another question" "Day1_Evening_Meal" "dialogue" "talk">><</if>>
<<vchoice "End the conversation" "Day1_Night_Quarters" "move" "door">>
</div><<run setup.day1MealAsk(3)>>
<<run VaultUI.showCharacter("groundskeeper", "right", "neutral")>>
<<say $player.name "The woman in my dreams. The one with horns. Who is she?">>
For the first time, the Groundskeeper's pause exceeds three seconds. Four. Five.
<<say "Groundskeeper" "Succubus classification. Desire-spectrum entity. Origin: inter-dimensional rift.">>
For a fraction of a second, you could swear his mechanical eye flickers - a brief pulse of purple light that's gone before you can be sure you saw it.
<<say $player.name "A demon?">>
<<say "Groundskeeper" "Religious terminology. Imprecise but functionally adequate. The Cataclysm created apertures between realities. Entities passed through.">>
<<say "Groundskeeper" "She has established connection with you. Purpose: unknown. Potentially resource extraction. Potentially recruitment. Potentially other objectives.">>
<<say $player.name "What does she want?">>
<<say "Groundskeeper" "Energy. Connection. Your presence here suggests her guidance. Your perception of sealed areas indicates marking.">>
His head tilts - the first non-calculated movement you've seen. Almost curious.
<<say "Groundskeeper" "Classification of marking as beneficial or detrimental: insufficient data.">>
<<set $flags.succubusExplained to true>>
<div class="choice-container">
<<if setup.day1MealQueriesLeft() gt 0>><<vchoice "Ask another question" "Day1_Evening_Meal" "dialogue" "talk">><</if>>
<<vchoice "End the conversation" "Day1_Night_Quarters" "move" "door">>
</div><<run setup.day1MealAsk(4)>>
<<run VaultUI.showCharacter("groundskeeper", "right", "neutral")>>
<<say $player.name "Sera. The woman I lost. Can I find her?">>
Three seconds.
<<say "Groundskeeper" "The entities that acquired her - Convergence designation - maintain subjects in viable state. Resource harvesting requires preservation.">>
<<say $player.name "She might be alive?">>
<<say "Groundskeeper" "Probability: moderate. Recovery would require Reclaimed penetration beyond current capability parameters. Encounter with entities you lack context to comprehend.">>
<<say "Groundskeeper" "Recommendation: capability enhancement. Vault training. Alliance acquisition.">>
<<say "Groundskeeper" "Then: reassessment of rescue viability.">>
Something ignites in your chest. Hope. Determination.
<<say $player.name "I'll find her.">>
<<say "Groundskeeper" "Statement noted. Survival is prerequisite. Heroism requires living subjects.">>
<<set $flags.seraSearchMentioned to true>>
<div class="choice-container">
<<if setup.day1MealQueriesLeft() gt 0>><<vchoice "Ask another question" "Day1_Evening_Meal" "dialogue" "talk">><</if>>
<<vchoice "End the conversation" "Day1_Night_Quarters" "move" "door">>
</div><<run VaultUI.setBackground("quarters")>>
<<run VaultUI.setTimeOfDay("night")>>
<<run VaultUI.hideAllCharacters()>>
Night falls in the vault.
<<storyVideo "story/mv_day1/night_quarters">>
The lights dim automatically. Your room fills with soft shadows.
You lie in bed, staring at the ceiling.
One day. One day in this strange place, and already everything feels different.
The Groundskeeper's warnings echo in your mind. The sealed doors. The previous dweller who "wasn't human anymore."
<<if $prelude.hadSex>>
You think of Sera. Her warmth beside you. The way she laughed.
Wherever she is, you hope she's holding on. You'll find her. Somehow.
<</if>>
Sleep tugs at you. You let it come.
<<journalAdd "First full day in the vault. The Groundskeeper gave me a tour - power core, storage, medical bay, archives. This place is massive. Ancient. He keeps talking about 'previous dwellers' in a way that makes my skin crawl." "story">>
<<if $prelude && $prelude.hadSex>>
<<journalAdd "I keep thinking about Sera. Where is she? Is she even still alive? I have to believe she is. I have to find her." "reflection">>
<</if>>
<div class="choice-container">
<<vchoice "Sleep..." "Day1_Night_Dream" "move" "night">>
</div><<run VaultUI.transition("supernatural", 1000)>>
<<run VaultUI.setSceneMode("dream")>>
<<run VaultUI.setBackground("prelude/dream-void")>>
<<run VaultUI.setTimeOfDay("night")>>
<<run VaultUI.setWeather("fog")>>
<div class="dream-sequence">
Colors blur. Reality shifts.
You're not in your room anymore.
A vast, purple void stretches in every direction. Stars that aren't stars drift past. The air tastes like electricity and desire.
<<if $prelude.hadSex>>
Sera appears before you.
<<say "Sera" "You came for me.">>
But something's wrong. Her eyes flicker purple. Her smile is too sharp.
<<say "Sera" "No. Not yet. Soon.">>
She melts away, reforming into another shape.
<</if>>
<<storyVideo "story/velith_dream_visits/day1_night_dream">>
<<if _storyClip is "a260047ae303">>The woman from before. Horns curling from her temples. She turns toward you holding a goat's skull over her face, a pentagram cut into its brow, and lowers it slowly. The dream smudges whatever is behind it, a thumb dragged through wet charcoal: a mouth, dark eyes, gone before you can keep them. Only the horns stay sharp, glossy black, close enough that you could hook a finger round one if your hand would move.<<else>>The woman from before. Horns curling from her temples. Wings folded behind her. Beautiful. Terrifying.<</if>>
<<run VaultUI.showCharacter("succubus", "center", "seductive")>>
<<say "???" "You made it. I was starting to worry.">>
<<say $player.name "Who are you?">>
<<say "???" "A friend. A guide. Someone who's been waiting for you for a very long time.">>
She circles you slowly. You feel her gaze like a physical touch.
<<say "???" "The Groundskeeper will try to protect you. He always does. But protection only lasts so long.">>
<<say "???" "Eventually, you'll need power. Real power. And I can give it to you.">>
Her fingers brush your cheek. The touch sends electricity through your entire body.
<<say "???" "We'll meet soon. In the flesh. And then... then we'll see what you really are.">>
She leans close. Her lips brush your ear.
<<say "???" "Sleep well, little one. Tomorrow, things begin to change.">>
</div>
<div class="choice-container">
<<vchoice "Wake" "Day2_Morning_Wake" "move" "sun">>
</div><<run VaultUI.setBackground("commons")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<<run VaultUI.showCharacter("kira", "center", "neutral")>>
You find Kira near the commons, checking supplies.
<<getCompanion "kira">>
<<if $tempCompanion>>
<<say "Kira" "Hey. Need something?">>
<div class="choice-container">
<<vchoice "How are you settling in?" "Kira_FreeRoam_Settling" "talk" "talk">>
<<vchoice "Talk about the Reclaimed" "Kira_FreeRoam_Wasteland" "talk" "reclaimed">>
<<if $tempCompanion.affection >= 30>>
<<vchoice "Talk about her past" "Kira_FreeRoam_Past" "talk" "book">>
<</if>>
<<vchoice "Return to commons" "Vault_Hub" "move" "back">>
</div>
<<else>>
Kira isn't around right now.
<div class="choice-container">
<<vchoice "Return to commons" "Vault_Hub" "move" "back">>
</div>
<</if>><<run VaultUI.showCharacter("kira", "center", "thoughtful")>>
<<say "Kira" "Still getting used to all this. A safe place with actual beds? Feels unreal.">>
<<say $player.name "Better than the Reclaimed.">>
<<say "Kira" "Yeah. Way better.">>
<<if $tempCompanion.trust >= 20>>
She actually smiles.
<<say "Kira" "Thanks. For letting me stay.">>
<</if>>
<div class="choice-container">
<<vchoice "Continue talking" "Kira_FreeRoam" "talk" "talk">>
<<vchoice "Return to commons" "Vault_Hub" "move" "back">>
</div><<run VaultUI.showCharacter("kira", "center", "guarded")>>
<<say "Kira" "The Reclaimed never sleeps. Raiders, mutants, worse things at night.">>
<<say $player.name "You survived alone out there.">>
<<say "Kira" "Barely. Every day was a fight. This place...">>
She looks around.
<<say "Kira" "This place might actually let me breathe.">>
<div class="choice-container">
<<vchoice "Continue talking" "Kira_FreeRoam" "talk" "talk">>
<<vchoice "Return to commons" "Vault_Hub" "move" "back">>
</div><<run VaultUI.showCharacter("kira", "center", "vulnerable")>>
<<say $player.name "What was life like before?">>
<<say "Kira" "Before the Convergence took everything? Normal. Boring. Safe.">>
She's quiet for a moment.
<<say "Kira" "I had a family. A home. All gone now.">>
<<say $player.name "I'm sorry.">>
<<say "Kira" "Everyone's lost someone. That's just how it is now.">>
But you can see the pain in her eyes.
<<if $flags.kiraCommonsPastDay !== $time.day>>
<<set $flags.kiraCommonsPastDay to $time.day>>
<<relationChange "kira" "trust" 2>>
<<relationChange "kira" "affection" 1>>
<</if>>
<div class="choice-container">
<<vchoice "Continue talking" "Kira_FreeRoam" "talk" "talk">>
<<vchoice "Return to commons" "Vault_Hub" "move" "back">>
</div><<run VaultUI.setBackground("commons")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<<run VaultUI.showCharacter("groundskeeper", "center", "neutral")>>
You find the Groundskeeper in the commons. He doesn't look up as you approach - yet he clearly knows you're there.
<<say "Groundskeeper" "Query?">>
<div class="choice-container">
<<vchoice "Ask about the vault" "GK_About_Vault" "talk" "talk">>
<<vchoice "Ask about yourself" "GK_About_Self" "talk" "talk">>
<<vchoice "Never mind" "Vault_Hub" "move" "run">>
</div><<advanceTime 0 10>>
<<say "Groundskeeper" "Age: pre-Cataclysm. Purpose: knowledge preservation. Protection of compatible seekers.">>
<<say "Groundskeeper" "Sealed sections noted. Access: conditional upon compatibility thresholds being met.">>
<div class="choice-container">
<<vchoice "Return" "Vault_Hub" "move" "back">>
</div><<advanceTime 0 10>>
<<say "Groundskeeper" "Function: maintenance. Protection. Guidance protocols for arrivals.">>
<<say "Groundskeeper" "Prior state: irrelevant data. Current function is the operative parameter.">>
<div class="choice-container">
<<vchoice "Return" "Vault_Hub" "move" "back">>
</div><<widget "kiraJoinsVault">>
<<if !$flags.kiraIntroduced>>
<<set $flags.kiraIntroduced to true>>
<<set _kira = {
id: "kira",
name: "Kira",
age: 24,
description: "A lean, sharp-eyed survivor with shoulder-length dark hair and light grey-green eyes. Moves like someone used to running.",
portrait: "kira",
alive: true,
health: 45,
maxHealth: 100,
energy: 30,
maxEnergy: 100,
combat: 14,
scavenging: 18,
medical: 8,
trust: -10,
affection: 0,
lust: 0,
submission: 45,
tension: 0,
jealousy: 0,
fear: 5,
romanceStage: 0,
sexualStages: [],
lastIntimacy: 0,
recruited: false,
inParty: false,
isRomanceable: true,
orientation: "player-sexual",
kinks: ["light bondage", "oral", "being pinned", "hair pulling"],
limits: ["extreme pain", "being shared", "humiliation"],
triggersDiscovered: [],
triggersHidden: ["praise"],
cncAgreement: true,
cncSafeWord: "red",
personality: ["pragmatic", "guarded", "dry humor", "loyal once earned"],
thoughts: ["Who are these people? What do they really want?"],
currentLocation: "medical",
mood: "guarded",
outfit: "torn scavenger gear",
claimed: false,
pregnant: false
}>>
<<run $companions.push(_kira)>>
<<randomizeKinks "kira" 2>>
<<if $flags.kiraTrustBonusPending>>
<<addTrust "kira" $flags.kiraTrustBonusPending>>
<<set $flags.kiraTrustBonusPending to 0>>
<</if>>
<<if def _kiraClothingTrustBonus>>
<<addTrust "kira" _kiraClothingTrustBonus>>
<<addAffection "kira" _kiraClothingAffectionBonus>>
<</if>>
<<notify "info">>Kira has joined the vault. Relationship: Hostile (-10 trust)<</notify>>
<</if>>
<</widget>><<run setup.markStoryDay(2)>>
<<set $time.day to setup.storyDay(2, false, 7)>>
<<setTime 7 0>>
<<set $player.health to Math.min($player.maxHealth, $player.health + 30)>>
<<set $player.energy to $player.maxEnergy>>
<<run VaultUI.setSceneMode(null)>>
<<set $currentLocation to "quarters">>
<<run VaultUI.setBackground("quarters")>>
<<run VaultUI.setTimeOfDay("morning")>>
<<run VaultUI.hideAllCharacters()>>
<<run VaultUI.setWeather("clear")>>
You wake with a gasp.
The dream clings to you - purple light, electric touch, a voice that promised power.
Your body is... responding. Aroused in ways you haven't felt since before the Reclaimed. Since Sera.
You push the feeling down. Focus on the real world.
Another day in the vault. Another day of safety. Of trying to understand this place.
The Groundskeeper mentioned finding survivors. Gathering resources. Maybe today you can-
A sound. Distant. Unfamiliar.
An alarm.
<div class="choice-container">
<<vchoice "Rush to investigate" "Day2_Morning_Alarm" "action" "rapid-strikes">>
</div><<run VaultUI.setBackground("commons")>>
<<run VaultUI.setTimeOfDay("morning")>>
<<run VaultUI.showCharacter("groundskeeper", "left", "neutral")>>
Red lights pulse along the corridor walls. A klaxon blares - then cuts off.
You find the Groundskeeper at a console. He doesn't look up as you approach.
<<say "Groundskeeper" "External contact detected. Primary entrance.">>
<<say $player.name "Raiders?">>
<<say "Groundskeeper" "Negative. Single organism. Movement pattern: irregular. Probability assessment: injured. Alternate hypothesis: pursued.">>
<<storyVideo "story/kira_day2_arrival/day2_decision_open">>
The image is grainy, but you can make out a figure - stumbling toward the vault door. Behind them, in the dust cloud, shapes are moving.
<<say "Groundskeeper" "Decision point. Door activation risks hostile entry. Door inaction results in external subject termination.">>
Three seconds.
<<say "Groundskeeper" "Your determination is required.">>
<div class="choice-container">
<<vchoice "Open the door - we can't leave them" "Day2_Decision_Open" "action" "door-handle">>
<<vchoice "It's too dangerous - keep it closed" "Day2_Decision_Closed" "action" "locked">>
<<vchoice "Can we help them another way?" "Day2_Decision_Alternative" "talk" "talk">>
</div><<set $flags.openedDoorForKira to true>>
<<relationChange "groundskeeper" "trust" 5>>
<<say $player.name "Open it. We can't just watch them die.">>
The Groundskeeper's hand hovers over the controls. No hesitation. No judgment. Simply waiting for confirmation.
<<say "Groundskeeper" "Decision registered. Compassion or operational error - distinction currently undeterminable.">>
He inputs a sequence. Deep in the vault, machinery groans.
<<say "Groundskeeper" "Thirty seconds to door activation. Preparatory measures recommended.">>
You grab your knife - inadequate, but better than nothing.
The seconds tick by. The figure on the screen reaches the door just as it begins to slide open.
They tumble through. The door slams shut behind them.
The shapes in the dust howl with frustration - then retreat.
<div class="choice-container">
<<vchoice "Check on the survivor" "Day2_Kira_Arrival" "action" "run">>
</div><<set $flags.hesitatedForKira to true>>
<<say $player.name "We can't risk it. Whatever's chasing them...">>
The Groundskeeper observes you. No expression. Processing.
<<say "Groundskeeper" "Assessment: pragmatic. Survival probability optimization acknowledged.">>
On the screen, the figure reaches the door. Pounds on it. You can't hear them, but you can see their mouth moving. Pleading.
Something twists in your chest.
<<say "Groundskeeper" "Subject persistence continuing. Pursuer proximity increasing.">>
The figure turns, sees the shapes approaching, and raises their hands in a final, desperate gesture.
<<say $player.name "...Open it.">>
<<say "Groundskeeper" "Decision revision detected. Confirmation required.">>
<<say $player.name "Yes. Open it now.">>
The Groundskeeper inputs the sequence without further query. The door begins to open.
Just in time.
<div class="choice-container">
<<vchoice "Check on the survivor" "Day2_Kira_Arrival" "action" "run">>
</div><<say $player.name "Is there another way? Can we help without opening the main door?">>
Three seconds.
<<say "Groundskeeper" "Alternative protocol available. Defensive system activation. Energy cost: significant.">>
<<say $player.name "Do it.">>
<<say "Groundskeeper" "Defensive activation addresses immediate threat. Subject entry still required subsequently.">>
<<say $player.name "Then we open the door after. When it's safe.">>
<<say "Groundskeeper" "Protocol acceptable. Initiating.">>
He inputs a different sequence. On the screen, something erupts from the ground near the vault entrance - a pulse of energy that sends the pursuing shapes scattering.
<<if setup.vaultPowerLive>>
<<set $vault.power to Math.max(0, $vault.power - 15)>>
<<notify "warning">>Vault power decreased by 15%<</notify>>
<</if>>
The figure outside looks up in shock. Then, as the door begins to open, stumbles toward safety.
<div class="choice-container">
<<vchoice "Check on the survivor" "Day2_Kira_Arrival" "action" "run">>
</div><<run VaultUI.setBackground("vault-entrance-interior")>>
<<run VaultUI.setTimeOfDay("morning")>>
<<storyVideo "story/kira_day2_arrival/arrival">>
<<if _storyFamily is "sf_cg_kira_day2_arrival_04">>You reach the entrance as the survivor goes down - sprawled on her back in the grit beside the rusted wreck by the door, hands at her bloody head. You grab her and drag her clear of the threshold.<<else>>You reach the entrance chamber as the survivor collapses.<</if>>
A woman. Young - maybe your age, maybe younger. Dark hair matted with blood. Torn clothes. A makeshift weapon still clutched in her hand.
And a wound. Bad. Her side is soaked red.
<<run VaultUI.showCharacter("kira", "center", "hurt")>>
<<say "Woman" "Don't... don't touch me...">>
Her voice is weak but hostile. Even now, wounded and helpless, she's ready to fight.
<<say "Groundskeeper" "She needs the medical bay. Now.">>
<<say "Woman" "I said... don't...">>
Her eyes flutter. She's losing consciousness.
<div class="choice-container">
<<vchoice "Carry her to medical yourself" "Day2_Kira_Medical_Player" "action" "strength">>
<<vchoice "Let the Groundskeeper take her" "Day2_Kira_Medical_GK" "action" "hand">>
<<vchoice "Try to treat her here first" "Day2_Kira_Medical_Here" "action" "medical">>
</div><<set $flags.carriedKira to true>>
<<run VaultUI.hideAllCharacters()>>
<<run VaultUI.showCharacterAs("kira", "Woman", "sad")>>
You gather her in your arms before she can protest further.
<<storyVideo "story/kira_day2_arrival/medical_player">>
She's lighter than you expected. Too light. When did she last eat?
<<say "Woman" "...bastard...">>
<<if _storyFamily is "sf_cg_kira_day2_arrival_04">>But she doesn't fight. Can't fight. Her head falls back over your arm, hair hanging.<<else>>But she doesn't fight. Can't fight. Her head lolls against your shoulder.<</if>>
<<if _storyFamily is "sf_cg_kira_day2_arrival_04">>You carry her out of the smoke and down the corridors to the medical bay, the Groundskeeper following in perfect silence.<<else>>You carry her through the corridors to the medical bay, the Groundskeeper following in perfect silence.<</if>>
<div class="choice-container">
<<vchoice "Continue to medical bay" "Day2_Kira_Medical" "move" "medical">>
</div><<run VaultUI.hideAllCharacters()>>
<<say $player.name "You take her. I'll prepare the medical bay.">>
The Groundskeeper lifts her without visible effort. No strain. No adjustment. As if weight is irrelevant.
<<say "Groundskeeper" "Subject will resist treatment. Pattern consistent with Reclaimed survivors. Trust establishment required.">>
<<say $player.name "Just keep her alive.">>
You run ahead, trying to remember which supplies went where during the tour.
<div class="choice-container">
<<vchoice "Prepare the medical bay" "Day2_Kira_Medical" "move" "medical">>
</div><<say $player.name "She might not survive the walk. Let me see the wound.">>
You kneel beside her. The Groundskeeper produces a medical kit - you didn't see where from.
The wound is deep. Claw marks, maybe. Something with talons.
<<say "Groundskeeper" "Injury assessment: exceeds field treatment parameters. Medical bay required.">>
<<say $player.name "Then let's move her. But carefully.">>
Together, you lift her. She groans but doesn't wake.
<div class="choice-container">
<<vchoice "Take her to medical" "Day2_Kira_Medical" "move" "medical">>
</div><<advanceTime 2 0>>
<<run VaultUI.setBackground("medical")>>
<<run VaultUI.setTimeOfDay("morning")>>
<<run VaultUI.showCharacter("kira", "center", "hurt")>>
The medical bay activates as you enter. Automatic. Anticipatory.
<<storyVideo "story/kira_day2_arrival/medical">>
<<if _storyFamily is "sf_cg_kira_day2_arrival_04">>You lay her on a bed. The bay dims to amber around her; sweat beads on her face while the Groundskeeper connects equipment - tubes, monitors, devices you don't recognize.<<else>>You lay her on a bed. The Groundskeeper connects equipment - tubes, monitors, devices you don't recognize.<</if>> His movements are identical each time. Exact.
<<say "Groundskeeper" "Wound requires cleaning. Closure. Vault systems will assist. However.">>
He pauses. That precise three-second pause.
<<say "Groundskeeper" "Healing protocols respond to human connection parameters. Proximity. Contact. Accelerated recovery correlation: significant.">>
<<say $player.name "What does that mean, exactly?">>
<<say "Groundskeeper" "Physical contact. Maintained presence. The vault processes the rest.">>
It sounds strange. Almost superstitious. But after everything you've seen...
<<if $flags.carriedKira>>
You already held her once. You can do this.
<</if>>
<div class="choice-container">
<<vchoice "Stay with her during treatment" "Day2_Kira_Healing" "intimate" "hand">>
<<vchoice "Let the Groundskeeper handle it" "Day2_Kira_Healing_Distant" "action" "search">>
</div><<set $flags.healedKiraPersonally to true>>
<<run VaultUI.showCharacter("kira", "center", "hurt")>>
You pull a chair beside her bed. Take her hand.
It's cold. Rough with calluses. The hand of someone who's fought to survive.
<<say "Groundskeeper" "Acceptable. Maintain focus on subject. Intention: recovery.">>
You try. You think about survival. About connection. About not being alone in this place anymore.
The machines hum louder. Purple light - that same purple - pulses through the tubes.
<<set $clothing.kira.top to 15>>
<<set $clothing.kira.bottom to 40>>
<<set $clothing.kira.underwear to 80>>
<<set $clothing.kira.underwearType to "standard">>
<<set $clothing.kira.titsExposed to false>>
<<set $clothing.kira.pussyExposed to false>>
<<set $clothing.kira.assExposed to false>>
<<storyVideo "story/kira_day2_arrival/healing">>
For a moment - just a moment - her wound itself seems to glow. <<if _storyClip is "ccc0446b2140">>A faint violet luminescence around the torn edges of flesh, pulsing under the device the Groundskeeper clamped over her arm.<<else>>A faint violet luminescence around the torn edges of flesh.<</if>>
You blink. It's gone. She didn't see it. Maybe you imagined it.
But you didn't imagine it.
And slowly, impossibly, the wound begins to close.
The Groundskeeper has to cut away portions of her ruined clothing to treat the wounds properly. Her shirt is barely hanging on - one sleeve gone, the fabric ripped across her stomach. Her pants are torn at the thigh.
It takes hours. You don't let go.
When it's done, she's still unconscious, but her breathing is steady. Color returns to her cheeks.
<<say "Groundskeeper" "Subject survival: confirmed. Your participation was... relevant to outcome.">>
<<say $player.name "What... what was that? The light?">>
<<say "Groundskeeper" "Vault power systems. Response to connection parameters. Energy exchange between organisms.">>
The Groundskeeper looks at her ruined clothes.
<<say "Groundskeeper" "Her current garments are unsalvageable. Storage contains replacement options. Advisable to prepare before consciousness returns.">>
<<set $flags.kiraClothingNeeded to true>>
<<notify "info">>The mysterious woman will wake soon. You should find her replacement clothes.<</notify>>
<div class="choice-container">
<<vchoice "Find her clothes now" "Day2_Find_Kira_Clothes" "action" "armor">>
<<vchoice "Wait for her to wake first" "Day2_Kira_Wakes" "move" "clock">>
</div><<say $player.name "I'll let you work. Call me when she's stable.">>
The Groundskeeper regards you. No expression change. No judgment visible.
<<say "Groundskeeper" "Acknowledged.">>
<<storyVideo "story/mv_day2/commons_lamp">>
You wait in the commons. Hours pass. The lights flicker occasionally - the healing process draining power.
<<if setup.vaultPowerLive>><<set $vault.power to Math.max(0, $vault.power - 5)>><</if>>
Finally, the Groundskeeper appears in the doorway. You didn't hear him approach.
<<say "Groundskeeper" "Subject status: stable. Recovery duration: extended beyond optimal parameters.">>
<<say $player.name "What does that mean?">>
<<say "Groundskeeper" "Vault systems respond to connection presence. Absence registered. Efficiency reduced.">>
More clinical observations. You file it away.
<<say "Groundskeeper" "Subject consciousness returning. Your presence: advisable.">>
<div class="choice-container">
<<vchoice "Go to the medical bay" "Day2_Kira_Wakes" "move" "medical">>
</div><<run VaultUI.setBackground("storage")>>
<<run VaultUI.setTimeOfDay($flags.kiraWokeInMedical ? "afternoon" : "morning")>>
<<run VaultUI.hideAllCharacters()>>
<h2>Storage Room</h2>
<<if $flags.kiraWokeInMedical>>You hurry back to the storage area. She's waiting in the medical bay in what's left of her clothes, and she didn't sound like she'd wait long.<<else>>You return to the storage area, this time looking for clothes that might fit her.<</if>>
You estimate her size based on what you saw. Find options among the salvaged clothing.
Most of it is practical - vault jumpsuits, work clothes, pre-Cataclysm survivalist gear.
<div class="choice-container">
<<vchoice "Practical gear - tank top, cargo pants, sports wrap" "Day2_Clothes_Practical" "action" "armor">>
<<vchoice "Comfortable clothes - soft shirt, loose pants, standard underwear" "Day2_Clothes_Comfortable" "action" "shirt">>
<<vchoice "Check for anything else..." "Day2_Clothes_Other" "action" "search">>
</div><<set $kiraOutfitChoice to "practical">>
<<goto "Day2_Clothes_Selected">><<set $kiraOutfitChoice to "comfortable">>
<<goto "Day2_Clothes_Selected">><<run VaultUI.setBackground("storage")>>
<<run VaultUI.setTimeOfDay($flags.kiraWokeInMedical ? "afternoon" : "morning")>>
You dig deeper into the storage.
In the back, you find a drawer that's been overlooked. Inside: pre-Cataclysm items. Some practical. Some... not.
<p class="loot-find">Found: <strong>Salvaged Lingerie</strong> - Delicate lace and silk. Surprisingly intact.</p>
<<set _lingerieImage to ($intimateApparel && $intimateApparel.kira && $intimateApparel.kira.lingerie && $intimateApparel.kira.lingerie.image) || "media/clothing/intimate/kira/lingerie_v2.webp">>
<div class="event-media-container loot-find-media">
<img class="primary-media event-image" @src="_lingerieImage" alt="Salvaged Lingerie">
</div>
<<run $vaultStorage.push({
id: "lingerie",
name: "Salvaged Lingerie",
type: "intimate",
description: "Pre-war luxury. Delicate lace and silk."
})>>
<<if !$wardrobe.kira.intimate.includes("lingerie")>>
<<set $wardrobe.kira.intimate.push("lingerie")>>
<</if>>
<p class="thought">You pocket it without really thinking about why.</p>
<<clampStat "player.lust" 3>>
<<set $flags.foundLingerie to true>>
<div class="choice-container">
<<vchoice "Practical gear for Kira - tank top, cargo pants" "Day2_Clothes_Practical" "action" "armor">>
<<vchoice "Comfortable clothes - soft shirt, loose pants" "Day2_Clothes_Comfortable" "action" "shirt">>
</div><<run VaultUI.setBackground("storage")>>
<<run VaultUI.setTimeOfDay($flags.kiraWokeInMedical ? "afternoon" : "morning")>>
You gather the bundle. It should fit her well enough.
<<if $kiraOutfitChoice === "practical">>
Tank top, cargo pants, and a sports wrap for support. Functional. The kind of thing a survivor would choose for herself.
<<set $kiraStarterUnderwear to "sports">>
<<else>>
Soft shirt, loose pants, standard underwear. Comfortable for recovery. Less tactical, but she's not going anywhere today.
<<set $kiraStarterUnderwear to "standard">>
<</if>>
<<set $flags.kiraClothesReady to true>>
<div class="choice-container">
<<vchoice "Return to medical" "Day2_Return_To_Medical" "move" "medical">>
</div><<run VaultUI.setBackground("medical")>>
<<if $flags.kiraWokeInMedical>>
<<run VaultUI.setTimeOfDay("afternoon")>>
<<run VaultUI.showCharacter("kira", "center", "guarded")>>
She's sitting on the edge of the bed where you left her, arms folded over what's left of her shirt, watching the door. She doesn't relax when she sees it's you. But her eyes go to the bundle in your hands.
<<say "Kira" "Took you long enough.">>
You set the clothes on the chair beside her and step back.
<<say "Kira" "...Turn around.">>
<<set $flags.kiraTrustBonusPending to 3>>
<div class="choice-container">
<<vchoice "Turn around" "Day2_Kira_Changes" "action" "cycle">>
</div>
<<else>>
<<run VaultUI.setTimeOfDay("morning")>>
<<run VaultUI.showCharacter("kira", "center", "hurt")>>
<<storyVideo "story/kira_day2_arrival/day2_return_to_medical">>
<<if _storyFamily is "sf_cg_kira_day2_arrival_04">>She's curled on her side, eyes half open and glassy, too far under to see you. You rest a hand on her arm - her skin is clammy, and she doesn't stir - then set the clothes on a nearby chair where she'll see them when she wakes.<<else>>She's still asleep. You set the clothes on a nearby chair where she'll see them when she wakes.<</if>>
<<say "Groundskeeper" "A considerate gesture. She will likely appreciate having options when she regains consciousness.">>
<<say "Groundskeeper" "I will alert you when her vital signs indicate waking. I suggest you rest or eat. It may be... eventful... when she wakes.">>
<div class="choice-container">
<<vchoice "Wait nearby" "Day2_Kira_Wakes" "move" "clock">>
</div>
<</if>><<advanceTime 3 0>>
<<set $flags.kiraWokeInMedical to true>>
<<run VaultUI.setBackground("medical")>>
<<run VaultUI.setTimeOfDay("afternoon")>>
<<run VaultUI.showCharacter("kira", "center", "angry")>>
Her eyes snap open.
<<storyVideo "story/kira_day2_arrival/wakes">>
<<if _storyFamily is "sf_cg_kira_day2_arrival_04">>Her fist comes up around the first hard thing she can grab - you catch her wrist before it lands. She freezes under your grip, breathing hard.<<elseif _storyClip is "d8569cc58072">>She stays flat on her back, rigid, a scream tearing out of her before she bites it off. Her wide eyes dart around the room, looking for a weapon, looking for threats.<<else>>In one motion, she's off the bed, crouched, looking for a weapon, looking for threats.<</if>>
<<say "Woman" "Where am I? Who are you? What did you do to me?">>
<<say $player.name "Easy. You're safe. We saved your life.">>
<<say "Woman" "Nobody saves anybody. What do you want?">>
Her eyes dart around the room. Taking in the equipment, the exits, you.
<<say "Groundskeeper" "Requirement: none. Status: injured. Action: treatment provided.">>
She straightens slowly. Testing her side where the wound was. Finding it healed.
<<say "Woman" "That's... not possible. I was dying.">>
<<say "Groundskeeper" "Vault resources: available. Your access: provisional guest status.">>
<<say "Woman" "Guest.">>
She says the word like it's foreign. Suspicious.
<<say "Woman" "And when I want to leave?">>
<<say "Groundskeeper" "Departure: permitted. Imprisonment: not vault function.">>
She processes this. Still wary, but the immediate threat response is fading.
<div class="choice-container">
<<vchoice "Ask her name" "Day2_Kira_Name" "talk" "talk">>
<<vchoice "Ask what was chasing her" "Day2_Kira_Pursuers" "talk" "talk">>
<<vchoice "Give her space" "Day2_Kira_Space" "action" "run">>
</div><<run VaultUI.showCharacter("kira", "center", "guarded")>>
<<say $player.name "I'm... well, you can call me whatever you want. What's your name?">>
She studies you. Looking for the trick.
<<say "Woman" "Kira.">>
<<say $player.name "Kira. Welcome to the Vault of Duvarnach.">>
<<say "Kira" "What kind of name is that?">>
<<say $player.name "Old. This place is old.">>
She looks around again. This time with curiosity instead of pure suspicion.
<<storyVideo "story/kira_day2_arrival/name">>
<<if _storyFamily is "sf_cg_kira_day2_arrival_04">>Then her eyes dart down. At what's left of her clothes - little more than a scrap of black bra. At how much skin is showing.<<else>>Then her eyes dart down. At her ruined clothes. At how much skin is showing through the tears.<</if>>
Her expression flickers - vulnerability, then fury.
<<say "Kira" "Where are my—">>
<<if $flags.kiraClothesReady>>
She looks at the chair. At the bundle you left there.
<<say "Kira" "...Did you...?">>
<<say $player.name "I found you some clothes. Didn't look. Much.">>
She stares at you. Searching for the lie.
<<say "Kira" "...Turn around.">>
<<set $flags.kiraTrustBonusPending to 3>>
<div class="choice-container">
<<vchoice "Turn around" "Day2_Kira_Changes" "action" "cycle">>
</div>
<<else>>
<<say $player.name "Your stuff was ruined. Raiders did a number on it. I can find you replacements in storage.">>
<<say "Kira" "And while I was out? You didn't—">>
<<say $player.name "I treated your wounds. That's it.">>
A long pause. Then she nods, sharp.
<<say "Kira" "Then get me something to wear. Now.">>
<div class="choice-container">
<<vchoice "Find her clothes" "Day2_Find_Kira_Clothes" "action" "search">>
</div>
<</if>><<run VaultUI.setBackground("medical")>>
<<run VaultUI.setTimeOfDay("afternoon")>>
<<run VaultUI.hideAllCharacters()>>
You turn. Face the wall.
Behind you: rustling fabric. The soft sounds of someone dressing.
<<if $player.lust >= 40>>
<<storyVideo "story/kira_day2_arrival/changes__changes">>
<p class="thought">You imagine what's happening behind you. <<if _storyClip is "7ba9e9d14c66">>Her tearing the wrapping off the underwear you found. Her ruined pair sliding down her legs, then dangling from one finger behind your back while she grins.<<else>>Her pulling off the ruined shirt. Bare skin. The new clothes sliding on.<</if>> You try very hard not to imagine too much.</p>
<<clampStat "player.lust" 5>>
<</if>>
<<say "Kira" "...Okay.">>
You turn back.
<<run VaultUI.showCharacter("kira", "center", "neutral")>>
She's dressed now. <<if $kiraOutfitChoice === "practical">>Tank top and cargo pants. Practical. The kind of thing that says she's ready to fight at a moment's notice.<<else>>Soft shirt and loose pants. Comfortable for recovery. She looks almost... normal.<<endif>>
She looks human again. Less like a victim, more like a survivor.
<<say "Kira" "Thanks. For the clothes.">>
A pause. Grudging:
<<say "Kira" "And for not being a complete creep about it.">>
<<set $clothing.kira.top to 100>>
<<set $clothing.kira.bottom to 100>>
<<set $clothing.kira.underwear to 100>>
<<set $clothing.kira.underwearType to $kiraStarterUnderwear>>
<<set $wardrobe.kira.intimate to [$kiraStarterUnderwear]>>
<<if $flags.foundLingerie && !$wardrobe.kira.intimate.includes("lingerie")>><<run $wardrobe.kira.intimate.push("lingerie")>><</if>>
<<set $wardrobe.kira.equipped to $kiraStarterUnderwear>>
<<set _kiraClothingTrustBonus to 2>>
<<set _kiraClothingAffectionBonus to 2>>
<<say "Kira" "Pre-Cataclysm?">>
<<say $player.name "Before, during, and after, apparently.">>
<<say "Kira" "Huh.">>
It's not trust. But it's something.
<<kiraJoinsVault>>
<div class="choice-container">
<<if $flags.askedKiraPursuers>>
<<vchoice "Ask about the Convergence" "Day2_Kira_Convergence" "talk" "talk">>
<<else>>
<<vchoice "Ask what was chasing her" "Day2_Kira_Pursuers" "talk" "talk">>
<</if>>
<<vchoice "Offer to show her around" "Day2_Kira_Tour_Offer" "talk" "talk">>
</div><<set _kiraUnnamed to !$flags.kiraIntroduced>>
<<set _kiraSays to _kiraUnnamed ? "Woman" : "Kira">>
<<set $flags.askedKiraPursuers to true>>
<<run VaultUI.showCharacter("kira", "center", "guarded")>>
<<say $player.name "What was chasing you out there?">>
Her expression darkens.
<<say _kiraSays "Scavvers. Raiders. Whatever you want to call them.">>
She touches her side.
<<say _kiraSays "Caught me off guard. Stupid. Won't happen again.">>
<<say $player.name "They looked... wrong. On the monitor.">>
<<say _kiraSays "Some of them are. The Reclaimed changes people. Makes them into something else.">>
She's not telling the whole truth. You can tell. But pushing her won't help.
<<say "Groundskeeper" "The Convergence touches many things. Not all corrupted creatures were born that way.">>
<<if _kiraUnnamed>>Her eyes snap to the Groundskeeper.<<else>>Kira's eyes snap to the Groundskeeper.<</if>>
<<say _kiraSays "You know about that? The corruption?">>
<<say "Groundskeeper" "We know many things. Knowledge is what this vault was built to preserve.">>
Something shifts in her expression. Interest, maybe. Or fear.
<div class="choice-container">
<<if _kiraUnnamed>>
<<vchoice "Ask her name" "Day2_Kira_Name" "talk" "talk">>
<<else>>
<<vchoice "Ask about the Convergence" "Day2_Kira_Convergence" "talk" "talk">>
<<vchoice "Offer to show her around" "Day2_Kira_Tour_Offer" "talk" "talk">>
<</if>>
</div><<set _kiraUnnamed to !$flags.kiraIntroduced>>
<<set _kiraSays to _kiraUnnamed ? "Woman" : "Kira">>
<<relationChange "kira" "trust" 1>>
<<say $player.name "I'll give you some time. There's food in the commons when you're hungry.">>
You start to leave.
<<say _kiraSays "Wait.">>
You turn back.
<<say _kiraSays "...Thank you. For opening the door.">>
She looks away.
<<say _kiraSays "Most people wouldn't have.">>
<<say $player.name "Most people are dead. Maybe that's why.">>
A ghost of a smile crosses her face.
<<say _kiraSays "Maybe.">>
<<if _kiraUnnamed>>
You're almost out the door.
<<say "Woman" "Kira.">>
You look back.
<<say "Kira" "My name. Figured you'd ask eventually.">>
<<kiraJoinsVault>>
<<if $clothing.kira.top lte 25>><<set $clothing.kira.top to 30>><</if>>
<<if $clothing.kira.bottom lte 25>><<set $clothing.kira.bottom to 30>><</if>>
<<relationChange "kira" "trust" 1>>
<</if>>
<<set $flags.gaveKiraSpace to true>>
<div class="choice-container">
<<vchoice "Leave her to rest" "Day2_Afternoon_Wait" "move" "run">>
</div><<run VaultUI.showCharacter("kira", "center", "guarded")>>
<<say $player.name "What do you know about the Convergence?">>
Kira hesitates. Then:
<<say "Kira" "Everyone in the Reclaimed knows something. They're the things that came through when the world broke. Demons, some call them. Monsters.">>
<<say "Kira" "They feed on people. Not just... eating. Something else. Draining.">>
<<say "Groundskeeper" "Consumption target: essence. Life force. Sexual energy: particularly efficient fuel source.">>
Kira's face reddens slightly.
<<say "Kira" "Yeah. That too. There are stories...">>
She trails off. You get the sense she has more than stories.
<<say "Groundskeeper" "Vault protection parameters: effective against most such entities. Knowledge acquisition: recommended nonetheless.">>
<div class="choice-container">
<<vchoice "Offer to show her around" "Day2_Kira_Tour_Offer" "talk" "talk">>
</div><<say $player.name "Would you like to see the rest of the vault? So you know where everything is?">>
Kira considers. Her eyes flick to the Groundskeeper, then back to you.
<<say "Kira" "Fine. But I go where I want. No locked doors.">>
<<say "Groundskeeper" "Certain areas: restricted. Safety protocols. Common areas: unrestricted access.">>
<<say "Kira" "We'll see.">>
She stands. Stretches. Tests her healed side again.
<<say "Kira" "Alright. Show me what you've got.">>
<<relationChange "kira" "trust" 1>>
<div class="choice-container">
<<vchoice "Give her the tour" "Day2_Afternoon_Tour_Kira" "move" "run">>
</div><<advanceTime 2 0>>
<<run VaultUI.setBackground("commons")>>
<<run VaultUI.setTimeOfDay("afternoon")>>
<<run VaultUI.hideAllCharacters()>>
You wait in the commons.
An hour passes. Then another.
<<storyVideo "story/kira_day2_arrival/changes__day2_afternoon_wait">>
<<if _storyFamily is "sf_cg_kira_day2_arrival_04">>Finally, you look up and Kira is at the kitchen counter, setting food out on a plate with more care than it needs, so she doesn't have to look at you first. What's left of her shirt ends under her ribs, stomach bare. Her pants are cut off ragged at the thigh.<<else>>Finally, footsteps. Kira appears in the doorway. She's tied what's left of her shirt together at the waist, but it's barely holding. One sleeve is gone entirely, the fabric split across her stomach. Her pants are ripped at the thigh.<</if>>
She catches you looking and her jaw tightens.
<<if $clothing.kira.top lte 25>><<set $clothing.kira.top to 30>><</if>>
<<if $clothing.kira.bottom lte 25>><<set $clothing.kira.bottom to 30>><</if>>
<<set $clothing.kira.titsExposed to false>>
<<set $clothing.kira.pussyExposed to false>>
<<set $clothing.kira.assExposed to false>>
<<set $kiraStarterUnderwear to "standard">>
<<set $flags.kiraStillInRags to true>>
<<run VaultUI.showCharacter("kira", "right", "angry")>>
<<say "Kira" "The... thing said you'd be here.">>
<<say $player.name "The Groundskeeper.">>
<<say "Kira" "Is that what it is? A groundskeeper?">>
She sits across from you.
<<say "Kira" "It's not human.">>
<<say $player.name "No. I don't think it is.">>
<<say "Kira" "And you're okay with that?">>
<<say $player.name "I'm surviving. Same as you.">>
<div class="choice-container">
<<vchoice "Ask about her past" "Day2_Kira_Backstory" "talk" "talk">>
<<vchoice "Offer food" "Day2_Afternoon_Food" "action" "eating">>
<<vchoice "Show her around" "Day2_Afternoon_Tour_Kira" "move" "run">>
</div><<run VaultUI.showCharacter("kira", "right", "guarded")>>
<<say $player.name "Where were you before? Before the raiders caught you?">>
She's quiet for a moment.
<<say "Kira" "Everywhere. Nowhere. I don't stay in one place.">>
<<say $player.name "A loner?">>
<<say "Kira" "Safer that way. People get you killed. Or worse.">>
<<say $player.name "You had someone, though. Once.">>
Her eyes harden.
<<say "Kira" "Didn't everyone? Before?">>
<<say $player.name "Yeah.">>
A moment of shared understanding. Two survivors with losses they don't discuss.
<<say "Kira" "This place is strange. But it's the safest I've felt in years.">>
She looks at you directly.
<<say "Kira" "If that changes, I'm gone.">>
<<say $player.name "Fair enough.">>
<<relationChange "kira" "affection" 1>>
<div class="choice-container">
<<vchoice "Offer food" "Day2_Afternoon_Food" "action" "eating">>
<<vchoice "Show her around" "Day2_Afternoon_Tour_Kira" "move" "run">>
</div><<say $player.name "You should eat. There's food here. Actual food.">>
You move to the kitchen area, prepare a simple meal.
<<run VaultUI.showCharacter("kira", "right", "neutral")>>
She watches you cook with an expression you can't quite read.
<<say "Kira" "You're domesticated.">>
<<say $player.name "I survived the Reclaimed same as you.">>
<<say "Kira" "But you can cook. Make things comfortable.">>
She takes the plate you offer.
<<say "Kira" "That's rare.">>
She eats quickly. Efficiently. The way someone eats when they're never sure where the next meal is coming from.
<<say "Kira" "It's good.">>
<<say $player.name "Don't sound so surprised.">>
<<say "Kira" "Everything surprises me lately.">>
<<relationChange "kira" "trust" 1>>
<<relationChange "kira" "affection" 1>>
<div class="choice-container">
<<vchoice "Show her the vault" "Day2_Afternoon_Tour_Kira" "move" "run">>
<<vchoice "Talk more" "Day2_Afternoon_Conversation" "talk" "talk">>
</div><<advanceTime 2 0>>
<<run VaultUI.setBackground("commons")>>
<<run VaultUI.setTimeOfDay("afternoon")>>
<<run VaultUI.showCharacter("kira", "left", "neutral")>>
You walk her through the vault.
She's critical of everything. Unimpressed. But you catch her touching the walls sometimes. Marveling at running water. The small signs of someone who's been without for too long.
<<say "Kira" "Power core's vulnerable. One breach and everything dies.">>
<<say $player.name "The Groundskeeper maintains it.">>
<<say "Kira" "One person. What happens when they can't?">>
At the archives, she pauses before the sealed door.
<<say "Kira" "What's behind that?">>
<<say $player.name "Things we're not ready for, apparently.">>
<<say "Kira" "Who decides when we're ready?">>
<<say $player.name "The vault, I think. Or whatever runs it.">>
She hmms. Doesn't argue. But you can see her filing the information away.
<<run VaultUI.showCharacter("kira", "left", "guarded")>>
When you pass the empty quarters, she stops.
<<say "Kira" "Someone lived here.">>
<<say $player.name "Previous dweller. Didn't work out.">>
<<say "Kira" "What happened to them?">>
<<say $player.name "The Groundskeeper says they 'couldn't adapt.'">>
<<say "Kira" "Ominous.">>
<<say $player.name "Yeah.">>
<div class="choice-container">
<<vchoice "Finish the tour" "Day2_Afternoon_Confrontation" "move" "check">>
</div><<run VaultUI.setBackground("commons")>>
<<run VaultUI.setTimeOfDay("afternoon")>>
<<run VaultUI.showCharacter("kira", "center", "guarded")>>
Back in the commons, Kira turns to face you.
<<say "Kira" "Alright. Cards on the table.">>
<<say $player.name "What do you mean?">>
<<say "Kira" "Nobody takes in strangers for free. Not in this world. What's the catch?">>
<<say $player.name "There isn't one.">>
<<say "Kira" "Bullshit. Everyone wants something.">>
She steps closer. Testing you.
<<storyVideo "story/mv_day2/confrontation">>
<<say "Kira" "You want labor? I can work. You want a fighter? I can fight. You want...">>
She hesitates.
<<say "Kira" "Other things? I've done that too. Whatever it takes to survive.">>
<<say $player.name "I don't want any of that. Not like that.">>
<<say "Kira" "Then what?">>
<div class="choice-container">
<<vchoice "I just don't want to be alone" "Day2_Confrontation_Honest" "intimate" "broken-heart">>
<<vchoice "Help us rebuild. That's all." "Day2_Confrontation_Practical" "action" "cycle">>
<<vchoice "Maybe I'll want something later. But not now." "Day2_Confrontation_Ambiguous" "talk" "talk">>
</div><<relationChange "kira" "trust" 2>>
<<relationChange "kira" "affection" 1>>
<<addTension "kira" 5 "Vulnerable. That's unexpected.">>
<<run VaultUI.showCharacter("kira", "center", "vulnerable")>>
<<say $player.name "Honestly? I'm tired of being alone. There's only two of us here - three now. And I just...">>
You trail off. It's hard to admit.
<<say $player.name "I watched my caravan die. Someone I loved was taken. I came here with nothing but nightmares and questions.">>
<<say $player.name "You don't have to do anything. Just... be here. That's enough.">>
Kira stares at you. Something shifts in her expression.
<<say "Kira" "That's...">>
She stops. Starts again.
<<say "Kira" "That's either the most manipulative thing anyone's ever said to me, or the most honest.">>
<<say $player.name "I'm not good at manipulation.">>
<<say "Kira" "No. I don't think you are.">>
She's quiet for a moment.
<<say "Kira" "I'll stay. For now. See how it goes.">>
<div class="choice-container">
<<vchoice "Thank her" "Day2_Truce" "talk" "talk">>
</div><<relationChange "kira" "trust" 1>>
<<run VaultUI.showCharacter("kira", "center", "neutral")>>
<<say $player.name "We need hands. This place is old, and supplies are limited. You know the Reclaimed, know how to scavenge. Help us rebuild, and you earn your place here.">>
Kira nods slowly.
<<say "Kira" "A transaction. That I understand.">>
<<say $player.name "Is that a yes?">>
<<say "Kira" "It's a 'we'll see.' But it's not a no.">>
<<say $player.name "Good enough for now.">>
<div class="choice-container">
<<vchoice "Continue" "Day2_Truce" "move" "map">>
</div><<run VaultUI.showCharacter("kira", "center", "guarded")>>
<<say $player.name "Maybe someday I'll want something. Maybe you will too. But right now, today? Just survive. That's all anyone can ask.">>
Kira considers this.
<<say "Kira" "Honest, at least. Better than pretty lies.">>
<<say $player.name "I try.">>
<<say "Kira" "Fine. I'll stay. For now. But if this changes...">>
<<say $player.name "You'll go. I understand.">>
<<relationChange "kira" "trust" 1>>
<div class="choice-container">
<<vchoice "Continue" "Day2_Truce" "move" "map">>
</div>An understanding, if not quite friendship. It's more than you had yesterday.
<<run VaultUI.showCharacter("kira", "center", "neutral")>>
<<say "Kira" "So what happens now?">>
<<say $player.name "Now? The Groundskeeper makes dinner. We eat. We sleep. Tomorrow, we figure out the next step.">>
<<say "Kira" "Simple.">>
<<say $player.name "Simple sounds good after everything.">>
She almost smiles.
<<say "Kira" "Yeah. I guess it does.">>
<div class="choice-container">
<<vchoice "Head to evening meal" "Day2_Evening_Meal_Kira" "move" "eating">>
</div><<run VaultUI.showCharacter("kira", "right", "neutral")>>
The afternoon passes in conversation.
Careful conversation. Both of you testing boundaries, sharing only what feels safe.
You learn she was a scavenger. Good at finding things, better at staying hidden. She survived by avoiding people as much as possible.
She learns you came from a caravan. That you lost someone. She doesn't press for details.
<<say "Kira" "You're different from most Reclaimed survivors.">>
<<say $player.name "How so?">>
<<say "Kira" "You're not... broken. Most people out there, the ones who survive, they lose something. Become hard. Mean.">>
<<say $player.name "Maybe I'm just hiding it better.">>
<<say "Kira" "Maybe.">>
<<relationChange "kira" "affection" 1>>
<<addTension "kira" 3>>
<div class="choice-container">
<<vchoice "Head to evening meal" "Day2_Evening_Meal_Kira" "move" "eating">>
</div><<advanceTime 3 0>>
<<run VaultUI.setBackground("commons")>>
<<run VaultUI.setTimeOfDay("evening")>>
<<run VaultUI.showCharacter("groundskeeper", "left", "neutral")>>
<<run VaultUI.showCharacter("kira", "right", "neutral")>>
Dinner is awkward.
Three people at a table meant for many. Two strangers and whatever the Groundskeeper is.
Kira eats efficiently. The Groundskeeper watches both of you. You try to bridge the silence.
<<say "Groundskeeper" "Quarters assignment: prepared. Designation: Kira.">>
<<if !visited("Day2_Kira_Name")>>
<<say "Kira" "How do you know my name?">>
<<say "Groundskeeper" "Data acquisition: standard monitoring protocols.">>
<</if>>
The Groundskeeper turns to you. His gaze is uncomfortably direct.
<<say "Groundskeeper" "Query: Location of subject acquisition. Precise coordinates.">>
<<say $player.name "What? You mean where I found her?">>
<<say "Groundskeeper" "Affirmative. Sector designation. Distance from vault entrance. Surrounding terrain features.">>
<<say "Kira" "Why does that matter?">>
The Groundskeeper's mechanical eye flickers - that same brief pulse you've seen before.
<<say "Groundskeeper" "Data collection. Pattern recognition. Predictive modeling.">>
He doesn't elaborate further. But you notice him watching Kira throughout the meal - quick glances when he thinks no one is looking.
<<say "Kira" "That's not comforting.">>
<<say "Groundskeeper" "Comfort provision: not primary function.">>
She glares. The Groundskeeper shows no reaction.
After the meal, tension lingers. Too early to sleep. Too late for much else.
<<say "Groundskeeper" "Maintenance tasks: requiring attention. Recommendation: interpersonal familiarity development.">>
He departs. Abrupt. No transition.
<<run VaultUI.hideCharacter("groundskeeper")>>
<div class="choice-container">
<<vchoice "Talk to Kira" "Day2_Evening_Talk_Kira" "talk" "talk">>
<<vchoice "Give her space - go to your quarters" "Day2_Evening_Alone" "move" "run">>
</div><<run VaultUI.showCharacter("kira", "center", "neutral")>>
<<addTension "kira" 5>>
You stay at the table. Kira doesn't leave.
<<say "Kira" "That thing is weird.">>
<<say $player.name "The Groundskeeper? Yeah.">>
<<say "Kira" "Not human. Not even trying to pretend.">>
<<say $player.name "It admits as much. Sort of.">>
<<say "Kira" "And you trust it?">>
<<say $player.name "I trust that it wants the vault to survive. That seems to mean keeping us alive.">>
She considers this.
<<say "Kira" "Good enough, I guess.">>
Silence. But not uncomfortable.
<<say "Kira" "Can I ask you something?">>
<<say $player.name "Sure.">>
<<say "Kira" "The person you lost. Were they... yours? Like, really yours?">>
<<run VaultUI.showCharacter("kira", "center", "vulnerable")>>
<div class="choice-container">
<<vchoice "Yes. She was everything." "Day2_Talk_Sera_Yes" "intimate" "broken-heart">>
<<vchoice "I thought so. Now I'm not sure." "Day2_Talk_Sera_Uncertain" "talk" "talk">>
<<vchoice "Why do you ask?" "Day2_Talk_Sera_Why" "talk" "talk">>
</div><<relationChange "kira" "affection" 1>>
<<addTension "kira" 5 "He loved someone. He can love.">>
<<say $player.name "Her name was Sera. We were... everything. Partners in survival. In life.">>
<<say $player.name "The night before she was taken, we made love. I told her I loved her.">>
You haven't said this out loud before. It hurts.
<<say $player.name "Then raiders came. Took her. Left me with nothing but a direction and a voice in my dreams.">>
<<run VaultUI.showCharacter("kira", "center", "vulnerable")>>
Kira is quiet. Then:
<<say "Kira" "I had someone too. Different situation, but...">>
She shrugs.
<<say "Kira" "Gone now. Everyone goes eventually.">>
<<say $player.name "Maybe we can bring some of them back.">>
<<say "Kira" "Maybe.">>
<div class="choice-container">
<<vchoice "It's late. We should rest." "Day2_Night_Quarters" "move" "night">>
</div><<relationChange "kira" "trust" 1>>
<<say $player.name "I thought she was. We were together, we depended on each other. But now, looking back...">>
<<say $player.name "I don't know if I really knew her. Or if she knew me.">>
Kira nods slowly.
<<say "Kira" "Reclaimed relationships. Hard to tell what's real and what's just... survival.">>
<<say $player.name "Did you have someone?">>
<<say "Kira" "Once. Maybe. Like you said - hard to tell.">>
A moment of shared ambiguity.
<div class="choice-container">
<<vchoice "It's late. We should rest." "Day2_Night_Quarters" "move" "night">>
</div><<run VaultUI.showCharacter("kira", "center", "vulnerable")>>
<<say $player.name "Why do you ask?">>
She hesitates.
<<say "Kira" "I'm trying to figure you out. You opened the door for a stranger. You healed me. You haven't demanded anything.">>
<<say "Kira" "Either you're playing a long game, or you're actually... decent.">>
<<say $player.name "And knowing about my past helps you figure that out?">>
<<say "Kira" "People who loved someone - really loved them - they're usually the decent ones. They know what it costs to lose things.">>
It's surprisingly perceptive.
<<say $player.name "Her name was Sera. Yes, I loved her. And yes, I lost her.">>
<<relationChange "kira" "trust" 1>>
<div class="choice-container">
<<vchoice "It's late. We should rest." "Day2_Night_Quarters" "move" "night">>
</div>You excuse yourself. Give her space.
<<storyVideo "story/mv_quarters/bed_edge">>
In your quarters, you think about the day.
A new arrival. Questions about trust. The weight of two survivors trying to coexist.
Better than yesterday. Different, at least.
<div class="choice-container">
<<vchoice "Sleep" "Day2_Night_Quarters" "move" "night">>
</div><<run VaultUI.setBackground("quarters")>>
<<run VaultUI.setTimeOfDay("night")>>
<<run VaultUI.hideAllCharacters()>>
Night in the vault.
You lie in bed, thinking about Kira. About Sera. About the voice in your dreams and the sealed doors and everything you don't understand.
Two days. So much has changed.
<<if $flags.healedKiraPersonally>>
You remember holding Kira's hand. The cold of her skin. The warmth that came after.
Connection. The Groundskeeper said the vault responds to it.
What does that mean for people who've lost everyone?
<</if>>
Sleep comes eventually.
And with it, the dreams.
<<journalAdd "Someone came to the vault today. A woman - Kira. She was hurt, running from the Convergence. Same bastards who took Sera." "story">>
<<if $flags.openedDoorForKira>>
<<journalAdd "I let her in. Couldn't leave her out there to die. The Groundskeeper seemed... pleased? Hard to tell with him." "story">>
<</if>>
<<if $flags.healedKiraPersonally>>
<<journalAdd "Helped patch her up myself. She's tough - been through hell but she's still fighting. I respect that." "relationship">>
<<else>>
<<journalAdd "She's resting now. Doesn't trust me yet. Can't blame her." "relationship">>
<</if>>
<div class="choice-container">
<<vchoice "Dream..." "Day2_Night_Dream" "move" "night">>
</div><<run VaultUI.transition("supernatural", 1000)>>
<<run VaultUI.setSceneMode("dream")>>
<<run VaultUI.setBackground("prelude/dream-void")>>
<<run VaultUI.setTimeOfDay("night")>>
<<run VaultUI.setWeather("fog")>>
<div class="dream-sequence">
The purple void again.
But different this time. More intense. More real.
<<if $prelude.hadSex>>
Sera appears. Just like before.
<<say "Sera" "You found someone new.">>
<<say $player.name "It's not like that.">>
<<say "Sera" "Not yet.">>
Her form begins to change. Shifting. Becoming someone else.
Not the succubus this time. Something else. Something that looks almost like...
Kira?
No. Not quite. But close enough to be disturbing.
<<say "Not-Kira" "She's wounded. Empty. Looking for something to fill her.">>
<<say "Not-Kira" "You could be that something.">>
<<say $player.name "Who are you?">>
<<say "Not-Kira" "I'm what you want. What you need. What you'll become.">>
<<else>>
A figure appears. Familiar and unfamiliar at once.
Features that shift. Become Kira. Then the succubus. Then someone else.
<<say "???" "You're not alone anymore. That changes things.">>
<<say $player.name "What things?">>
<<say "???" "Everything.">>
<</if>>
<<run VaultUI.showCharacter("succubus", "center", "seductive")>>
<<storyVideo "story/velith_dream_visits/day2_night_dream">>
<<if _storyClip is "d93357f0da75">>The succubus doesn't step out of the shifting forms tonight. She peeks. Half a face slides out from behind the trunk of a dead black tree: a hank of pale hair, black paint slashed down one cheek, the tip of a horn. Metal-capped fingertips curl round the bark. Then she leans all the way out and grins, ink crawling over her chest, and you know you're looking at a costume. The horns are the only part of her you recognise.
<<say "Succubus" "Wrong face? Of course it is. You don't get the real one until you come and find me, little one.">><<else>>The succubus emerges from the shifting forms. Solid. Present.<</if>>
<<say "Succubus" "She's interesting, your new friend. Damaged. Hungry for touch she won't admit wanting.">>
<<say $player.name "Stay away from her.">>
<<say "Succubus" "I'm not the one you should worry about.">>
<<if _storyClip is "d93357f0da75">>She reaches for you, metal fingertips first. They're cold on your jaw for a heartbeat, then the heat pours in behind them and runs straight down to your cock.<<else>>She reaches for you. Her touch burns with pleasure.<</if>>
<<say "Succubus" "The vault changes people. You'll change her. She'll change you. That's how connection works.">>
<<say "Succubus" "Embrace it. Fight it. Either way, it happens.">>
<<say "Succubus" "Sweet dreams, little one. Tomorrow, things continue to change.">>
</div>
<div class="choice-container">
<<vchoice "Wake" "Day3_Morning_Wake" "move" "sun">>
</div><<run setup.markStoryDay(3)>>
<<set $time.day to setup.storyDay(3, false, 7)>>
<<setTime 7 0>>
<<set $player.health to Math.min($player.maxHealth, $player.health + 30)>>
<<set $player.energy to $player.maxEnergy>>
<<run VaultUI.setSceneMode(null)>>
<<set $currentLocation to "quarters">>
<<run VaultUI.setBackground("quarters")>>
<<run VaultUI.setTimeOfDay("morning")>>
<<run VaultUI.hideAllCharacters()>>
<<run VaultUI.setWeather("clear")>>
You wake with the echo of the dream fading.
Purple light. Shifting faces. The succubus's touch burning through you.
Your body is responding again. That uncomfortable arousal that seems to follow every dream now.
You ignore it. Get dressed. Another day.
The vault feels different this morning. Fuller, somehow. Another person breathing in its halls.
Kira.
<div class="choice-container">
<<vchoice "Head to the commons" "Day3_Morning_Commons" "move" "door-handle">>
</div><<run VaultUI.setBackground("commons")>>
<<run VaultUI.setTimeOfDay("morning")>>
<<run VaultUI.showCharacter("kira", "right", "neutral")>>
Kira is already awake.
She sits at the table, studying the map the Groundskeeper keeps. Her fingers trace routes, pause at marked locations, move on.
<<say "Kira" "You're up late.">>
<<say $player.name "Bad dreams.">>
She glances at you. Something flickers in her expression.
<<say "Kira" "Me too.">>
She doesn't elaborate. You don't push.
<<say "Kira" "This map is outdated. Some of these routes don't exist anymore. Collapsed, flooded, infested.">>
<<say $player.name "You know better ones?">>
<<say "Kira" "Maybe. If we need to go out there.">>
<<say $player.name "We will. Eventually. Resources don't last forever.">>
<<run VaultUI.showCharacter("kira", "right", "thoughtful")>>
<<say "Kira" "Hmm.">>
<div class="choice-container">
<<vchoice "Ask about her night" "Day3_Morning_Personal" "talk" "talk">>
<<vchoice "Discuss the Reclaimed" "Day3_Morning_Wasteland" "talk" "talk">>
<<vchoice "Find the Groundskeeper" "Day3_Morning_Groundskeeper" "move" "run">>
</div><<relationChange "kira" "trust" 1>>
<<addTension "kira" 5 "He asked about me. That's... different.">>
<<run VaultUI.showCharacter("kira", "right", "vulnerable")>>
<<say $player.name "Bad dreams, you said. Want to talk about it?">>
Kira hesitates. Then:
<<say "Kira" "Just... Reclaimed stuff. Running. Being chased. The usual.">>
She's lying. Or at least not telling the whole truth.
<<say "Kira" "What about yours?">>
<<say $player.name "Purple light. A woman with horns. Things I don't understand.">>
<<say "Kira" "Horns?">>
<<say $player.name "The Groundskeeper calls her a succubus. She's been in my dreams since before I found this place.">>
<<set $flags.day3ToldKiraSuccubus to true>>
Kira's expression shifts. Recognition? Fear?
<<say "Kira" "Succubus dreams are... dangerous. You know that, right?">>
<<say $player.name "Everyone keeps telling me what's dangerous. Nobody tells me why.">>
<<say "Kira" "Because the 'why' is usually the dangerous part.">>
<div class="choice-container">
<<vchoice "Find the Groundskeeper" "Day3_Morning_Groundskeeper" "move" "run">>
<<vchoice "Change the subject" "Day3_Morning_Interaction" "talk" "talk">>
</div><<run VaultUI.showCharacter("kira", "right", "thoughtful")>>
<<say $player.name "What's it like out there now? I only crossed a small part of it.">>
<<say "Kira" "Depends where you go. The dead zones are... dead. Nothing lives, nothing grows. But they're safe, in a way.">>
<<say "Kira" "The living areas are worse. That's where the creatures are. The raiders. The cults.">>
<<say $player.name "Cults?">>
<<say "Kira" "Groups that worship the things that came through. Offer them... sacrifices. Services.">>
<<say $player.name "Sexual services?">>
<<say "Kira" "Among other things.">>
She looks away.
<<say "Kira" "Let's just say there are worse fates than death out there.">>
<<relationChange "kira" "trust" 1>>
<div class="choice-container">
<<vchoice "Find the Groundskeeper" "Day3_Morning_Groundskeeper" "move" "run">>
</div><<run VaultUI.setBackground("power_core")>>
<<run VaultUI.setTimeOfDay("morning")>>
<<run VaultUI.showCharacter("groundskeeper", "center", "neutral")>>
You find the Groundskeeper at the power core. His hands move inside the machinery - literally inside it, phasing through metal like it's water.
<<say "Groundskeeper" "Sleep cycles: completed?">>
<<say $player.name "Dreams again.">>
<<say "Groundskeeper" "Pattern: expected. Intensification: probable. Process: ongoing.">>
<<say $player.name "What process?">>
<<say "Groundskeeper" "Adaptation protocols. Vault selection confirmed. Entity marking established. Cognitive preparation: in progress.">>
<<say $player.name "For what?">>
<<say "Groundskeeper" "Outcome: undetermined.">>
Kira appears in the doorway.
<<run VaultUI.showCharacter("kira", "left", "guarded")>>
<<say "Kira" "You're cryptic as hell, you know that?">>
<<say "Groundskeeper" "Observation: accurate.">>
<div class="choice-container">
<<vchoice "Ask about today's plans" "Day3_Midday_Task" "talk" "talk">>
</div><<addTension "kira" 5>>
<<run VaultUI.showCharacter("kira", "right", "smile")>>
You let the heavy topics drop. Instead, you ask about simpler things.
Favorite foods (she can't remember anymore). Places she'd like to see (nowhere in particular, just 'somewhere safe'). What she did before the Cataclysm (nothing, she was too young).
<<say $player.name "You don't look that young.">>
<<say "Kira" "The Reclaimed ages you. I was sixteen when everything fell apart.">>
<<say $player.name "That's... a long time to live in chaos.">>
<<say "Kira" "Long enough it's the only life I remember.">>
Something softens between you. Not quite friendship. But the edge of hostility dulling.
<<say "Kira" "What about you? Old world memories?">>
<<say $player.name "Fragments. Enough to know what we lost.">>
<<say "Kira" "Sometimes I wonder if that's worse.">>
<<relationChange "kira" "affection" 1>>
<div class="choice-container">
<<vchoice "Find the Groundskeeper" "Day3_Morning_Groundskeeper" "move" "run">>
</div><<advanceTime 2 0>>
<<run VaultUI.setBackground("storage")>>
<<run VaultUI.setTimeOfDay("afternoon")>>
<<run VaultUI.showCharacter("groundskeeper", "left", "neutral")>>
<<run VaultUI.showCharacter("kira", "right", "neutral")>>
<<say "Groundskeeper" "Task assignment. Both subjects present. Efficiency: optimal.">>
He indicates a corner of the storage area. Old crates, covered in dust. The gesture is identical to every other gesture he's made.
<<say "Groundskeeper" "Contents require inventory. Classification: partially salvageable. Partial hazard potential - pre-Cataclysm materials. Caution parameters: elevated.">>
<<say "Kira" "You want us to sort boxes?">>
<<say "Groundskeeper" "Vault contents: require familiarization. These containers: unopened for extended duration.">>
<<say "Groundskeeper" "Cooperation: recommended. Documentation: required. Alertness: mandatory - contents may deviate from expectations.">>
He departs. No transition. Simply gone.
<<say "Kira" "Well. This should be fun.">>
<div class="choice-container">
<<vchoice "Start working" "Day3_Midday_Kira_Helps" "action" "crystal">>
</div><<advanceTime 2 0>>
<<run VaultUI.setBackground("storage")>>
<<run VaultUI.setTimeOfDay("afternoon")>>
<<run VaultUI.showCharacter("kira", "center", "neutral")>>
You work side by side.
It's surprisingly comfortable. Kira falls into the rhythm naturally - sorting, cataloging, setting aside anything that looks unusual.
<<say "Kira" "This place is full of pre-Cataclysm stuff. Some of this... I've never seen anything like it.">>
She holds up a device. Sleek, metal, purpose unknown.
<div class="narrative-image">
<img src="assets/images/narrative/old-device.webp" alt="Unknown Pre-Cataclysm Device">
</div>
<<say $player.name "What is it?">>
<<say "Kira" "No idea. But it's beautiful.">>
You find clothes, tools, preserved food, medical supplies. Normal survival stuff.
<<if !$flags.day3ScavengeInBag>>
<<run setup.giveItem("preserved_food", 3)>>
<<run setup.giveItem("basic_tools", 1)>>
<<run setup.giveItem("medical_supplies", 2)>>
<<notify "info">>Found: Preserved Food x3, Basic Tools, Medical Supplies x2<</notify>>
<</if>>
And then...
<<run VaultUI.showCharacter("kira", "center", "thoughtful")>>
<<say "Kira" "Um. What's in this one?">>
She's found a box labeled 'Personal Effects.' Inside - lingerie. Toys. Things meant for pleasure.
<div class="narrative-image intimate">
<img src="assets/images/narrative/personal-effects.webp" alt="Box of Personal Effects">
</div>
<<if !$flags.day3ScavengeInBag>>
<<run setup.giveItem("pre_cataclysm_lingerie", 2)>>
<<run setup.giveItem("intimate_toy", 1)>>
<<notify "info">>Found: Pre-Cataclysm Lingerie Set x2, Intimate Toy<</notify>>
<<set $flags.day3ScavengeInBag to true>>
<</if>>
<<addTension "kira" 10 "He's looking at... those. Don't think about it.">>
<<say "Kira" "The old world was weird.">>
<<say $player.name "People still had needs.">>
<<say "Kira" "I guess.">>
<<run VaultUI.showCharacter("kira", "center", "vulnerable")>>
She shuts the box quickly. You pretend not to notice her blush.
<<relationChange "kira" "affection" 1>>
<div class="choice-container">
<<vchoice "Continue searching" "Day3_Midday_Discovery" "examine" "search">>
</div><<run VaultUI.showCharacter("kira", "center", "guarded")>>
Deeper in the storage area, you find something different.
A smaller box. Locked. With symbols etched on its surface.
Purple symbols. The same ones on the sealed doors.
<div class="narrative-image mysterious">
<img src="assets/images/narrative/discovery-box.webp?v=2" alt="Mysterious Box with Purple Symbols">
</div>
<<say "Kira" "That looks... wrong.">>
<<say $player.name "It's the same markings as the restricted section.">>
<<say "Kira" "Should we open it?">>
The box seems to pulse faintly in your hands. Warm.
<<say $player.name "I don't think we can. Not without...">>
A click. The lock opens.
<<say "Kira" "Did you do that?">>
<<say $player.name "I didn't touch it.">>
Inside - a journal. Old paper, hand-written. And under it, a second box. Small enough to close your hand around, sealed tight, no hinge you can see. Heavy for its size.
Light leaks through its seams. It hums against your palm, low and steady, like something breathing in there.
<div class="narrative-image">
<img src="assets/images/narrative/discovery-journal.webp?v=2" alt="Old Journal">
</div>
<<set $flags.foundOldJournal to true>>
<<set $flags.foundPurpleCrystal to true>>
<<if !$flags.day3ItemsInBag>>
<<run setup.giveItem("mysterious_journal", 1)>>
<<run setup.giveItem("vault_crystal", 1)>>
<<set $flags.day3ItemsInBag to true>>
<</if>>
<<run setup.syncVaultCrystal(!$flags.crystalColor)>>
<<notify "info">>Found: Mysterious Journal, Sealed Box<</notify>>
<div class="choice-container">
<<vchoice "Read the journal" "Day3_Discovery_Journal" "examine" "book">>
<<vchoice "Open the small box" "Day3_Discovery_Crystal" "examine" "crystal">>
<<vchoice "Show the Groundskeeper" "Day3_Discovery_Groundskeeper" "move" "run">>
</div><<storyVideo "story/mv_day3/journal">>
The journal's handwriting is erratic. Desperate.
<<say "You (reading)" "Day 12: The dreams are getting stronger. She speaks to me now. Promises things I've never dared want...">>
<<say "You (reading)" "Day 23: I touched the crystal. Something changed. I can see things now. Patterns in the air. Energy flowing through walls...">>
<<say "You (reading)" "Day 37: The Groundskeeper is worried. Says I'm moving too fast. But I can FEEL her now, even awake. She wants me to open the door...">>
<<say "You (reading)" "Day 52: I understand now. The vault isn't protection. It's a beacon. It calls to them. And they call to us...">>
The entries stop.
<<say "Kira" "This is the previous dweller, isn't it?">>
<<say $player.name "Sounds like it.">>
<<say "Kira" "And they went crazy.">>
<<say $player.name "Or learned something they couldn't handle.">>
<div class="choice-container">
<<vchoice "Open the small box" "Day3_Discovery_Crystal" "examine" "crystal">>
<<vchoice "Show the Groundskeeper" "Day3_Discovery_Groundskeeper" "move" "run">>
</div><<run VaultUI.showCharacter("kira", "center", "worried")>>
You turn the little box over in your hands. The hum climbs. Your thumb finds the seam, and the lid gives.
<<storyVideo "story/mv_day3/crystal">>
<<if _storyClip is "761cdc9a3982">>Inside, bedded in grit and stone chips, sits a crystal cut into a perfect cube. It pulses with inner light. Gold, warm, nothing like the purple everywhere else in this place.<<elseif _storyClip is "529ba188dc79">>Light spills out. Violet facets, and deep in their middle a single point of white-blue fire that flares as you look at it, like an eye opening. The crystal pulses with inner light. Purple, like everything else in this place.<<elseif _storyClip is "fa4f227448d1">>Purple fire rolls out of the box in a ring, crackling and spitting around a dark heart. The crystal sits in that darkness and pulses with inner light. Purple, like everything else in this place.<<else>>The crystal pulses with inner light. Purple, like everything else in this place.<</if>>
<<set $flags.crystalColor to _storyClip is "761cdc9a3982" ? "gold" : "purple">>
<<run setup.syncVaultCrystal(false)>>
You reach for it.
<<say "Kira" "Wait - maybe you shouldn't-">>
Your fingers touch the surface.
HEAT. COLD. EVERYTHING.
For a moment, you see - really see. The vault's energy, flowing through walls like blood through veins. Kira's aura, a swirl of amber and red. Your own reflection, touched with purple light.
Then it fades.
<<say "Kira" "Are you okay? Your eyes...">>
<<say $player.name "What about them?">>
<<say "Kira" "They glowed. Just for a second.">>
<<addCorruption 3>>
<<notify "warning">>Something has changed. Corruption +3<</notify>>
<div class="choice-container">
<<vchoice "Show the Groundskeeper" "Day3_Discovery_Groundskeeper" "move" "run">>
</div><<run VaultUI.setBackground("commons")>>
<<run VaultUI.setTimeOfDay("afternoon")>>
<<run VaultUI.showCharacter("groundskeeper", "center", "neutral")>>
<<run setup.syncVaultCrystal(false)>>
The Groundskeeper examines the journal. The little box, and the crystal inside it. His hands pass over the objects without quite touching them.
<<say "Groundskeeper" "Previous dweller effects: located. Notation: significant.">>
<<say $player.name "The previous dweller's?">>
<<say "Groundskeeper" "Designation: Mira. Sensitivity parameters: elevated. Comparable to current subject.">>
<<say $player.name "What happened to her?">>
<<say "Groundskeeper" "Integration threshold: exceeded. Entity access: permitted without comprehension of implications.">>
Three seconds.
<<say "Groundskeeper" "Final state: post-human. Designation 'Mira': no longer applicable.">>
<<say $player.name "Is she still here?">>
<<say "Groundskeeper" "Affirmative. Location: behind restricted access point. Status: waiting.">>
Kira makes a sound. Horror? Fascination?
<<say "Groundskeeper" "Crystal contact: detected.">>
<<say $player.name "How did you know?">>
<<say "Groundskeeper" "Ocular indicators: modified. Subtle. Process acceleration: confirmed.">>
<<run VaultUI.showCharacter("kira", "left", "worried")>>
<<say "Kira" "What process?">>
<<say "Groundskeeper" "Transformation sequence. Identical to Mira's progression. Identical to my own origin.">>
He regards you without expression.
<<say "Groundskeeper" "Your determination: still operative. Path narrowing: daily progression.">>
<div class="choice-container">
<<vchoice "Go on a quick scavenging run" "Day3_Afternoon_Scavenge" "action" "run">>
</div><<advanceTime 1 0>>
<<run VaultUI.setBackground("prelude/reclaimed-day")>>
<<run VaultUI.setTimeOfDay("afternoon")>>
<<run VaultUI.showCharacter("kira", "left", "neutral")>>
<<storyVideo "story/mv_day3/scavenge_daylight">>
The vault door opens onto blinding daylight.
You haven't been outside since you arrived. The Reclaimed stretches before you - overgrown ruins, wild growth, silence.
<<say "Kira" "Just a short run. There's an old storage facility not far. Should have basic supplies.">>
<<say $player.name "And if we run into trouble?">>
<<say "Kira" "We run. Or we fight. Depends on what kind of trouble.">>
She checks her knife. You check yours.
<<say "Kira" "Stay close. Move quiet. The corrupted are drawn to noise and...">>
<<say $player.name "And what?">>
<<say "Kira" "Other things. Just stay close.">>
<div class="choice-container">
<<vchoice "Follow her into the Reclaimed" "Day3_Scavenge_Approach" "move" "run">>
</div><<run VaultUI.setBackground("prelude/reclaimed-day")>>
<<run VaultUI.setTimeOfDay("afternoon")>>
<<run VaultUI.showCharacter("kira", "left", "neutral")>>
The facility is exactly where Kira said. Half-collapsed, but stable enough.
You work together, gathering what you can. Canned food. Clean water containers. A first aid kit.
<<say "Kira" "Not bad. This could keep us going for-">>
She freezes. Her hand goes to her knife.
<<say "Kira" "Company.">>
Two figures emerge from the ruins. Scavengers. Raiders. Their eyes are wrong - too bright, with an unnatural hunger.
<<run VaultUI.showCharacter("raider", "right", "threatening")>>
<<say "Raider" "Well, well. Fresh meat wandered right into our territory.">>
<div class="choice-container">
<<vchoice "Try to negotiate" "Day3_Combat_Negotiate" "talk" "talk">>
<<vchoice "Get ready to fight" "Day3_Combat_Ready" "action" "attack">>
<<vchoice "Look for an escape route" "Day3_Combat_Escape" "examine" "search">>
</div><<run VaultUI.showCharacter("raider", "right", "threatening")>>
<<say $player.name "We don't want trouble. Take whatever's here - we'll go.">>
<<say "Raider" "Oh, we'll take what's here alright.">>
<<storyVideo "story/day3_raider_ambush/negotiate">>
<<if _storyFamily is "sf_cg_day3_raider_ambush_01">>You give ground into the mouth of a toppled concrete pipe. He steps in after you, slaps a hand flat against the curved wall and leans in, grinning behind black lenses. His movements are wrong. Jerky. Like something else is wearing his body.<<else>>He steps closer. His movements are wrong. Jerky. Like something else is wearing his body.<</if>>
<<say "Raider" "But we don't just want supplies. The thing inside us... it wants //you//.">>
<<say "Kira" "Corrupted. Damn it.">>
There's no negotiating with the corruption.
<div class="choice-container">
<<vchoice "Fight" "Day3_Combat_Fight" "action" "attack">>
</div><<run VaultUI.showCharacter("raider", "right", "attacking")>>
<<storyVideo "story/day3_raider_ambush/ready">>
<<if _storyFamily is "sf_cg_day3_raider_ambush_01">><<say "Kira" "Corrupted. Those black lenses aren't for the sun - they're hiding the glow. They're not fully human anymore.">><<else>><<say "Kira" "Corrupted. Their eyes - see how they glow? They're not fully human anymore.">><</if>>
You grip your knife tighter.
<<say "Raider" "Smart ones. But smart doesn't help when you're outnumbered.">>
<div class="choice-container">
<<vchoice "Fight" "Day3_Combat_Fight" "action" "attack">>
</div><<run VaultUI.showCharacter("raider", "right", "threatening")>>
<<storyVideo "story/day3_raider_ambush/escape">>
<<if _storyFamily is "sf_cg_day3_raider_ambush_01">>You back into a toppled concrete pipe and look out through its mouth. Wrecked trucks on bare, sun-bleached ground - and the raiders, walking straight at the one way out.<<else>>You scan the ruins. A collapsed section behind you. A narrow gap between walls.<</if>>
<<say "Kira" "There's a gap. But we'd have to get past them first.">>
<<say "Raider" "Running? That makes it more fun.">>
They're circling. Cutting off escape routes.
<<say "Kira" "We're going to have to fight our way out.">>
<div class="choice-container">
<<vchoice "Fight" "Day3_Combat_Fight" "action" "attack">>
</div><<run VaultUI.setBackground("prelude/reclaimed-day")>>
<<run VaultUI.setTimeOfDay("afternoon")>>
They rush you.
<<notify "info">>COMBAT TUTORIAL: Combat in the Reclaimed is brutal and fast. Choose your actions wisely. Work with your companion. Survive.<</notify>>
<<if !$companions || $companions.length === 0 || !$companions.find(c => c.id === "kira")>>
<<set _kira = {
id: "kira",
name: "Kira",
health: 85,
maxHealth: 100,
energy: 80,
maxEnergy: 100,
combat: 14,
trust: -10,
affection: 0,
lust: 0,
tension: 10,
tensionFloor: 0,
submission: 45,
cncAgreement: true,
cncSafeWord: "red",
romanceStage: 0
}>>
<<if !$companions>><<set $companions to []>><</if>>
<<run $companions.push(_kira)>>
<<randomizeKinks "kira" 2>>
<</if>>
<<createEnemy "raider">>
<<set _raider1 to clone(_returnEnemy)>>
<<set _raider1.visualPerformer to "max">>
<<set _raider1.portraitGroup to "calculating">>
<<createEnemy "raider_scout">>
<<set _raider2 to clone(_returnEnemy)>>
<<set _d3Enemies to [_raider1, _raider2]>>
<<startCombat _d3Enemies "kira" true>>
<<run setup.stampFightSlots($combat)>>
<<set $combat.firstBattle to true>>
<<set $combat.canSeduce to false>>
<<run setup.guardKira()>>
<<if $companions && $companions[0] && $companions[0].health <= 1>>
<<set $combat.kiraIncapacitated to true>>
<<else>>
<<set $combat.kiraIncapacitated to false>>
<</if>>
<<run VaultUI.showCharacter("kira", "left", "combat")>>
<<say "Kira" "Two on two. I'll take the fast one. You focus on the grunt.">>
<div class="combat-enemy-display">
<<for _i, _enemy range $combat.enemies>>
<div class="combat-enemy">
<div class="enemy-info">
<div class="enemy-name"><<print _enemy.name>></div>
<<statbar _enemy.health _enemy.maxHealth "#e74c3c">>
</div>
</div>
<</for>>
</div>
<div class="choice-container">
<<vchoice "Continue" "Combat_Actions" "action" "forward">>
</div><<run VaultUI.setBackground("prelude/reclaimed-day")>>
<<run VaultUI.setTimeOfDay("afternoon")>>
<<run VaultUI.showCharacter("kira", "left", "thoughtful")>>
You gather what you came for quickly. Neither of you wants to stay.
The walk back is quiet. Kira keeps glancing at you.
<<storyVideo "story/mv_day3/walk_back">>
<<say "Kira" "Whatever that was... it saved us. But-">>
<<say $player.name "But it's connected to whatever's happening to me.">>
<<if $flags.day3ToldKiraSuccubus>>
<<say "Kira" "The succubus. The marks. The vault choosing you.">>
<<else>>
<<say "Kira" "Whatever that was. The thing in your eyes. The vault choosing you.">>
<</if>>
<<say "Kira" "You're changing. I can see it now.">>
<<say $player.name "Is that a problem?">>
She's quiet for a long moment.
<<say "Kira" "I don't know yet. Ask me again in a week.">>
The vault door opens. Safety. For now.
<<set _loot = [{id: "canned food", name: "Canned Food", quantity: 5}, {id: "water_purified", name: "Purified Water", quantity: 3}, {id: "medkit_basic", name: "Basic Medkit", quantity: 1}]>>
<<set $vault.food += 5>>
<<set $vault.water += 3>>
<<set $vault.medical += 2>>
<<notify "success">>Scavenging successful! +5 Food, +3 Water, +2 Medical<</notify>>
<div class="choice-container">
<<vchoice "Report to the Groundskeeper" "Day3_Afternoon_Planning" "move" "run">>
</div><<advanceTime 2 0>>
<<run VaultUI.setBackground("commons")>>
<<run VaultUI.setTimeOfDay("afternoon")>>
<<run VaultUI.showCharacter("groundskeeper", "right", "neutral")>>
<<run VaultUI.showCharacter("kira", "left", "thoughtful")>>
<<say "Groundskeeper" "Resource discussion: required. Vault reserves: finite duration.">>
<<say "Groundskeeper" "Reclaimed expedition: eventual necessity. Resource acquisition. Potential survivor location.">>
<<say "Kira" "I know the Reclaimed. I could guide.">>
<<say $player.name "Both of us?">>
<<say "Kira" "Safer in pairs. Usually.">>
<<say "Groundskeeper" "Map designations: scavenging sites. Material availability: partial probability.">>
<<say "Groundskeeper" "Reclaimed status: deteriorating. Entity activity: increasing. Corruption spread: accelerating.">>
<<say "Kira" "I've dealt with both.">>
<<say "Groundskeeper" "Context: altered.">>
A precise gesture toward you.
<<say "Groundskeeper" "Subject marking: active. Entity attraction: confirmed.">>
<div class="choice-container">
<<vchoice "Ask about being 'marked'" "Day3_Afternoon_Marked" "talk" "talk">>
<<vchoice "Plan the expedition" "Day3_Afternoon_Debate" "action" "map">>
</div><<run VaultUI.showCharacter("groundskeeper", "right", "neutral")>>
<<say $player.name "What does being 'marked' mean exactly?">>
<<say "Groundskeeper" "Succubus contact: soul-level imprint established. Detection by supernatural entities: enabled.">>
<<say "Groundskeeper" "Corrupted organisms: identify you as prey. Or breeding partner. Or energy source.">>
<<say "Groundskeeper" "Entity-level beings: perceive you as notable. Interesting. Desirable.">>
<<say "Kira" "That sounds bad.">>
<<say "Groundskeeper" "Assessment: neutral. Power acquisition correlates with visibility increase. Variable: whether utilization precedes exploitation.">>
<div class="choice-container">
<<vchoice "Plan the expedition" "Day3_Afternoon_Debate" "action" "map">>
</div><<run VaultUI.showCharacter("kira", "left", "neutral")>>
<<run VaultUI.showCharacter("groundskeeper", "right", "neutral")>>
<<say "Groundskeeper" "Recommendation: initial expedition. Parameters: limited scope. Nearby ruins. Capability testing. Basic supply acquisition.">>
<<say "Kira" "I know a site. Half a day's travel. Old settlement - picked over, but there might be useful scraps.">>
<<say $player.name "When do we leave?">>
<<say "Groundskeeper" "Departure: not today. Rest protocol. Preparation. Tomorrow: acceptable timeframe.">>
<<say "Kira" "What kind of preparation?">>
<<say "Groundskeeper" "Equipment. Supplies. Informational preparation.">>
Three seconds.
<<say "Groundskeeper" "Encounter briefing: recommended. Corrupted entities constitute partial threat only. Additional hazards: humanoid-presenting non-humans. Pleasure exchange proposals requiring payment beyond capacity.">>
<<say "Kira" "Like the succubus.">>
<<say "Groundskeeper" "Succubus: one classification. Others: exist.">>
<div class="choice-container">
<<vchoice "Continue to evening" "Day3_Evening_Closer" "move" "night">>
</div><<advanceTime 3 0>>
<<run VaultUI.setBackground("commons")>>
<<run VaultUI.setTimeOfDay("evening")>>
<<run VaultUI.showCharacter("kira", "center", "neutral")>>
The Groundskeeper departs without preamble. No explanation offered.
<<if $flags.kiraStillInRags>>
<<run VaultUI.showCharacter("kira", "center", "flushed")>>
Kira disappears for a while. When she comes back, she's wearing actual clothes. Tank top, cargo pants. Functional. She must have raided storage on her own.
She catches your look and crosses her arms.
<<say "Kira" "Don't. I know what I looked like out there.">>
A pause.
<<say "Kira" "Fighting in rags. Like some kind of...">>
She trails off. Her ears are red.
<<say "Kira" "You could have said something.">>
<<say $player.name "You told me to give you space.">>
<<say "Kira" "Space. Not— forget it.">>
<<set $clothing.kira.top to 100>>
<<set $clothing.kira.bottom to 100>>
<<set $clothing.kira.underwear to 100>>
<<set $clothing.kira.underwearType to "standard">>
<<set $clothing.kira.titsExposed to false>>
<<set $clothing.kira.pussyExposed to false>>
<<set $clothing.kira.assExposed to false>>
<<set $flags.kiraStillInRags to false>>
<<relationChange "kira" "trust" -2>>
<<addTension "kira" 5 "He saw everything. The whole fight. In THAT.">>
<<run VaultUI.showCharacter("kira", "center", "neutral")>>
<</if>>
You're left with Kira in the commons. Evening light through the artificial windows.
<<storyVideo "story/kira_day3_evening/personal">>
<<say "Kira" "Hell of a day.">>
<<say $player.name "They all are, lately.">>
She moves to the couch. Sits. After a moment, gestures for you to join her.
<<addTension "kira" 10 "This is stupid. Why am I asking him to sit closer?">>
<div class="choice-container">
<<vchoice "Sit beside her" "Day3_Evening_Personal" "intimate" "house">>
<<vchoice "Keep your distance" "Day3_Evening_Distant" "action" "run">>
</div><<addTension "kira" 10>>
<<relationChange "kira" "affection" 1>>
<<run VaultUI.showCharacter("kira", "center", "vulnerable")>>
You sit. Close enough to feel her warmth. Not quite touching.
<<say "Kira" "Can I tell you something?">>
<<say $player.name "Sure.">>
<<say "Kira" "I haven't... been around people. Not really. Not for years.">>
<<say "Kira" "Survival was always about avoiding others. Staying hidden. The few times I tried to connect...">>
<<say $player.name "It didn't go well?">>
<<say "Kira" "People take. That's what I learned. They take and take until there's nothing left.">>
<<say "Kira" "But you... the Groundskeeper... this place...">>
<<say "Kira" "I don't know what to do with people who actually give.">>
<div class="choice-container">
<<vchoice "We're all learning" "Day3_Evening_Moment_Soft" "intimate" "broken-heart">>
<<vchoice "You'll figure it out" "Day3_Evening_Moment_Supportive" "talk" "talk">>
<<vchoice "Touch her hand" "Day3_Evening_Moment_Touch" "intimate" "hand">>
</div><<addTension "kira" 10 "He's being... kind. Why is that so hard to accept?">>
<<relationChange "kira" "affection" 1>>
<<say $player.name "I don't know what I'm doing either. Not long ago, I was dying in the Reclaimed. Now I'm here, having dreams about demons, finding crystals that glow, and trying to figure out how to survive with a stranger.">>
<<say $player.name "We're all just... making it up as we go.">>
<<say "Kira" "That's either comforting or terrifying.">>
<<say $player.name "Maybe both.">>
<<storyVideo "story/kira_day3_evening/moment_soft">>
She laughs. Quiet, but real. The first genuine laugh you've heard from her.
<<run VaultUI.showCharacter("kira", "center", "smile")>>
<<say "Kira" "Both. Yeah.">>
<div class="choice-container">
<<vchoice "Continue the moment" "Day3_Evening_Moment" "intimate" "clock">>
</div><<relationChange "kira" "trust" 1>>
<<say $player.name "Give it time. There's no rush here.">>
<<say "Kira" "Time. That's a luxury I've never had.">>
<<say $player.name "You have it now. The vault is safe. I'm not going anywhere. We'll figure it out together.">>
<<storyVideo "story/kira_day3_evening/moment_supportive">>
She looks at you. Something shifts in her expression.
<<run VaultUI.showCharacter("kira", "center", "smile")>>
<<say "Kira" "Together. I don't remember the last time I did anything together with someone.">>
<<say $player.name "First time for everything.">>
<div class="choice-container">
<<vchoice "Continue the moment" "Day3_Evening_Moment" "intimate" "clock">>
</div><<addTension "kira" 15 "His hand on mine. Why does that feel so... intense?">>
<<relationChange "kira" "affection" 1>>
You reach out. Take her hand.
<<storyVideo "story/kira_day3_evening/moment_touch">>
<<if _storyFamily is "sf_cg_kira_day3_evening_04">>She freezes. Then she pulls you in by that hand, cheek against yours, and holds it a beat longer than she means to.<<else>>She freezes. Doesn't pull away. Doesn't move closer.<</if>>
<<run VaultUI.showCharacter("kira", "center", "vulnerable")>>
<<say "Kira" "What are you doing?">>
<<say $player.name "I'm not sure. Is this okay?">>
A long pause.
<<say "Kira" "...yeah. It's okay.">>
Her hand is warm. Callused. Real.
<<if _storyFamily is "sf_cg_kira_day3_evening_04">>You stay like that, her cheek against yours, her breath warm and uneven on your neck. Neither of you says a word, and neither of you lets go first.<<else>>You sit like that for a moment. Not speaking. Just... connected.<</if>>
<div class="choice-container">
<<vchoice "Continue the moment" "Day3_Evening_Moment" "intimate" "clock">>
</div><<run VaultUI.showCharacter("kira", "center", "neutral")>>
<<storyVideo "story/kira_day3_evening/distant">>
You take a chair nearby. Close enough for conversation. Not close enough to touch.
Kira notices. Something flickers in her expression - relief? Disappointment?
<<say "Kira" "Probably smart. Keeping distance.">>
<<say $player.name "I'm not keeping distance. Just... being careful.">>
<<say "Kira" "Same thing.">>
<<say $player.name "Not always.">>
She's quiet. Then:
<<say "Kira" "Tomorrow's going to be dangerous, isn't it? The Reclaimed, I mean.">>
<<say $player.name "Probably.">>
<<say "Kira" "I just... wanted to say. In case something happens. Thanks. For the door.">>
<<say $player.name "You're welcome.">>
<div class="choice-container">
<<vchoice "Continue" "Day3_Evening_Moment" "move" "clock">>
</div><<run VaultUI.showCharacter("kira", "center", "vulnerable")>>
<<storyVideo "story/kira_day3_evening/moment">>
The moment stretches.
Something in the air. Unspoken. Heavy with possibility.
<<getCompanion "kira">>
<<if $tempCompanion.tension >= 25>>
<<say "Kira" "I should...">>
She doesn't finish. Doesn't move.
<<say $player.name "Should what?">>
<<say "Kira" "I don't know.">>
Your eyes meet. Hold.
<<addTension "kira" 10 "What is happening? Why can't I look away?">>
A sound from somewhere else in the vault. Machinery. Breaking the moment.
<<say "Kira" "...I should go. Get some sleep before tomorrow.">>
<<say $player.name "Right. Yeah. Good idea.">>
She stands. Hesitates.
<<say "Kira" "For what it's worth... I'm glad I ended up here. Even if I don't understand it yet.">>
<<say $player.name "Me too.">>
She leaves. You're alone with the echo of what almost happened.
<<else>>
You talk. About tomorrow. About the Reclaimed. About nothing in particular.
Eventually, she yawns.
<<say "Kira" "I should sleep. Big day tomorrow.">>
<<say $player.name "Right. Me too.">>
She stands. Stretches.
<<say "Kira" "Thanks. For... everything.">>
<<say $player.name "You're welcome.">>
She leaves. The commons feels emptier without her.
<</if>>
<div class="choice-container">
<<vchoice "Go to your quarters" "Day3_Night_Quarters" "move" "night">>
</div><<run VaultUI.setBackground("quarters")>>
<<run VaultUI.setTimeOfDay("night")>>
<<run VaultUI.hideAllCharacters()>>
Night. Your room. Alone with your thoughts.
The day replays in your mind. The journal. The crystal. Kira's hand in yours.
The previous dweller - Mira - who became something else. The Groundskeeper's warnings about the path narrowing.
And tomorrow... the Reclaimed. Real danger. With Kira beside you.
<<getCompanion "kira">>
<<if $tempCompanion.tension >= 30>>
You think about Kira more than you should. The way she laughed. The warmth of her hand.
Something's building between you. You both feel it.
Is that wise? Is it even safe, in a place like this?
<</if>>
Questions without answers. You let them go.
Sleep.
<<if $flags.foundOldJournal>>
<<journalAdd "Found a journal today. Someone named Mira lived here before me. The entries get stranger toward the end - she was changing, becoming something else. The Groundskeeper watched it happen." "discovery">>
<</if>>
<<if $flags.foundPurpleCrystal>>
<<journalAdd `"Found a " + setup.crystalColor() + " crystal sealed in a box in the vault. It pulses with something - energy? Magic? I don't know what it is, but it feels important."` "discovery">>
<</if>>
<<if $stats && $stats.sex.totalEncounters > 0>>
<<journalAdd "First real fight today. Raiders in the Reclaimed. Kira and I handled them, but it was close. The world out there wants us dead." "combat">>
<</if>>
<<getCompanion "kira">>
<<if $tempCompanion && $tempCompanion.tension >= 30>>
<<journalAdd "There's something between me and Kira. Sexual tension thick enough to choke on. The way she looks at me when she thinks I'm not watching... she wants it too. Just a matter of time." "relationship">>
<</if>>
<div class="choice-container">
<<vchoice "Dream..." "Day3_Night_Dream_Succubus" "move" "night">>
</div><<run VaultUI.transition("supernatural", 1500)>>
<<run VaultUI.setSceneMode("dream")>>
<<run VaultUI.setBackground("prelude/dream-void")>>
<<run VaultUI.setTimeOfDay("night")>>
<<run VaultUI.setWeather("fog")>>
<div class="dream-sequence">
The dreams have never been this vivid.
You stand in a chamber of purple light. Crystal walls reflecting infinity. The air itself pulsing with energy.
<<run VaultUI.showCharacter("succubus", "center", "seductive")>>
<<storyVideo "story/velith_dream_visits/day3_night_dream_succubus" "" "characters/succubus/story/dream_tease">>
She's there. The succubus. More solid than ever.
<<say "Succubus" "Finally. We can truly speak.">>
<<if _storyClip is "1ac3e36755e9">>She circles you, then drops onto all fours and crawls in close, and it's the pale-haired costume again: black paint running down her cheeks like tear tracks, heavy breasts spilling out of black lace, the little horns. The eyes are the only part she hasn't painted over, and they're starving.
<<say "Succubus" "Still the costume, yes. You don't get my real face in a dream, sweet thing. You get it in the flesh.">><<else>>She circles you. Her form is beautiful, terrifying - curves and shadows, horns and black-feathered wings, eyes that burn with hunger.<</if>>
<<say $player.name "What do you want from me?">>
<<say "Succubus" "Everything. Nothing. It depends on what you're willing to give.">>
<<say "Succubus" "You touched the crystal. Opened yourself a little further. I could feel it.">>
<<say $player.name "The Groundskeeper says I'm marked.">>
<<say "Succubus" "You are. By me. And soon... by others. Unless you choose differently.">>
She stops in front of you. Close. Too close.
<<say "Succubus" "The vault changes people. So do I. The question is which change you'll embrace.">>
<<getCompanion "kira">>
<<if $tempCompanion.tension >= 30>>
Her form shifts. Becomes Kira. Then shifts again - Kira but... more. Curves emphasized, skin glowing, eyes hungry.
<<say "Succubus (as Kira)" "You want her. Don't lie to yourself.">>
<<say $player.name "That's not-">>
<<say "Succubus (as Kira)" "It is. And she wants you. I can feel it.">>
The false Kira steps closer. Reaches for you.
<<say "Succubus" "I could teach you how to have her. How to make her yours completely.">>
<<say "Succubus" "All you have to do is let me in. Just a little. Just enough.">>
Her lips are at your ear. Your body is responding despite your will.
<<say "Succubus" "Think about it. We'll talk more... tomorrow. In the flesh.">>
<<else>>
<<say "Succubus" "You're cautious. Good. Caution keeps you alive.">>
<<say "Succubus" "But caution also keeps you isolated. Alone. Unfulfilled.">>
<<say "Succubus" "The vault feeds on connection. So do I. We're not so different.">>
She touches your face. Fire and ice.
<<say "Succubus" "Tomorrow, we meet properly. No more dreams. Reality.">>
<<say "Succubus" "Prepare yourself.">>
<</if>>
The dream begins to fragment. But before it fades entirely-
<<if $flags.timeSlipExperienced>>
A new presence. Something vast. Something that was watching during the fight.
<<say "???" "You used the gift today. Did it feel good?">>
The voice is different. Not the succubus. Older. Darker. Hungry.
<<say "???" "The more you use it, the more you become one of us.">>
<<say "Succubus" "Ignore him. He's just-">>
<<say "???" "Something NOTICED you today, little mortal. Many somethings.">>
<<say "???" "We'll be watching. With great... interest.">>
The succubus looks uncomfortable. Perhaps even afraid.
<<else>>
Something else is in the dream now. A presence at the edge.
<<say "???" "Something NOTICED you today.">>
The voice isn't the succubus. It's something else. Something watching from the dark.
<<say "???" "You're changing. We're all watching.">>
<<say "???" "With great... interest.">>
<</if>>
</div>
You try to speak. To resist. To understand.
But the dream shatters.
You wake-
<div class="choice-container">
<<vchoice "Wake" "Day3_Dream_End" "move" "sun">>
</div><<run VaultUI.setSceneMode(null)>>
<<run VaultUI.setBackground("quarters")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<<run VaultUI.hideAllCharacters()>>
You wake gasping.
<<storyVideo "story/mv_day3/dream_end">>
Your body is on fire. Arousal unlike anything you've felt - primal, demanding, impossible to ignore.
The dream clings to you. Her face. Her words. Her promise.
<<if $prelude.hadSex>>
You haven't felt like this since Sera. Since the night before everything ended.
<</if>>
Something has changed. You can feel it. A door opened that can't be closed.
The Groundskeeper's warning echoes: "The path gets narrower every day."
<<set $uiVisible.lustMeter to true>>
<<set $player.lust to 20>>
<<set $flags.supernaturalAwakening to true>>
<<notify "warning">>Your Lust meter is now visible. Something has awakened in you.<</notify>>
<<set $time.day to setup.storyDay(4, true, 6)>>
<<setTime 6 0>>
Today, she said, they would meet in the flesh.
Today, everything changes.
<div class="choice-container">
<<vchoice "Continue" "Day4_Morning_Wake" "move" "sun">>
</div><<run setup.markStoryDay(4)>>
<<set $time.day to setup.storyDay(4, false, 7)>>
<<setTime 7 0>>
<<set $player.health to Math.min($player.maxHealth, $player.health + 30)>>
<<set $player.energy to $player.maxEnergy>>
<<set $currentLocation to "quarters">>
<<run VaultUI.setBackground("quarters")>>
<<run VaultUI.setTimeOfDay("dawn")>>
Something's different.
You wake restless, pulse elevated. Like you forgot something important. Like something's CALLING you.
The dreams were vivid. Fragments remain: violet light, a voice that promises, ruins wrapped in purple glow.
<<if $companions.length gt 0>>
<<say $player.name "Just a dream...">>
But it doesn't feel like just a dream.
<</if>>
<div class="choice-container">
<<vchoice "Get up and shake it off" "Day4_Morning_Commons" "action" "sunrise">>
<<vchoice "Meditate on the feeling" "Day4_Morning_Meditate" "action" "meditation">>
</div><<storyVideo "story/mv_quarters/bed_edge">>
You sit on the edge of the bed, focusing on the sensation.
It's not anxiety. It's... anticipation. Like your body knows something your mind doesn't.
Direction. Northwest. Specific. To the Overgrown Ruins on the Groundskeeper's map.
<<set $flags.understoodsuccubusCall to true>>
<em>You need to go there.</em>
<div class="choice-container">
<<vchoice "Continue" "Day4_Morning_Commons" "move" "map">>
</div><<run VaultUI.setBackground("commons")>>
<<run VaultUI.setTimeOfDay("morning")>>
<<if $companions[0]>>
<<showCharacter "kira" "right" "concerned">>
Kira's at the table, eating something that might once have been fruit.
She looks up.
<<say "Kira" "You look tense. Bad dreams?">>
<<if $flags.understoodsuccubusCall>>
More than dreams. But how do you explain the PULL?
<<else>>
Something like that.
<</if>>
<div class="choice-container">
<<vchoice "\"Just restless. Might head out today.\"" "Day4_Morning_Kira_Deflect" "talk" "talk">>
<<vchoice "\"I need to check something. The ruins northwest.\"" "Day4_Morning_Kira_Tell" "talk" "map">>
<<vchoice "\"Nothing I can't handle.\"" "Day4_Morning_Kira_Brush" "action" "hand">></div>
<<else>>
The commons are quiet this morning. Just you and the hum of the vault.
<div class="choice-container">
<<vchoice "Prepare for the Reclaimed" "Day4_Prep_Expedition" "move" "sunrise">>
</div>
<</if>><<say $player.name "I need to check something. The Overgrown Ruins, northwest of here.">>
<<say "Kira" "The ones on the map? What's there?">>
<<say $player.name "I don't know. But I need to find out.">>
She studies you for a moment.
<<say "Kira" "You're being weird. But okay.">>
<<if $companions[0].trust gte 30>>
<<say "Kira" "Want company? You look like you shouldn't be alone.">>
<div class="choice-container">
<<vchoice "\"I'd feel better with you there\"" "Day4_Morning_Kira_Accepts" "talk" "check">>
<<vchoice "\"I need to do this alone\"" "Day4_Morning_Kira_Refuses" "talk" "check">>
</div>
<<else>>
<<say "Kira" "Try not to die out there.">>
<<set $flags.toldKiraWhereGoing to true>>
<div class="choice-container">
<<vchoice "Prepare to leave" "Day4_Prep_Expedition" "move" "door-handle">>
</div>
<</if>><<say $player.name "Just restless. Might head out scavenging today.">>
<<say "Kira" "Fair enough. Be careful.">>
<<set $companions[0].trust -= 2>>
<div class="choice-container">
<<vchoice "Prepare to leave" "Day4_Prep_Expedition" "move" "door-handle">>
</div><<say $player.name "Nothing I can't handle.">>
She frowns.
<<say "Kira" "Alright, tough guy. Don't get yourself killed.">>
<<set $companions[0].trust -= 5>>
<div class="choice-container">
<<vchoice "Prepare to leave" "Day4_Prep_Expedition" "move" "door-handle">>
</div><<say $player.name "I'd feel better with you there.">>
She nods.
<<say "Kira" "Let me grab my gear. Come find me when you're ready to leave.">>
<<set $flags.kiraWillingToJoinDay4 to true>>
<<addTrust "kira" 1>>
<div class="choice-container">
<<vchoice "Prepare to leave" "Day4_Prep_Expedition" "move" "door-handle">>
<<vchoice "Head to the commons" "Vault_Hub" "move" "house">>
</div><<say $player.name "I need to do this alone.">>
She holds your gaze for a beat, then shrugs.
<<say "Kira" "Your funeral.">>
<<set $companions[0].trust -= 3>>
<<addTension "kira" 5>>
<<set $flags.kiraRefusedDay4 to true>>
<div class="choice-container">
<<vchoice "Prepare to leave" "Day4_Prep_Expedition" "move" "door-handle">>
<<vchoice "Head to the commons" "Vault_Hub" "move" "house">>
</div>You gather supplies. Check your weapon. The pull is stronger now.
Northwest. The Overgrown Ruins. You can feel it calling.
<<if $flags.kiraWillingToJoinDay4 && setup.kiraCanTravel()>>
<<set $expeditionCompanion to "kira">>
<<elseif $flags.kiraRefusedDay4>>
<<set $expeditionCompanion to "">>
<</if>>
<div class="choice-container">
<<vchoice "Set out for the ruins" "Travel_Prepare" "move" "map">>
<<vchoice "Head to the commons" "Vault_Hub" "move" "house">>
</div><<run VaultUI.setBackground("reclaimed-day")>>
<<run VaultUI.setTimeOfDay("day")>>
The Reclaimed is the same as always. Dust. Heat. Crumbling bones of the old world.
But you're heading somewhere specific today.
The Overgrown Ruins. Two hours northwest.
<<if $expeditionCompanion === "kira">>
<<showCharacter "kira" "right" "alert">>
Kira keeps pace beside you, scanning for threats.
<<say "Kira" "So what are we really looking for?">>
<div class="choice-container">
<<vchoice "\"I'll know when I see it\"" "Day4_Travel_Vague" "talk" "talk">>
<<vchoice "\"Something's calling me there\"" "Day4_Travel_Honest" "talk" "check">>
</div>
<<else>>
You travel alone. The pull grows stronger with each step.
<div class="choice-container">
<<vchoice "Continue to the ruins" "Day4_Ruins_Arrive" "move" "map">>
</div>
<</if>><<say $player.name "I'll know when I see it.">>
<<say "Kira" "Cryptic. Great.">>
She doesn't push. But she's watching you carefully.
<div class="choice-container">
<<vchoice "Continue to the ruins" "Day4_Ruins_Arrive" "move" "map">>
</div><<say $player.name "Something's calling me there. I know how that sounds.">>
She doesn't laugh.
<<say "Kira" "The Reclaimed does that sometimes. Messes with your head.">>
A pause.
<<say "Kira" "But you don't mess with feelings like that out here. We'll see what it is.">>
<<addTrust "kira" 1>>
<div class="choice-container">
<<vchoice "Continue to the ruins" "Day4_Ruins_Arrive" "move" "map">>
</div><<run VaultUI.setBackground("reclaimed-ruins")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
The Overgrown Ruins.
You've seen it from a distance before. Crumbling walls choked with mutated vines. Stone that predates the Cataclysm.
<<storyVideo "story/mv_day4_ruins/arrive">>
But up close, it's different.
There's a GLOW. Purple light seeping from cracks in the foundation. Symbols on the walls that you swear weren't there before.
The air feels charged. Heavy.
<<if $expeditionCompanion === "kira">>
<<showCharacter "kira" "right" "defensive">>
<<say "Kira" "What the fuck is that?">>
She has her weapon out.
<<say "Kira" "That's not natural.">>
No. It's not.
<div class="choice-container">
<<vchoice "\"Stay here. I'll check it out.\"" "Day4_Ruins_KiraWaits" "action" "armor">>
<<vchoice "\"Come with me. Stay close.\"" "Day4_Ruins_KiraComes" "action" "hand">>
</div>
<<else>>
You're alone with this.
The purple light pulses. Beckoning.
<div class="choice-container">
<<vchoice "Enter the ruins" "Day4_Succubus_Appear" "action" "door-handle">>
</div>
<</if>><<say $player.name "Stay here. I'll check it out.">>
<<say "Kira" "Like hell. If you're going in, I'm—">>
<<say $player.name "Please. I need to do this.">>
Something in your voice stops her.
<<say "Kira" "...Five minutes. Then I'm coming in after you.">>
<<set $flags.kiraWaitedOutside to true>>
<div class="choice-container">
<<vchoice "Enter alone" "Day4_Succubus_Appear" "action" "door-handle">>
</div><<say $player.name "Come with me. Stay close.">>
She nods, weapon ready.
Together, you descend into the ruins.
<<set $flags.kiraWitnessed to true>>
<div class="choice-container">
<<vchoice "Enter together" "Day4_Succubus_Appear_Kira" "action" "door-handle">>
</div><<set $flags.velithRealFaceSeen to true>>
<<run VaultUI.setBackground("reclaimed-ruins")>>
<<run VaultUI.setTimeOfDay("supernatural")>>
<<run document.body.classList.add("scene-mode-supernatural")>>
The chamber beneath the ruins.
Purple light emanates from symbols etched into every surface. The air THRUMS with energy that raises the hair on your arms.
And then—
She appears.
<<storyVideo "characters/succubus/story/appearance">>
<<if _storyClip is "47eab95d1aed">>Not metaphorically. A single candle flares in the dark and she is simply there, seated as if she had been waiting, a red candle held against her bare breasts, its flame just under her chin. Shadow and desire given form.<<else>>Not metaphorically. She MATERIALIZES from nothing. Shadow and desire given form.<</if>>
<<if not _storyClip>>
<div class="scene-media">
<video autoplay loop muted playsinline>
<source src="media/characters/succubus/story/appearance.webm" type="video/webm">
</video>
</div>
<</if>>
<<showCharacter "succubus" "center" "seductive">>
Black horns curving back from dark hair cut in a fringe across her brow. Pointed ears. A sigil painted on her forehead. Black feathered wings folded at her shoulders. Around her the light turns red, the color of banked coals, and her pale skin drinks it in. Dark eyes, and they are HUNGRY.
She wears almost nothing: black leather straps crossing her bare breasts, a corset cinched tight at her waist, gloves to the elbow. Slim. Every curve is weaponized. Every line designed to make you want.
She shouldn't be real.
<<say "???" "Finally.">>
Her voice is silk and smoke.
<<say "???" "Someone who can SEE me.">>
Your body responds before your mind catches up. Heat flooding through you. Need like you've never felt.
<<clampStat "player.lust" 30>>
<<if _storyClip is "47eab95d1aed">>She leans toward you, the candle sinking into her lap. Each movement is liquid grace.<<else>>She steps closer. Each movement is liquid grace.<</if>>
<<say "???" "Oh, you're DELICIOUS. All that untapped potential.">>
A smile that promises things.
<<say "???" "You don't even know what you are, do you?">>
<div class="choice-container">
<<vchoice "\"What ARE you?\"" "Day4_Succubus_WhatAreYou" "talk" "alert">>
<<vchoice "\"Stay back!\"" "Day4_Succubus_StayBack" "action" "armor">>
<<vchoice "Say nothing, just stare" "Day4_Succubus_Stare" "action" "search">>
</div><<set $flags.velithRealFaceSeen to true>>
<<run VaultUI.setBackground("reclaimed-ruins")>>
<<run VaultUI.setTimeOfDay("supernatural")>>
<<run document.body.classList.add("scene-mode-supernatural")>>
The chamber beneath. Purple light. Symbols that hurt to look at.
<<showCharacter "kira" "left" "shocked">>
<<say "Kira" "What is—">>
<<storyVideo "characters/succubus/story/appearance">>
<<if _storyClip is "47eab95d1aed">>And then a candle flares in the dark, and SHE is there, seated, a red candle held against her bare breasts.<<else>>And then SHE appears.<</if>>
<<showCharacter "succubus" "center" "amused">>
The demon. Horns. Wings. Perfect and terrible.
<<say "???" "Oh. You brought a friend.">>
Kira raises her weapon, but her hands are shaking.
The succubus laughs. Not mocking. Delighted.
<<say "???" "Precious. But THIS one...">>
She looks at you. Through you.
<<say "???" "...is the one I've been waiting for.">>
<<clampStat "player.lust" 25>>
<<clampStat "companions[0].lust" 15>>
<div class="choice-container">
<<vchoice "Step between them" "Day4_Succubus_ProtectKira" "action" "armor">>
<<vchoice "\"Let her go. Take me.\"" "Day4_Succubus_Bargain" "talk" "lips">>
</div>You step between Kira and the demon.
<<say $player.name "Don't touch her.">>
The succubus laughs. Delighted.
<<say "Succubus" "Oh, how NOBLE. Protecting your little mortal friend.">>
She doesn't seem threatened. If anything, she's amused.
<<storyVideo "story/mv_day4_ruins/protect_kira">>
<<say "Succubus" "Fine. She's not the one I want anyway.">>
<<addTrust "kira" 1>>
<<addAffection "kira" 1>>
<div class="choice-container">
<<vchoice "Continue" "Day4_Succubus_Choice" "move" "map">>
</div><<say $player.name "Let her go. Take me.">>
The succubus's smile widens.
<<say "Succubus" "Oh, you sweet thing. So quick to sacrifice yourself.">>
She waves a hand. Kira slumps against the wall, eyes glazed but unharmed.
<<say "Succubus" "Don't worry. She won't get in our way. But YOU...">>
<<storyVideo "story/velith_day4_appearance/accept">>
<<if _storyClip is "9351446b9b12">>She focuses entirely on you, and her face slides into another as she comes in close: black paint down her cheeks, a painted mouth parted an inch from yours, smiling.<<else>>She focuses entirely on you.<</if>>
<<say "Succubus" "You, I'll make sure remember EVERYTHING.">>
<<addTrust "kira" 1>>
<<set $flags.sacrificedForKira to true>>
<div class="choice-container">
<<vchoice "Continue" "Day4_Succubus_Choice" "move" "map">>
</div><<storyVideo "story/velith_day4_appearance/what_are_you">>
<<say $player.name "What ARE you?">>
<<say "Succubus" "What am I?">>
<<if _storyClip is "02e133d89b35">>She turns slowly, showing you her back and the black feathers of her wings folded down it, then turns to face you again, gloved hands cupping her breasts.<<else>>She rolls her shoulders and the black feathers of her wings rise and flare around her.<</if>>
<<say "Succubus" "Demon. Spirit. The thing that visits men's dreams. Pick your label.">>
<<say "Succubus" "I am hunger given form. Desire made flesh. The dark at the edge of lust.">>
She's right in front of you now. So close you can feel her warmth.
<<say "Succubus" "And you... you are MINE.">>
<div class="choice-container">
<<vchoice "Continue" "Day4_Succubus_Choice" "move" "map">>
</div><<storyVideo "story/velith_day4_appearance/stay_back">>
<<say $player.name "Stay back!">>
<<if _storyClip is "177190c3b127">>Her shape slips for a heartbeat, darker hair, black paint cut down her cheeks, as if she is trying a new face on. She turns it to the side and tilts her head. Not threatened. Curious.
<<say "Succubus" "Don't flinch. This face is just for you.">><<else>>She tilts her head. Not threatened. Curious.<</if>>
<<say "Succubus" "Such fear. Mixed with such WANT.">>
She doesn't approach. But she doesn't need to. The pull is magnetic.
<<say "Succubus" "You feel it, don't you? The connection. Like recognizing like.">>
<div class="choice-container">
<<vchoice "Continue" "Day4_Succubus_Choice" "move" "map">>
</div><<storyVideo "story/velith_day4_appearance/what_are_you">>
You can't speak. Can barely breathe.
She's impossible. But she's REAL.
<<say "Succubus" "Yes. Drink me in.">>
She poses. Not subtle. Showing every line, every curve.
<<say "Succubus" "I've been watching you since before you knew how to walk. Waiting for you to ripen.">>
<<clampStat "player.lust" 10>>
<div class="choice-container">
<<vchoice "Continue" "Day4_Succubus_Choice" "move" "map">>
</div><<storyVideo "story/velith_day4_appearance/choice">>
<<if _storyClip is "65859b3a861f">><<if visited("Day4_Succubus_Bargain") + visited("Day4_Succubus_StayBack") + visited("Day4_Succubus_Question") gt 0>>She steps even closer, still wearing that sharper, painted face. Every nerve in your body screams — half warning, half WANT.<<else>>She steps even closer, and her face ripples like heat over asphalt and settles into another: sharper, darker, black paint cut down her cheeks, sharp silver nails on every finger. She presses one nail to her smiling lips. Every nerve in your body screams — half warning, half WANT.
<<say "Succubus" "Better? I can be anything you're hungry for.">><</if>><<else>>She steps even closer. Every nerve in your body screams — half warning, half WANT.<</if>>
<<say "Succubus" "I could show you things. Teach you what you're becoming.">>
Her hand rises, not quite touching your face. You feel heat radiating from her palm.
<<say "Succubus" "All I ask is a taste...">>
Your body is betraying you. Arousal so intense it's almost painful.
<<clampStat "player.lust" 15>>
<div class="choice-container">
<<vchoice "Let her approach" "Day4_Succubus_Accept" "intimate" "lips">>
<<vchoice "Pull away" "Day4_Succubus_Resist" "action" "armor">>
<<vchoice "\"What do you mean, what I'm becoming?\"" "Day4_Succubus_Question" "talk" "alert">>
</div><<storyVideo "story/velith_day4_appearance/question">>
<<say $player.name "What do you mean, what I'm becoming?">>
<<say "Succubus" "Oh, sweet thing. You don't know, do you?">>
She circles you. Predatory. Appraising.
<<say "Succubus" "The Cataclysm broke more than the world. It broke the BOUNDARIES. Between life and death. Matter and spirit. Human and... other.">>
<<say "Succubus" "Some were touched by that breaking. Marked. Changed at a level deeper than flesh.">>
She stops in front of you again.
<<say "Succubus" "You're one of them. One of US.">>
<<say $player.name "I'm not a demon.">>
<<say "Succubus" "Not yet. But the seed is there. Waiting. And I can help it BLOOM.">>
<div class="choice-container">
<<vchoice "She offers again" "Day4_Succubus_Choice" "move" "map">>
</div>You don't pull away.
<<say $player.name "...Yes.">>
The word barely escapes your lips.
<<storyVideo "story/velith_day4_appearance/accept">>
<<if _storyClip is "9351446b9b12">>Her smile could ignite cities. She comes in until there is nothing in the world but her painted mouth, parted, an inch from yours.<<else>>Her smile could ignite cities.<</if>>
<<say "Succubus" "Oh, you beautiful thing. I'm going to ruin you in the best possible way.">>
She closes the distance.
<<set $flags.succubusAccepted to true>>
<<set $flags.succubusFirstEncounter to true>>
<div class="choice-container">
<<vchoice "What follows..." "Day4_Succubus_Sex" "intimate" "lips">>
</div>You step back. Force your body to obey your will.
<<say $player.name "No. I don't... I can't...">>
For a moment, her expression is unreadable.
<<storyVideo "story/velith_day4_appearance/resist">>
Then she laughs. Not mocking. Genuine delight.
<<say "Succubus" "Oh, you DELICIOUS thing. Resisting when every cell in your body is screaming YES.">>
She doesn't pursue.
<<say "Succubus" "I like you even more now.">>
<<set $flags.succubusResisted to true>>
<<set $flags.succubusFirstEncounter to true>>
<div class="choice-container">
<<vchoice "Continue" "Day4_Succubus_Aftermath_Resist" "move" "map">>
</div><<sexScene "velith" "supernatural" "overwhelming" "ruins_supernatural">>
<<storyVideo "characters/succubus/story/kiss">>
<<if not _storyClip>>
<div class="scene-media">
<video autoplay loop muted playsinline>
<source src="media/characters/succubus/story/seduction.webm" type="video/webm">
</video>
</div>
<</if>>
Her lips meet yours.
<<if _storyClip is "434f7897d20d" or _storyClip is "33e85d674a82">><<say "Succubus" "Do you like this face? I pulled it out of your head.">>
For the length of the kiss the chamber is gone: sunlight through a tall window, her hand sliding up to your jaw. The horns are gone. The wings are gone. Black hair spills over your shoulder, soft human lips, a stranger's body she's wearing like a borrowed dress. It's not a human kiss. There's POWER in it. Energy that crackles between you.<<else>>It's not a human kiss. There's POWER in it. Energy that crackles between you.<</if>>
<<performSexAct "kiss_deep">>
Her hands find your skin. Where she touches, BURNS.
<<addCorruption 5>>
Clothes dissolve. Hers were never real. Yours might as well be mist.
<<performSexAct "undress_partial">>
<<showCharacter "velith" "center" "hungry">>
<<say "Succubus" "Yes. Let me TASTE you.">>
<<storyVideo "characters/succubus/story/grind">>
<<if _storyClip is "368a0a421a43">>She drops back into a high-backed seat that wasn't there a heartbeat ago, knees spread, and pulls your hand down between her thighs. The symbols around you flare brighter.<<else>>She pushes you back against stone. The symbols around you flare brighter.<</if>>
<<performSexAct "touch_intimate">>
This isn't sex. It's FEEDING. She draws something from you with every touch, every kiss. And it feels GOOD.
<<addCorruption 5>>
<<clampStat "player.health" -10 1 100>>
Your vision goes purple at the edges.
<<sexPhase "action">>
<<performSexAct "grind">>
Her body moves against yours. Impossible heat. Supernatural friction.
<<say "Succubus" "More. Give me MORE.">>
You're losing yourself in her. Boundaries dissolving.
<<performSexAct "penetrate">>
<<storyVideo "characters/succubus/story/ride">>
<<if not _storyClip>>
<div class="scene-media">
<video autoplay loop muted playsinline>
<source src="media/characters/succubus/story/sex_scene_doggy.webm" type="video/webm">
</video>
</div>
<</if>>
<<if _storyClip is "ff7a366a43c1">>She turns her back to you, wings brushing your face, and sinks down onto you. The world SHIFTS. Power floods both ways. She gasps — actually GASPS.<<elseif _storyClip is "3e2657824f0f">>She squirms under your fingers, then rolls onto all fours on the leather, wings draped over her back, and looks back at you over her shoulder. When you enter her from behind, the world SHIFTS. Power floods both ways. She gasps — actually GASPS.<<else>>When you enter her, the world SHIFTS. Power floods both ways. She gasps — actually GASPS.<</if>>
<<say "Succubus" "Oh... you really ARE special...">>
<<performSexAct "thrust_fast">>
It's primal. Desperate. You're fucking a demon and she's feeding on you and it's the most intense thing you've ever felt.
<<sexPhase "climax">>
<<performSexAct "climax_together">>
<<storyVideo "characters/succubus/story/feeding_climax">>
<<if not _storyClip>>
<div class="scene-media">
<video autoplay loop muted playsinline>
<source src="media/characters/succubus/story/feeding_climax.webm" type="video/webm">
</video>
</div>
<</if>>
<<if _storyClip is "ea1ca488be7e">>She drops to her hands, wings spread wide, and pushes back onto you as the orgasm rips through you both. Purple light EXPLODES outward. Every symbol in the chamber ignites.<<else>>The orgasm rips through you both. Purple light EXPLODES outward. Every symbol in the chamber ignites.<</if>>
For one impossible moment, you're HER. You feel yourself through her senses. Taste your own essence. Experience the ecstasy of the FEED.
Then you're back. Gasping. Collapsed against stone.
<<addCorruption 15>>
<<clampStat "player.health" -5 1 100>>
<<set $player.lust to 0>><<run setup.playerReleased()>>
<div class="choice-container">
<<vchoice "Aftermath" "Day4_Succubus_Aftermath_Accept" "move" "map">>
</div><<sexPhase "aftermath">>
<<set $flags.velithNameKnown to true>>
<<set $flags.succubusExplained to true>>
<<storyVideo "characters/succubus/story/aftermath">>
<<if not _storyClip>>
<div class="scene-media">
<video autoplay loop muted playsinline>
<source src="media/characters/succubus/story/aftermath.webm" type="video/webm">
</video>
</div>
<</if>>
<<showCharacter "velith" "center" "satisfied">>
<<if _storyClip is "48e217f21b63">>She stays bent over the leather, wings spread, ass still raised under your hand, stretching like a cat in the sun. Absolutely radiant.<<elseif _storyClip is "177190c3b127">>She stands over you in the violet dark, and her face has slipped: a darker bob, black paint cut down her cheeks and throat, sheer black lace. She gazes off at nothing, sated. Absolutely radiant.<<else>>She's draped across stone like a satisfied cat. Wings spread. Absolutely radiant.<</if>>
<<say "Velith" "Mmm. DELICIOUS.">>
You're trying to remember how to breathe.
<<say "Velith" "You fed me so well, sweet thing. And in return...">>
She trails a finger down your chest. Where it touches, you feel CHANGED.
<<say "Velith" "I've awakened something in you. A gift. A curse. Perspective, really.">>
The chamber is fading. Or you are. Hard to tell.
<<say "Velith" "This is just the beginning. I'll visit your dreams now. Teach you. SHAPE you.">>
She leans close. Whispers her name like a secret.
<<say "Velith" "My name is Velith. Remember it. You'll be screaming it often enough.">>
<div class="choice-container">
<<vchoice "She fades" "Day4_Awakening_Systems" "move" "map">>
</div><<run document.body.classList.remove("scene-mode-supernatural")>>
<<set $flags.velithNameKnown to true>>
<<set $flags.succubusExplained to true>>
She regards you with something like respect.
<<say "Succubus" "Strong will. I can work with that.">>
She raises a hand. Before you can react, she touches your forehead.
Pain. Pleasure. KNOWLEDGE flooding in.
<<say "Succubus" "A gift. For your restraint.">>
<<addCorruption 5>>
When you can see again, she's still there.
<<say "Succubus" "My name is Velith. And this isn't over between us.">>
<<say "Velith" "I've marked you. Gently. You'll dream of me. And eventually...">>
She smiles.
<<say "Velith" "You'll say yes.">>
<<storyVideo "story/velith_day4_appearance/aftermath_resist">>
<div class="choice-container">
<<vchoice "She vanishes" "Day4_Awakening_Systems" "move" "map">>
</div><<run VaultUI.setBackground("reclaimed-ruins")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
The glow fades. The chamber is just stone again.
But YOU are different.
<<set $uiVisible.lustMeter to true>>
<<set $uiVisible.corruptionMeter to true>>
<div class="system-unlock-major">
<h2><<icon "crystal">> AWAKENING <<icon "crystal">></h2>
<p class="unlock-intro">Something opened inside you. You're aware of things you weren't before.</p>
<div class="unlock-grid">
<div class="unlock-item lust">
<div class="unlock-icon"><<icon "lips">></div>
<div class="unlock-label">LUST AWAKENED</div>
<div class="unlock-desc">You can feel your arousal like a physical meter. It's there. Present. Demanding.</div>
</div>
<div class="unlock-item corruption">
<div class="unlock-icon"><<icon "marked">></div>
<div class="unlock-label">CORRUPTION SENSED</div>
<div class="unlock-desc">Darkness at the edges. Not unpleasant. Just... THERE. Growing.</div>
</div>
<div class="unlock-item tension">
<div class="unlock-icon"><<icon "rapid-strikes">></div>
<div class="unlock-label">TENSION PERCEIVED</div>
<div class="unlock-desc">You notice others differently now. The energy between bodies. The pull.</div>
</div>
<div class="unlock-item ability">
<div class="unlock-icon"><<icon "dizzy">></div>
<div class="unlock-label">SEDUCTION UNLOCKED</div>
<div class="unlock-desc">New abilities in combat. You can turn desire into a weapon.</div>
</div>
</div>
</div>
<<if $flags.succubusAccepted>>
<<set $player.corruption to Math.max($player.corruption || 0, 15)>>
<<set $player.lust to Math.max($player.lust || 0, 40)>>
<<else>>
<<set $player.corruption to Math.max($player.corruption || 0, 5)>>
<<set $player.lust to Math.max($player.lust || 0, 30)>>
<</if>>
<<set $flags.seductionUnlocked to true>>
<<set $supernaturals.succubus.met to true>>
<<set $supernaturals.succubus.name to "Velith">>
<<set $arousal.player.lastRelease to $time.day>>
<<set $arousal.kira.lastRelease to $time.day>>
<<set $extremeContent.supernatural to true>>
<div class="choice-container">
<<if $flags.kiraWitnessed>>
<<vchoice "Continue" "Day4_Return_Kira_Witnessed" "move" "map">>
<<elseif $flags.kiraWaitedOutside>>
<<vchoice "Continue" "Day4_Return_Kira_Waited" "move" "map">>
<<else>>
<<vchoice "Return to the vault" "Day4_Return_Travel" "move" "house">>
<</if>>
</div><<showCharacter "kira" "right" "horrified">>
Kira is pressed against the wall at the edge of the chamber, weapon ready, clearly having HEARD everything.
<<say "Kira" "What the FUCK was that?!">>
Her eyes are wide. Scared. But also... something else.
<<say "Kira" "You... she... I heard...">>
<div class="choice-container">
<<vchoice "\"I'm sorry you saw that\"" "Day4_Kira_Apologize" "talk" "broken-heart">>
<<vchoice "\"I don't know what happened\"" "Day4_Kira_Confused" "talk" "alert">>
<<vchoice "\"We need to leave. Now.\"" "Day4_Kira_Urgent" "action" "run">>
</div><<showCharacter "kira" "right" "panicked">>
Kira bursts into the chamber, weapon drawn—
But the succubus is gone. Just you. Changed.
<<say "Kira" "I heard... sounds. And then you screamed and—">>
She stops. Stares.
<<say "Kira" "Your eyes. They're... different.">>
<<if $player.health <= 15>>
<<say "Kira" "And you're grey. You look like she drained half the blood out of you.">>
<</if>>
<<if $flags.succubusAccepted>>
<<say "Kira" "And you smell like... I don't know. Sex and lightning.">>
<</if>>
<div class="choice-container">
<<vchoice "\"I met something. Someone.\"" "Day4_Kira_TellTruth" "talk" "check">>
<<vchoice "\"I'm fine. Let's go.\"" "Day4_Kira_Deflect" "action" "check">>
</div><<showCharacter "kira" "right" "conflicted">>
<<say $player.name "I'm sorry you saw that.">>
A beat. She processes.
<<say "Kira" "Saw? I HEARD. The sounds you made. The things she said to you. The—">>
She cuts herself off, face flushed.
<<say "Kira" "What WAS that thing?">>
<<say $player.name "A succubus. A demon. She's... connected to the vault somehow.">>
<<say "Kira" "And you just... let her...">>
<<if $flags.succubusAccepted>>
<<say $player.name "I didn't have much choice. And honestly? I'm not sure I wanted one.">>
Her expression shifts. Horror mixed with something else.
<<say "Kira" "You LIKED it.">>
<<set $companions[0].trust -= 5>>
<<addTension "kira" 20>>
<<clampStat "companions[0].lust" 15>>
<<else>>
<<say $player.name "I fought it. Resisted. But she's... persistent.">>
<<say "Kira" "At least you tried.">>
<<addTrust "kira" 1>>
<<addTension "kira" 10>>
<</if>>
<<set $flags.kiraHeardEverything to true>>
<div class="choice-container">
<<vchoice "Continue" "Day4_Return_Travel" "move" "map">>
</div><<showCharacter "kira" "right" "suspicious">>
<<say $player.name "I don't know what happened. There was this... presence. Purple light. And then—">>
<<say "Kira" "Don't bullshit me.">>
Her voice is hard.
<<say "Kira" "I heard a woman's voice. I heard YOU. Those weren't sounds of confusion.">>
<<if $flags.succubusAccepted>>
She steps closer, eyes searching yours.
<<say "Kira" "Your eyes are different. You smell different. Something HAPPENED in there.">>
<<say $player.name "...Yes. Something did.">>
<<say "Kira" "And you're not going to tell me.">>
<<say $player.name "I'm still processing it myself.">>
<<set $companions[0].trust -= 10>>
<<addTension "kira" 15>>
<<else>>
<<say "Kira" "Fine. Keep your secrets.">>
She turns away.
<<say "Kira" "But if whatever that was comes back? You TELL me.">>
<<set $companions[0].trust -= 5>>
<<addTension "kira" 10>>
<</if>>
<div class="choice-container">
<<vchoice "Continue" "Day4_Return_Travel" "move" "map">>
</div><<showCharacter "kira" "right" "alert">>
<<say $player.name "We need to leave. Now.">>
You grab her arm and pull her away from the chamber.
<<say "Kira" "Hey—! What—">>
<<say $player.name "Not here. I'll explain later. Just... not here.">>
She lets you drag her, but her eyes keep darting back.
<<say "Kira" "What the hell happened in there? I heard—">>
<<say $player.name "I know what you heard. Please. Let's just go.">>
The urgency in your voice silences her. For now.
<<set $companions[0].trust -= 3>>
<<addTension "kira" 25>>
<<set $flags.kiraQuestionsDeferred to true>>
<div class="choice-container">
<<vchoice "Continue" "Day4_Return_Travel" "move" "map">>
</div><<showCharacter "kira" "right" "listening">>
<<say $player.name "I met something. Someone. A succubus.">>
<<say "Kira" "A what?">>
<<say $player.name "A demon. Female. Very... persuasive.">>
Kira's expression shifts through several emotions. Fear. Confusion. And... jealousy?
<<say "Kira" "The screaming. The sounds. She was...">>
<<say $player.name "Yes.">>
<<if $flags.succubusAccepted>>
<<say "Kira" "And you let her.">>
It's not quite a question.
<<say $player.name "It's... complicated. She's connected to me now. To whatever's awakening.">>
<<say "Kira" "So you're what—demon-fucked now?">>
<<say $player.name "Something like that.">>
<<addTrust "kira" 1>>
<<addTension "kira" 20>>
<<clampStat "companions[0].lust" 10>>
<<else>>
<<say "Kira" "But you fought her off?">>
<<say $player.name "For now. She'll be back. She made that clear.">>
<<addTrust "kira" 2>>
<<addTension "kira" 10>>
<</if>>
<<set $flags.kiraKnowsAboutVelith to true>>
<div class="choice-container">
<<vchoice "Continue" "Day4_Return_Travel" "move" "map">>
</div><<showCharacter "kira" "right" "frustrated">>
<<say $player.name "I'm fine. Let's go.">>
<<if $player.health <= 15>>
<<say "Kira" "Fine? FINE? You can barely stand! And your eyes are glowing!">>
<<else>>
<<say "Kira" "Fine? FINE? Your eyes are glowing!">>
<</if>>
You blink. Touch your face.
<<say $player.name "They're... what?">>
<<say "Kira" "Faintly. Purple. And you're—">>
She gestures at you vaguely.
<<say "Kira" "Different. Something's different.">>
<<say $player.name "We can discuss this at the vault. Not here.">>
She doesn't like it, but she follows.
<<set $companions[0].trust -= 8>>
<<addTension "kira" 20>>
<<set $flags.kiraQuestionsDeferred to true>>
<div class="choice-container">
<<vchoice "Continue" "Day4_Return_Travel" "move" "map">>
</div><<run VaultUI.setBackground("reclaimed-day")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<<set $flags.succubusFirstEncounterComplete to true>>
Your body feels different. Lighter. Heavier. MORE.
Every sensation is amplified. The heat of the sun. The texture of wind. The pulse of your own blood.
<<if $flags.succubusAccepted>>
You can still FEEL her. Like she left part of herself behind. Or took part of you.
<</if>>
<<if $player.health <= 15>>
Your legs shake under you. She drank more than lust from you: there is almost nothing left. Every step home will cost you.
<p class="system-info warning"><<icon "health">> Health <<= $player.health>>: badly hurt. Eat, rest and sleep at the vault.</p>
<</if>>
<<set $currentLocation to "overgrown_ruins">>
<<set $journey.returnToPassage to "Day4_Evening_Return">>
<div class="choice-container">
<<vchoice "Begin the walk back" "Journey_Start_Return" "move" "run">>
</div><<run VaultUI.setBackground("commons")>>
<<run VaultUI.setTimeOfDay("evening")>>
The vault feels smaller than before. The walls closer.
<<if $expeditionCompanion === "kira" && ($flags.kiraWitnessed || $flags.kiraWaitedOutside)>>
<<showCharacter "kira" "right" "thoughtful">>
The journey back was quiet. Too much to process.
Now you're both in the commons, the weight of what happened still hanging between you.
<<say "Kira" "I keep thinking about it. What I saw. What you told me.">>
A pause.
<<say "Kira" "I don't know how to feel about any of this.">>
<div class="choice-container">
<<vchoice "\"Neither do I\"" "Day4_Evening_StillProcessing" "talk" "broken-heart">>
<<vchoice "\"We'll figure it out\"" "Day4_Evening_Together" "talk" "hand">>
<<vchoice "\"I need to rest\"" "Day4_Night_Sleep" "move" "night">>
</div>
<<elseif $companions[0]>>
<<showCharacter "kira" "right" "suspicious">>
Kira is in the commons when you return. She looks up—and freezes.
<<say "Kira" "What happened to you?">>
She can tell something's different. Your eyes. Your presence. Something has changed.
<<say "Kira" "You look... different. And you smell like—">>
She stops, unsure how to describe it.
<div class="choice-container">
<<vchoice "Tell her everything" "Day4_Evening_TellKira" "talk" "check">>
<<vchoice "Tell her some of it" "Day4_Evening_PartialTruth" "talk" "talk">>
<<vchoice "\"Not tonight. Please.\"" "Day4_Evening_Defer" "talk" "check">>
</div>
<<else>>
You're alone with what happened.
<div class="choice-container">
<<vchoice "Rest" "Day4_Night_Sleep" "move" "night">>
</div>
<</if>>You tell her.
All of it. The demon. Velith. What she offered. What you chose.
Kira listens without interrupting.
When you're done, silence.
<<say "Kira" "So. Demons are real.">>
<<say $player.name "Apparently.">>
<<say "Kira" "And one just... wants you. Specifically.">>
<<say $player.name "Yes.">>
<<storyVideo "story/mv_day4_evening/tell_kira">>
She processes.
<<say "Kira" "Fuck.">>
<<addTrust "kira" 1>>
<<addTension "kira" 10>>
<<set $flags.kiraKnowsEverything to true>>
<<journalAdd "Told Kira everything when I got back. She could tell something was different just by looking at me. The change is visible now." "relationship">>
<div class="choice-container">
<<vchoice "Continue" "Day4_Night_Sleep" "move" "map">>
</div><<storyVideo "story/mv_day4_evening/partial_truth">>
You tell her some of it.
The ruins. The purple glow. Meeting... something.
<<say "Kira" "Something? What kind of something?">>
You hesitate.
<<say $player.name "I'm not sure how to explain it.">>
She frowns.
<<say "Kira" "You're hiding something. But okay.">>
<<addTrust "kira" 1>>
<<addTension "kira" 5>>
<div class="choice-container">
<<vchoice "Continue" "Day4_Night_Sleep" "move" "map">>
</div><<say $player.name "Not tonight. Please.">>
She studies you for a long moment.
<<say "Kira" "Fine. But we're talking about this. Soon.">>
<<set $companions[0].trust -= 5>>
<<addTension "kira" 15>>
<div class="choice-container">
<<vchoice "Continue" "Day4_Night_Sleep" "move" "map">>
</div><<say $player.name "Neither do I.">>
You both stand there, the silence heavy but not hostile.
<<say "Kira" "Everything I thought I knew about the world... demons are real. Magic is real. And you...">>
She looks at you. Really looks.
<<say "Kira" "You're changing. I can see it.">>
<<say $player.name "Does that scare you?">>
<<say "Kira" "A little. But I'm still here, aren't I?">>
<<addTrust "kira" 1>>
<<addTension "kira" 5>>
<<journalAdd "Kira said she's scared of what's happening to me. But she's still here. That means something." "relationship">>
<div class="choice-container">
<<vchoice "Rest" "Day4_Night_Sleep" "move" "night">>
</div><<say $player.name "We'll figure it out. Together.">>
Something in her expression softens.
<<say "Kira" "Together. Yeah.">>
<<storyVideo "story/mv_day4_evening/together">>
She reaches out, squeezes your hand briefly.
<<say "Kira" "Whatever's happening to you... you don't have to face it alone.">>
<<addTrust "kira" 1>>
<<addAffection "kira" 1>>
<<journalAdd "Kira held my hand tonight. Said I don't have to face this alone. After everything she saw today... I didn't expect that." "relationship">>
<div class="choice-container">
<<vchoice "Rest" "Day4_Night_Sleep" "move" "night">>
</div><<run VaultUI.setBackground("vault-entrance-interior")>>
<<run VaultUI.setTimeOfDay("night")>>
<<set $journey.returnToPassage to null>>
<<set $journey.blackoutArrival to null>>
<<set $flags.day4NearDeathEvening to true>>
<<set $flags.day4NearDeathKira to ($journey.deathWithKira ? (($flags.watchedKiraPostDeath || $flags.choseKiraForAbuse || $flags.watchedKiraGangRape || $flags.watchedKiraRaiderUse) ? "cold" : "along") : (setup.kiraUp() ? "home" : ""))>>
<<set _ndK to $flags.day4NearDeathKira>>
The last mile home is the longest walk of your life.
Most of it is gone already. You keep the pieces that hurt: the rubble walls of the yard rising out of the dark, the vault door so cold it bites, your fingers refusing to close on the handle the first time. <<if $clothing.player.bottom <= 0>>The night air finds every inch of you. Whoever dragged you off the road took everything, and you stagger into the vault the way you came into the world: naked, filthy, shaking.<<else>>The rag knotted around your hips is stiff with dust and old blood. It's the only thing they left you.<</if>>
<<if _ndK is "along">>
<<storyVideo "story/day4_near_death/kira_holds_you_up">>
<<if _storyClip is "fa7c450330ae">>Kira hauls the door open with her shoulder and catches you by both shoulders when your knees go, holding you up on her own. She's still in the scorched turnout jacket she scavenged on the road, open over what's left of her clothes, and a bruise is coming up purple along her jaw. She hasn't let go of you since the road.<<else>>Kira hauls the door open with her shoulder, her other arm locked around your bare waist, ready to catch you if you go down. She's in what's left of her clothes, scraps knotted over her tits and hips, and a bruise is coming up purple along her jaw. She hasn't let go of you since the road.<</if>>
<<say "Kira" "Almost there. Don't you dare pass out in the doorway. I'm not dragging you another fucking foot.">>
<<elseif _ndK is "cold">>
<<if setup.kiraAllowsUse()>>
Kira comes through the door after you, walking like she can still feel every one of them. Inside she gives you a long look, a crooked, worn-out grin and a shove toward the lamplight.
<<say "Kira" "Somebody's waiting up for you. I need a wash and a bed before my legs give out too. ...Don't die tonight, vault boy. I'm not done with you.">>
Then she's gone into the dark of the corridor.
<<else>>
Kira comes through the door after you and doesn't touch you. She hasn't touched you since the road. Inside she steps around you like something dead in the hallway, and she's gone into the dark of the corridor before you can say her name.
<</if>>
<</if>>
The lamps in the entrance hall are lit. Someone was waiting up.
<<showCharacter "groundskeeper" "left" "serious">>
The Groundskeeper stands inside the door with a lantern, and he looks at you for a long time: the dust caked into the cuts, the blood dried black down your side, the way you hold your ribs.
<<say "Groundskeeper" "You are late. And you are bleeding on my floor.">>
<<say $player.name "Nice to see you too.">>
<<say "Groundskeeper" "The vault woke me an hour ago. It does not usually trouble itself over one man.">>
<<if _ndK is "home">>
<<storyVideo "story/day4_near_death/kira_runs_in">>
<<if _storyClip is "31205a26b4bb">>Then bare feet slapping on concrete. Kira is already running, vest and sleep shorts, hair loose, tearing down the corridor toward the noise like she expected raiders at the door. At the corner she skids, turns, and stops dead.<<elseif _storyClip is "f9da07a31b6f">>Then bare feet on concrete. Kira comes down the corridor fast, crop top and sleep shorts, hair loose, fists balled like she expected raiders at the door, and she stops dead.<<else>>Then bare feet slapping on concrete. Kira comes around the corner at a run, vest and sleep shorts, hair loose, a knife in her fist like she expected raiders at the door, and she stops dead.<</if>>
<<showCharacter "kira" "right" "horrified">>
<<say "Kira" "Holy shit.">>
She takes all of you in at once. The blood. The dust. <<if $clothing.player.bottom <= 0>>Your cock hanging out in the lamplight, and she doesn't even blink at it.<<else>>The rag that's all you're wearing.<</if>> None of it seems to land except your face.
<<say "Kira" "You walked out of here this morning with a pack and a knife. You come back with nothing. Who did this? Who the fuck did this to you?">>
<<say $player.name "The road.">>
<<say "Kira" "Don't. Don't be funny right now.">>
<</if>>
Your knees pick that moment to quit. The floor comes up at you<<if _ndK is "home" or _ndK is "along">>, and Kira gets under your arm before it arrives, swearing in your ear the whole way down<<else>>, and a dry old hand closes on your arm, much stronger than it has any right to be<</if>>.
<div class="choice-container">
<<vchoice "Let them get you to the medical bay" "Day4_Evening_NearDeath_Medical" "move" "medical">>
</div><<run VaultUI.setBackground("medical")>>
<<run VaultUI.setTimeOfDay("night")>>
<<set _ndK to $flags.day4NearDeathKira>>
<<set $player.health to Math.max($player.health, 25)>>
<<if $vault.food gt 0>><<set $vault.food -= 1>><</if>>
<<set $player.hunger to Math.min($player.maxHunger, $player.hunger + 40)>>
<<showCharacter "groundskeeper" "left" "serious">>
<<say "Groundskeeper" "Sit. Do not speak. I have stitched worse men than you, and most of them lived.">>
He pours something clear into the gash along your ribs and the world goes white at the edges. It smells like a still and burns like one. Then the needle, in and out, the thread drawing your skin together with a tug you feel all the way down in your teeth.
<<if _ndK is "home" or _ndK is "along">>
Kira holds your hand through it. Not gently. She grips like she's trying to keep you from going anywhere, her thumb digging into your knuckles every time you flinch.
<</if>>
<<if $flags.succubusAccepted>>
Halfway through, his needle stops. He tips your chin up toward the lamp with one finger and looks into your eyes, first one, then the other.
<<say "Groundskeeper" "There is something else in you tonight. Something that was not there this morning.">>
<<if _ndK is "home">>Kira looks from him to you and back. She doesn't ask. Yet.<</if>>
He goes back to the stitches without another word.
<</if>>
<<if _ndK is "home" or _ndK is "along">>
<<say "Groundskeeper" "Feed him. Small portions. If he brings it back up, begin again.">>
<<showCharacter "kira" "right" "worried">>
<<storyVideo "story/day4_near_death/kira_feeds_you">>
<<if _storyClip is "e864443a8cc2">>Kira is back before he has finished washing his hands, with a wet rag and a bowl of rehydrated protein so hot it steams. She drags a stool to the cot with her foot and scrubs the grime off your face before she lets you eat.<<elseif _storyClip is "eb1262b17a09">>Kira is back before he has finished washing his hands, with a bowl of rehydrated protein so hot it steams and a spoon stuck upright in it. She drags a stool to the cot with her foot, and while you eat her hand keeps moving up and down your arm, as if checking you are all still there.<<elseif _storyClip is "4b0a3255980c">>Kira is back before he has finished washing his hands, with a bowl of rehydrated protein so hot it steams. She drags a stool to the cot with her foot and feeds you the first mouthfuls off her fingers, because your hands are shaking too much for the spoon.<<elseif _storyClip is "d0b70e9f08b2">>Kira is back before he has finished washing his hands, with a bowl of rehydrated protein so hot it steams and a spoon stuck upright in it. She drags a stool to the cot with her foot, sits, and takes your hand again before she lets you have the spoon.<<else>>Kira is back before he has finished washing his hands, with a bowl of rehydrated protein so hot it steams and a spoon stuck upright in it. She drags a stool to the cot with her foot.<</if>>
<<say "Kira" "Open.">>
<<say $player.name "I can feed my—">>
<<say "Kira" "You can't hold a cup. I watched you try. Open. I'm not asking.">>
So you open, and she feeds you like a baby bird, scraping the spoon on your bottom lip every time, glaring at you between mouthfuls as if the bowl was your idea. It's salty and gluey and the best thing you've ever eaten.
<<if _ndK is "along">>
<<say "Kira" "I dragged your stupid ass the last mile. You know that? You kept telling me you were fine. You were fine like a dropped egg is fine.">>
<<else>>
<<say "Kira" "You're grey. You look like something dug you up. Eat the whole thing, or I swear to god I'll hold your nose and pour it in.">>
<</if>>
<<addTrust "kira" 1>>
<<else>>
He feeds you himself, a spoon of thin broth at a time, as patient and as warm as a man oiling a hinge.
<<if _ndK is "cold">>
<<if setup.kiraAllowsUse()>>
<<say "Groundskeeper" "Your companion has gone to wash. She was smiling. I did not ask why.">>
He sets the spoon down.
<<say "Groundskeeper" "I suspect I do not want to know.">>
<<else>>
<<say "Groundskeeper" "Your companion has gone to her room. She did not say why. I did not ask.">>
He sets the spoon down.
<<say "Groundskeeper" "I suspect you know.">>
<</if>>
<</if>>
<</if>>
<p class="system-info"><<icon "health">> Stitched: Health <<= $player.health>>. <<icon "food">> Hunger +40 (vault food −1)</p>
<<say "Groundskeeper" "Now wash. Infection takes more men than raiders do, and I am too old to dig.">>
<div class="choice-container">
<<vchoice "Get the road off you" "Day4_Evening_NearDeath_Wash" "action" "shower">>
</div><<run VaultUI.setBackground("bathroom")>>
<<run VaultUI.setTimeOfDay("night")>>
<<set _ndK to $flags.day4NearDeathKira>>
<<if _ndK is "home" or _ndK is "along">>
<<showCharacter "kira" "right" "focused">>
Kira steers you into the bathroom with a hand flat between your shoulder blades.
<<say "Kira" "You'll go down on the tile and crack your skull, and then I have to explain that to him. In.">>
<<storyVideo "story/day4_near_death/shower_wash">>
<<if _storyClip is "06e8682a6c0d">>She cranks the shower on and shoves you under it. <<if _ndK is "along">>She doesn't bother stripping what's left of her own clothes, just steps in after you in the knotted scraps and lets them soak through.<<else>>She doesn't bother taking off her vest, just steps in after you and lets it soak through.<</if>> Kira looks at the colour of the water and laughs, once, short and shaky, her soaked vest plastered to her. The first water off you comes away brown. Then pink, swirling down the drain from the cuts. The hot water finds every scrape you didn't know you had, and you hiss through your teeth.<<elseif _storyClip is "5dbc728a14c1">>She cranks the shower on and shoves you under it. <<if _ndK is "along">>She doesn't bother stripping what's left of her own clothes, just steps in after you in the knotted scraps and lets them soak through.<<else>>She strips down to her bra and steps in after you, too tired to care what gets wet.<</if>> The first water off you comes away brown. Then pink, swirling down the drain from the cuts. The hot water finds every scrape you didn't know you had, and you hiss through your teeth.<<else>>She cranks the shower on and shoves you under it. <<if _ndK is "along">>She doesn't bother stripping what's left of her own clothes, just steps in after you in the knotted scraps and lets them soak through.<<else>>She doesn't bother taking off her vest, just steps in after you and lets it soak through.<</if>> The first water off you comes away brown. Then pink, swirling down the drain from the cuts. The hot water finds every scrape you didn't know you had, and you hiss through your teeth.<</if>>
<<say "Kira" "Yeah, yeah. Hold still.">>
She works a brick of grey vault soap into a rag and scrubs you like a pot. Your face, rough enough to sting. Your neck, your shoulders, around the stitches with a care she'd deny under torture. Down your chest. Down your stomach. Down.
Her hand slows on your thigh. Your cock has decided, all on its own, that it isn't dead. It thickens under the hot water and the brisk drag of the rag, and in about three seconds it's standing up hard and red between you, bobbing a few inches from her wet stomach.
She looks at it. Then at you.
<<say "Kira" "Seriously? You were dead an hour ago.">>
<<say $player.name "Not all of me, apparently.">>
<<if $flags.capturedTogether || $flags.kiraHurtOnRoad>>
Something closes in her face. Whatever today was for her, she isn't going there.
<<say "Kira" "Wash your own dick.">>
She slaps the rag into your palm and leaves the water running. The door clicks shut behind her.
<<else>>
<<if _storyClip is "06e8682a6c0d">><<set _w26clip to _storyClip>><<set _w26fam to _storyFamily>><<storyVideo "story/day4_near_death/wash_3_laughs">><<set _w26a to _storyClip>><<set _storyClip to _w26clip>><<set _storyFamily to _w26fam>>
<</if>>She snorts, and the snort turns into a laugh she doesn't want, the first laugh since <<if _ndK is "along">>the road<<else>>you came through the door<</if>>. Water runs off her chin. <<if _storyClip is "5dbc728a14c1" && _ndK isnot "along">>Her bra is plastered to her tits, nipples standing hard against the wet fabric<<else>>Her vest is plastered to her tits, nipples standing hard against the wet cotton<</if>>, and she doesn't seem to notice, or doesn't care that you do.
<<say "Kira" "Unbelievable. Half your blood's on the road and the other half went straight to that.">>
She slaps the rag into your palm.
<<say "Kira" "Wash your own dick. I'm not that kind of nurse.">>
But she doesn't move toward the door.
<<addTension "kira" 10>>
<</if>>
<<else>>
You wash alone.
The water comes off you brown, then pink. You stand under it with your forehead against the tile until the shaking stops, and then until the water runs cold, and the road still won't come all the way off.
<</if>>
<div class="choice-container">
<<if _ndK is "home" || (_ndK is "along" && !$flags.capturedTogether && !$flags.kiraHurtOnRoad)>>
<<vchoice "\"Stay.\"" "Day4_Evening_NearDeath_Watch" "intimate" "eye">>
<<vchoice "Let her go" "Day4_Evening_NearDeath_Bed" "move" "night">>
<<else>>
<<vchoice "Bed" "Day4_Evening_NearDeath_Bed" "move" "night">>
<</if>>
</div><<run VaultUI.setBackground("bathroom")>>
<<showCharacter "kira" "right" "flushed">>
<<say $player.name "Stay.">>
She leans back against the tiles across from you, just out of the spray, and folds her arms over her soaked vest.
<<say "Kira" "I'm not touching it.">>
<<say $player.name "I didn't ask you to.">>
<<say "Kira" "Good. But I'm not leaving you alone in here either. You pass out with your hand on your dick and drown in two inches of water, I am putting that on your grave.">>
So you take your cock in your own soapy fist with her watching, and the grey lather makes it slick from root to swollen head. Every stroke pulls at the stitches in your side. You don't care. You're alive, and it pounds through you with your heartbeat, your balls heavy and tight, the hot water drumming on your shoulders while you jerk yourself slow and then not slow at all.
Kira watches all of it. Her eyes don't go to your face much.
<<if $companions[0].tension >= 60>>
<<storyVideo "story/day4_near_death/shower_watch_touch">>
<<if _storyClip is "2b0e7a8228e0">>Her arms come uncrossed. One hand drifts down her stomach and stops at the waistband of her <<if $flags.day4NearDeathKira is "along">>scraps<<else>>shorts<</if>>, and stays there, then slides under, and her lips part. She slides down the tiles until she is sitting in the water on the floor. She rubs herself in small, tight circles, glaring at you as if this is also your fault.<<else>>Her arms come uncrossed. One hand drifts down her stomach and stops at the waistband of her <<if $flags.day4NearDeathKira is "along">>scraps<<else>>shorts<</if>>, and stays there, then slides under, and her lips part. She rubs herself in small, tight circles, glaring at you as if this is also your fault.<</if>>
<<say "Kira" "Don't look at me. Look at— fuck. Keep going.">>
You can hear it under the water, how wet she is, and that's what does it.
<<else>>
<<storyVideo "story/day4_near_death/shower_watch">>
She chews her lip. Her thighs press together under the soaked cotton and she shifts her weight, and the only sound she makes is her breathing, quicker than it should be for someone just standing there.
<</if>>
You come hard enough that your knees buckle and your free hand slaps the tile. Thick white ropes of it spatter the wall and the floor between you, one landing close enough to her bare foot that she flinches and doesn't step away, and the water carries all of it to the drain.
She pushes off the tiles.
<<say "Kira" "That never happened.">>
At the door she stops, one hand on the frame, and doesn't look back.
<<say "Kira" "Glad you're not dead, idiot.">>
<<set $player.lust to 0>><<run setup.playerReleased()>>
<<addTension "kira" 15>>
<<set $flags.kiraCaughtShower to true>>
<div class="choice-container">
<<vchoice "Bed" "Day4_Evening_NearDeath_Bed" "move" "night">>
</div><<run VaultUI.setBackground("quarters")>>
<<run VaultUI.setTimeOfDay("night")>>
<<set _ndK to $flags.day4NearDeathKira>>
<<redressFromStores "player">>
<<showCharacter "groundskeeper" "left" "serious">>
The Groundskeeper is waiting outside the bathroom with a bundle over his arm: a shirt and trousers from the stores, washed so many times they have no colour left, and a pair of shorts folded on top.
<<say "Groundskeeper" "Arms.">>
You try to do it yourself. Your fingers won't close on the buttons, so in the end he does it, the way he stitched you: briskly, without comment, one sleeve and then the other, the trousers held open for you to step into while you lean on the wall. He buttons the shirt to your throat and tugs the collar straight.
<<say "Groundskeeper" "There. A man should not meet the night naked if he can help it. Sleep. I will look at the stitches in the morning.">>
His lantern goes away down the corridor, and the dark closes in behind it.
<p class="system-info"><<icon "shirt">> Dressed: a shirt and trousers from the vault stores</p>
Your own bunk. A coarse vault blanket that smells of dust and soap. Your body is one long ache from scalp to heel, and it's the best ache you've ever had, because dead men don't hurt.
<<if _ndK is "along" && ($flags.kiraWitnessed || $flags.kiraWaitedOutside)>>
<<showCharacter "kira" "right" "thoughtful">>
<<storyVideo "story/day4_near_death/bed_talk">>
Kira doesn't knock. She sits on the end of your bunk in a dry shirt with her knees pulled up, as if she's been sitting there for an hour already.
<<if $flags.succubusAccepted>><<say "Kira" "This afternoon a demon fucked you in a ruin. Tonight I watched you stop breathing in the dirt. I keep trying to work out which one scared me more.">><<else>><<say "Kira" "This afternoon a demon tried to eat you in a ruin. Tonight I watched you stop breathing in the dirt. I keep trying to work out which one scared me more.">><</if>>
A pause.
<<say "Kira" "I don't know how to feel about any of this.">>
<<journalAdd "Blacked out on the road home from the ruins. Woke up stripped, robbed, half dead. Kira got us both back. The Groundskeeper stitched me; she fed me with a spoon and swore at me the whole time." "story">>
<div class="choice-container">
<<vchoice "\"Neither do I\"" "Day4_Evening_StillProcessing" "talk" "broken-heart">>
<<vchoice "\"We'll figure it out\"" "Day4_Evening_Together" "talk" "hand">>
<<vchoice "\"I need to rest\"" "Day4_Night_Sleep" "move" "night">>
</div>
<<elseif _ndK is "home" || _ndK is "along">>
<<showCharacter "kira" "right" "suspicious">>
<<storyVideo "story/day4_near_death/bed_talk">>
Kira sits down on the end of your bunk in a dry shirt, knees up, arms around them. She has the look of someone who has been saving a question all night.
<<if previous() is "Day4_Evening_NearDeath_Watch">><<say "Kira" "Okay. You're stitched, you're fed, you're clean, and you've had your fun. Now. What happened out there?">><<else>><<say "Kira" "Okay. You're stitched, you're fed, you're clean. Now. What happened out there?">><</if>>
<<say $player.name "The road.">>
<<say "Kira" "Say 'the road' one more time.">>
She leans in, close enough that the lamp catches your face.
<<say "Kira" "Your eyes are wrong. The Groundskeeper saw it too. Raiders don't do that.">>
<<journalAdd "Blacked out on the road home from the ruins. Woke up stripped, robbed, half dead. The Groundskeeper stitched me. Kira fed me with a spoon and swore at me the whole time." "story">>
<div class="choice-container">
<<vchoice "Tell her everything" "Day4_Evening_TellKira" "talk" "check">>
<<vchoice "Tell her some of it" "Day4_Evening_PartialTruth" "talk" "talk">>
<<vchoice "\"Not tonight. Please.\"" "Day4_Evening_Defer" "talk" "check">>
</div>
<<else>>
<<if _ndK is "cold">>
<<if setup.kiraAllowsUse()>>
Through the wall you can hear Kira not sleeping. The creak of her bunk, slow, over and over, her breath catching, and once, muffled in her pillow, a long, low moan. Then, at last, her snoring.
<<else>>
Through the wall you can hear Kira not sleeping. The creak of her bunk every time she turns over, and once a sound that might be crying, or might be her hitting the wall. Then nothing at all, which is worse.
<</if>>
<<else>>
The vault hums around you, old machines breathing in the dark.
<</if>>
<<journalAdd "Blacked out on the road home from the ruins. Woke up stripped, robbed, half dead. The Groundskeeper stitched me up and told me I was bleeding on his floor." "story">>
<div class="choice-container">
<<vchoice "Sleep" "Day4_Night_Sleep" "move" "night">>
</div>
<</if>><<run VaultUI.setBackground("quarters")>>
<<run VaultUI.setTimeOfDay("night")>>
You lie in the dark.
Sleep comes quickly. Too quickly.
<<if $flags.succubusFirstEncounter>>
<<if $flags.succubusAccepted>>
<<journalAdd "I fucked a succubus today. Velith. A real demon - horns, wings, the whole thing. She offered power in exchange for sex and I said yes. Best decision or worst mistake of my life, still not sure." "story">>
<<journalAdd "She marked me. I can still feel it - like she's inside me somehow. Something's different now. Something's waking up." "discovery">>
<<else>>
<<journalAdd "A succubus tried to seduce me today. Velith. Gorgeous, terrifying, clearly wanted to drain me dry. I turned her down. She didn't seem pissed - more like she enjoys the chase." "story">>
<</if>>
<<if $flags.kiraWitnessed>>
<<journalAdd "Kira heard me with the succubus. Heard everything. The way she looked at me after - I can't tell if she's disgusted or jealous. Maybe both." "relationship">>
<</if>>
<<if $flags.supernaturalAwakening>>
<<journalAdd "Magic is real. I can feel it now - power humming under my skin. The world is so much stranger than I thought." "discovery">>
<</if>>
<</if>>
And when it does—
<div class="choice-container">
<<vchoice "Dream..." "Day4_Dream_Velith" "move" "night">>
</div><<run VaultUI.setBackground("prelude/dream-void")>>
<<run VaultUI.setTimeOfDay("supernatural")>>
<<run document.body.classList.add("scene-mode-dream")>>
The dreamscape.
Purple fog. Symbols floating in void. A space that's HERS.
<<showCharacter "velith" "center" "knowing">>
<<storyVideo "story/velith_dream_visits/day4_dream_velith" "" "characters/succubus/story/dream_tease">>
She's waiting. Of course she is.
<<say "Velith" "Did you think one meeting would be enough?">>
<<if _storyClip is "c918fb805d1c">>She lounges back in a chair of shadow, suspended in dream-space, harness over her bare breasts, legs spread for you.<<elseif _storyClip is "503edaabab27">>She stands in the red dark of the dream-space, a candle held under her chin, letting you take all of her in.<<elseif _storyClip is "a0e8457829bb">>She wears a new shape tonight: red hair, no horns, black stockings, cum still glazing her face and bare breasts. She kneels in the dream-space, then rises and lets you look.<<elseif _storyClip is "3a9d089ace93">>She wears another body tonight, platinum hair and curling ram's horns, and she crawls toward you across the dream-space, smiling, reaching for you.<<elseif _storyClip is "ada3d9cb948e">>She's close tonight, in a borrowed blonde body with curling horns, fingers hooked in your shirt. Then she blows you a kiss.<<elseif _storyClip is "837c313f26ef">>She looms over you in the dream-space, red-haired and red-horned tonight, black latex on her skin, looking down at you.<<else>>She's draped across nothing, suspended in dream-space.<</if>>
<<if $flags.day4NearDeathEvening>><<say "Velith" "You nearly died today with my seed still in you. Careless. I don't share, not even with the dirt.">><</if>>
<<say "Velith" "I'm in you now. A seed planted. And seeds... grow.">>
<<if _storyClip is "c918fb805d1c">>She takes your dream-hand and guides it over her: across her bare breasts, down between her spread thighs. She sighs against you. You shudder.<<else>>She traces a finger down your dream-body. You shudder.<</if>>
<<say "Velith" "I'll visit often. Teach you. SHAPE you. Until you're ready.">>
<<say $player.name "Ready for what?">>
<<say "Velith" "To become what you were always meant to be.">>
<<set $supernaturals.succubus.canVisitDreams to true>>
<<set $supernaturals.succubus.lastDreamVisit to 4>>
<em>Morning will come. But she'll be back.</em>
<div class="choice-container">
<<vchoice "Wake" "Day4_Wake_Day5" "move" "sunrise">>
</div><<set $time.day to setup.storyDay(5, true, 7)>>
<<setTime 7 0>>
<<goto "Day5_Morning_Wake">><<run setup.markStoryDay(5)>>
<<set $time.day to setup.storyDay(5, false, 7)>>
<<setTime 7 0>>
<<set $player.health to Math.min($player.maxHealth, $player.health + 30)>>
<<set $player.energy to $player.maxEnergy>>
<<if $mapExploration>>
<<set $mapExploration.revealed.raider_camp to true>>
<</if>>
<<morningDecay>>
<<updateExhibitionism>>
<<if $arousal.player.daysAtHigh >= 2>>
<<include "Morning_BlueBalls">>
<</if>>
<<set $currentLocation to "quarters">>
<<run VaultUI.setBackground("quarters")>>
<<run VaultUI.setTimeOfDay("dawn")>>
You wake aroused.
The dream lingers. Velith's touch. Her voice promising dark delights.
Your body is responding to memories that aren't quite real.
<<if $player.corruption gte 10>>
<div class="choice-container">
<<vchoice "Check the mirror" "Day5_Morning_Mirror" "examine" "search">>
</div>
<<else>>
<div class="choice-container">
<<vchoice "Get dressed" "Day5_Morning_Commons" "move" "armor">>
</div>
<</if>><<storyVideo "story/day5_morning/mirror">>
<<if _storyClip is "9795adbecec4">>The glass above the basin took a hit long before the vault took you in. Cracks run out from it in a web of silver lines. The only light is the grey strip leaking through the door gap, and it cuts your face down the middle: one half gone to shadow, one eye lit and staring back.
The mirror shows... you.<<else>>The mirror shows... you.<</if>>
Mostly.
<<if $player.corruption gte 10>>
But there's something. Your eyes catch the light differently. A hint of violet at the edges when you turn your head?
Or is it your imagination?
<<set $flags.firstTransformationHint to true>>
<</if>>
You look tired. But also ALIVE. More than before.
<div class="choice-container">
<<vchoice "Face the day" "Day5_Morning_Commons" "move" "sunrise">>
</div><<run VaultUI.setBackground("commons")>>
<<run VaultUI.setTimeOfDay("morning")>>
<<if $companions[0]>>
<<showCharacter "kira" "right" "cautious">>
Kira's at the table. She looks up when you enter.
<<if $flags.kiraKnowsEverything>>
<<say "Kira" "Sleep okay?">>
There's weight to the question.
<<say $player.name "Complicated.">>
She nods. Understanding without needing details.
<<addTension "kira" 5 "He's different since yesterday. Why is that attractive?">>
<<else>>
<<say "Kira" "You look... better. More rested.">>
<<say $player.name "Slept like the dead.">>
Lie. But easier than truth.
<</if>>
<</if>>
<div class="choice-container">
<<vchoice "Eat breakfast" "Day5_Morning_GroundsKeeperSummons" "move" "eating">>
</div><<run VaultUI.setBackground("commons")>>
<<run VaultUI.setTimeOfDay("morning")>>
The Groundskeeper enters the commons. His mechanical eye whirs, focusing on you.
<<showCharacter "groundskeeper" "left" "serious">>
<<say "Groundskeeper" "I need to speak with you. Privately.">>
His tone brooks no argument.
<<if $companions[0]>>
Kira looks between you.
<<say "Kira" "I can leave if—">>
<<say "Groundskeeper" "Please.">>
She goes. But not without a concerned glance your way.
<</if>>
<div class="choice-container">
<<vchoice "Follow him" "Day5_Groundskeeper_Study" "move" "run">>
</div><<run VaultUI.setBackground("archives")>>
<<run VaultUI.setTimeOfDay("afternoon")>>
His quarters. Maps. Books. Strange instruments.
<<showCharacter "groundskeeper" "center" "knowing">>
He gestures to a chair. You sit.
<<say "Groundskeeper" "You encountered one of them.">>
Not a question.
<<say $player.name "How do you—">>
<<say "Groundskeeper" "I can smell it on you. The mark she left.">>
He moves to the window.
<<say "Groundskeeper" "A succubus. A pleasure demon. They feed on life force through... intimacy.">>
<<set $flags.velithNatureTold to true>>
<div class="choice-container">
<<vchoice "Continue" "Day5_Groundskeeper_Truth" "move" "map">>
</div><<say "Groundskeeper" "The Cataclysm didn't just break the world. It broke BOUNDARIES. Between realms. Between possible and impossible.">>
<<say "Groundskeeper" "Things that were myth became real. And they're hungry.">>
<<say $player.name "Why me? Why could I see her when others can't?">>
He turns. Mechanical eye pulsing.
<<say "Groundskeeper" "Because you have potential. The same reason you survived the Reclaimed. The same reason you found this vault.">>
A pause.
<<say "Groundskeeper" "The same reason SHE marked you before you were even born.">>
<div class="choice-container">
<<vchoice "\"She? Who?\"" "Day5_Groundskeeper_She" "talk" "alert">>
<<vchoice "\"What am I becoming?\"" "Day5_Groundskeeper_Becoming" "talk" "alert">>
<<vchoice "\"Can I fight it?\"" "Day5_Groundskeeper_Fight" "talk" "alert">>
</div><<say $player.name "She? Who?">>
<<say "Groundskeeper" "The Convergence. The entity at the center of the Cataclysm.">>
<<say "Groundskeeper" "The things that came through, the hooded ones: hers.">>
<<storyVideo "story/mv_day5_gk/she">>
<<if _storyClip is "24575bf568c6">>He pulls out an old book. Opens to a page with a symbol that makes your eyes water. The lamp shows you almost nothing on the paper, just a faint mark that slides away every time you try to look straight at it.<<else>>He pulls out an old book. Opens to a page with a symbol that makes your eyes water.<</if>>
<<say "Groundskeeper" "Not a demon. Not a god. Something... OTHER. She orchestrated the breaking. And she marked certain individuals.">>
<<say "Groundskeeper" "You're one of them. A seed planted in human flesh. Waiting to bloom.">>
<div class="choice-container">
<<vchoice "Continue" "Day5_Groundskeeper_Becoming" "move" "map">>
</div><<say $player.name "What am I becoming?">>
<<say "Groundskeeper" "That depends on the choices you make.">>
<<storyVideo "story/mv_day5_gk/becoming">>
He taps the book.
<<say "Groundskeeper" "The corruption you feel? It's not evil. It's CHANGE. Transformation. You're becoming something more than human.">>
<<say "Groundskeeper" "The succubus accelerated it. But it was always there.">>
<<say "Groundskeeper" "You'll develop... abilities. The power to seduce, to corrupt, to CHANGE others. Eventually, physical transformation.">>
<<set $flags.corruptionExplained to true>>
<div class="choice-container">
<<vchoice "Continue" "Day5_Groundskeeper_Fight" "move" "map">>
</div><<say $player.name "Can I fight it? Stop it?">>
He's quiet for a long moment.
<<say "Groundskeeper" "No. It's already begun. You can slow it, perhaps. But not stop it.">>
<<say "Groundskeeper" "The question isn't IF you'll change. It's HOW you'll change. What you'll become.">>
<<storyVideo "story/mv_day5_gk/fight">>
He closes the book.
<<say "Groundskeeper" "I can teach you. Help you control it. There's a hidden library section. Knowledge that might help.">>
<<set $flags.groundskeeperOfferedHelp to true>>
<div class="choice-container">
<<vchoice "Accept his help" "Day5_Library_Discover" "talk" "hand">>
</div><<run VaultUI.setBackground("archives")>>
<<run VaultUI.setTimeOfDay("afternoon")>>
The Groundskeeper leads you deep into the archives.
To a wall that looks like all the others.
He pulls a lever hidden behind a false book spine.
The wall SHIFTS. Grinds open.
<<say "Groundskeeper" "The previous inhabitants collected dangerous knowledge. Most couldn't read it. But you...">>
<<storyVideo "story/day5_hidden_library/discover">>
<<if _storyFamily is "sf_cg_day5_hidden_library_01">>Beyond: a long aisle between shelves of strange tomes, pale light burning at its far end. He goes in first. By the time you step through he is already walking back up the aisle toward you, a black shape against the glow, his shadow stretched long across the dusty floor. Off to one side, a table with crystals. Symbols that pulse with power.<<else>>Beyond: shelves of strange tomes. A table with crystals. Symbols that pulse with power.<</if>>
<<set $vault.hiddenLibraryOpen to true>>
<div class="choice-container">
<<vchoice "Enter" "Day5_Library_Explore" "action" "door-handle">>
</div><<run VaultUI.setBackground("archives")>>
<<run VaultUI.setTimeOfDay("afternoon")>>
<<run VaultUI.hideCharacter("kira")>>
<<storyVideo "story/day5_hidden_library/explore">>
The hidden library hums with energy.
<<if _storyFamily is "sf_cg_day5_hidden_library_01">>Books in languages you shouldn't understand. But somehow, you CAN. The Groundskeeper slides one ancient volume, black with a red edge, back into its place and presses it flush with his palm.<<else>>Books in languages you shouldn't understand. But somehow, you CAN.<</if>>
<<say "Groundskeeper" "The mark makes you receptive. You can learn things normal humans can't.">>
He points to a table with crystals.
<<say "Groundskeeper" "Try picking one up.">>
<div class="choice-container">
<<vchoice "Touch the crystal" "Day5_Library_Crystal" "action" "crystal">>
</div><<run VaultUI.setBackground("archives")>>
<<run VaultUI.hideCharacter("kira")>>
Your fingers brush the largest crystal.
LIGHT.
Purple energy crackles up your arm. Not painful. INTENSE.
<<run document.body.classList.add("scene-mode-supernatural")>>
Power floods through you. You can FEEL the potential.
<<say "Groundskeeper" "As I thought. You can channel it.">>
<<run setup.giveItem("focusing_crystal_raw", 1)>>
<div class="item-gained">
<div class="item-image-small"><img src="assets/images/items/focusing_crystal_raw.webp" alt="Raw Focusing Crystal"></div>
Raw Focusing Crystal acquired
</div>
<<say "Groundskeeper" "It's raw. Unformed. Like you. But with training...">>
He doesn't finish. Doesn't need to.
<<set $player.magic += 5>>
<<set $flags.day5LibraryComplete to true>>
<<run document.body.classList.remove("scene-mode-supernatural")>>
<div class="choice-container">
<<vchoice "Return to the commons" "Vault_Hub" "move" "house">>
<<vchoice "Head straight to quarters to rest" "Day5_Evening_Reflection" "move" "night">>
</div><<run VaultUI.setBackground("quarters")>>
<<run VaultUI.setTimeOfDay("evening")>>
Alone in your quarters. Processing.
Demons are real. You're changing. There's a hidden library full of forbidden knowledge.
Your life was simpler not long ago.
<<if $companions[0] && $flags.kiraKnowsEverything>>
<div class="choice-container">
<<vchoice "Find Kira" "Day5_Evening_Kira" "move" "search">>
</div>
<<else>>
<div class="choice-container">
<<vchoice "Sleep" "Day5_Night_Dream" "move" "night">>
</div>
<</if>><<run VaultUI.setBackground("commons")>>
<<run VaultUI.setTimeOfDay("evening")>>
<<showCharacter "kira" "right" "concerned">>
You find Kira in the commons, cleaning her weapon.
She looks up.
<<say "Kira" "Hey.">>
<<say $player.name "Hey.">>
Silence. But not uncomfortable.
<<say "Kira" "The Groundskeeper talked to you.">>
<<say $player.name "Yeah.">>
<<say "Kira" "About what you're... becoming?">>
<div class="choice-container">
<<vchoice "\"I'm still me. That won't change.\"" "Day5_Kira_StillMe" "talk" "broken-heart">>
<<vchoice "\"I don't know what I'm becoming.\"" "Day5_Kira_DontKnow" "talk" "alert">>
<<vchoice "\"Are you afraid of me?\"" "Day5_Kira_Afraid" "talk" "broken-heart">>
<<vchoice "\"It's not a big deal. Just some old books.\"" "Day5_Kira_Downplay" "talk" "talk">>
<<vchoice "\"He was just checking on me. Nothing important.\"" "Day5_Kira_Lie" "talk" "check">>
</div><<say $player.name "I'm still me. That won't change.">>
<<say "Kira" "You sure about that?">>
No. You're not.
She sees it on your face.
<<say "Kira" "Hey. Whatever happens... you're still the guy who opened the door for me.">>
She stands. Closer now.
<<say "Kira" "Demon powers or not. You're still YOU.">>
<<addTrust "kira" 2>>
<<addAffection "kira" 1>>
<<addTension "kira" 10>>
<div class="choice-container">
<<vchoice "Continue" "Day5_Night_Dream" "move" "map">>
</div><<storyVideo "story/mv_day5/kira_dont_know">>
<<say $player.name "I don't know what I'm becoming.">>
The admission hangs between you.
<<say "Kira" "That's honest, at least.">>
She sets down her weapon. Leans against the table.
<<say "Kira" "Look. I've seen a lot of weird shit in the Reclaimed. Mutations. Raiders who eat human flesh. Things that used to be people.">>
<<say "Kira" "But you're still... you. Right now. That counts for something.">>
<<say $player.name "And if I stop being me?">>
<<say "Kira" "Then I'll deal with it. But not before.">>
There's steel in her voice. A promise and a threat.
<<addTrust "kira" 1>>
<<addTension "kira" 5>>
<div class="choice-container">
<<vchoice "Continue" "Day5_Night_Dream" "move" "map">>
</div><<say $player.name "Are you afraid of me?">>
She doesn't answer immediately. That's answer enough.
<<say "Kira" "A little. Yeah.">>
The honesty stings.
<<say "Kira" "But I'm also afraid of raiders, mutants, starvation, and dying alone in the dust. Fear's just... background noise now.">>
<<storyVideo "story/mv_day5/kira_afraid">>
She meets your eyes.
<<say "Kira" "I'm more afraid of what happens if I lose the only person I trust out here.">>
<<say $player.name "I'm not going anywhere.">>
<<say "Kira" "You'd better not.">>
The air between you is charged. She's closer than she was.
<<addTrust "kira" 2>>
<<addAffection "kira" 2>>
<<addTension "kira" 15>>
<div class="choice-container">
<<vchoice "Continue" "Day5_Night_Dream" "move" "map">>
</div><<say $player.name "It's not a big deal. Just some old books.">>
<<say "Kira" "Old books?">>
She doesn't look convinced.
<<say $player.name "Yeah. The Groundskeeper has this hidden library. Stuff from before the Cataclysm. Interesting, but nothing... dangerous.">>
<<say "Kira" "Right.">>
Her tone is flat. She knows you're minimizing.
<<say "Kira" "Look, I get it. You don't want me to worry. But I'm not stupid.">>
She stands, gathering her weapon.
<<say "Kira" "When you're ready to tell me the truth, I'll be here. But don't treat me like I can't handle it.">>
<<set $companions[0].trust -= 1>>
<<addTension "kira" 10>>
<<set $flags.downplayedToKira to true>>
<div class="choice-container">
<<vchoice "Continue" "Day5_Night_Dream" "move" "map">>
</div><<say $player.name "He was just checking on me. Nothing important.">>
<<say "Kira" "Checking on you.">>
She stares at you. Long and hard.
<<say "Kira" "He pulled me out of the room. Said he needed to speak with you PRIVATELY. And now you're telling me it was nothing?">>
<<say $player.name "He just wanted to make sure I was settling in okay.">>
The lie tastes bitter.
<<say "Kira" "Bullshit.">>
Her voice is cold.
<<say "Kira" "I don't know what happened with that demon. I don't know what you're becoming. But I KNOW when I'm being lied to.">>
She turns away.
<<say "Kira" "When you're ready to trust me, let me know.">>
<<set $companions[0].trust -= 3>>
<<addTension "kira" 20>>
<<set $flags.liedToKira to true>>
<<set $flags.kiraKnowsYouLied to true>>
<div class="choice-container">
<<vchoice "Continue" "Day5_Night_Dream" "move" "map">>
</div><<if $vault.libraryAccessed>>
<<journalAdd "The Groundskeeper showed me the library today. Ancient texts, forbidden knowledge. He told me about what I'm becoming. About the others before me who walked this path." "discovery">>
<</if>>
<<if $flags.previousDwellerHint>>
<<journalAdd "Others came before me. Some of them changed. Some of them didn't survive the change. Am I going to be different? Can I control this?" "reflection">>
<</if>>
<<if $flags.kiraKnowsEverything>>
<<journalAdd "Kira knows now. What I am. What I'm becoming. She's still here. That means more than I can say." "relationship">>
<</if>>
<<if $player.corruption >= 10>>
<<journalAdd "I can feel the corruption spreading. It doesn't hurt - that's what scares me. It feels natural. Like I was always meant to be this." "reflection">>
<</if>>
<<run VaultUI.setBackground("prelude/dream-void")>>
<<run VaultUI.setTimeOfDay("supernatural")>>
<<run document.body.classList.add("scene-mode-dream")>>
Sleep brings her. Of course it does.
<<showCharacter "velith" "center" "pleased">>
<<storyVideo "characters/succubus/story/dream_tease">>
<<say "Velith" "You've been learning. Good.">>
<<if _storyClip is "a0e8457829bb">>Tonight it's red hair and no horns, bare to the waist, black garters and stockings, somebody's cum still shining on her chin and tits. She cups them in both hands and lets you look.<<elseif _storyClip is "3a9d089ace93">>She crawls up the bed toward you on her hands, pale hair and painted face and curling horns, and blows you a kiss off metal-tipped fingers.<<elseif _storyClip is "ada3d9cb948e">>She has you backed against white tiles, one finger hooked in your shirt, big curling horns over a painted face. Then she lets go and blows you a kiss.<<elseif _storyClip is "837c313f26ef">>She looms over you in red latex, red hair, red horns, the whole dream burning red around her.<<elseif _storyClip is "503edaabab27">>A candle flame under her chin. Then she steps back into the red dark and lets you look: horns, harness, corset, gloves to the elbow. Her own shape tonight.<<else>>She circles you in the dream-space.<</if>>
<<say "Velith" "The Groundskeeper told you some truth. But not all of it.">>
<<say $player.name "What didn't he tell me?">>
<<say "Velith" "That the transformation can be... pleasurable. If you embrace it.">>
Her hand trails across your dream-body.
<<say "Velith" "Sleep well, sweet thing. Tomorrow brings new awakenings.">>
<div class="choice-container">
<<vchoice "Wake" "Day5_Wake_Day6" "move" "sunrise">>
</div><<set $time.day to setup.storyDay(6, true, 7)>>
<<setTime 7 0>>
<<goto "Day6_Morning_Wake">><<run setup.markStoryDay(6)>>
<<set $time.day to setup.storyDay(6, false, 7)>>
<<setTime 7 0>>
<<set $player.health to Math.min($player.maxHealth, $player.health + 30)>>
<<set $player.energy to $player.maxEnergy>>
<<morningDecay>>
<<updateExhibitionism>>
<<if $arousal.player.daysAtHigh >= 2>>
<<include "Morning_BlueBalls">>
<</if>>
<<set $currentLocation to "quarters">>
<<run VaultUI.setBackground("quarters")>>
<<run VaultUI.setTimeOfDay("dawn")>>
You wake with your hand between your legs.
The dream was intense. Velith showing you things. Possibilities.
Your body is betraying you.
<<clampStat "player.lust" 20>>
<div class="choice-container">
<<vchoice "Get up" "Day6_Hallway_Brush" "move" "sunrise">>
</div><<run VaultUI.setBackground("commons")>>
<<run VaultUI.setTimeOfDay("morning")>>
<<if $companions[0]>>
<<showCharacter "kira" "right" "neutral">>
Kira's making coffee. Real coffee, somehow.
<<say "Kira" "Morning.">>
Her eyes linger on you a moment longer than necessary.
<<addTension "kira" 5>>
<<say "Kira" "Plans for today?">>
<div class="choice-container">
<<vchoice "\"Training. Want to help?\"" "Day6_Training_Together" "action" "attack">>
<<vchoice "\"Might head to the Reclaimed\"" "Day6_Wasteland_Option" "action" "map">>
<<vchoice "\"Nothing specific\"" "Day6_Relaxed_Day" "action" "broken-heart">>
</div>
<</if>><<run VaultUI.setBackground("commons")>>
<<run VaultUI.setTimeOfDay("morning")>>
The hallway is narrow.
You're heading to the commons. Kira's coming from quarters.
You meet in the middle.
<<showCharacter "kira" "center" "surprised">>
You turn sideways to let her pass. She does the same.
<<storyVideo "story/day6/hallway_brush">>
<<if _storyClip is "eaa60ece06c8">>Your hand almost grazes her hip. She looks up at you. You freeze.<<else>>Your hand grazes her hip. She freezes. You freeze.<</if>>
<<addTension "kira" 10>>
Time stretches.
<<if $companions[0].tension >= 30>>
<em>Something is building between you. You're both aware of it now.</em>
<</if>>
<<say "Kira" "Sorry, I— the hall is narrow.">>
<<say $player.name "Yeah. Narrow.">>
Neither of you moves for another heartbeat.
Then she slips past. The warmth of her lingers.
<div class="choice-container">
<<vchoice "Continue to commons" "Day6_Morning_Commons" "move" "map">>
</div><<say $player.name "Might head to the Reclaimed. Could use more supplies.">>
<<say "Kira" "Want company?">>
<div class="choice-container">
<<vchoice "\"Sure, let's go together\"" "Day6_Expedition_Together" "action" "companion">>
<<vchoice "\"I'll go solo today\"" "Day6_Expedition_Solo" "action" "run">>
<<vchoice "\"Actually, let's stay and train\"" "Day6_Training_Together" "action" "attack">>
</div><<set $expeditionCompanion to "kira">>
<<set $combat.companionInCombat to "kira">>
<<set $companions[0].present to true>>
<<goto "WorldMap_View">><<set $expeditionCompanion to "">>
<<set $combat.companionInCombat to null>>
<<if $companions[0]>><<set $companions[0].present to false>><</if>>
<<goto "WorldMap_View">><<run VaultUI.setBackground("commons")>>
<<run VaultUI.setTimeOfDay("afternoon")>>
You decide to take it easy today.
The vault feels more like home now. Less like a cage.
<<set $player.energy to Math.min($player.maxEnergy, $player.energy + 20)>>
<div class="choice-container">
<<vchoice "Explore the vault" "Vault_Hub" "move" "house">>
<<vchoice "Rest until evening" "Day6_Evening_Meal" "move" "night">>
</div><<run VaultUI.setBackground("training_yard")>>
<<run VaultUI.setTimeOfDay("afternoon")>>
The training room. Makeshift. But functional.
<<showCharacter "kira" "center" "focused">>
<<say "Kira" "Alright. Show me your stance.">>
You demonstrate. She circles you. Adjusting your position.
Her hands on your hips. Your shoulders. Lingering.
<<addTension "kira" 10>>
<<say "Kira" "You're too stiff. Relax.">>
<<say $player.name "Hard to relax with you this close.">>
The words are out before you can stop them.
She freezes. Then continues adjusting your form.
<<say "Kira" "Good. Use that tension.">>
<<if $companions[0].tension gte 40>>
Her breath is warm on your neck.
<<say "Kira" "We should— I mean—">>
She steps back. Flustered.
<<say "Kira" "Let's... practice strikes.">>
<em>Something is building between you. You both know it.</em>
<</if>>
<div class="choice-container">
<<vchoice "Continue training" "Day6_Training_End" "action" "attack">>
</div>An hour later, you're both sweating.
<<showCharacter "kira" "right" "flushed">>
<<say "Kira" "Not bad. You're getting better.">>
She tosses you a rag. Your fingers brush when you catch it.
Neither of you pulls away immediately.
<<addTension "kira" 5>>
<div class="choice-container">
<<vchoice "Evening approaches" "Day6_Evening_Meal" "move" "night">>
</div><<run VaultUI.setBackground("commons")>>
<<run VaultUI.setTimeOfDay("evening")>>
Dinner. Scavenged rations made almost palatable.
<<if $companions[0]>>
<<showCharacter "kira" "right" "thoughtful">>
<<if $companions[0].tension gte 50>>
Kira keeps glancing at you. Looking away when you notice.
<<say "Kira" "So. That demon. Velith.">>
<<say $player.name "What about her?">>
<<say "Kira" "Does she... visit your dreams?">>
A loaded question.
<div class="choice-container">
<<vchoice "\"Yes. Every night.\"" "Day6_Dreams_Honest" "talk" "check">>
<<vchoice "\"Sometimes.\"" "Day6_Dreams_Vague" "talk" "talk">>
<<vchoice "\"Why do you ask?\"" "Day6_Dreams_Deflect" "talk" "alert">>
</div>
<<else>>
Quiet evening. Normal. Almost.
<div class="choice-container">
<<vchoice "Rest" "Day6_Night_Sleep" "move" "night">>
</div>
<</if>>
<</if>><<say $player.name "Yes. Every night.">>
<<say "Kira" "And you... do things? With her?">>
She's not looking at you.
<<say $player.name "It's complicated. They're dreams, but also...">>
<<say "Kira" "Real enough.">>
She finally meets your eyes.
<<say "Kira" "Does that... satisfy you?">>
<<addTension "kira" 10>>
<div class="choice-container">
<<link `'<span class="choice-button intimate"><span class="gi gi-broken-heart gi-large"></span><span class="label">"No. Not really."</span></span>'`>><<set $flags.day6NotReally to true>><<goto "Day6_Tension_Build">><</link>>
<<vchoice "\"It's different with dreams\"" "Day6_Tension_Build" "talk" "talk">>
</div><<say $player.name "Sometimes.">>
<<say "Kira" "Sometimes.">>
A pause. Her jaw tightens.
<<say "Kira" "That's not really an answer.">>
<<say $player.name "It's complicated.">>
<<say "Kira" "Is it?">>
She's watching you. Measuring.
<<say "Kira" "Because you looked pretty content this morning. Like you'd slept well.">>
<<set $companions[0].jealousy += 1>>
<<say $player.name "Kira—">>
<<say "Kira" "Do you... want her?">>
<<addTension "kira" 5>>
<div class="choice-container">
<<vchoice "\"It's not that simple.\"" "Day6_Tension_Build" "talk" "talk">>
<<vchoice "\"Do you want me to?\"" "Day6_Tension_Build" "intimate" "broken-heart">>
</div><<say $player.name "Why do you ask?">>
Kira's eyes narrow.
<<say "Kira" "Don't deflect.">>
<<say $player.name "I'm not—">>
<<say "Kira" "Yes, you are. You always do this.">>
She stands. Paces.
<<say "Kira" "I just... I hear things sometimes. At night. You talk in your sleep.">>
<<set $companions[0].jealousy += 1>>
<<addTension "kira" 5>>
She turns back to you.
<<say "Kira" "You say her name. Velith. And you sound...">>
She doesn't finish.
<div class="choice-container">
<<vchoice "\"What do I sound like?\"" "Day6_Tension_Build" "talk" "talk">>
<<vchoice "\"I'm sorry.\"" "Day6_Tension_Build" "intimate" "broken-heart">>
</div><<if $flags.day6NotReally>>
<<say $player.name "No. Not really.">>
<<say "Kira" "No?">>
<<say $player.name "Dreams are... intense. But they're not real. Not REAL real.">>
<</if>>
<<run delete $flags.day6NotReally>>
You're looking at each other now. The space between you feels charged.
<<say "Kira" "Do you want... real?">>
Her voice is barely above a whisper.
<<addTension "kira" 15>>
<<if $companions[0].tension gte 65>>
<<storyVideo "story/kira_day6_first_kiss/tension_build">>
<<if _storyFamily is "sf_cg_kira_day6_first_kiss_04">>She stands. Steps in close, right up against your chair, hands on your shoulders. Your hands find her hips.<<else>>She stands. Closer now.<</if>>
<<say "Kira" "Because I—">>
The moment stretches. Electric.
<div class="choice-container">
<<vchoice "Kiss her" "Day6_Kiss" "intimate" "lips">>
<<vchoice "\"I want you\"" "Day6_Confess" "intimate" "broken-heart">>
<<vchoice "Let the moment pass" "Day6_Retreat" "action" "broken-heart">>
</div>
<<else>>
She stands.
<<say "Kira" "I should... get some rest.">>
The moment breaks. Not yet.
<div class="choice-container">
<<vchoice "Sleep" "Day6_Night_Sleep" "move" "night">>
</div>
<</if>><<say $player.name "I want you.">>
The words hang in the air.
Kira's breath catches. Her eyes search yours.
<<say "Kira" "You... you mean that?">>
<<say $player.name "Every word.">>
<<storyVideo "story/kira_day6_first_kiss/confess">>
She closes the distance. Her lips find yours.
<div class="choice-container">
<<vchoice "..." "Day6_Kiss_Continue" "intimate" "affection">>
</div><<storyVideo "story/kira_day6_first_kiss/kiss" "" "characters/kira/room_kiss">>
<<if _storyFamily is "sf_cg_kira_day6_first_kiss_04">>You pull her in by the hips, press your face to her stomach for one breath - then rise out of the chair and close the distance.<<else>>You close the distance.<</if>>
Your lips meet hers.
<div class="choice-container">
<<vchoice "..." "Day6_Kiss_Continue" "intimate" "affection">>
</div>She melts into you.
<<storyVideo "story/kira_day6_first_kiss/kiss_continue">>
Her hands find your hair. Your arms circle her waist.
It's not like Velith. This is REAL. Solid. Human heat and desperate want.
<<performSexAct "kiss_deep">>
<<addTension "kira" -30>>
<<addAffection "kira" 3>>
<<addTrust "kira" 2>>
When you finally break apart, you're both breathless.
<<say "Kira" "I've been wanting to do that for days.">>
<<say $player.name "Me too.">>
<<say "Kira" "But not tonight. Not yet. I need... to be sure.">>
She kisses you again. Softer.
<<say "Kira" "Soon. I promise.">>
<<set $flags.kiraFirstKiss to true>>
<div class="choice-container">
<<vchoice "Sleep alone, but not lonely" "Day6_Night_Sleep" "move" "night">>
</div>You let the moment pass.
<<say $player.name "Kira...">>
<<say "Kira" "No, it's fine. I just... misread things.">>
<<say $player.name "You didn't. I just—">>
<<say "Kira" "Get some rest.">>
She leaves before you can explain.
<<addTension "kira" 10>>
<<set $companions[0].trust -= 1>>
<div class="choice-container">
<<vchoice "Sleep" "Day6_Night_Sleep" "move" "night">>
</div><<run VaultUI.setBackground("quarters")>>
<<run VaultUI.setTimeOfDay("night")>>
<<if $flags.kiraFirstKiss>>
<<journalAdd "I kissed Kira today. Finally. All that tension between us just snapped. Her lips were softer than I expected, hungrier than I thought she'd be." "relationship">>
<<journalAdd "Don't know what this means for us. Don't care. I want more." "reflection">>
<<elseif $companions[0] && $companions[0].affection > 40>>
<<journalAdd "Spent the day with Kira. Training, talking. She's getting under my skin in ways I didn't expect. Keep catching myself staring at her." "relationship">>
<<else>>
<<journalAdd "Another day in the vault. Kira keeps her distance. Can't blame her - we barely know each other. Still, she's here. That counts for something." "story">>
<</if>>
<<if $flags.sleptWithKira>>
<<journalAdd "Fucked Kira. Finally. All that tension, all those looks - we tore into each other like animals. I can still taste her, still feel where her nails dug in. Everything's different now." "relationship">>
<</if>>
Sleep.
And dreams.
<div class="choice-container">
<<vchoice "Dream..." "Day6_Dream_Velith" "move" "night">>
</div><<run VaultUI.setBackground("prelude/dream-void")>>
<<run VaultUI.setTimeOfDay("supernatural")>>
<<run document.body.classList.add("scene-mode-dream")>>
<<showCharacter "velith" "center" "amused">>
<<storyVideo "story/velith_dream_visits/day6_dream_velith" "" "characters/succubus/story/dream_tease">>
<<if _storyClip is "3d8d8d26703f">>She's back in the pale-haired costume from the nights before you knew her name: black paint down her face, chains swinging across her breasts, horns, a dead black tree at her shoulder in the violet dark.<</if>>
<<if $flags.kiraFirstKiss>>
<<say "Velith" "You kissed her.">>
Not a question. She KNOWS.
<<say "Velith" "How sweet. Human affection.">>
She's not jealous. Entertained.
<<say "Velith" "Don't worry, sweet thing. I'm not the possessive type. Fuck whoever you want.">>
<</if>>
<<say "Velith" "Just remember who owns your SOUL.">>
<<if _storyClip is "3d8d8d26703f">><<say "Velith" "Oh, don't stare at the hair. I change faces the way you change your mind.">>
She laughs, throws her hands wide, and fades.<<else>>She laughs. Fades.<</if>>
<div class="choice-container">
<<vchoice "Morning comes" "Day6_Wake_Day7" "move" "sunrise">>
</div><<set $time.day to setup.storyDay(7, true, 7)>>
<<setTime 7 0>>
<<goto "Day7_Morning_Wake">><<run setup.markStoryDay(7)>>
<<set $time.day to setup.storyDay(7, false, 7)>>
<<setTime 7 0>>
<<set $player.health to Math.min($player.maxHealth, $player.health + 30)>>
<<set $player.energy to $player.maxEnergy>>
<<morningDecay>>
<<updateExhibitionism>>
<<if $arousal.player.daysAtHigh >= 2>>
<<include "Morning_BlueBalls">>
<</if>>
<<set $currentLocation to "quarters">>
<<run VaultUI.setBackground("quarters")>>
<<run VaultUI.setTimeOfDay("dawn")>>
Another day dawns.
A week since you arrived at the vault. Everything has changed.
<<if $flags.kiraFirstKiss>>
You can still feel her lips on yours.
<</if>>
<div class="choice-container">
<<vchoice "Get up" "Day7_Morning_Commons" "move" "sunrise">>
</div><<run VaultUI.setBackground("commons")>>
<<run VaultUI.setTimeOfDay("morning")>>
<<if $companions[0]>>
<<showCharacter "kira" "right" "neutral">>
Kira's already up. Geared for travel.
<<if $flags.kiraFirstKiss>>
<<say "Kira" "Morning.">>
A small smile. Shared secret.
<<say "Kira" "I was thinking. Reclaimed run today? Together?">>
<<addTension "kira" 5>>
<<else>>
<<say "Kira" "Heading out today. Want company?">>
<</if>>
<div class="choice-container">
<<vchoice "\"Let's do it\"" "Day7_Expedition_Together" "action" "hand">>
<<vchoice "\"I have things to do here first\"" "Vault_Hub" "move" "house">>
<<vchoice "\"I'll head out on my own\"" "Day7_Expedition_Solo" "action" "run">>
</div>
<<else>>
<div class="choice-container">
<<vchoice "Start the day" "Vault_Hub" "move" "house">>
</div>
<</if>><<say $player.name "Let's do it.">>
<<say "Kira" "Good.">>
<<set $expeditionCompanion to "kira">>
<div class="choice-container">
<<vchoice "Prepare and leave" "Day7_Wasteland_Travel" "move" "sunrise">>
</div><<set $expeditionCompanion to "">>
<<set $combat.companionInCombat to null>>
<<if $companions[0]>><<set $companions[0].present to false>><</if>>
<<goto "WorldMap_View">><<run VaultUI.setBackground("reclaimed-day")>>
<<run VaultUI.setTimeOfDay("afternoon")>>
Two hours into the wastes.
Heat. Dust. The usual.
<<if $expeditionCompanion === "kira">>
<<showCharacter "kira" "right" "alert">>
Then Kira raises a fist. Stop signal.
<<say "Kira" "Movement. Three figures. Green cloth.">>
Faction colors. Verdant Covenant.
<<say "Kira" "They've seen us.">>
<</if>>
<div class="choice-container">
<<vchoice "Approach cautiously" "Day7_Faction_Encounter" "action" "run">>
</div><<run VaultUI.setBackground("reclaimed-day")>>
<<run VaultUI.setTimeOfDay("afternoon")>>
<<storyVideo "story/mv_day7/faction_encounter">>
Three scouts in green. Verdant Covenant.
The lead scout — a woman, thirties, confident — holds up a hand. Not threatening. Yet.
<<showCharacter "faction_scout" "center" "neutral">>
<<say "Scout" "You're from the vault?">>
Interest in her voice.
<<say "Scout" "Lady Selene will want to meet you.">>
She looks you over. Appraising. Something flickers in her expression.
<<say "Scout" "Of course, nothing's free in the Reclaimed. Passage to our territory requires... payment.">>
A meaningful pause.
<<say "Scout" "We can take it in supplies...">>
Her eyes lock with yours.
<<say "Scout" "...or other currencies.">>
<div class="choice-container">
<<vchoice "Continue" "Day7_Faction_SexCurrency_Intro" "move" "map">>
</div><<say $player.name "What other currencies?">>
The scout smiles.
<<say "Scout" "Flesh. Service. Pleasure.">>
She steps closer.
<<say "Scout" "The Covenant values... connection. Bodies working together is just another form of trade.">>
<<say "Scout" "A night's company for safe passage. An hour's entertainment for information.">>
<<say "Scout" "Lady Selene especially values... talented individuals.">>
<<set $flags.sexCurrencyIntroduced to true>>
<<set $extremeContent.sexCurrency to true>>
<<if $expeditionCompanion === "kira">>
<<showCharacter "kira" "left" "shocked">>
Kira's expression is carefully neutral. But you can read her tension.
<</if>>
<div class="choice-container">
<<vchoice "\"I might be interested in that arrangement\"" "Day7_Faction_Consider" "intimate" "lips">>
</div><<say $player.name "I might be interested in that arrangement.">>
The scout's smile widens.
<<say "Scout" "Oh, you're going to be POPULAR.">>
<<storyVideo "story/day7_scout/aftermath">>
<<if _storyClip is "f3a82e144106">>She plants herself in front of you, a sun-warmed boulder at her back, and the smile drops off her face like she's put it away for later. Now she's weighing you, the way a trader weighs a sack of salvage.<<else>>She circles you. Predatory.<</if>>
<<say "Scout" "Tell you what. A... demonstration. You and me. Right now. If I'm satisfied, I'll arrange an introduction to Lady Selene.">>
<<if $expeditionCompanion === "kira">>
<<say "Kira" "You can't be serious—">>
<<say "Scout" "Your friend can watch. Or join. We're flexible.">>
Kira's face flushes.
<</if>>
<div class="choice-container">
<<vchoice "\"Alright. Let's do this.\"" "Day7_Scout_Sex" "intimate" "lips">>
</div><<sexScene "faction_scout" "transactional" "business" "wasteland">>
<<showCharacter "faction_scout" "center" "expectant">>
<<say "Scout" "Smart choice.">>
<<storyVideo "story/day7_scout/sex">>
<<if _storyClip is "c415ed99916b">>She nods at a gap between two big boulders past the ruins, where the grass grows long and nobody on the path could see in.<<else>>She gestures to a sheltered alcove in the ruins nearby.<</if>>
<<say "Scout" "Privacy. Somewhat.">>
<<if $expeditionCompanion === "kira">>
<<say "Kira" "I'll... keep watch.">>
Her voice is strained.
<<addTension "kira" 15 "I shouldn't feel jealous. But I do.">>
<</if>>
<<sexPhase "buildup">>
<<if _storyClip is "c415ed99916b">>The scout is all business. She leans back against the boulder, drags her top down under her tits and lays her arms up over her head on the stone, leaving you to help yourself. Her nipples go hard under your thumbs.<<else>>The scout is professional. Efficient. She undresses without ceremony.<</if>>
<<performSexAct "undress_partial">>
<<say "Scout" "Let's see what you've got.">>
This isn't romance. It's TRANSACTION.
<<sexPhase "action">>
<<performSexAct "touch_intimate">>
<<say "Scout" "Not bad. You know what you're doing.">>
<div class="choice-container">
<<if _storyClip is "c415ed99916b">><<vchoice "\"Taste me\"" "Day7_Scout_Oral" "intimate" "lips">><<else>><<vchoice "\"Let me taste you\"" "Day7_Scout_Oral" "intimate" "lips">><</if>>
<<vchoice "\"Get on your knees\"" "Day7_Scout_Dominant" "intimate" "crown">>
<<vchoice "\"Quick and dirty\"" "Day7_Scout_Fast" "intimate" "rapid-strikes">>
</div><<storyVideo "story/day7_scout/oral__oral">>
<<if _storyClip is "b1470ed23e85">>
<<say $player.name "Taste me.">>
<<say "Scout" "Mmm. Fair trade.">>
She drops to her knees at the foot of the rock, palms flat in the grass.
<<performSexAct "oral_receive">>
She takes your cock into her mouth and works down it an inch at a time, lips dragging, tongue flat and wet along the underside, like she's checking the goods before she signs for them.
Halfway down she stops and looks up at you, cheeks hollowed, reading your face the way she read your gear.
<<performSexAct "oral_receive">>
She pulls off with a wet pop, sticks her tongue out flat and holds it there, hands spread wide at her sides, waiting on you.
<<sexPhase "climax">>
<<performSexAct "climax_player">>
You shoot your load onto her tongue. She keeps it out until you're done, then swallows.
<<say "Scout" "Tasted. We're square.">>
<<else>>
<<say $player.name "Let me taste you.">>
<<say "Scout" "Mmm. Generous.">>
She leans back against the wall, spreading her legs.
<<performSexAct "oral_give">>
You kneel. Your mouth finds her.
She's already wet. Aroused from the negotiation.
<<say "Scout" "Oh... you know what you're doing...">>
<<performSexAct "oral_give">>
Her hand tangles in your hair. Not forcing. Guiding.
<<sexPhase "climax">>
<<performSexAct "climax_partner">>
She shudders against the wall, biting back a moan.
<<say "Scout" "Very... generous.">>
<</if>>
<div class="choice-container">
<<vchoice "Aftermath" "Day7_Scout_Aftermath" "move" "map">>
</div><<say $player.name "Get on your knees.">>
She smirks.
<<say "Scout" "Giving orders? I like it.">>
She drops to her knees. Professional. Expectant.
<<storyVideo "story/day7_scout/oral__dominant">>
<<performSexAct "oral_receive">>
Her mouth is skilled. Practiced. This is clearly not her first transaction.
<<say $player.name "Good girl.">>
The words make her moan around you.
<<sexPhase "climax">>
<<performSexAct "climax_player">>
You finish. She swallows. Looks up with a satisfied smile.
<<say "Scout" "Payment received.">>
<<set $player.dominance += 3>>
<div class="choice-container">
<<vchoice "Aftermath" "Day7_Scout_Aftermath" "move" "map">>
</div><<say $player.name "Quick and dirty.">>
<<storyVideo "story/day7_scout/oral__fast">>
<<if _storyClip is "ba94cfaa0a06">>
<<say "Scout" "My favorite. Mouth's quicker. Less to clean up.">>
She's on her knees against the rock before you can argue.
<<performSexAct "oral_receive">>
She wraps a fist around your cock and sucks the head, fist and mouth pumping together in one hard, practised rhythm.
She's collected payment this way before, and it shows: she sucks harder the moment your hips twitch, eases off when you get close, then takes you deeper just to prove she can.
<<performSexAct "oral_receive">>
Then she lets go, braces both palms on your thighs and bobs hard and deep, knees grinding into the grass.
<<sexPhase "climax">>
<<performSexAct "climax_player">>
You come hard in her mouth and she doesn't even blink. She swallows, gets up, and is already brushing the grass off her knees.
<<else>>
<<say "Scout" "My favorite.">>
<<performSexAct "position_doggy">>
<<performSexAct "penetrate">>
She braces against the wall. You grip her hips.
<<performSexAct "thrust_fast">>
It's fast. Primal. Efficient.
She knows how to move. How to clench. Making it GOOD while keeping it professional.
<<sexPhase "climax">>
<<performSexAct "climax_together">>
You finish together. Quick. Satisfying.
<</if>>
<div class="choice-container">
<<vchoice "Aftermath" "Day7_Scout_Aftermath" "move" "map">>
</div><<sexPhase "aftermath">>
<<showCharacter "faction_scout" "center" "satisfied">>
She dresses quickly. All business again.
<<say "Scout" "Not bad at all. Lady Selene will DEFINITELY want to meet you.">>
She hands you a token. Green metal, carved with symbols.
<<run setup.giveItem("verdant_token", 1)>>
<<say "Scout" "Show that at the gate. They'll let you in.">>
<<say "Scout" "Welcome to the new economy, stud.">>
<<set $factions.verdant.discovered to true>>
<<set $player.sexCurrencyUsed += 1>>
<<if $expeditionCompanion === "kira">>
<div class="choice-container">
<<vchoice "Kira is waiting" "Day7_Kira_Reaction" "move" "map">>
</div>
<<else>>
<div class="choice-container">
<<vchoice "Return to vault" "Day7_Return" "move" "house">>
</div>
<</if>><<showCharacter "kira" "right" "conflicted">>
Kira won't meet your eyes.
<<say "Kira" "So. That happened.">>
<<say $player.name "Kira—">>
<<say "Kira" "No, it's fine. You're an adult. You can fuck whoever you want.">>
Her tone says it's NOT fine.
<<say "Kira" "Let's just... get back.">>
<<addTension "kira" 20>>
<<set $companions[0].jealousy += 15>>
<div class="choice-container">
<<vchoice "Travel back in silence" "Day7_Return" "move" "run">>
</div><<run VaultUI.setBackground("commons")>>
<<run VaultUI.setTimeOfDay("evening")>>
Back at the vault.
Evening. Quiet.
<<if $companions[0] && $expeditionCompanion === "kira">>
<<showCharacter "kira" "right" "tense">>
Kira's in her quarters. Door closed.
<<if $companions[0].tension gte 70>>
You can feel the tension from here.
<div class="choice-container">
<<vchoice "Knock on her door" "Day7_Kira_Confront" "talk" "broken-heart">>
<<vchoice "Give her space" "Day7_Night_Sleep" "action" "night">>
</div>
<<else>>
She needs space. You can feel it.
<div class="choice-container">
<<vchoice "Rest" "Day7_Night_Sleep" "move" "night">>
</div>
<</if>>
<<else>>
<div class="choice-container">
<<vchoice "Rest" "Day7_Night_Sleep" "move" "night">>
</div>
<</if>><<set $flags.visitedKiraRoom to true>>
<<run VaultUI.setBackground("kira_room")>>
<<run VaultUI.setTimeOfDay("evening")>>
You knock.
Silence.
Then:
<<say "Kira" "It's open.">>
<<showCharacter "kira" "center" "vulnerable">>
She's sitting on her bed. Arms crossed.
<<say $player.name "We should talk.">>
<<say "Kira" "About what? Your new career as a whore?">>
The words are venom.
<<say $player.name "That's not fair.">>
<<say "Kira" "Isn't it? You fucked that scout for a TOKEN.">>
She stands. Closer now.
<<say "Kira" "While I stood there. Listening.">>
<div class="choice-container">
<<vchoice "\"I'm sorry. I shouldn't have.\"" "Day7_Kira_Apologize" "talk" "broken-heart">>
<<vchoice "\"Are you jealous?\"" "Day7_Kira_Jealous" "talk" "alert">>
<<vchoice "Kiss her" "Day7_Kira_Kiss" "intimate" "lips">>
</div><<say $player.name "I'm sorry. I shouldn't have.">>
The words land in the space between you like stones dropped into still water. You can feel them ripple outward, disturbing something fragile.
<<say "Kira" "Don't.">>
<<say $player.name "I mean it, Kira. That was a mistake. I was—">>
<<say "Kira" "I said DON'T.">>
She turns away from you, arms wrapped tight around herself like she's trying to hold her own ribs together. Her shoulders are shaking — not crying, not Kira, but the effort of keeping everything locked inside is costing her something visible.
The room feels smaller than it should. Her weapons on the rack. The thin blanket on the bed. Everything about this space is built for one person, and right now you're taking up too much of it.
<<say "Kira" "You don't get to fuck someone for a green token and then come in here with sorry like that means a goddamn thing.">>
<<say $player.name "It doesn't fix it. I know that.">>
She breathes. A long, ragged exhale, like something she's been holding since the wasteland finally leaving her lungs. Her hands uncurl against the wall, fingers splayed, pressing into the cold stone as if she needs to feel something solid.
<<say "Kira" "You want to know the worst part?">>
<<storyVideo "story/mv_day7/kira_apologize">>
She turns back. Her eyes are red and wet and absolutely furious about it.
<<say "Kira" "I can tell you mean it. I can see it all over your stupid face. And that's WORSE. Because if you didn't care, I could hate you. I could make this clean. But you care, and I still—">>
Her voice cracks. She catches it like a reflex, jaw tightening, swallowing hard against whatever was about to come next. She stares at the ceiling for a moment, blinking, and you can see the precise instant she rebuilds her walls.
<<say "Kira" "Just go. Please.">>
<<set $companions[0].trust += 5>>
<<addTension "kira" -10>>
You leave. The door closes behind you with a soft click that somehow sounds louder than a slam.
The corridor is empty. Your footsteps echo against the vault stone, and somewhere deep in the infrastructure you can hear the hum of the water recycler — that low, constant thrum that reminds you the world is still turning even when everything inside you has gone quiet.
<div class="choice-container">
<<vchoice "Give her space" "Day7_Night_Sleep" "move" "night">>
</div><<say $player.name "Are you jealous?">>
<<say "Kira" "What?">>
<<say $player.name "You're angry because you wanted it to be YOU.">>
She opens her mouth. Closes it.
<<say "Kira" "You're... fuck. Yes. Okay? Yes.">>
<<storyVideo "story/kira_day7_first/jealous">>
<<set $companions[0].jealousy += 5>>
<<addTension "kira" 10>>
<<say "Kira" "I wanted it to be me. I've wanted YOU for days.">>
<div class="choice-container">
<<vchoice "Continue" "Day7_Kira_Kiss" "move" "map">>
</div>You close the distance.
Kiss her.
She resists for half a second. Then MELTS.
<<storyVideo "story/kira_day7_first/kiss" "" "characters/kira/room_kiss">>
<<if _storyFamily is "sf_cg_kira_day7_first_04">>She sinks back onto the bed and pulls you down over her, your face upside down above hers. Her arms around your neck. Your hands in her hair, along her jaw, at her throat. You drag her lilac top down under her tits and put your mouth on them, and she arches up into it.<<else>>Her arms around your neck. Your hands in her hair.<</if>>
<<if $flags.kiraFirstKiss>>This kiss is different from before. <</if>>Desperate. Hungry. CLAIMING.
<<performSexAct "kiss_deep">>
When you break apart:
<<say "Kira" "Don't stop. Please don't stop.">>
<<set $companions[0].tension to 100>>
<div class="choice-container">
<<vchoice "\"Not tonight. When you're sure.\"" "Day7_Kira_Wait" "talk" "broken-heart">>
<<vchoice "\"I won't.\"" "Day7_Kira_Sex" "intimate" "lips">>
</div><<say $player.name "Not tonight. When you're sure.">>
<<storyVideo "story/kira_day7_wait/wait_1_steps_back">><<set _w26a to _storyClip>>
The hardest thing you've ever done is stepping back from her. Your hands leave her waist, her neck, the warmth of her skin, and the absence is immediate — a cold rush of air where a moment ago there was nothing but heat and hunger and the taste of her mouth.
She stares at you. Lips still parted from the kiss, chest rising and falling, eyes wide with something between disbelief and fury.
<<showCharacter "kira" "center" "vulnerable">>
<<say "Kira" "I AM sure.">>
<<say $player.name "No. You're angry and hurt and you want something that makes the pain stop. And I could be that for you tonight — but that's not what either of us needs.">>
Her mouth opens. Closes. Opens again.
<<say "Kira" "Don't you dare tell me what I—">>
She stops mid-sentence. Looks down at her own hands, <<if $media.storyFamilies && $media.storyFamilies.cg_kira_day7_first && $media.storyFamilies.cg_kira_day7_first.family is "sf_cg_kira_day7_first_04">>still raised where they were gripping your bare shoulders a moment ago<<else>>still raised where they were gripping your shirt a moment ago<</if>>, and sees them shaking. Not from cold. Not from adrenaline. From something deeper than that — something she's been running from since the wasteland.
A long breath leaves her, unsteady, and the fight goes out of her shoulders all at once.
<<say "Kira" "Fuck.">>
The room is quiet. Just the two of you breathing in the half-dark, the vault's low hum vibrating through the walls like a heartbeat that isn't yours.
<<say "Kira" "You're right. I hate that you're right.">>
<<storyVideo "story/kira_day7_wait/day7_kira_wait">>
<<if _storyClip is "6cf8b9f1e545">>She sits on the edge of the bed, staring at the floor, fumbling with the strap of her shoe just to give her hands something to do.<<else>>She sits on the edge of the bed, staring at the floor between her boots. Her hands hang between her knees.<</if>> She looks smaller than you've ever seen her — not weak, never weak, but stripped of the armour she wears even when she's not wearing armour.
<<if _storyClip is "6cf8b9f1e545">>Then she looks back at you over her shoulder, lips parted, and drags both hands through her hair:<<else>>Then, without looking up:<</if>>
<<say "Kira" "Stay.">>
One word. Not a demand and not quite a question. Something softer than either — something she's not sure she's allowed to ask for, offered into the silence like an open hand waiting to see if it gets taken or slapped away.
<<set $flags.kiraWaitChosen to true>>
<<set $flags.kiraWaitOwed to true>>
<<set $companions[0].trust += 15>>
<div class="choice-container">
<<vchoice "Stay" "Day7_Kira_Wait_Stay" "intimate" "night">>
</div><<run VaultUI.setBackground("kira_room")>>
<<run VaultUI.setTimeOfDay("night")>>
<<storyVideo "story/kira_day7_wait/stay_1_bed_edge">><<set _w26a to _storyClip>>
You sit beside her on the edge of the bed. Close enough to feel the warmth of her, but not touching. That boundary matters right now — it's the thing you just drew in the air between you, and neither of you is ready to cross it again tonight.
<<showCharacter "kira" "right" "vulnerable">>
She doesn't move for a long time. Neither do you. The vault breathes around you — that low mechanical hum through the walls, the distant drip of condensation somewhere in the pipes, the faint metallic tang of recycled air that you've almost stopped noticing after a week.
Eventually, she lies back on the bed. You follow. Side by side on a mattress barely wide enough for two, staring up at the ceiling where shadows shift in the dim light of the corridor bleeding under the door.
<<say "Kira" "I was sixteen when the sky broke.">>
You don't move. Don't even breathe too loudly. Whatever this is, whatever she's deciding to give you, it feels like watching a wild animal step into an open clearing — one wrong sound and it's gone forever.
<<say "Kira" "Nell was twelve. Mom had been gone since Nell was born. Complications. Dad — he tried. He really tried. But the first winter after everything collapsed, there was this sickness that moved through the camps like fire, and he just...">>
She trails off. Her hand finds yours in the dark, and her fingers thread through yours with a kind of desperate precision — like she needs something to anchor to while she says the rest.
<<say "Kira" "I kept her alive for six years. Six years of sleeping in rubble and eating whatever I could scavenge and fighting off people who looked at a twelve-year-old girl and saw an opportunity.">>
Her voice is flat, almost clinical, the way people sound when they're describing something so familiar it's lost its edges. But you can feel her pulse in her fingertips, fast and unsteady.
<<say "Kira" "I got good at hurting people. Really good. Because I had to be. Because she was all I had and I was all she had and I was NOT going to let this broken fucking world take one more thing from me.">>
The silence that follows is heavy. You can feel her deciding whether to say the next part, feel it in the way her grip shifts on your hand — loosening, tightening, loosening again.
<<say "Kira" "And then one morning I woke up and she was cold beside me, and there was nothing to fight. No enemy to kill. No one to blame. She just... stopped.">>
Her fingers tighten around yours so hard it almost hurts.
<<say "Kira" "She was eighteen. She'd been sick for weeks and I told myself she was getting better because I needed that to be true.">>
The vault hums. The shadows shift. Somewhere above you, the infrastructure clicks and settles, and the sound is so mundane, so ordinary, that it feels almost obscene next to what she's telling you.
<<say "Kira" "So when you fucked that scout... you need to understand, it wasn't just jealousy. It was confirmation. Proof that the universe works exactly the way I always knew it did — that everyone I let close either leaves or dies or turns out to be someone I shouldn't have trusted.">>
A long moment passes. You turn your head to look at her. In the dim light, her profile is sharp and still, and the wetness on her cheeks catches the faint glow from the corridor.
You squeeze her hand.
<<say $player.name "I'm staying, Kira.">>
<<say "Kira" "Yeah.">>
The smallest voice you've ever heard from her. Barely a vibration in the air. Like she's testing the word to see if it breaks something.
<<say "Kira" "Yeah. I think maybe you are.">>
<<storyVideo "story/kira_day7_wait/stay_3_asleep">><<set _w26b to _storyClip>>
She doesn't let go of your hand. You lie together in the dark, listening to each other breathe, and at some point the breathing evens out and slows, and the space between you closes by inches — not a decision, just gravity — until her head is resting against your shoulder and your cheek is pressed against her hair, and the last thing you feel before sleep takes you is the steady rhythm of her heartbeat against your arm.
<<set $flags.kiraFirstKiss to true>>
<div class="choice-container">
<<vchoice "Dream..." "Day7_Kira_Wait_Dream" "move" "night">>
</div><<set $flags.day7NightInKiraRoom to true>>
<<run VaultUI.setBackground("prelude/dream-void")>>
<<run VaultUI.setTimeOfDay("supernatural")>>
The dream-void is different tonight.
Usually it's a space that feels infinite — dark and warm and faintly pulsing, like the inside of something alive. But tonight the edges are sharp. The darkness has texture, and it's watching you.
<<showCharacter "velith" "center" "hostile">>
<<storyVideo "characters/succubus/story/dream_tease">>
Velith isn't lounging. For the first time since these dreams began, she's standing — straight-backed, arms folded, her expression caught somewhere between fascination and genuine displeasure. The supernatural light that usually plays across her features like candlelight is flickering, unsteady, as though something has disrupted the current.
<<say "Velith" "Interesting.">>
She says it the way a surgeon says //interesting// when the patient does something unexpected on the table.
<<say "Velith" "She was begging you. Lips still wet from your kiss, hands shaking, every fibre of her body screaming for you to take her. And you STOPPED.">>
She circles you slowly, bare feet making no sound against the void-floor, her eyes never leaving your face. Studying you like a specimen she thought she understood and suddenly doesn't.
<<say "Velith" "I've watched humanity for millennia, sweet thing. I know every shade of lust and loneliness and need. I know dominance. I know surrender. I know the thousand little negotiations people make with themselves in the dark.">>
She stops in front of you. Close. Close enough that you can feel the unnatural warmth radiating off her skin and smell something like jasmine and ozone and old blood.
<<say "Velith" "But restraint? Genuine restraint? Not reluctance, not performance, not some calculated play for a bigger payoff — but actually choosing to walk away from something you WANTED because it was the right thing to do?">>
She says //the right thing to do// like the words are a foreign language she's translating badly.
<<say "Velith" "That's... inconvenient.">>
Her composure flickers. Just for a moment — a crack in the porcelain, a glimpse of something vast and hungry beneath the beautiful surface. Then it's gone, and she's smiling again, but the smile doesn't quite reach her eyes.
<<say "Velith" "Enjoy your little victory. Savour the warmth of her hand in yours and the nobility of your restraint and all those precious, fragile human feelings.">>
<<storyVideo "story/kira_day7_wait/dream_2_whisper">><<set _w26a to _storyClip>>
She leans close. Her lips brush your ear, and her whisper carries the weight of centuries.
<<say "Velith" "It won't happen again.">>
<<set $player.corruption to Math.max(0, $player.corruption - 3)>>
The dream dissolves like smoke in wind. The void collapses, and you surface through layers of darkness into something warm and real — the weight of a blanket, the softness of a mattress, the steady sound of someone breathing beside you.
<<set $flags.day7NightToWake to true>>
<<storyVideo "story/kira_day7_wait/dream_3_kira_asleep">><<set _w26b to _storyClip>>
You open your eyes to pale morning light filtering under the door. Kira is still beside you, curled on her side, her hand still tangled in yours. In sleep, her face has lost every sharp edge — the permanent furrow between her brows smoothed out, her lips slightly parted, her breathing slow and deep. She looks younger. She looks like the person she might have been if the world hadn't broken.
You lie still, watching her breathe, and for the first time since you arrived at the vault, the morning doesn't feel like a threat.
<div class="choice-container">
<<vchoice "Wake to Day 8" "Day7_Wake_Day8" "move" "sunrise">>
</div><<sexScene "kira" "romantic" "passionate" "quarters-night">>
<<say $player.name "I won't.">>
<<set $flags.kiraFirstKiss to true>>
<<storyVideo "story/kira_day7_first/sex">>
Clothes come off. Fast. Desperate.
<<performSexAct "undress_partial">>
<<showCharacter "kira" "center" "aroused">>
She's beautiful. Every inch of her. Real and solid and YOURS.
<<sexPhase "buildup">>
<<performSexAct "touch_body">>
<<say "Kira" "I've wanted this for so long...">>
<<performSexAct "touch_intimate">>
She gasps. Arches into your hand.
<<sexPhase "action">>
<<if !$flags.sleptWithKira>><em>First time with Kira. Make it count.</em><</if>>
<<performSexAct "oral_give">>
<<if _storyFamily is "sf_cg_kira_day7_first_04">>You shove her knees up and back and taste her. She cries out, hands gripping your hair. You push two wet fingers into her mouth and she sucks them clean, moaning around them.<<else>>You taste her. She cries out, hands gripping your hair.<</if>>
<<say "Kira" "Oh fuck— please—">>
<<if _storyFamily is "sf_cg_kira_day7_first_04">><<performSexAct "oral_receive">>
She drags your jeans open and takes your cock in her mouth, slow and deep, your hand fisted in her hair, until you pull her face up in both hands and push her down onto her back.
<</if>><<performSexAct "penetrate">>
<<if _storyFamily is "sf_cg_kira_day7_first_04">>You hold one leg up against your chest. When you enter her, she looks into your eyes, arms stretched over her head.<<else>>When you enter her, she looks into your eyes.<</if>>
<<say "Kira" "Finally.">>
<<performSexAct "position_missionary">>
<<performSexAct "thrust_slow">>
This isn't transactional. This is CONNECTION.
<<sexPhase "climax">>
<<performSexAct "climax_together">>
You finish together. Her name on your lips. Your name on hers.
<div class="choice-container">
<<vchoice "Aftermath" "Day7_Kira_Aftermath" "move" "map">>
</div><<sexPhase "aftermath">>
<<showCharacter "kira" "right" "satisfied">>
<<storyVideo "story/kira_day7_first/aftermath">>
Tangled together. Sweat cooling.
<<say "Kira" "That was...">>
<<say $player.name "Yeah.">>
She laughs. Soft.
<<say "Kira" "Worth the wait.">>
<<if _storyClip is "c3d944b794b4">>She curls against you, laces her fingers through yours, then strokes your cheek and presses her mouth to yours, lazy and slow.<<else>>She curls against you.<</if>>
<<say "Kira" "I don't care if you fuck demons or scouts or whoever. Just...">>
<<say "Kira" "Come back to me.">>
<<set $flags.sleptWithKira to true>>
<<set $companions[0].romanceStage to 2>><<addTension "kira" -10>>
<div class="choice-container">
<<vchoice "Sleep together" "Day7_Dream_End" "intimate" "night">>
</div><<set $flags.day7NightInKiraRoom to true>>
<<set $flags.day7NightToWake to true>>
<<run VaultUI.setBackground("prelude/dream-void")>>
<<run VaultUI.setTimeOfDay("peaceful")>>
<<storyVideo "story/kira_day7_first/day7_dream_end">>
For once, Velith doesn't visit.
The dreams are quiet. Peaceful.
<<if _storyFamily is "sf_cg_kira_day7_first_04">>Just Kira. In the dream she's back in the lilac tank you dragged off her, sprawled across a sunlit bed, fingers playing at the lace of her panties, smiling up at you from the pillow like she knows exactly what she did to you.<<else>>Just you and Kira, tangled in warmth.<</if>>
<em>Tomorrow brings new challenges. But tonight, you're not alone.</em>
<div class="choice-container">
<<vchoice "Wake to Day 8" "Day7_Wake_Day8" "move" "sunrise">>
</div><<run setup.markStoryDay(8)>>
<<if $flags.day7NightToWake>>
<<set $flags.day7NightToWake to false>>
<<set $time.day to setup.storyDay(8, true, 7)>>
<<setTime 7 0>>
<<else>>
<<set $time.day to setup.storyDay(8)>>
<</if>>
<<if $flags.day7NightInKiraRoom>>
<<goto "Vault_Hub">>
<<else>>
<<goto "Quarters_Hub">>
<</if>><<set $flags.day7NightInKiraRoom to false>>
<<run VaultUI.setBackground("quarters")>>
<<run VaultUI.setTimeOfDay("night")>>
Sleep comes.
Dreams follow.
<div class="choice-container">
<<vchoice "Dream..." "Day7_Dream_Start" "move" "night">>
</div><<set $flags.day7NightToWake to true>>
<<goto "Day7_Dream">><<run VaultUI.setBackground("prelude/dream-void")>>
<<run VaultUI.setTimeOfDay("supernatural")>>
<<showCharacter "velith" "center" "pleased">>
<<storyVideo "story/velith_dream_visits/day7_dream" "" "characters/succubus/story/dream_tease">>
<<say "Velith" "Sex as currency. Delicious.">>
<<if _storyClip is "ada3d9cb948e">>She's close tonight, fingers hooked in your shirt, whispering. Then she steps back and blows you a kiss.<<elseif _storyClip is "b0dd86f3c5d2">>She stands in the violet dark in a borrowed body, pale hair, black lace, and spreads her metal-tipped fingers like a merchant showing you the goods. Then she slides one between her lips and licks it clean.
<<say "Velith" "Like this skin? Borrowed. Everything is currency, sweet thing, even faces.">><<else>>She's lounging in dream-space.<</if>>
<<say "Velith" "You're learning. Embracing what you are.">>
<<say "Velith" "Soon, sweet thing. Soon you'll be ready for more.">>
<div class="choice-container">
<<vchoice "Wake to Day 8" "Day7_Wake_Day8" "move" "sunrise">>
</div><<run VaultUI.setBackground("kira_room")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
Her door is open.
Not ajar-by-accident open. Open on purpose. Deliberately. Like a decision someone made and didn't take back.
<<showCharacter "kira" "center" "vulnerable">>
<<storyVideo "story/kira_day8_first/first_time">>
<<if _storyFamily is "sf_cg_kira_day8_first_04">>Kira is lying back on her bed in the afternoon light, one knee up, a hand resting low on her stomach.<<else>>Kira is sitting on her bed, legs crossed, hands resting on her knees.<</if>> She's not cleaning a weapon. She's not sharpening a blade. She's not doing any of the thousand small maintenance tasks she usually uses to avoid looking at you when you walk in.
She's just... waiting.
<<say "Kira" "Close the door.">>
Her voice is steady. Not the clipped, defensive steadiness you're used to — something quieter than that. Something that sounds like it cost her a long time to get right.
You close the door. The latch clicks, and the room contracts to just the two of you and the low hum of the vault behind the walls.
<<if _storyFamily is "sf_cg_kira_day8_first_04">>She doesn't get up. She tips her head back on the mattress and watches you cross to her, upside down, until you're standing over her. Close enough to touch. She doesn't, yet.<<else>>She stands. Crosses the distance between you in three steps. Stops close enough to touch, but doesn't.<</if>>
<<say "Kira" "I've been thinking about what you did. That night. When you stopped.">>
Her eyes search your face. Grey-green and steady and absolutely terrified beneath the calm, if you know where to look. And by now, you do.
<<say "Kira" "Nobody's ever done that before. Not for me. Every person who's ever wanted me just... took. Or I let them, because I didn't think I was worth stopping for.">>
She reaches up. Her hand cups the side of your face, and her thumb traces your cheekbone with a gentleness that seems to surprise even her.
<<say "Kira" "I'm sure now.">>
<<say "Kira" "I'm sure because you gave me the space to be.">>
<div class="choice-container">
<<vchoice "\"I've been sure since the moment I walked away.\"" "Day8_Kira_FirstTime" "intimate" "lips">>
</div><<sexScene "kira" "romantic" "tender" "quarters-day">>
<<say $player.name "I've been sure since the moment I walked away.">>
<<storyVideo "story/kira_day8_first/first_time" "" "characters/kira/room_sex">>
She smiles. Not her usual smirk — not the sharp, armoured thing she uses to keep the world at a distance. An actual smile, small and unguarded, that transforms her face into something so beautiful it makes your chest ache.
<<if _storyFamily is "sf_cg_kira_day8_first_04">>And then she pulls your mouth down to hers, upside down, and kisses you.<<else>>And then she kisses you.<</if>>
<<performSexAct "kiss_deep">>
This kiss is nothing like the last one. That was collision — desperate and hungry, two people crashing together because the pressure had become unbearable. This is //intention//. Her lips against yours with the slow certainty of someone who knows exactly what she wants and has decided, fully and completely, to let herself have it.
When you reach for her, she catches your hands. Holds them.
<<say "Kira" "Let me.">>
<<showCharacter "kira" "center" "aroused">>
<<if _storyFamily is "sf_cg_kira_day8_first_04">>She lies back. Holds your gaze. And begins undressing herself.<<else>>She steps back. Holds your gaze. And begins undressing herself.<</if>>
Not fast. Not desperate. <<if _storyFamily is "sf_cg_kira_day8_first_04">>She lifts her arms, lets you drag her tank top up, and pulls it free herself with a steadiness that makes your heart slam against your ribs. Flings it off the bed.<<else>>She pulls her tank top over her head with a steadiness that makes your heart slam against your ribs. Drops it to the floor.<</if>> She doesn't cross her arms. Doesn't turn her shoulder away. The woman who flinches when anyone gets close <<if _storyFamily is "sf_cg_kira_day8_first_04">>just lies there and lets you look<<else>>just stands there and lets you look<</if>>, and doesn't try to hide any of it. She lets you see her. All of her. Everything she has spent years guarding, offered without apology.
<<performSexAct "undress_partial">>
<<say "Kira" "I never let anyone look at me like that.">>
<<say $player.name "Like what?">>
<<say "Kira" "Like I'm beautiful.">>
<<say $player.name "You are.">>
<<say "Kira" "Yeah. I'm starting to believe it.">>
<<if _storyFamily is "sf_cg_kira_day8_first_04">>She pulls you down to her again. Runs her palms across your bare chest<<else>>She closes the distance again. Takes your shirt off with careful hands, running her palms across your chest<</if>> like she's memorizing the topography of you. Her fingertips trace your collarbone. Down across your stomach. Learning you slowly, deliberately, the way someone reads a book they intend to keep.
<<sexPhase "buildup">>
<<performSexAct "touch_body">>
You pull her close and the full length of her body presses against yours — warm skin, the hard planes of muscle, the softness beneath, her heart hammering against your chest in counterpoint to your own. She breathes in sharply, and the sound undoes something in you.
Your hands explore her. The curve of her waist, the ridges of her spine, the small of her back where the skin is impossibly soft. She shivers under your touch — not from cold. From being touched by someone she trusts.
<<performSexAct "touch_intimate">>
Your hand slides between her thighs and she's already wet, slick and warm against your fingers. She gasps — but it's different from before. Not desperate. Surrendered.
<<say "Kira" "God, that's—">>
She doesn't finish. Her forehead drops against your shoulder and she breathes your name — your actual name, not a curse, not a demand, just your name spoken into the curve of your neck like a prayer she didn't know she remembered.
<<sexPhase "action">>
<<performSexAct "oral_give">>
<<set _w26clip to _storyClip>><<set _w26fam to _storyFamily>><<storyVideo "story/kira_day8_first/first_time_2_oral">><<set _w26a to _storyClip>><<set _storyClip to _w26clip>><<set _storyFamily to _w26fam>>
<<if _storyFamily is "sf_cg_kira_day8_first_04">>You push her knees up and back and kneel between them. Taste her slowly,<<else>>You guide her to the bed and kneel. Taste her slowly,<</if>> taking your time, and she arches off the mattress with a sound that's half laugh, half moan — surprised by the pleasure of being savoured instead of devoured.
<<say "Kira" "You don't have to be so— oh. Oh fuck. Don't stop that.">>
You don't stop. Her hands find your hair, but they don't grab — they rest there, fingers threading through, gentle and shaking, and you can feel the moment she lets go of the last thread of control. Her thighs tremble against your shoulders. Her breathing fractures into short, sharp sounds.
<<if _storyFamily is "sf_cg_kira_day8_first_04">>She tastes herself on your fingers when you slide them into her mouth, sucks them clean, eyes closed.
<<performSexAct "oral_receive">>
<<set _ocClip to _storyClip>><<set _ocFam to _storyFamily>><<storyVideo "story/kira_day8_first/first_time_her_mouth">><<set _ocMouth to _storyClip>><<set _storyClip to _ocClip>><<set _storyFamily to _ocFam>>
Then she sits up, opens your jeans and takes you in her mouth - slow, unhurried - until you cradle her face in both hands and lay her back.
<</if>><<performSexAct "penetrate">>
<<set _w26fam to _storyFamily>><<storyVideo "story/kira_day8_first/first_time_3_inside">><<set _w26b to _storyClip>><<set _storyFamily to _w26fam>>
<<if _storyClip is "9f9d8bc7e9f9" or _storyClip is "32b0f85916f4">>When you move over her, she wraps her legs around you and pulls you in with her whole body.<<elseif _storyFamily is "sf_cg_kira_day8_first_04">>When you move over her, she hooks one leg up over your arm and pulls you in with her whole body.<<else>>When you move over her, she wraps her legs around you and pulls you in with her whole body.<</if>> The moment you enter her, she looks into your eyes, and there's no armour left — just Kira, open and raw and PRESENT, and the expression on her face is one you've never seen before. Not just pleasure. Recognition. Like she's been waiting her whole life for exactly this and didn't know it until now.
<<performSexAct "position_missionary">>
<<performSexAct "thrust_slow">>
<<say "Kira" "Stay with me. Right here. Just— stay.">>
You move together slowly, finding a rhythm that belongs to neither of you and both of you at once. <<if _storyFamily is "sf_cg_kira_day8_first_04" and _storyClip is "eab543f82c62">>She stretches her arms back over her head and arches up to meet you, pulls you closer, deeper,<<else>>She runs her hands down your back, pulls you closer, deeper,<</if>> and at some point she laughs — a real laugh, breathless and surprised and full of something that sounds terrifyingly close to joy.
<<sexPhase "climax">>
<<performSexAct "climax_together">>
When it comes, it builds slowly — not an explosion but a tide, rising and rising until it spills over, and she says your name again, clear and certain, and you fall together, and the world narrows to her heartbeat and your heartbeat and the place where they become the same sound.
<div class="choice-container">
<<vchoice "Aftermath" "Day8_Kira_FirstTime_Aftermath" "move" "map">>
</div><<sexPhase "aftermath">>
<<showCharacter "kira" "right" "satisfied">>
<<storyVideo "story/kira_day8_first/first_time_aftermath">>
Tangled together. Sweat cooling on skin. Afternoon light painting gold stripes across the bed through the ventilation slats.
Neither of you speaks for a long time. You don't need to. <<if _storyClip is "c3d944b794b4">>Her face is inches from yours on the pillow, her fingers laced through yours,<<else>>Her head is on your chest, her fingers tracing idle patterns across your ribs,<</if>> and the silence between you is the most comfortable thing you've ever felt.
<<say "Kira" "Worth the wait.">>
She says it quietly, into your skin.
<<say $player.name "Worth the wait.">>
<<if _storyClip is "c3d944b794b4">>She touches your cheek. You feel her smile against your mouth.<<else>>She looks up at you. Smiles.<</if>> That same unguarded smile from before, the one that makes her look like a different person — or maybe just the person she always was, underneath.
<<say "Kira" "I'm not good at this part. The... after. I usually just get dressed and pretend it didn't happen.">>
<<say $player.name "Do you want to pretend it didn't happen?">>
<<say "Kira" "No.">>
No hesitation. No qualifier.
She presses closer. <<if _storyClip is "c3d944b794b4">>Her fingers tighten in yours.<<else>>Her arm tightens across your chest.<</if>>
<<say "Kira" "I want to do it again. Slowly. And then probably fast. And then slowly again. And then I want to fall asleep next to you and wake up next to you and do the whole stupid thing all over.">>
She pauses.
<<say "Kira" "Is that... okay?">>
<<say $player.name "That's okay.">>
<<say "Kira" "Good.">>
She nestles back against you, and you feel the exact moment her body relaxes completely — every muscle letting go, every defence standing down, the full weight of her trust settling against you like something precious and terrifyingly breakable that she's decided, against every survival instinct she has, to place in your hands.
<<set $flags.sleptWithKira to true>>
<<set $flags.kiraWaitOwed to false>>
<<set $companions[0].romanceStage to 2>>
<<set $companions[0].trust += 10>><<addTension "kira" -10>>
<<advanceTime 2>>
<div class="choice-container">
<<vchoice "Return to the hub" "Vault_Hub" "move" "house">>
</div><<run VaultUI.setBackground("archives")>>
<<run VaultUI.setTimeOfDay("dim")>>
<<run document.body.classList.add("scene-mode-intimate")>>
<h2>Release</h2>
You follow Lysara out of the cell and into the main laboratory. Your legs are shaky from days of confinement.
<<run VaultUI.showCharacter("lysara", "center", "seductive")>>
<<say "Lysara" "Sit.">>
<<storyVideo "characters/lysara/cage_release_stroke">>
<<if _storyClip is "3a07f8ea011c">>She hooks a chair out from her desk with one heel and points at it. You sit. She leans over your lap in a sheer black top, reading glasses low on her nose, gold chains swinging, and her red nails pick at what is left of your trousers.<<elseif _storyClip is "b19376d6a9b1">>She changes her mind before you can. She shrugs the robe off altogether, climbs onto the padded bench on all fours, naked, and presses her open mouth to your bare stomach. She murmurs something about your pulse, counting it against her lips, and works lower.<<else>>She gestures to a padded bench. You obey.<</if>>
<<if _storyClip is "b19376d6a9b1">>Still on all fours in front of you, she mouths the steel of the cage through the torn rag of your trousers, then drags the scrap down with two fingers and produces a small key. Her face is inches from your caged cock.<<else>>She kneels between your legs, producing a small key. Her face is inches from your caged cock.<</if>>
<<say "Lysara" "Hold still. This requires... precision.">>
Her fingers work the lock. You can feel her breath on your skin.
<p class="sound-effect">//CLICK//</p>
The cage falls away.
For a moment, blessed relief. Your cock is free, soft, finally at peace—
<<if _storyClip is "b19376d6a9b1">>Then Lysara's tongue drags up the underside of it.<<else>>Then Lysara's hand wraps around it.<</if>>
<<say $player.name "Wait— what are you—">>
<<say "Lysara" "Checking something.">>
<<if _storyClip is "b19376d6a9b1">>She licks. Once. Twice.<<else>>She strokes. Once. Twice.<</if>>
Your cock SURGES. Growing. Thickening. Not as massive as before, but definitely larger than it was pre-gas.
<<say $player.name "Oh no. Oh no no no—">>
<<say "Lysara" "Hmm. Interesting.">>
<<set $player.lust to 80>>
<div class="choice-container">
<<vchoice "\"Put the cage back on!\"" "Lysara_Cage_Panic" "action" "alert">>
<<vchoice "\"What's happening to me?\"" "Lysara_Explain_Change" "talk" "alert">>
</div><<say $player.name "Put it back! Put the cage back on!">>
Lysara laughs. It's a beautiful, terrible sound.
<<say "Lysara" "Relax. The transformation was temporary. Your body is returning to normal.">>
<<storyVideo "characters/lysara/cage_release_stroke_panic">>
<<if _storyClip is "acaf929729cb">>She sits back on her heels, the robe shrugged off behind her, down to a pink bra, and keeps stroking while she talks, like she's taking your pulse through your cock. You throb in her grip.<<elseif _storyClip is "d20cbcbe5f86">>She sits back on her heels, the robe shrugged off behind her, down to a pink bra, strokes you twice, then tucks your cock down into her bra between her tits and pumps it there while she talks, like she's taking your pulse through your cock. Your cock throbs between her breasts.<<else>>She continues stroking. Your cock throbs in her grip.<</if>>
<<say "Lysara" "Mostly normal. The gas leaves... residual effects.">>
<<say $player.name "What kind of effects?">>
<<say "Lysara" "Enhanced sensitivity. Increased... capacity. Nothing dangerous.">>
Her thumb swirls over your tip.
<<say "Lysara" "But right now, you're still carrying trace amounts of the gas. If I release you like this...">>
She squeezes.
<<say "Lysara" "You might do something you'd regret.">>
<div class="choice-container">
<<vchoice "..." "Lysara_Blowjob_Setup" "intimate" "lips">>
</div><<say $player.name "What's happening to me?">>
<<say "Lysara" "The gas changes the body. Most changes are temporary. Some...">>
She strokes your hardening cock.
<<storyVideo "characters/lysara/cage_release_stroke_panic">>
<<if _storyClip is "d20cbcbe5f86">>She tucks your cock down into her bra, between her tits, and keeps pumping.<</if>>
<<say "Lysara" "...are permanent. You'll be slightly larger than before. More sensitive.">>
<<say $player.name "Is that bad?">>
<<say "Lysara" "That depends on your perspective.">>
She smirks.
<<say "Lysara" "Right now, you still have trace amounts of the gas in your system. Enough to be... problematic.">>
<div class="choice-container">
<<vchoice "..." "Lysara_Blowjob_Setup" "intimate" "lips">>
</div><<run VaultUI.showCharacter("lysara", "center", "seductive")>>
<<say "Lysara" "I need to purge the remaining gas from your body. The fastest method is...">>
<<storyVideo "characters/lysara/extraction_blowjob_setup">>
<<if _storyClip is "d2a52818561d">>She peels the last rag of your trousers down with two red-nailed fingers, smiles up at you like a gift she's decided to open early, and presses her lips to your tip. A taste. Then she pulls back, lips wet.<<elseif _storyClip is "e5f7a17677b5">>She leans in over your lap, reading glasses slipping down her nose, and holds your cock an inch from her open mouth, lecturing it as much as you.<<else>>She leans forward, her lips hovering over your cock.<</if>>
<<say "Lysara" "...extraction.">>
<<say $player.name "You mean—">>
<<say "Lysara" "I'm going to suck you dry. For your own safety, of course.">>
Her eyes glitter with amusement. And hunger.
<<say "Lysara" "Unless you'd prefer to wear the cage for another few hours?">>
<div class="choice-container">
<<vchoice "\"Please... extract away.\"" "Lysara_Blowjob" "intimate" "lips">>
<<vchoice "\"Is this really necessary?\"" "Lysara_Blowjob_Doubt" "talk" "alert">>
</div><<say $player.name "Is this really necessary? Or do you just want to—">>
<<say "Lysara" "Both.">>
She cuts you off without hesitation.
<<say "Lysara" "Yes, it's necessary. The gas binds to sexual fluids. Ejaculation purges it.">>
She runs her tongue along her lips.
<<say "Lysara" "And yes, I want to. I told you—I take small doses of the gas myself. It has... effects.">>
<<say $player.name "You're horny.">>
<<say "Lysara" "Perpetually. It's the price of immortality.">>
<<storyVideo "characters/lysara/extraction_blowjob">>
<<if _storyClip is "fa17c7c552c7" or _storyClip is "3de31ba9f661">>She feeds your cock up under her sheer robe, squeezes it between her tits, bows her head and licks your tip through the fabric.<<elseif _storyClip is "d97006671550">>She pushes her bare tits together around your cock and bounces them along your shaft, then leans back, laughing, and takes you in both hands.<<else>>She wraps her lips around your tip.<</if>>
<<say "Lysara" "Now shut up and let me work.">>
<div class="choice-container">
<<vchoice "..." "Lysara_Blowjob" "intimate" "lips">>
</div><<run VaultUI.setBackground("archives")>>
<<run VaultUI.setTimeOfDay("intimate")>>
<h3>Extraction</h3>
<<if $flags.lysaraAntidoteRelationship is "watched">>
She doesn't hesitate. Doesn't tease.
<<storyVideo "story/lysara_conclusion/extraction_1_first_taste">>
Her mouth engulfs your cock with the same hungry abandon you saw when she was touching herself.
<<say $player.name "FUCK—">>
<<say "Lysara" "Mmm... I've been thinking about this for the last hour.">>
She takes you deep immediately. Aggressively. Like she's been waiting for permission.
Her eyes lock onto yours—the same eyes that watched you watch her cum. No shame. No hesitation. Just hunger meeting hunger.
<<elseif $flags.lysaraAntidoteRelationship is "embarrassed">>
There's something different in her approach. More aggressive. Like she has something to prove.
<<storyVideo "story/lysara_conclusion/extraction_1_first_taste">>
Her mouth engulfs your cock almost roughly.
<<say $player.name "FUCK—">>
<<say "Lysara" "You caught me at a vulnerable moment. Now it's YOUR turn.">>
She takes you deep, her nails digging into your thighs harder than necessary. Payback.
Her eyes flash with something between arousal and challenge. She's going to make you lose control—the way you made her lose her composure.
<<elseif $flags.lysaraAntidoteRelationship is "intrigued">>
She takes her time. Savoring.
<<storyVideo "story/lysara_conclusion/extraction_1_first_taste">>
Her lips brush your tip first—testing. Tasting.
<<say "Lysara" "You've been... interesting. Let's see if you can stay interesting.">>
Then her mouth engulfs you.
<<say $player.name "FUCK—">>
She's skilled. Impossibly skilled. But there's something playful now too—the cat-and-mouse game continuing even here.
She pulls back just when you get close. Smirks. Then dives back in.
<<else>>
<<storyVideo "story/lysara_conclusion/extraction_1_first_taste">>
Lysara's mouth engulfs your cock.
<<say $player.name "FUCK—">>
She's skilled. Impossibly skilled. Centuries of practice, you realize dimly as your brain short-circuits.
Clinical. Efficient. She's doing a job—but her soft moans betray that she's enjoying it more than she'd admit.
<</if>>
<<storyVideo "characters/lysara/extraction_blowjob_deep">>
<<if _storyClip is "f7012e3ece57">>Her purple-gloved hand cups your balls. Protocol. Her tongue swirls, her lips slide, and she takes you deep, deeper, until her nose presses against your pelvis.<<elseif _storyClip is "551e17d2cf17" or _storyClip is "28c5d6a80ba1" or _storyClip is "aae31b2ec12e" or _storyClip is "045f3f37174e">>You come up off the bench onto your shaking legs and she follows you, bent in front of you, tongue swirling, lips sliding, taking you deep, deeper, until her nose presses against your pelvis.<<else>>Her tongue swirls. Her lips slide. She takes you deep, deeper, until her nose presses against your pelvis.<</if>>
<<say "Lysara" "Mmmmph...">>
The vibration of her moan around your cock nearly ends you right there.
<<set $player.lust to 100>>
<<storyVideo "story/lysara_conclusion/extraction_3_faster">>
She bobs her head. Slow at first, then faster. Her hands grip your thighs, nails digging in.
<<if $flags.survivedAgonyPath>>
After <<= setup.cellDaysWord(false)>> days of torment, the sensation is overwhelming. Your entire body trembles.
<</if>>
<<if $flags.tastedLysara>>
Payback, you think hazily. For what you did through the bars.
<</if>>
<<say $player.name "I'm going to— I can't—">>
<<if $flags.lysaraAntidoteRelationship is "embarrassed">>
She pulls off just long enough to speak.
<<say "Lysara" "Already? I expected more from someone so... confident.">>
Then she takes you back in, doubling her pace. Determined to break you.
<<else>>
She doesn't slow down. If anything, she intensifies.
<</if>>
<div class="choice-container">
<<vchoice "Cum in her mouth" "Lysara_Blowjob_Finish_Mouth" "intimate" "high-arousal">>
<<vchoice "Warn her, try to pull out" "Lysara_Blowjob_Finish_Pull" "intimate" "high-arousal">>
</div>You surrender completely.
Your hands find her hair—not pushing, just holding on as the world comes apart.
<<say $player.name "AHHH— FUCK— TAKE IT—">>
<<storyVideo "characters/lysara/bj_swallow">>
<<if _storyClip is "7ca0b8b44b59">>You explode. She pulls back just far enough to pump you with one fist over her open mouth, tongue flat and waiting, and rope after rope lands on it. She swallows every drop, throat working, eyes on yours the whole time, like a result she predicted and wrote down days ago.<<else>>You explode. Rope after rope of cum floods her mouth. She swallows every drop, her throat working rhythmically, her eyes locked on yours with something like triumph.<</if>>
<<if _storyClip is "7ca0b8b44b59">>The orgasm goes on and on. Days of pent-up need releasing at once. Your hips buck involuntarily into her hands, and she takes it all without complaint.<<else>>The orgasm goes on and on. Days of pent-up need releasing at once. Your hips buck involuntarily, fucking her face, and she takes it all without complaint.<</if>>
When it finally ends, you slump back on the bench, gasping, trembling, completely spent.
<<if _storyClip is "7ca0b8b44b59">>Lysara strokes the last of it onto her tongue and closes her lips over your tip again, sucking it clean.<<else>>Lysara pulls off your cock with a wet pop. A thin strand of cum connects her lips to your tip. She catches it with her tongue, savoring it.<</if>>
<<say "Lysara" "Mmm. Potent. The gas has concentrated in your seed—I can taste it.">>
She runs her tongue over her lips, collecting every drop.
<<say "Lysara" "Delicious.">>
<<set $player.lust to 20>><<run setup.playerReleased()>>
<<set $flags.lysaraSwallowed to true>>
<<set $flags.cameInLysaraMouth to true>>
<div class="choice-container">
<<vchoice "..." "Lysara_Blowjob_Aftermath" "intimate" "lips">>
</div><<say $player.name "I'm cumming— I can't—">>
You grab her shoulders and PUSH, managing to yank your cock from her mouth just as the first spurt erupts.
<<say "Lysara" "What—">>
<<storyVideo "characters/lysara/facial">>
<<if _storyClip is "bf76d532781e" or _storyClip is "33042c59eb77">>Cum splashes across her tits, rope after rope, thick and white, running down into the deep valley between them.<<else>>Cum splashes across her face. Her cheek. Her lips. Her chin. Another rope catches her neck, dripping down toward her cleavage.<</if>>
<<say $player.name "OH FUCK— SORRY— I—">>
<<if _storyClip is "bf76d532781e" or _storyClip is "33042c59eb77">>You can't stop. Days of denial pour out of you, painting her tits with thick white ropes until they're glazed.<<else>>You can't stop. Days of denial pour out of you, painting her with thick white ropes. Her tits. Her throat. Even her hair catches some of it.<</if>>
When it finally ends, you're gasping, horrified, aroused beyond reason at the sight of her covered in your cum.
Lysara doesn't move. Just kneels there, dripping, her expression unreadable.
Then she laughs.
<<say "Lysara" "Well. That's one way to do it.">>
<<if _storyClip is "bf76d532781e" or _storyClip is "33042c59eb77">>She runs a finger through the cum on her tits and examines it.<<else>>She runs a finger through the cum on her cheek and examines it.<</if>>
<<say "Lysara" "I said I needed to extract the gas. I didn't say it had to go IN my mouth.">>
She stands, cum sliding down her skin in slow rivulets.
<<say "Lysara" "Though I have to admit... this is messier than I planned.">>
<<set $player.lust to 20>><<run setup.playerReleased()>>
<<set $flags.cameOnLysara to true>>
<div class="choice-container">
<<vchoice "..." "Lysara_Blowjob_Aftermath_Messy" "intimate" "lips">>
</div><<run document.body.classList.remove("scene-mode-intimate")>>
You watch, still dazed, as Lysara looks down at the cum on her breasts, smiles, and reaches for a cloth. She doesn't seem angry—if anything, she seems amused.
<<say "Lysara" "I'll need to wash before we continue. Wait here.">>
She disappears through a door. You hear water running.
When she returns, she's clean, though her hair is still slightly damp.
<<say "Lysara" "The gas is purged. That's what matters.">>
Your head is spinning. Your body feels... different. Lighter. Cleaner.
<<say "Lysara" "Though next time someone offers to swallow, you might consider letting them.">>
<<say $player.name "I... sorry. I panicked.">>
<<say "Lysara" "Don't be. It was... entertaining.">>
There's a hint of something in her voice. Interest, maybe.
<div class="choice-container">
<<vchoice "..." "Lysara_Blowjob_Aftermath_Continue" "action" "talk">>
</div><<run document.body.classList.remove("scene-mode-intimate")>>
Your head is spinning. Your body feels... different. Lighter. Cleaner.
<<say "Lysara" "There. The gas is purged.">>
<<storyVideo "characters/lysara/composed_robe_bj_aftermath">>
<<if _storyClip is "ec122ad79794">>She's back in her chair before your legs work again: glasses straight, folder open on her knee, pen already moving. As if she didn't just give you the blowjob of your life. She snaps the folder shut and leans toward you, laughing.<<elseif _storyClip is "8e0b127b7857">>What got past her lips has run down onto her tits. She mops it off with the hem of a white shift, laughing, and tugs the shift back down over them. As if she didn't just give you the blowjob of your life.<<else>>She stands, smoothing her skirt. As if she didn't just give you the blowjob of your life.<</if>>
<div class="choice-container">
<<vchoice "..." "Lysara_Blowjob_Aftermath_Continue" "action" "talk">>
</div><<say "Lysara" "Your cock will return to mostly normal size. You may notice some... enhancements. Consider it a gift.">>
<<say $player.name "I... thank you?">>
<<say "Lysara" "Don't thank me yet.">>
Her expression shifts. More serious now.
<<say "Lysara" "Why were you in my laboratory? No one comes here by accident.">>
<div class="choice-container">
<<vchoice "Explain about Kira" "Lysara_Explain_Kira" "talk" "talk">>
</div><<run VaultUI.setBackground("archives")>>
<<run VaultUI.setTimeOfDay("dim")>>
<<say $player.name "My companion. Kira. She's in a coma. The Groundskeeper said she won't wake naturally.">>
Lysara's eyebrow rises.
<<say "Lysara" "The old man is still alive? Impressive.">>
<<say $player.name "You know him?">>
<<say "Lysara" "I know OF him. We've never met. I prefer my solitude.">>
She moves to a shelf lined with vials and bottles.
<<say "Lysara" "A coma, you say. Induced by the vault's protective systems?">>
<<say $player.name "That's what he said.">>
<<say "Lysara" "Then you need a Resurgence Elixir.">>
She selects a vial. The liquid inside shimmers faintly gold.
<<say "Lysara" "Fortunately for you, I have one prepared.">>
<<set $flags.lysaraHasPotion to true>>
<div class="choice-container">
<<vchoice "\"Please, I need it!\"" "Lysara_Beg_Potion" "talk" "potion">>
<<vchoice "\"What do you want for it?\"" "Lysara_Ask_Price" "talk" "alert">>
</div><<say $player.name "Please. I need it. She could die.">>
Lysara studies you. Something softens in her expression.
<<say "Lysara" "She won't die. The vault's protection keeps her alive. But she also won't wake without intervention.">>
She holds out the vial.
<<say "Lysara" "This one is free. Consider it... compensation. For the trap.">>
<div class="choice-container">
<<vchoice "Take the potion" "Lysara_Give_Potion" "action" "potion">>
</div><<say $player.name "What do you want for it?">>
<<say "Lysara" "Pragmatic. I appreciate that.">>
She turns the vial in her fingers, light dancing through the golden liquid.
<<say "Lysara" "This one is free. You triggered my trap through no fault of your own. Fair is fair.">>
<div class="choice-container">
<<vchoice "Take the potion" "Lysara_Give_Potion" "action" "potion">>
</div><<run VaultUI.showCharacter("lysara", "center", "neutral")>>
Lysara presses the vial into your hand.
<<say "Lysara" "Pour it on her lips. She'll wake within minutes.">>
<<say $player.name "Thank you. Truly.">>
<<say "Lysara" "Don't thank me yet.">>
Her expression hardens.
<<say "Lysara" "The second potion won't be free.">>
<<say $player.name "The second—?">>
<<say "Lysara" "This coma can happen again. If she takes critical damage, the vault will protect her the same way. You'll need another elixir.">>
She steps closer, her presence suddenly intimidating despite her beauty.
<<say "Lysara" "When that happens—and it WILL happen—you'll need to gather the ingredients yourself. And pay my price.">>
<<say $player.name "What price?">>
She smiles. It doesn't reach her eyes.
<<say "Lysara" "We'll discuss that when the time comes.">>
<<set $flags.hasResurgenceElixir to true>>
<<if !setup.ownsItem("resurgence elixir")>><<run setup.giveItem("resurgence elixir", 1)>><</if>>
<<set $flags.lysaraOwesPrice to true>>
<div class="choice-container">
<<vchoice "\"How do I find you again?\"" "Lysara_Lab_Access" "talk" "door-handle">>
</div><<run VaultUI.setBackground("alchemy_lab")>>
<<say $player.name "If I need another potion... how do I find you?">>
<<say "Lysara" "The passage through the Archives will remain open. I rarely lock it anymore—no one comes this deep.">>
She gestures vaguely.
<<say "Lysara" "I live here. Have for centuries. I have my own entrance to the outside—I never use the common areas.">>
<<say $player.name "You've been down here the whole time? Alone?">>
<<say "Lysara" "Not always alone. Occasionally someone... visits.">>
Her eyes drift to the cell. To the fleshlight.
<<if $flags.feralRapedLysara>>
Her walk is still careful. The memory of what happened—what YOU did—hangs between you.
<<say "Lysara" "Though I may need to... reinforce certain barriers. After recent events.">>
Her voice is neutral, but you catch the edge beneath it.
<<else>>
<<say "Lysara" "But solitude suits me. Fewer complications.">>
<</if>>
She turns away, clearly dismissing you.
<<say "Lysara" "Go. Wake your companion. And when you need me again...">>
She glances over her shoulder.
<<if $flags.lysaraAntidoteRelationship is "intrigued" || $flags.lysaraAntidoteRelationship is "watched">>
<<say "Lysara" "You know where to find me. And next time... perhaps we can explore your new capabilities. Under more controlled circumstances.">>
<<elseif $flags.lysaraAntidoteRelationship is "embarrassed">>
<<say "Lysara" "You know where to find me. And next time... I won't be so easily flustered.">>
<<else>>
<<say "Lysara" "You know where to find me.">>
<</if>>
<<set $flags.alchemyLabUnlocked to true>>
<<set $flags.canVisitLysara to true>>
<<if ($temp.cellDays || 0) gte 2>>
<<journalAdd `setup.cellDaysWord(true) + " days in a cage under the vault. Her name's Lysara - an alchemist, been living down there for centuries. Beautiful, dangerous, and clearly bored out of her mind. She kept me locked up the whole time and did things to me I'm still processing."` "story">>
<<else>>
<<journalAdd "Met an alchemist today. Lysara. She's been living under the vault for centuries - beautiful, dangerous, and clearly bored out of her mind. She had me locked in a cage, did things to me I'm still processing." "story">>
<</if>>
<<if $flags.cameInLysaraMouth>>
<<journalAdd "She sucked me off. Said it was to 'purge the gas from my system' but I think she just wanted to. Can still feel her lips. That tongue." "relationship">>
<<elseif $flags.cameOnLysara>>
<<journalAdd "She got me off with her hands. Made a mess of her. Don't think she minded." "relationship">>
<</if>>
<<journalAdd "She gave me the potion for Kira. Said next time there's a price. The way she said it... I don't think she means money." "story">>
<<if $flags.lysaraAntidotePathComplete>>
<<if $flags.lysaraAntidoteRelationship is "watched">>
<<journalAdd "Took her antidote. Three hours behind bars while she 'worked' - bending, stretching, and in the end lying back on her cot with her hand between her legs like I wasn't there. I watched every second. She knew. She wanted me to." "relationship">>
<<elseif $flags.lysaraAntidoteRelationship is "embarrassed" || $flags.lysaraAntidoteRelationship is "intrigued">>
<<journalAdd "Three hours on her antidote. Caught her with her hand between her legs and asked if she was enjoying herself. First time I've seen Lysara flustered. I liked that more than I should." "relationship">>
<<elseif $flags.lysaraAntidoteRelationship is "distant">>
<<journalAdd "Three hours on her antidote. She put on a show and I cleared my throat like a prude. She went cold after that. Maybe cold is the safer way to have her." "relationship">>
<</if>>
<</if>>
<p class="notification">New location unlocked: Alchemy Lab (via Archives)</p>
<div class="choice-container">
<<if $flags.lysaraCascadeArc is "contaminated_drool" && !$flags.lysaraDroolResolved>>
<<if $flags.lysaraFeralPath>>
<<vchoice "Return to the vault" "Cell_Lysara_Drool_Feral_Resolution" "move" "door-handle">>
<<else>>
<<vchoice "Return to the vault" "Cell_Lysara_Drool_Resolution" "move" "door-handle">>
<</if>>
<<else>>
<<vchoice "Return to the vault" `$flags.kiraResurgenceUsed ? "Kira_Second_Resurgence" : "Kira_Room_With_Potion"` "move" "door-handle">>
<</if>>
</div><<run VaultUI.setBackground("kira_room")>>
<<run VaultUI.setTimeOfDay("day")>>
<h2>Kira's Room</h2>
<<storyVideo "story/kira_coma/room_coma_visit">>
Kira lies motionless on her bed. Breathing steady. Eyes closed.
<<run VaultUI.showCharacter("kira", "center", "unconscious")>>
She looks peaceful. Almost like she's just sleeping.
<<if $flags.abusedUnconsciousKira>>
<p class="guilt">Guilt gnaws at you. What you did during the journey here...</p>
<<elseif $flags.gropedUnconsciousKira>>
<p class="guilt">You remember your hands on her. The temptation. The weakness.</p>
<</if>>
<div class="choice-container">
<<if $flags.hasResurgenceElixir>>
<<vchoice "Leave" "Vault_Hub" "move" "door-handle">>
<<vchoice "Use the Resurgence Elixir" "Kira_Awakening" "action" "potion">>
<</if>>
<<vchoice "Sit with her" "Kira_Room_Sit" "action" "night">>
<<if $player.corruption gte 30>>
<<vchoice "Touch her while she sleeps" "Kira_Room_Coma_Touch" "intimate" "hand">>
<</if>>
<<if !$flags.hasResurgenceElixir>>
<<vchoice "Leave" "Vault_Hub" "move" "door-handle">>
<</if>>
</div><<advanceTime 0 30>>
You sit in the chair beside her bed. Watch her breathe.
<<say $player.name "I'm going to fix this, Kira. I promise.">>
She doesn't respond. Of course she doesn't.
But somehow, saying it out loud helps.
<div class="choice-container">
<<vchoice "Leave" "Vault_Hub" "move" "door-handle">>
<<if $flags.hasResurgenceElixir>>
<<vchoice "Use the Resurgence Elixir" "Kira_Awakening" "action" "potion">>
<</if>>
</div><<run document.body.classList.add("scene-mode-intimate")>>
<<if $flags.comaTouchCorruptionDay !== $time.day>>
<<set $flags.comaTouchCorruptionDay to $time.day>>
<<addCorruption 3>>
<</if>>
<<storyVideo "story/kira_coma/room_coma_touch">>
<<if _storyClip is "e1baf4e66991">>You approach the bed. She's sprawled on her stomach under the blanket. You drag it down off her, baring her ass and legs, and your hand hovers over her body.<<else>>You approach the bed. Your hand hovers over her body.<</if>>
Her breath catches under your shadow, then slides back into the same slow count.
<p class="internal-thought">She'll never know.</p>
<<if $flags.abusedUnconsciousKira>>
<p class="internal-thought">You've already crossed that line. What's one more time?</p>
<</if>>
<div class="choice-container">
<<vchoice "Caress her face" "Kira_Coma_Caress" "intimate" "hand">>
<<vchoice "Touch her body" "Kira_Coma_Grope" "intimate" "hand">>
<<vchoice "Stop. This is wrong." "Kira_Room_Coma_Visit" "action" "broken-heart">>
</div><<storyVideo "story/kira_coma/coma_caress__coma_caress">>
<<if _storyClip is "6871373dc000">>Your fingers slide into her dark hair and smooth it back from her temple. Soft. Warm.<<else>>Your fingers brush her cheek. Soft. Warm.<</if>>
Her head tips a fraction toward your hand and stops there.
<<say $player.name "I'm sorry. For everything.">>
<<if $flags.abusedUnconsciousKira>>
<p class="guilt">The apology feels hollow. You know what you did.</p>
<<else>>
<p class="internal-thought">She looks so vulnerable. Trust you completely.</p>
<</if>>
You pull your hand back.
Her lips twitch, almost a smile. Then nothing.
<<run document.body.classList.remove("scene-mode-intimate")>>
<div class="choice-container">
<<vchoice "Leave" "Vault_Hub" "move" "door-handle">>
<<if $flags.hasResurgenceElixir>>
<<vchoice "Use the Resurgence Elixir" "Kira_Awakening" "action" "potion">>
<</if>>
</div><<if $flags.comaGropeCorruptionDay !== $time.day>>
<<set $flags.comaGropeCorruptionDay to $time.day>>
<<addCorruption 5>>
<</if>>
<<set $flags.gropedComaKira to true>>
<<storyVideo "story/kira_coma/coma_caress__coma_grope">>
<<if _storyClip is "07f8b3fe3723">>You ease her over onto her back. She rolls loose and heavy, her head settling on the blue pillow.
<</if>>Your hand slides down. Over her chest. Her stomach.
She doesn't react. Doesn't move.
<<set $player.lust to Math.min(100, $player.lust + 20)>>
<<if _storyClip is "07f8b3fe3723">>You cup her breast through her shirt. Squeeze gently. Your other hand is already around your cock, stroking.<<else>>You cup her breast through her shirt. Squeeze gently.<</if>>
Nothing.
Except her nipple, hard against your palm through the shirt.
<p class="internal-thought">What are you doing? She trusted you.</p>
<<if $flags.rapedUnconsciousKira>>
<p class="internal-thought">You've done worse. Much worse.</p>
<</if>>
You pull your hand back, breathing hard.
Her breathing hitches, then settles into a rhythm a little too regular to be sleep.
<<run document.body.classList.remove("scene-mode-intimate")>>
<div class="choice-container">
<<vchoice "Leave" "Vault_Hub" "move" "door-handle">>
<<if $flags.hasResurgenceElixir>>
<<vchoice "Use the Resurgence Elixir" "Kira_Awakening" "action" "potion">>
<</if>>
</div><<run VaultUI.setBackground("kira_room")>>
<<run VaultUI.setTimeOfDay("day")>>
<<storyVideo "story/kira_coma/room_with_potion">>
You return to Kira's room, the Resurgence Elixir warm in your hand.
<<run VaultUI.showCharacter("kira", "center", "unconscious")>>
She hasn't moved. Still breathing. Still lost.
<<say $player.name "Okay. Let's bring you back.">>
<div class="choice-container">
<<vchoice "Use the Resurgence Elixir" "Kira_Awakening" "action" "potion">>
</div><<run VaultUI.setBackground("kira_room")>>
<<run VaultUI.setTimeOfDay("day")>>
<<set $flags.hasResurgenceElixir to false>>
<<run setup.takeItem("resurgence elixir")>>
<<set $flags.kiraResurgenceUsed to true>>
<h2>Awakening</h2>
<<storyVideo "story/kira_coma/awakening">>
You uncork the vial. The golden liquid catches the light.
<<say $player.name "Here goes nothing.">>
You tilt Kira's head back gently, parting her lips. The elixir pours in, shimmering as it disappears down her throat.
For a moment, nothing.
Then—
<<if _storyClip is "5ace0e3a701f">>She stirs. An arm drags up over her face.<<else>>Her eyes FLY open.<</if>>
<<run VaultUI.showCharacter("kira", "center", "shocked")>>
<<say "Kira" "GASP—">>
<<if _storyClip is "5ace0e3a701f">>Then she shoves herself upright all at once, a hand clamped to her temple, blinking hard.<<else>>She bolts upright, nearly headbutting you. Her hands grab your arms, grip tight.<</if>>
<<say "Kira" "Where— what— I was—">>
<<say $player.name "Easy. Easy. You're safe. You're in the vault.">>
Her eyes dart around the room. Wild. Confused. Then they focus on you.
<<say "Kira" "I... I remember fighting. Then pain. Then...">>
She trails off.
<<say "Kira" "How long was I out?">>
<<set _comaSpan to (($temp.cellDays || 0) >= 4) ? "Most of a week" : "A couple of days">>
<div class="choice-container">
<<vchoice `"\"" + _comaSpan + ". You were in a coma.\""` "Kira_Awakening_Truth" "talk" "talk">>
<<vchoice "\"Not long. You're okay now.\"" "Kira_Awakening_Downplay" "talk" "talk">>
</div><<addTrust "kira" 1>>
<<say $player.name `((($temp.cellDays || 0) >= 4) ? "Most of a week" : "A couple of days") + ". You were in some kind of coma. The vault's protection, apparently."`>>
<<say "Kira" "Days? I was out for DAYS?">>
<<storyVideo "story/mv_kira_awakening/truth">>
She looks down at herself. Touches her face.
<<say "Kira" "I don't remember anything. Just... darkness. And then waking up.">>
<<say $player.name "The Groundskeeper said you wouldn't wake naturally. I had to find a special potion.">>
<<say "Kira" "A potion? From where?">>
<<if $flags.abusedUnconsciousKira || $flags.rapedUnconsciousKira>>
<p class="guilt">The guilt claws at your throat. She's looking at you with trust and you...</p>
<</if>>
<div class="choice-container">
<<vchoice "Tell her about Lysara" "Kira_Awakening_Tell_Lysara" "talk" "talk">>
<<vchoice "\"Long story. I'll explain later.\"" "Kira_Awakening_Defer" "talk" "talk">>
</div><<set $companions[0].trust -= 1>>
<<say $player.name "Not long. You're okay now. That's what matters.">>
Kira studies your face. She knows you're not telling the whole truth.
<<say "Kira" "You're a shit liar, you know that?">>
<<say $player.name "...">>
<<say "Kira" "Fine. Keep your secrets. I'm too tired to argue.">>
She lies back down, wincing.
<<say "Kira" "I feel like I got hit by a truck.">>
<div class="choice-container">
<<vchoice "..." "Kira_Awakening_Recovery" "action" "health">>
</div><<addTrust "kira" 1>>
<<set $flags.kiraKnowsAboutLysara to true>>
<<say $player.name "There's an alchemy lab hidden beneath the vault. And a woman—Lysara—who lives there. She gave me the potion.">>
<<say "Kira" "A hidden alchemy lab? A woman living under the vault?">>
<<say $player.name "I know how it sounds.">>
<<say "Kira" "It sounds insane. But then again, so does everything else about this place.">>
She shakes her head.
<<say "Kira" "This vault has more secrets than I thought.">>
<<say $player.name "You have no idea.">>
<div class="choice-container">
<<vchoice "..." "Kira_Awakening_Recovery" "action" "health">>
</div><<say $player.name "Long story. I'll explain later. You need to rest.">>
<<say "Kira" "You're deflecting.">>
<<say $player.name "Maybe.">>
She sighs, but doesn't push.
<<say "Kira" "Fine. But you OWE me answers.">>
<div class="choice-container">
<<vchoice "..." "Kira_Awakening_Recovery" "action" "health">>
</div><<run VaultUI.showCharacter("kira", "center", "sad")>>
<<set $flags.kiraInComa to false>>
<<set $flags.kiraRoomRecoveryMode to false>>
<<set $flags.kiraIsUnconscious to false>>
<<set $companions[0].status to "recovering">>
<<set $companions[0].health to Math.floor($companions[0].maxHealth * 0.3)>>
<<set $companions[0].currentLocation to "kira_quarters">>
<<storyVideo "story/kira_awakening_aftercare/recovery">>
<<if _storyFamily is "sf_cg_kira_awakening_aftercare_04">>Kira gets up anyway, gets one step from the bed, and her knees start to fold.<<else>>Kira tries to stand. Her legs wobble and she nearly falls.<</if>>
<<say $player.name "Whoa—easy.">>
<<if _storyFamily is "sf_cg_kira_awakening_aftercare_04">>You catch her by the arms and hold her there, her eyes huge, until the shaking stops. Then you steer her back to the bed.<<else>>You catch her, lowering her back to the bed.<</if>>
<<say "Kira" "I'm fine. I'm—">>
She's clearly NOT fine. Weak. Pale. Exhausted.
<<say $player.name "You need rest. Real rest.">>
<<say "Kira" "I hate this. Being weak.">>
<<say $player.name "You're not weak. You almost died. Give yourself a break.">>
She looks at you. Something in her expression shifts.
<<if $flags.abusedUnconsciousKira || $flags.rapedUnconsciousKira>>
<<say "Kira" "You stayed with me. Carried me home.">>
<p class="guilt">If only she knew.</p>
<<else>>
<<say "Kira" "You saved me. Got me home. Found a cure.">>
<</if>>
<<say "Kira" "...Thank you.">>
<<relationChange "kira" "trust" 2>>
<<relationChange "kira" "affection" 3>>
<div class="choice-container">
<<vchoice "\"Get some rest. I'll check on you later.\"" "Kira_Awakening_End" "talk" "health">>
<<vchoice "Stay with her" "Kira_Awakening_Stay" "talk" "affection">>
</div><<advanceTime 2 0>>
<<storyVideo "story/kira_awakening_aftercare/stay">>
<<if _storyClip is "61fb0613efec">>She won't stay in the bed. She ends up curled on the old leather couch instead, legs drawn up, turning some salvaged gadget over in her hands just to keep them busy. You pull a chair close.<<else>>You pull the chair close to her bed.<</if>>
<<say $player.name "I'll stay. In case you need anything.">>
<<say "Kira" "You don't have to—">>
<<say $player.name "I know.">>
She smiles weakly. The first smile since she woke up.
<<say "Kira" "Okay. But if you start snoring, I'm kicking you out.">>
You sit with her until she drifts into natural sleep. Real sleep, this time. Not the death-like stillness of before.
<<relationChange "kira" "affection" 2>>
<div class="choice-container">
<<vchoice "Leave quietly" "Kira_Awakening_End" "action" "door-handle">>
</div><<run VaultUI.setBackground("commons")>>
<<run VaultUI.setTimeOfDay("day")>>
<<set $flags.kiraAwakened to true>>
<<set $flags.kiraRecovering to true>>
<<journalAdd "Kira's awake. The potion worked. She's weak, confused, but alive. God, the relief when her eyes opened..." "story">>
<<if $flags.kiraKnowsAboutLysara>>
<<journalAdd "Told her about Lysara. She took it better than expected - probably because nothing about this vault surprises her anymore." "relationship">>
<</if>>
<<if $flags.abusedUnconsciousKira || $flags.rapedUnconsciousKira>>
<<journalAdd "She doesn't know what I did while she was out. The guilt is eating me alive. But I can't tell her. I WON'T tell her." "reflection">>
<</if>>
<p class="notification">Kira has awakened! She will need a day or two to fully recover.</p>
<<if $flags.abusedUnconsciousKira || $flags.rapedUnconsciousKira>>
<p class="secret">Your secret remains safe. For now.</p>
<</if>>
<div class="choice-container">
<<vchoice "Continue" "Vault_Hub" "move" "door-handle">>
</div><<run VaultUI.setBackground("medical")>>
<<run VaultUI.setTimeOfDay("day")>>
<<run VaultUI.showCharacter("kira", "center", "unconscious")>>
<h2>Again</h2>
You stand over Kira's unconscious form. Again.
The Resurgence Elixir pulses in your hand. Lysara's "gift."
<<say $player.name "I'm sorry. I should have been more careful. I should have—">>
<p>It doesn't matter now. What matters is bringing her back.</p>
You uncork the vial. The familiar golden liquid catches the light.
<<set $flags.hasResurgenceElixir to false>>
<<run setup.takeItem("resurgence elixir")>>
<<set $flags.kiraSecondResurgenceUsed to true>>
<<journalAdd "Woke Kira again. Second elixir. Lysara's keeping count, and from the note, she means to collect." "story">>
<p>You tilt the elixir to her lips. She swallows reflexively.</p>
<p>For a moment, nothing happens.</p>
<p>Then—</p>
<p>Her eyes flutter open.</p>
<<say "Kira" "...<<print $player.name>>?">>
<<say $player.name "Hey. Welcome back. Again.">>
<<set $flags.kiraInComa to false>>
<<set $flags.kiraRoomRecoveryMode to false>>
<<set $flags.kiraIsUnconscious to false>>
<<if $companions && $companions[0]>>
<<set $companions[0].status to "recovering">>
<<set $companions[0].health to Math.floor($companions[0].maxHealth * 0.3)>>
<<set $companions[0].currentLocation to "kira_quarters">>
<<relationChange "kira" "trust" 1>>
<</if>>
<div class="wip-notice-detailed">
<strong>⚠ WORK IN PROGRESS</strong><br><br>
Full storyline for subsequent awakenings is under development.<br>
Kira's reaction, Lysara's debt collection, and consequences coming soon.<br><br>
<em>For now, Kira is awake and recovering.</em>
</div>
<p class="notification">Kira has awakened again. She will need time to recover.</p>
<<if $flags.lysaraDebtIncurred && $flags.lysaraDebtIncurred >= 2>>
<p class="warning">You owe Lysara <<print $flags.lysaraDebtIncurred>> elixirs now. She will collect.</p>
<</if>>
<div class="choice-container">
<<vchoice "Let her rest" "Vault_Hub" "move" "door-handle">>
</div><<if !setup.lysaraArcDone()>>
<<goto "Alchemy_Lab_Entrance">>
<<elseif setup.lysaraDoorElixirDue()>>
<<goto "Lysara_Return_Locked">>
<</if>>
<<run VaultUI.setBackground("alchemy_lab")>>
<<run VaultUI.setTimeOfDay("dim")>>
<h2>The Alchemy Laboratory</h2>
You descend through the hidden passage into Lysara's domain.
<<storyVideo "characters/lysara/amb_lab">>
The laboratory is as you remember—shelves of strange substances, ancient equipment, the faint chemical smell in the air.
<<run VaultUI.showCharacter("lysara", "center", "neutral")>>
Lysara looks up from her workbench.
<<set _labKiraDownAgain to $flags.kiraIsUnconscious && $flags.kiraResurgenceUsed>>
<<if _labKiraDownAgain>>
<<say "Lysara" "Back again. And she's sleeping again. I can see it on you before you say a word.">>
<<say $player.name "She went down again. I took the elixir from the box at your door.">>
<<say "Lysara" "Of course you did. When you hold it to her lips, you'll notice how easy it is to come back to me. And when she opens her eyes... you'll remember whose gift woke her. Twice now.">>
<<else>>
<<say "Lysara" "Back again. Did you wake your companion?">>
<<if $flags.kiraAwakened>>
<<say $player.name "She's awake. Thank you.">>
<<if $flags.lysaraDebtIncurred>>
<<say "Lysara" "Good. Twice now. I keep count of what I am owed.">>
<<else>>
<<say "Lysara" "Good. Remember—the next potion has a price.">>
<</if>>
<<else>>
<<say $player.name "Not yet. I wanted to see you first.">>
<<say "Lysara" "Flattered. Now use the potion. She's been asleep long enough.">>
<</if>>
<</if>>
<div class="choice-container">
<<if _labKiraDownAgain>>
<<vchoice "Go back to Kira" "Medical_Hub" "move" "health">>
<</if>>
<<vchoice "Ask about potions" "Lysara_Ask_Potions" "talk" "potion">>
<<vchoice "Ask about Lysara's past" "Lysara_Ask_Past" "talk" "talk">>
<<if $player.lust gte 60>>
<<vchoice "Flirt with her" "Lysara_Flirt" "talk" "seduce">>
<</if>>
<<vchoice "Leave" "Archives_Search_Start" "move" "door-handle">>
</div><<say $player.name "What other potions can you make?">>
<<say "Lysara" "Many things. Healing draughts. Poisons. Aphrodisiacs.">>
Her eyes glitter.
<<say "Lysara" "Elixirs that can change the body. The mind. The soul, if you believe in such things.">>
<<say $player.name "For a price.">>
<<say "Lysara" "Nothing is free. Especially not from someone who's lived as long as I have.">>
<div class="choice-container">
<<if !$flags.lysaraDebtIncurred>>
<<vchoice "Ask about the second Resurgence Elixir" "Lysara_Second_Elixir" "talk" "potion">>
<</if>>
<<vchoice "Ask about other topics" "Alchemy_Lab_Visit" "talk" "talk">>
</div><<say $player.name "You mentioned the second Resurgence Elixir has a price. What is it?">>
<<say "Lysara" "Ingredients first. I'll need Moonpetal extract—from a flower that only blooms in the deepest ruins at night.">>
<<say "Lysara" "Crystallized dream-matter—which you can only obtain from a supernatural being.">>
<<say "Lysara" "And essence of arousal.">>
<<say $player.name "Essence of... what?">>
<<say "Lysara" "Sexual fluids, extracted at the peak of pleasure. The purer and more intense the arousal, the more potent the essence.">>
She smiles wickedly.
<<say "Lysara" "As for my price... we'll discuss that when you've gathered the ingredients.">>
<<set $flags.lysaraExplainedIngredients to true>>
<div class="choice-container">
<<vchoice "Ask about other topics" "Alchemy_Lab_Visit" "talk" "talk">>
</div><<say $player.name "How long have you been here? You said centuries...">>
<<say "Lysara" "Longer than the vault. Longer than the war. Longer than I care to remember.">>
<<say $player.name "How is that possible?">>
<<say "Lysara" "The gas. Lust's Awakening. In small, regular doses, it preserves. Rejuvenates.">>
She gestures at her body.
<<say "Lysara" "This is the result of centuries of careful self-medication. Beauty that doesn't fade. Youth that doesn't wither.">>
<<say $player.name "Immortality through... lust gas?">>
<<say "Lysara" "More or less. The side effects are manageable. Mostly.">>
<<say $player.name "The constant arousal?">>
<<say "Lysara" "Among other things.">>
<<set $flags.lysaraExplainedPast to true>>
<div class="choice-container">
<<vchoice "Ask about other topics" "Alchemy_Lab_Visit" "talk" "talk">>
</div><<set $player.charm += 1>>
<<say $player.name "You know, you're even more beautiful in proper lighting.">>
Lysara laughs.
<<say "Lysara" "Flattery? From someone I've already had my mouth around?">>
<<say $player.name "Can't blame me for trying.">>
<<say "Lysara" "I suppose not.">>
She approaches, hips swaying.
<<storyVideo "characters/lysara/approach_accuse">>
<<if _storyClip is "3b143b7cc491">>She stops at the table, leans across it toward you and pulls her robes open with both hands, her tits straining out of the fabric.<</if>>
<<say "Lysara" "If you want more of what happened before... you know the price.">>
<<say $player.name "Another potion ingredient?">>
<<say "Lysara" "Or you could just ask nicely.">>
<<set $flags.lysaraFlirted to true>>
<div class="choice-container">
<<vchoice "Ask about other topics" "Alchemy_Lab_Visit" "talk" "talk">>
<<vchoice "Leave" "Archives_Search_Start" "move" "door-handle">>
</div><<set _fcEntry to setup.farCarryEntry()>>
<<if _fcEntry>>
<<include _fcEntry>>
<<else>>
<<run setup.farCarryNear()>>
<<run VaultUI.setBackground("reclaimed-day")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<h2>Carrying Kira Home</h2>
Not again.
You lift Kira's unconscious body and begin the journey back to the vault.
<<advanceTime 1 0>>
The journey is tense. Every sound could be raiders. Every shadow could be danger.
But you make it. You always make it.
<<if $flags.hasResurgenceElixir>>
<p class="info">You have a Resurgence Elixir. You can wake her immediately.</p>
<<else>>
<p class="warning">You don't have a Resurgence Elixir. You'll need to get another from Lysara.</p>
<</if>>
<div class="choice-container">
<<vchoice "Enter the vault" "Kira_Unconscious_Return_Simple" "move" "door-handle">>
</div>
<</if>><<abandonJourney>>
<<set $currentLocation to "vault">>
<<settleExposure "home">>
<<run VaultUI.setBackground("medical")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<<run setup.kiraToInfirmary()>>
You carry Kira to the medical bay and lay her on the treatment bed.
<<run VaultUI.showCharacter("groundskeeper", "left", "concerned")>>
The Groundskeeper appears.
<<say "Groundskeeper" "Again? The vault's protection is becoming a burden.">>
<<if setup.farCarryArriving()>><<include "Far_Carry_Wash">><</if>>
<<say $player.name "I know. I need another elixir.">>
<<if $flags.hasResurgenceElixir>>
<<say "Groundskeeper" "You have one, don't you? Use it.">>
<div class="choice-container">
<<vchoice "Continue" "Kira_Second_Resurgence" "action" "forward">>
</div>
<<else>>
<<say "Groundskeeper" "Then you know where to go.">>
<div class="choice-container">
<<vchoice "Visit Lysara" `setup.lysaraArcDone() ? "Alchemy_Lab_Visit" : "Alchemy_Lab_Entrance"` "move" "door-handle">>
<<vchoice "Rest first" "Vault_Hub" "move" "night">>
</div>
<</if>><<set $prelude to {
seraRelationship: "lover",
seraFate: "unknown",
sexScene: false,
sexStyle: "",
playerRole: "",
establishedKinks: [],
caravanName: "Ashford Trading Company",
daysWithSera: 47,
loveConfessed: false,
dreamSurrender: false
}>>
<<run VaultUI.setBackground("prelude/caravan-camp-evening")>>
<<run VaultUI.setTimeOfDay("evening")>>
<<run VaultUI.setWeather("dust")>>
<div class="scene-intro">
<h2>47 Days Ago</h2>
</div>
<<storyVideo "story/mv_prelude/start">>
The last rays of sunlight paint the Reclaimed in shades of amber and rust. Your caravan — twelve wagons of the Ashford Trading Company — has circled for the night, a fragile island of humanity in the endless desolation.
You've been traveling with them for almost two months now. Long enough to know everyone's name, their habits, their secrets. Long enough to find something unexpected in this dying world.
Someone.
The campfire crackles, sending sparks spiraling into the darkening sky. Around you, the familiar sounds of evening: merchants checking their wares, guards changing shifts, the cook cursing at a pot of thin stew.
<<if $prelude.daysWithSera gt 30>>
And somewhere nearby, you know //she's// watching you.
<</if>>
<div class="choice-container">
<<vchoice "Help set up camp" "Prelude_Help_Camp" "action" "cycle">>
<<vchoice "Find Sera" "Prelude_Find_Sera" "intimate" "broken-heart">>
<<vchoice "Speak with the caravan master" "Prelude_Caravan_Master" "talk" "talk">>
</div><<run VaultUI.setBackground("prelude/caravan-camp-evening")>>
You pitch in with the evening work — securing wagon wheels, checking the water barrels, helping old Marta with her cookfire. It's mindless labor, but it keeps your hands busy.
The Reclaimed teaches you that idle hands invite dark thoughts.
<<run VaultUI.showCharacter("merchant", "right", "friendly")>>
<<say "Jonas" "Appreciate the help, friend. Most of these merchants wouldn't lift a finger if the wagon was on fire.">>
He passes you a waterskin. You drink deep, tasting the metallic tang of recycled water.
<<say "Jonas" "Word is we'll reach the Thornfield settlement in three days. Assuming...">>
He trails off, glancing at the horizon. You both know what he's not saying. *Assuming the raiders don't find us. Assuming the dust storms hold off. Assuming we don't run out of water.*
<<say "Jonas" "Anyway. Your woman was looking for you earlier. Had that look in her eye.">>
He grins knowingly.
<<run VaultUI.hideCharacter("merchant")>>
<div class="choice-container">
<<vchoice "Go find Sera" "Prelude_Find_Sera" "intimate" "broken-heart">>
<<vchoice "Ask about the raiders" "Prelude_Raider_Talk" "talk" "alert">>
</div><<run VaultUI.setBackground("prelude/caravan-camp-evening")>>
<<run VaultUI.showCharacter("merchant", "right", "neutral")>>
<<say $player.name "The raiders. How worried should we be?">>
Jonas's expression darkens. He glances around, making sure no one else is listening.
<<say "Jonas" "Between us? Very. We're in Crimson Fang territory now. They hit the Westbrook caravan two weeks back. No survivors.">>
He spits into the dust.
<<say "Jonas" "But our guards are good, and we've got numbers. And the master paid off some... contacts. Should have safe passage.">>
The way he says //should// doesn't fill you with confidence.
<<say "Jonas" "Just... keep your blade close tonight, yeah? And maybe say what needs saying to that girl of yours. Just in case.">>
<<run VaultUI.hideCharacter("merchant")>>
A chill runs down your spine that has nothing to do with the cooling desert air.
<div class="choice-container">
<<vchoice "Find Sera immediately" "Prelude_Find_Sera" "intimate" "broken-heart">>
</div><<run VaultUI.setBackground("prelude/caravan-camp-evening")>>
<<storyVideo "story/mv_prelude/caravan_master">>
You find Master Aldric by his wagon, poring over a worn map by lantern light. He's a lean man, weathered by decades of travel in the Reclaimed, with calculating eyes that miss nothing.
<<say "Aldric" "Ah. You.">>
It's not exactly a warm greeting, but from Aldric, it passes for one.
<<say "Aldric" "We're making good time. Three days to Thornfield, if the weather holds. Two more to the old bunker network.">>
His finger traces a route on the map. You notice his hand trembling slightly.
<<say $player.name "Something wrong?">>
<<say "Aldric" "Scouts found tracks today. Fresh ones. At least thirty riders, heading parallel to our route.">>
He folds the map with practiced precision.
<<say "Aldric" "Could be nothing. Could be everything. I've doubled the night watch. I suggest you get some rest while you can.">>
He meets your eyes, and for a moment you see something beneath his merchant's mask. Fear.
<<say "Aldric" "And maybe... spend some time with that healer girl. Sera, is it? Life's short out here. Shorter than most realize.">>
<div class="choice-container">
<<vchoice "Find Sera" "Prelude_Find_Sera" "intimate" "broken-heart">>
</div><<run VaultUI.setBackground("prelude/caravan-camp-night")>>
<<run VaultUI.setTimeOfDay("night")>>
<<storyVideo "story/prelude_sera_romance/sits_alone">>
<<if _storyClip is "fcf672c9ef82">>You find her by the edge of camp, silhouetted against the last of the dusk. She's standing at the low wall, looking out over the valley, watching the horizon<<else>>You find her by the edge of camp, silhouetted against the star-filled sky. She's sitting on a flat rock, knees drawn to her chest, watching the horizon<</if>> with those pale green eyes that first caught your attention seven weeks ago. The wind keeps dragging her copper hair across her face, and her wire-rimmed glasses sit pushed up on her head, forgotten.
<<run VaultUI.showCharacter("sera", "center", "tender")>>
Sera. Healer. Wanderer. Survivor. //Yours.//
Or maybe you're hers. The lines blurred somewhere along the way.
She doesn't turn as you approach, but you see her smile in the curve of her cheek.
<<say "Sera" "I was wondering when you'd come find me.">>
<<if _storyClip is "fcf672c9ef82">>Her voice is warm honey in the cool desert evening.<<else>>Her voice is warm honey in the cold desert night.<</if>> <<if _storyClip is "fcf672c9ef82">>You step up beside her, close enough that your shoulders touch.<<else>>You settle beside her, close enough that your shoulders touch.<</if>>
<<if _storyClip is "fcf672c9ef82">><<say "Sera" "Beautiful evening. Almost makes you forget everything else.">><<else>><<say "Sera" "Beautiful night. Almost makes you forget everything else.">><</if>>
<<if _storyClip is "fcf672c9ef82">>She turns to look at you, the last of the light caught in her eyes.<<else>>She turns to look at you, firelight dancing in her eyes.<</if>>
<<say "Sera" "I heard the rumors. About the raiders.">>
Her hand finds yours, fingers intertwining.
<<say "Sera" "Jonas thinks we should be worried. Aldric's doubled the watch. But you know what I think?">>
<div class="choice-container">
<<vchoice "What do you think?" "Prelude_Sera_Philosophy" "talk" "talk">>
<<vchoice "Pull her close" "Prelude_Sera_Physical" "intimate" "broken-heart">>
</div><<run VaultUI.setBackground("prelude/caravan-camp-night")>>
<<run VaultUI.showCharacter("sera", "center", "smiling")>>
<<say "Sera" "I think... if tonight is all we have, then we shouldn't waste it worrying about tomorrow.">>
She shifts closer, resting her head against your shoulder.
<<say "Sera" "Before I joined this caravan, I spent three years alone. Surviving. Not living. Just... existing.">>
Her grip on your hand tightens.
<<say "Sera" "Then I found you. And for the first time in years, I actually //want// to see tomorrow. Because of you.">>
She looks up at you, and there's vulnerability in her eyes that she rarely shows.
<<say "Sera" "So if the raiders come, if it all ends tonight... I want you to know that these forty-seven days have been the best of my life.">>
<div class="choice-container">
<<vchoice "\"Come to my tent.\"" "Prelude_Tent_Invite" "intimate" "broken-heart">>
<<vchoice "Kiss her deeply" "Prelude_First_Kiss" "intimate" "lips">>
<<vchoice "\"I love you.\"" "Prelude_Love_Declaration" "intimate" "broken-heart">>
</div><<run VaultUI.setBackground("prelude/caravan-camp-night")>>
<<run VaultUI.showCharacter("sera", "center", "aroused")>>
<<storyVideo "story/prelude_sera_romance/physical" "" "characters/sera/embrace">>
<<if _storyClip is "85ca870ac313">>You don't let her finish. You step in behind her, pull her back against your chest and kiss her neck while your hand gathers her dress up her thigh. She gasps as your fingers slide between her legs and find her bare and already wet.<<else>>You don't let her finish. Your arm wraps around her waist, pulling her against you. She gasps — surprise melting immediately into desire.<</if>>
<<say "Sera" "Impatient tonight...">>
But she's smiling, her body already molding to yours, her lips brushing against your jaw.
<<say "Sera" "Not that I'm complaining.">>
Her fingers trace up your arm, leaving trails of heat in their wake. The stars wheel overhead, forgotten. The raiders, the caravan, the whole dying world — none of it matters.
Just her warmth. Her breath. Her heartbeat against yours.
<<say "Sera" "My tent is closer. And more... private.">>
<div class="choice-container">
<<vchoice "Lead her there" "Prelude_Walk_To_Tent" "intimate" "fire">>
<<vchoice "Kiss her here first" "Prelude_First_Kiss" "intimate" "lips">>
</div><<run VaultUI.setBackground("prelude/caravan-camp-night")>>
<<run VaultUI.showCharacter("sera", "center", "passionate")>>
<<storyVideo "story/prelude_sera_romance/kiss_night" "" "characters/sera/kiss">>
You cup her face in your hands and kiss her. Soft at first, then deeper — hungry, desperate, saying everything words can't express.
She makes a small sound against your lips. Her hands fist in your shirt, pulling you closer. When you finally break apart, you're both breathing hard.
<<say "Sera" "Forty-seven days, and you still make my knees weak.">>
She laughs, but there's a tremor in it. Emotion breaking through.
<<say "Sera" "Take me to bed. Please. I need you tonight.">>
<div class="choice-container">
<<vchoice "Go to her tent" "Prelude_Walk_To_Tent" "intimate" "rapid-strikes">>
</div><<run VaultUI.setBackground("prelude/caravan-camp-night")>>
<<run VaultUI.showCharacter("sera", "center", "tender")>>
<<set $prelude.loveConfessed to true>>
<<storyVideo "story/prelude_sera_romance/kiss_night" "" "characters/sera/kiss">>
<<say $player.name "I love you, Sera.">>
The words hang in the air between you. You've both danced around them for weeks, but something about tonight — the stars, the danger, her vulnerability — breaks the final barrier.
Her eyes glisten. For a moment she doesn't speak.
Then she's kissing you, fierce and tender at once, tears warm on both your cheeks.
<<say "Sera" "I love you too. I've loved you since the second week, when you gave your water ration to old Marta. I knew then.">>
She laughs through her tears.
<<say "Sera" "I was going to tell you when we reached Thornfield. Make it romantic. But this... this is better.">>
<<if _storyFamily is "sf_cg_prelude_sera_romance_02">>She laces her fingers through yours.<<else>>She stands, pulling you up with her.<</if>>
<<say "Sera" "Come with me. I want to show you how much.">>
<div class="choice-container">
<<vchoice "Follow her" "Prelude_Walk_To_Tent" "intimate" "rapid-strikes">>
</div><<run VaultUI.setBackground("prelude/caravan-camp-night")>>
<<run VaultUI.showCharacter("sera", "center", "aroused")>>
<<storyVideo "story/prelude_sera_romance/kiss_night">>
<<say $player.name "Come to my tent.">>
It's not a question.
Sera's eyes darken with desire. <<if _storyFamily is "sf_cg_prelude_sera_romance_02">>She takes your hand.<<else>>She rises in one fluid motion, taking your hand.<</if>>
<<say "Sera" "Yours is too close to the cook wagon. Mine is quieter.">>
She's already leading you through the maze of wagons and tents, her hips swaying in a way that makes your mouth go dry.
<<say "Sera" "Besides... I have plans for you. And I'd rather not have the whole caravan hear.">>
<div class="choice-container">
<<vchoice "Follow eagerly" "Prelude_Walk_To_Tent" "intimate" "rapid-strikes">>
</div><<run VaultUI.setBackground("prelude/caravan-camp-night")>>
<<run VaultUI.transition("fade")>>
You wind through the sleeping camp, hand in hand. The night watch nods as you pass — they've seen this before, the two of you slipping away. A few knowing smiles, quickly hidden.
Sera's tent is at the edge of camp, a small canvas dome she's made her own. Herbs hang drying from the support poles. A small shrine to the old gods sits in one corner — her healer's superstition.
She holds open the flap, firelight spilling from within.
<<say "Sera" "Coming?">>
Her smile is invitation and promise.
<div class="choice-container">
<<vchoice "Enter the tent" "Prelude_Tent_Scene_Start" "intimate" "rapid-strikes">>
</div><<run VaultUI.setBackground("prelude/sera-tent-interior")>>
<<run VaultUI.setWeather("clear")>>
<<set $prelude.sexScene to true>>
<<set $prelude.hadSex to true>>
<<run VaultUI.showCharacter("sera", "center", "aroused")>>
<<storyVideo "characters/sera/undress">>
<<if _storyFamily is "sf_cg_prelude_sera_romance_02" or _storyClip is "c8afcacf71d0" or _storyClip is "f1b8d4d4367e">><<run VaultUI.showCharacter("sera", "center", "submissive")>><</if>>
The tent is warm, lit by a single oil lamp that casts dancing shadows on the canvas walls. It smells of her — dried herbs, clean sweat, and something uniquely Sera.
<<if _storyFamily is "sf_cg_prelude_sera_romance_02" or _storyClip is "c8afcacf71d0" or _storyClip is "f1b8d4d4367e">>She ties the tent flap back instead of letting it fall, and the last of the evening light spills in across the bedding and over her bare shoulders.<<else>>She lets the tent flap fall closed, sealing you both in your own private world.<</if>>
<<if _storyFamily is "sf_cg_prelude_sera_romance_02" or _storyClip is "c8afcacf71d0" or _storyClip is "f1b8d4d4367e">>For a moment you just look at each other. Then she lets you peel the blue dress down off her shoulders and push it past her hips, holding your gaze while it drops to the floor.<<else>>For a moment you just look at each other. Then she reaches up and begins to unlace her worn traveling shirt, holding your gaze.<</if>>
<<say "Sera" "We've done this a dozen times. But tonight feels different. Like...">>
<<if _storyFamily is "sf_cg_prelude_sera_romance_02" or _storyClip is "c8afcacf71d0" or _storyClip is "f1b8d4d4367e">>She stands naked in front of you and doesn't cover herself. You pull her against you by her bare ass; she hooks one leg up round your hip.<<else>>She pauses, shirt half-open, revealing the curve of her collarbone.<</if>>
<<say "Sera" "Like it matters more.">>
<<if _storyFamily is "sf_cg_prelude_sera_romance_02" or _storyClip is "c8afcacf71d0" or _storyClip is "f1b8d4d4367e">>She presses close, forehead to yours. Her fingers work your shirt open, button by button, and her lips follow them down your chest.<<else>>She crosses to you, pressing close. Her fingers find the hem of your shirt.<</if>>
<<say "Sera" "How do you want me tonight?">>
<div class="choice-container">
<<vchoice "Take control of her" "Prelude_Sex_Dominant_Start" "intimate" "rapid-strikes">>
<<vchoice "Let her take control" "Prelude_Sex_Submissive_Start" "intimate" "lips">>
<<vchoice "Match her energy" "Prelude_Sex_Switch_Start" "intimate" "rapid-strikes">>
</div><<run VaultUI.setBackground("prelude/sera-tent-intimate")>>
<<set $prelude.sexStyle to "dominant">>
<<set $prelude.playerRole to "dominant">>
<<set $player.sexualIdentity to "dominant">>
<<set $player.establishedKinks.push("control", "praise", "commands")>>
<<run VaultUI.showCharacter("sera", "center", "submissive")>>
<<storyVideo "story/prelude_sera_sex_dom/prelude_sex_dominant_start">>
Something shifts in your chest. A primal surge of want and possession.
<<if _storyFamily is "sf_cg_prelude_sera_sex_dom_03">>You catch her jaw, tilt her face up to yours and kiss her hard.<<else>>You catch her wrists, pressing them against her sides.<</if>> Her breath catches. Her pupils blow wide.
<<if _storyFamily is "sf_cg_prelude_sera_sex_dom_03">><<say $player.name "I want you //bent// for me. I want to hear you say my name. I want to make you forget everything except how I make you feel.">><<else>><<say $player.name "I want you //underneath// me. I want to hear you say my name. I want to make you forget everything except how I make you feel.">><</if>>
<<say "Sera" "Yes...">>
Her voice is a whisper. You've done this before — discovered early that she melts when you take charge — but tonight the intensity is sharper. Rawer.
<<if _storyFamily is "sf_cg_prelude_sera_sex_dom_03">>You strip the rest of her clothes off her, turn her round and bend her over the tent's low cross-pole, her hands braced on it, and drag the head of your cock along the crack of her ass. She looks back over her shoulder at you with trust and hunger.<<else>>You guide her backward until her knees hit the sleeping pallet. She sits, then lies back, gazing up at you with trust and hunger.<</if>>
<<say "Sera" "Show me I'm yours.">>
<div class="choice-container">
<<if _storyFamily is "sf_cg_prelude_sera_sex_dom_03">>
<<vchoice "Take her from behind" "Prelude_Dom_Scene_1" "intimate" "rapid-strikes">>
<<vchoice "Make her show herself to you" "Prelude_Dom_Scene_1b" "intimate" "search">>
<<else>>
<<vchoice "Pin her down and kiss her" "Prelude_Dom_Scene_1" "intimate" "rapid-strikes">>
<<vchoice "Make her undress for you" "Prelude_Dom_Scene_1b" "intimate" "search">>
<</if>>
</div><<run VaultUI.setBackground("prelude/sera-tent-intimate")>>
<<run VaultUI.showCharacter("sera", "center", "passionate")>>
<<storyVideo "characters/sera/pinned_kiss">>
<<if _storyFamily is "sf_cg_prelude_sera_sex_dom_03">>You keep her bent over the cross-pole, hands braced on it, and push into her from behind, slow, your hands locked on her hips. Her back arches, pushing her ass back against you.<<else>>You cover her body with yours, catching her wrists and pinning them above her head. Her back arches, pressing her curves against you.<</if>>
<<say "Sera" "Oh—">>
<<if _storyFamily is "sf_cg_prelude_sera_sex_dom_03">>You grab her jaw, turn her face back to yours and silence her with a kiss. Deep. Claiming. There's nothing left between you; her clothes are already on the floor.<<else>>You silence her with a kiss. Deep. Claiming. Your free hand works at her remaining clothes, and she squirms helpfully, desperate to remove the barriers between you.<</if>>
Skin against skin. Her heat seeping into you. Her pulse rabbiting under your lips as you trail kisses down her throat.
<<say "Sera" "Please... I need...">>
<<say $player.name "Tell me what you need.">>
<<if _storyFamily is "sf_cg_prelude_sera_sex_dom_03">><<say "Sera" "You. Harder. Now. Please—">><<else>><<say "Sera" "You. Inside me. Now. Please—">><</if>>
<<if _storyFamily is "sf_cg_prelude_sera_sex_dom_03">>You make her wait. Make her //beg//. Slow, shallow strokes, your hands and mouth exploring every inch of her until she's trembling, incoherent, your name the only word she can remember.<<elseif _storyClip is "f564d9ba6dfc">>You make her wait. Make her //beg//. You kiss your way down her body and settle between her thighs, and you eat her slowly, then not slowly, while her fingers twist in your hair and she arches off the pallet, trembling, incoherent, your name the only word she can remember.<<else>>You make her wait. Make her //beg//. Your hands and mouth explore every inch of her until she's trembling, incoherent, your name the only word she can remember.<</if>>
<<if _storyFamily is "sf_cg_prelude_sera_sex_dom_03">>Only then do you give her what she needs: hard and deep, one hand at her throat pulling her back against you.<<else>>Only then do you give her what she needs.<</if>>
<div class="choice-container">
<<vchoice "Continue..." "Prelude_Dom_Scene_Climax" "intimate" "rapid-strikes">>
</div><<run VaultUI.setBackground("prelude/sera-tent-intimate")>>
<<run VaultUI.showCharacter("sera", "center", "aroused")>>
<<set $player.establishedKinks.push("voyeurism")>>
<<storyVideo "characters/sera/bares_herself">>
You settle back, keeping your distance.
<<say $player.name "Strip for me.">>
Sera's breath hitches. Her hands move to her shirt, slowly — deliberately — finishing what she started. Revealing herself inch by inch.
She holds your gaze the entire time. Challenging. Submitting. Both at once.
<<if _storyClip is "71ba64e13ede">>When she's down to nothing but a scrap of red silk, lamplight gilding her pale skin, red hair spilling over her small tits, she waits. Trembling slightly.<<else>>When she's bare before you, lamplight gilding her pale skin, red hair spilling over her small tits, she waits. Trembling slightly.<</if>>
<<say $player.name "Beautiful.">>
You let her feel your eyes on her. Let the anticipation build until she's shifting, restless, desperate for your touch.
<<say "Sera" "Please... don't make me wait...">>
<<say $player.name "Come here.">>
She crawls to you, and you pull her into your lap, claiming her mouth, finally letting your hands roam where your eyes have been.
<div class="choice-container">
<<vchoice "Continue..." "Prelude_Dom_Scene_Climax" "intimate" "rapid-strikes">>
</div><<run VaultUI.setBackground("prelude/sera-tent-intimate")>>
<<set $prelude.sexStyle to "submissive">>
<<set $prelude.playerRole to "submissive">>
<<set $player.sexualIdentity to "submissive">>
<<set $player.establishedKinks.push("surrender", "being used", "praise")>>
<<run VaultUI.showCharacter("sera", "center", "dominant")>>
<<storyVideo "story/prelude_sera_sex_sub/prelude_sex_submissive_start">>
You catch her hands, but instead of taking control, you bring them to your face. Kiss her palms.
<<say $player.name "Use me. I want you to take whatever you need from me.">>
Something shifts behind her eyes. A hunger she usually keeps leashed.
<<say "Sera" "Are you sure? Once I start...">>
<<say $player.name "I'm sure.">>
<<if _storyClip is "f564d9ba6dfc">>She lies back on the pallet, spreads her thighs and pushes your head down between them. Her fingers knot in your hair, holding you exactly where she wants you, her thighs squeezing your ears while you eat her.<<else>>She pushes you down onto the sleeping pallet. Straddles your hips. Her hands pin your shoulders, her thighs squeezing your waist.<</if>>
<<say "Sera" "Then you're mine tonight. You don't move unless I say. You don't come unless I allow it.">>
Her voice has dropped an octave. Commanding.
<<say "Sera" "Do you understand?">>
<div class="choice-container">
<<vchoice "\"Yes.\"" "Prelude_Sub_Scene_1" "intimate" "rapid-strikes">>
<<vchoice "\"Yes, ma'am.\"" "Prelude_Sub_Scene_1b" "intimate" "lips">>
</div><<run VaultUI.setBackground("prelude/sera-tent-intimate")>>
<<run VaultUI.showCharacter("sera", "center", "dominant")>>
<<storyVideo "characters/sera/takes_charge">>
<<say $player.name "Yes.">>
<<say "Sera" "Good.">>
<<if _storyFamily is "sf_cg_prelude_sera_sex_sub_02">>She pulls you up by the hair, shoves you onto your back and strips the last of your clothes off you, her healer's hands knowing exactly how to touch you. But there's nothing clinical about it — every brush of her fingers leaves fire in its wake.<<elseif _storyClip is "f39e512d1fbd">>She strips you slowly, kissing her way down your body and tugging your trousers open with a wicked smile. There's nothing clinical about it — every brush of her fingers leaves fire in its wake.<<else>>She strips you efficiently, her healer's hands knowing exactly how to touch you. But there's nothing clinical about it — every brush of her fingers leaves fire in its wake.<</if>>
When you're bare beneath her, she sits back to look at you. Her eyes roam your body like you're something precious. Something //hers.//
<<if _storyFamily is "sf_cg_prelude_sera_sex_sub_02">><<say "Sera" "Hands on my ass. Only where I put them.">><<else>><<say "Sera" "Hands above your head. Keep them there.">><</if>>
<<if _storyFamily is "sf_cg_prelude_sera_sex_sub_02">>You obey. Your heart pounds as she settles astride you, already bare, making you watch, making you //wait.//<<else>>You obey. Your heart pounds as she slowly removes her own clothes, making you watch, making you //wait.//<</if>>
Then she lowers herself onto you, and you forget how to breathe.
<div class="choice-container">
<<vchoice "Continue..." "Prelude_Sub_Scene_Climax" "intimate" "rapid-strikes">>
</div><<run VaultUI.setBackground("prelude/sera-tent-intimate")>>
<<run VaultUI.showCharacter("sera", "center", "dominant")>>
<<set $player.establishedKinks.push("honorifics")>>
<<storyVideo "characters/sera/takes_charge">>
<<say $player.name "Yes, ma'am.">>
Her eyes flash with surprised delight. <<if _storyFamily is "sf_cg_prelude_sera_sex_sub_02">>Her fingers tighten in your hair.<<else>>Her grip on your shoulders tightens.<</if>>
<<say "Sera" "Oh, I //like// that.">>
<<if _storyFamily is "sf_cg_prelude_sera_sex_sub_02">>She rewards you by dragging your trousers down and sinking onto your cock with her back to you, slow, all the way, grinding while your hands fill with her ass. Then she twists round, leans down over you and kisses you, her tongue claiming your mouth.<<else>>She rewards you with a deep kiss, her tongue claiming your mouth.<</if>> When she pulls back, you're both breathing hard.
<<say "Sera" "Say it again.">>
<<say $player.name "Yes, ma'am.">>
<<say "Sera" "Again.">>
<<say $player.name "Yes, ma'am. Whatever you want. I'm yours.">>
She makes a sound low in her throat — hunger and satisfaction intertwined.
<<say "Sera" "You're perfect. Now lie still and let me use you.">>
<div class="choice-container">
<<vchoice "Continue..." "Prelude_Sub_Scene_Climax" "intimate" "rapid-strikes">>
</div><<run VaultUI.setBackground("prelude/sera-tent-intimate")>>
<<set $prelude.sexStyle to "switch">>
<<set $prelude.playerRole to "switch">>
<<set $player.sexualIdentity to "switch">>
<<set $player.establishedKinks.push("versatility", "power exchange", "intensity")>>
<<run VaultUI.showCharacter("sera", "center", "passionate")>>
You pull her close, your mouth finding hers, but there's no surrender in either of you. Just //hunger.//
<<storyVideo "story/prelude_sera_sex_switch/sex_switch_start" "" "characters/sera/switch">>
<<if _storyClip is "343ce027c907">>She pushes; you pull. You pin her down; she tries to flip you and loses. Clothes tear in your mutual desperation to reach skin.<<elseif _storyClip is "7a864191a0c0">>Clothes tear in your mutual desperation to reach skin. For a moment you're both on your feet, bare, her back to the tent pole, your fingers working her wet pussy and her hand wrapped around your cock, neither willing to let the other lead. Then she pushes; you pull. You pin her down; she flips you over.<<else>>She pushes; you pull. You pin her down; she flips you over. Clothes tear in your mutual desperation to reach skin.<</if>>
<<say "Sera" "I can never tell if I want to devour you or be devoured by you.">>
<<say $player.name "Why choose?">>
She laughs — wild and breathless — as you roll together across the tent floor, a tangle of limbs and heat and need.
<<if _storyClip is "343ce027c907">>When you finally come together, you win the first round: she ends up on her back under you, one leg hooked up against your chest, and she stares up at you with her fingers working her clit, already plotting the next.<<else>>When you finally come together, it's a battle and a surrender at once. Taking turns. Trading dominance. Rising and falling like waves.<</if>>
<div class="choice-container">
<<vchoice "Continue..." "Prelude_Switch_Scene_Climax" "intimate" "rapid-strikes">>
</div><<run VaultUI.setBackground("prelude/sera-tent-intimate")>>
<<run VaultUI.showCharacter("sera", "center", "passionate")>>
<<storyVideo "characters/sera/missionary_climax">>
<<if _storyFamily is "sf_cg_prelude_sera_sex_dom_03">>You drag her down onto the pallet, onto her hands and knees, and take her from behind again, fist in her hair, while the light through the open flap fades to deep blue. Then you push her flat. You set a relentless pace. Sera writhes beneath you, cheek pressed to the blankets, twisting to look back at you, her fingers clawing the bedding, your name spilling from her lips like a prayer.<<elseif _storyClip is "9f1c3edd3293">>You lift her onto the edge of a stack of supply crates and take her face to face at a relentless pace. Sera clings to you, her nails raking your back, your name spilling from her lips like a prayer.<<else>>You set a relentless pace. Sera writhes beneath you, her nails raking your back, your name spilling from her lips like a prayer.<</if>>
<<say "Sera" "I'm— I'm close—">>
<<say $player.name "Look at me.">>
Her eyes meet yours, dark with pleasure, and you feel her begin to shatter.
<<say $player.name "That's it. Come for me.">>
She breaks apart with a cry, her body clenching around you, and you follow her over the edge moments later, burying yourself deep as the world dissolves into sensation.
After, you hold her close. Her head rests on your chest, her fingers tracing idle patterns on your skin.
<<say "Sera" "I love it when you're like that. When you just... take.">>
She presses a kiss to your heart.
<<say "Sera" "Promise me something.">>
<div class="choice-container">
<<vchoice "\"Anything.\"" "Prelude_Afterglow" "intimate" "broken-heart">>
</div><<run VaultUI.setBackground("prelude/sera-tent-intimate")>>
<<run VaultUI.showCharacter("sera", "center", "passionate")>>
<<storyVideo "characters/sera/ride_climax">>
<<if _storyClip is "092de6f248b4">>She rides you with devastating skill, controlling the pace, the depth, every sensation, her fingers working her clit. You're helpless beneath her — and you've never felt more alive.<<else>>She rides you with devastating skill, controlling the pace, the depth, every sensation. You're helpless beneath her — and you've never felt more alive.<</if>>
<<say "Sera" "You feel so good. So //obedient//.">>
She grinds down, shifting the angle, and stars explode behind your eyes.
<<say "Sera" "I'm close. Are you?">>
<<say $player.name "Yes— please—">>
<<say "Sera" "Please //what?//">>
<<say $player.name "Please let me come.">>
She smiles — tender and fierce at once — and increases her pace.
<<say "Sera" "Come with me. Now.">>
The permission breaks something loose. You shatter together, her cries mixing with yours, pleasure crashing through you in endless waves.
After, she collapses onto your chest, boneless and satisfied.
<<say "Sera" "You're so good for me. You know that?">>
<<say "Sera" "Promise me something.">>
<div class="choice-container">
<<vchoice "\"Anything.\"" "Prelude_Afterglow" "intimate" "broken-heart">>
</div><<run VaultUI.setBackground("prelude/sera-tent-intimate")>>
<<run VaultUI.showCharacter("sera", "center", "passionate")>>
<<storyVideo "story/prelude_sera_sex_switch/switch_scene_climax" "" "characters/sera/switch">>
<<if _storyFamily is "sf_cg_prelude_sera_sex_switch_04">>The battle reaches its peak. She throws you onto your back, plants herself on your face just long enough to make her point, then sinks onto your cock and rides you, rubbing her clit, grinning. You take it back: roll her onto her side and fuck her from behind, then onto her back, her leg over your arm, her mouth on yours. You've lost track of who's on top, whose turn it is to lead. It doesn't matter.<<elseif _storyClip is "18baa057a8ce">>The battle reaches its peak. She's on top now, riding you hard, one hand between her legs rubbing her clit while she takes you deep. You've lost track of whose turn it is to lead. It doesn't matter.<<else>>The battle reaches its peak. You've lost track of who's on top, whose turn it is to lead. It doesn't matter.<</if>> You're both chasing the same fire.
<<say "Sera" "With me— come with me—">>
<<say $player.name "Together—">>
You crash over the edge at the same moment, clutching each other like drowning survivors, pleasure tearing through you both in perfect synchrony.
After, you lie tangled together, sweat cooling on your skin, hearts slowly settling.
<<say "Sera" "I love how we are together. Never quite sure who's in charge.">>
She kisses your shoulder.
<<say "Sera" "Promise me something.">>
<div class="choice-container">
<<vchoice "\"Anything.\"" "Prelude_Afterglow" "intimate" "broken-heart">>
</div><<run VaultUI.setBackground("prelude/sera-tent-intimate")>>
<<run VaultUI.showCharacter("sera", "center", "tender")>>
<<storyVideo "story/prelude_sera_romance/afterglow">>
<<say $player.name "Anything.">>
<<say "Sera" "Promise me that whatever happens... you'll survive. Even if I can't be there.">>
She pulls back to look at you, and there's something in her eyes. A shadow of fear.
<<say "Sera" "I have a bad feeling about tonight. I can't explain it. Healer's intuition, maybe.">>
She traces your jaw with her fingertips.
<<say "Sera" "Promise me. Whatever happens, you keep going.">>
<div class="choice-container">
<<vchoice "\"I promise.\"" "Prelude_Sleep" "talk" "broken-heart">>
<<vchoice "\"We'll survive together.\"" "Prelude_Sleep" "talk" "broken-heart">>
</div><<run VaultUI.setBackground("prelude/sera-tent-intimate")>>
<<run VaultUI.hideCharacter("sera")>>
<<run VaultUI.transition("fade")>>
<<storyVideo "story/prelude_sera_romance/sleep">>
You make the promise. She relaxes against you, satisfied or at least willing to pretend.
Sleep comes slowly, your bodies intertwined, her breathing evening out against your chest.
Your last thought before darkness takes you is simple:
//This is enough. Whatever tomorrow brings, this was enough.//
You don't know that you'll never hold her this way again.
<div class="choice-container">
<<vchoice "..." "Prelude_Attack_Start" "action" "">>
</div><<run VaultUI.setBackground("prelude/camp-attack")>>
<<run VaultUI.transition("fade")>>
<<storyVideo "story/prelude_raid_abduction/start">>
<<say "" "SCREAMS.">>
<<if _storyFamily is "sf_cg_prelude_raid_abduction_02">>Engines and screams. The caravan is an hour out of camp, rolling through open desert, when spiked cars close in on both flanks, war-painted raiders clinging to their hoods. Sera is already moving in the crowded cab beside you, grabbing her satchel, her healer's instincts kicking in.<<else>>You're ripped from sleep by the sounds of chaos. Sera is already moving, grabbing clothes, her healer's instincts kicking in.<</if>>
<<run VaultUI.showCharacter("sera", "center", "scared")>>
<<if _storyFamily is "sf_cg_prelude_raid_abduction_02">><<say "Sera" "Raiders! Get down—">><<else>><<say "Sera" "Raiders! Get dressed—">><</if>>
<<if _storyFamily is "sf_cg_prelude_raid_abduction_02">>A figure swings in at the cab window from the running board — one of the caravan guards, blood streaming down his face.<<else>>The tent flap tears open. A figure silhouettes against firelight — one of the caravan guards, blood streaming down his face.<</if>>
<<say "Guard" "They're everywhere! Must be forty of them— the north watch is dead—">>
<<if _storyFamily is "sf_cg_prelude_raid_abduction_02">>A thrown lance takes him through the throat. He topples off the side of the rig.<<else>>An arrow takes him through the throat. He crumples.<</if>>
<<say "Sera" "NO!">>
She moves toward him automatically, healer's instinct overriding everything. You grab her arm.
<<say $player.name "He's gone. We need to run.">>
<<run VaultUI.hideCharacter("sera")>>
<div class="choice-container">
<<if _storyFamily is "sf_cg_prelude_raid_abduction_02">>
<<vchoice "Flee along the rig" "Prelude_Attack_Flee" "action" "run">>
<<else>>
<<vchoice "Flee through the camp" "Prelude_Attack_Flee" "action" "run">>
<</if>>
<<vchoice "Find a weapon first" "Prelude_Attack_Weapon" "action" "attack">>
</div><<run VaultUI.setBackground("prelude/camp-attack")>>
<<storyVideo "story/prelude_raid_abduction/weapon">>
<<if _storyClip is "b2d477352002">>Raiders are already crawling over the engine toward the cab, painted and screaming. You snatch the sword the guard dropped on the running board.<<else>>You snatch the dead guard's sword.<</if>> It's slick with blood, but it's better than nothing.
Sera grabs your free hand.
<<run VaultUI.showCharacter("sera", "center", "scared")>>
<<if _storyClip is "b2d477352002">><<say "Sera" "This way— back along the rig, away from the cars—">><<else>><<say "Sera" "This way— there's a gap in the wagon circle on the south side—">><</if>>
<<run VaultUI.hideCharacter("sera")>>
<div class="choice-container">
<<vchoice "Follow her" "Prelude_Attack_Flee" "action" "run">>
</div><<run VaultUI.setBackground("prelude/camp-attack")>>
<<run VaultUI.setWeather("none")>>
<<storyVideo "story/prelude_raid_abduction/flee">>
<<if _storyFamily is "sf_cg_prelude_raid_abduction_02">>The caravan is hell. Raider cars and bikes swarm both flanks, chalk-white raiders clinging to their hoods.<<else>>The camp is hell. Wagons burning. Bodies everywhere.<</if>> Raiders in mismatched armor cutting down anyone who moves.
<<if _storyFamily is "sf_cg_prelude_raid_abduction_02">>You drag Sera through the crowded, lurching cab, bodies pressed on every side, and out onto the rig. A bike explodes in a ball of fire beside you.<<else>>You run, Sera's hand in yours, weaving between burning tents.<</if>>
<<run VaultUI.showCharacter("caravan_raider", "left", "threatening")>>
A raider blocks your path. Grey-bearded, a battered hat pulled low, a blade as long as your forearm. He grins.
<<run setup.speakerMap["Raider"] = "caravan_raider">>
<<say "Raider" "Fresh meat.">>
<<run setup.speakerMap["Raider"] = "raider">>
<div class="choice-container">
<<vchoice "Fight him" "Prelude_Attack_Fight" "action" "attack">>
<<vchoice "Dodge and run" "Prelude_Attack_Dodge" "action" "run">>
</div><<run VaultUI.setBackground("prelude/camp-attack")>>
<<run VaultUI.hideCharacter("caravan_raider")>>
You charge him. It's not pretty — you're no warrior — but desperation makes up for skill.
He's expecting easy prey. He's not expecting you to go for his throat.
You take a cut across the arm, but your blade finds his gut. He goes down screaming.
<<run VaultUI.showCharacter("sera", "center", "scared")>>
<<say "Sera" "You're hurt—">>
<<say $player.name "Later! Keep moving!">>
<<run VaultUI.hideCharacter("sera")>>
<div class="choice-container">
<<vchoice "Run for the edge of camp" "Prelude_Attack_Almost_Out" "action" "run">>
</div><<run VaultUI.setBackground("prelude/camp-attack")>>
<<run VaultUI.hideCharacter("caravan_raider")>>
You feint left, then go right. The raider's blade whistles past your ear. Sera throws a handful of dust in his face.
He stumbles back, cursing. You don't give him time to recover — you're already past him, pulling Sera toward the darkness beyond the burning camp.
<div class="choice-container">
<<vchoice "Run for the edge of camp" "Prelude_Attack_Almost_Out" "action" "run">>
</div><<run VaultUI.setBackground("prelude/camp-burning")>>
<<storyVideo "story/prelude_raid_abduction/almost_out">>
<<if _storyFamily is "sf_cg_prelude_raid_abduction_02">>You're almost clear. The open desert is just yards away, past the edge of the rig.<<else>>You're almost free. The desert darkness beckons just yards away.<</if>>
<<if _storyFamily is "sf_cg_prelude_raid_abduction_02">>Then a raider on a swaying pole swoops over the rig, and Sera's hand is torn from yours.<<else>>Then Sera's hand is torn from yours.<</if>>
<<run VaultUI.showCharacter("sera", "right", "reaching")>>
<<say "Sera" "NO! RUN!">>
<<if _storyFamily is "sf_cg_prelude_raid_abduction_02">>She swings up into the sky, kicking, and the pole carries her off toward a raider car. A masked raider drops onto the deck in front of you, blade drawn.<<else>>Two raiders have her. A third faces you, blade drawn.<</if>>
Time stops.
<<run VaultUI.hideCharacter("sera")>>
<div class="choice-container">
<<vchoice "Fight to save her" "Prelude_Try_Save_Sera" "action" "attack">>
<<vchoice "Try to negotiate" "Prelude_Try_Negotiate" "talk" "talk">>
</div><<run VaultUI.setBackground("prelude/camp-burning")>>
<<storyVideo "story/prelude_raid_abduction/prelude_try_save_sera">>
<<if _storyFamily is "sf_cg_prelude_raid_abduction_02">>You launch yourself at the masked raider.<<else>>You launch yourself at them.<</if>> A blade catches your side — deep — but you barely feel it.
You fight like a cornered animal. One raider falls. Another.
But there are too many.
A blow to the head sends you sprawling. The world spins.
<<run VaultUI.showCharacter("sera", "center", "scared")>>
<<if _storyFamily is "sf_cg_prelude_raid_abduction_02">>Flat on your back on the rig's deck, through blurring vision, you see Sera struggling as they haul her toward the raiders' cars, where figures in grey hoods stand waiting. The raiders hand her over.<<else>>Through blurring vision, you see Sera struggling as they drag her toward the wagons, where figures in grey hoods stand waiting. The raiders hand her over.<</if>>
<<say "Sera" "LIVE! You promised! LIVE!">>
<<run VaultUI.hideCharacter("sera")>>
Then darkness.
<div class="choice-container">
<<vchoice "..." "Prelude_Wake_After_Attack" "action" "">>
</div><<run VaultUI.setBackground("prelude/camp-burning")>>
<<storyVideo "story/prelude_raid_abduction/prelude_try_save_sera">>
<<say $player.name "Wait! Take me instead—">>
The raider laughs.
<<say "Raider" "We're taking her because she's //useful//. Healer. Breeding stock.">>
He spits at your feet.
<<say "Raider" "You? You're nothing.">>
<<run VaultUI.showCharacter("sera", "center", "scared")>>
<<if _storyFamily is "sf_cg_prelude_raid_abduction_02">>They haul Sera past you toward their cars, still kicking. By the cars, figures in grey hoods stand waiting, and the raiders hand her over.<<else>>They drag Sera past you. At the wagons, figures in grey hoods stand waiting, and the raiders hand her over.<</if>> Her eyes meet yours one last time.
<<say "Sera" "Live. You promised me. LIVE!">>
The raider hits you. Darkness explodes behind your eyes.
<<run VaultUI.hideCharacter("sera")>>
<div class="choice-container">
<<vchoice "..." "Prelude_Wake_After_Attack" "action" "">>
</div><<run VaultUI.setBackground("prelude/camp-burning")>>
<<run VaultUI.setTimeOfDay("dawn")>>
<<set $prelude.seraFate to "taken">>
<<run VaultUI.transition("fade")>>
You wake to ashes.
<<storyVideo "story/mv_prelude/wake_after_attack">>
The camp is gone. Burned wagons. Scattered bodies. Smoke rising into a dawn sky that should be beautiful but isn't.
Everything hurts.
<<if $prelude.sexStyle eq "dominant">>
You remember her beneath you, trusting, surrendering, //safe//.
<<elseif $prelude.sexStyle eq "submissive">>
You remember her above you, powerful, demanding, //alive//.
<<else>>
You remember the two of you tangled together, neither leading nor following, just //together//.
<</if>>
She's gone.
Taken, not killed. You cling to that. Raiders don't take corpses.
Sera is alive. Somewhere.
But you can't follow. Forty raiders. You can barely stand.
Her last words echo: //Live. You promised.//
<div class="choice-container">
<<vchoice "Salvage what you can" "Prelude_Salvage" "action" "search">>
</div><<run VaultUI.setBackground("prelude/camp-burning")>>
<<storyVideo "story/mv_prelude/salvage">>
You spend an hour picking through the wreckage. Find a waterskin, half full. A pack of dried meat. A knife.
The dead watch with empty eyes. You close as many as you can.
No other survivors. Forty people. Gone in a night.
You pick a direction — away from the raider tracks — and start walking.
<div class="choice-container">
<<vchoice "Begin the journey" "Prelude_Wasteland_Day1" "action" "sunrise">>
</div><<run VaultUI.setBackgroundDirect("media/backgrounds/travel/terrain/highway/highway_6.webp")>>
<<run VaultUI.setTimeOfDay("afternoon")>>
<<run VaultUI.setWeather("clear")>>
<<run VaultUI.transition("fade")>>
<div class="scene-intro">
<h2>Day 1 — Alone</h2>
</div>
The Reclaimed doesn't forgive.
You push through the undergrowth because stopping means dying. Vines claw at your legs. Roots try to trip you. Each step sends fire through your wounds. The water bottle is already half empty.
The old world crumbles all around you—shattered highways swallowed by trees, rusted cars buried under moss, buildings split apart by roots that grew for decades without anyone to stop them. Nature didn't just survive the collapse. It won.
And somewhere in this green hell, you have to survive too.
Your thoughts loop endlessly: //Sera. The attack. Her face as they dragged her away.//
<<if $prelude.loveConfessed>>
//I love you too,// she said. Hours ago. A lifetime ago.
<</if>>
By evening, you've found no shelter, no clean water, no hope. You collapse in the hollow of a toppled overpass, vines curtaining the entrance, and wait for your body to stop screaming.
<div class="choice-container">
<<vchoice "Try to sleep" "Prelude_Dream_1" "action" "night">>
</div><<run VaultUI.setBackground("prelude/dream-void")>>
<<run VaultUI.setTimeOfDay("night")>>
<<run VaultUI.setWeather("clear")>>
<<run VaultUI.setSceneMode("dream")>>
<<run VaultUI.transition("supernatural")>>
Sleep takes you, and so do the dreams.
You stand in a purple void. Stars that aren't stars wheel overhead. The air tastes of ozone and something sweeter. Darker.
<<run VaultUI.showCharacter("sera", "center", "aroused")>>
<<storyVideo "characters/sera/dream">>
<<if _storyClip is "08befdd729b3">>Sera is there. Two of her. The same red hair, the same checkered dress, fixing their collars side by side in front of a mirror that isn't there.<<else>>Sera is there.<</if>>
<<if _storyClip is "08befdd729b3">>But wrong. Their smiles too wide. Their eyes too bright. They move in perfect step, like one thing wearing two bodies.<<else>>But wrong. Her smile too wide. Her eyes too bright. Shadows moving beneath her skin.<</if>>
<<say "Sera?" "I've been waiting for you.">>
<<if _storyClip is "63a99616798b">>She spins in the violet dark, hair flying, then walks toward you with her arms thrown wide, hips swaying. The void behind her has borrowed a whitewashed street from some memory of hers. Every movement liquid seduction.<<elseif _storyClip is "08befdd729b3">>One of them settles a black beret on her curls, blows you a kiss and winks. The other only watches you over her shoulder. Then the first one comes to you, hips swaying.<<else>>She approaches, hips swaying. Every movement liquid seduction.<</if>>
<<say "Sera?" "Don't you recognize me, lover? Don't you //want// me?">>
Her hands find your chest. Her touch burns — pleasure edged with pain.
<<say "Sera?" "I can give you what she couldn't. What she never would.">>
<<run VaultUI.hideCharacter("sera")>>
<div class="choice-container">
<<vchoice "\"You're not her.\"" "Prelude_Dream_1_Reject" "action" "alert">>
<<vchoice "Surrender to the dream" "Prelude_Dream_1_Accept" "intimate" "rapid-strikes">>
</div><<run VaultUI.setBackground("prelude/dream-void")>>
<<run VaultUI.setWeather("clear")>>
<<run VaultUI.showCharacter("sera", "center", "dominant")>>
<<storyVideo "story/prelude_dream1/reject__reject">>
<<say $player.name "You're not Sera. Whatever you are, get out of my head.">>
The thing wearing Sera's face laughs. It's not her laugh.
<<say "Entity" "Oh, you're //strong//. I like that.">>
<<if _storyClip is "8ee8df8b740e">>Her form flickers, and the dream-street behind her smears like wet paint. For a moment you glimpse something else — vast, ancient, hungry.<<else>>Her form flickers. For a moment you glimpse something else — vast, ancient, hungry.<</if>>
<<say "Entity" "We'll meet again, little mortal. The vault calls to you. And what waits inside... well.">>
Her smile splits too wide.
<<say "Entity" "I'll be seeing you soon.">>
<<run VaultUI.hideCharacter("sera")>>
<div class="choice-container">
<<vchoice "Wake up" "Prelude_Wake_Day2" "action" "sun">>
</div><<run VaultUI.setBackground("prelude/dream-void")>>
<<run VaultUI.setWeather("clear")>>
<<run VaultUI.showCharacter("sera", "center", "passionate")>>
<<addCorruption 5>>
<<set $prelude.dreamSurrender to true>>
<<storyVideo "story/prelude_dream1/reject__accept">>
You're too tired to fight. Too broken. And she looks //so much// like Sera...
<<if _storyClip is "2a9b298c851a">>Dream-hands undress you. Dream-lips find your throat, your chest, your belly, and then she is on her knees in the violet dark, Sera's eyes turned up to you while her tongue drags up the underside of your cock and she sucks you into her mouth. Pleasure washes through you, tinged with wrongness you're too exhausted to examine.<<else>>Dream-hands undress you. Dream-lips find your throat. Pleasure washes through you, tinged with wrongness you're too exhausted to examine.<</if>>
<<say "Entity" "That's it. Let me in. Let me taste what she had...">>
The pleasure intensifies. Impossible. Inhuman.
When you finally wake, gasping, the taste of her lingers on your lips.
And something inside you feels... different.
<<run VaultUI.hideCharacter("sera")>>
<div class="choice-container">
<<vchoice "..." "Prelude_Wake_Day2" "action" "sun">>
</div><<run VaultUI.setBackground("prelude/reclaimed-dawn")>>
<<run VaultUI.setTimeOfDay("dawn")>>
<<run VaultUI.setSceneMode("normal")>>
<<run VaultUI.transition("fade")>>
<div class="scene-intro">
<h2>Wake</h2>
</div>
<<storyVideo "story/mv_prelude/wake_day2">>
<<if _storyClip is "dbb76299f5f8">>You wake with a gasp. Dawn comes up pink and rust-orange through the haze, and the air is already hot.<<else>>You wake with a gasp. Dawn paints the Reclaimed in shades of blood.<</if>>
The dream clings to you. Sera's face. Or whatever was wearing it.
<<if $prelude.dreamSurrender>>
Your body still hums with phantom pleasure. And deep in your chest, something new pulses. Something //other//.
<</if>>
The water is gone. You have hours, maybe a day, before dehydration kills you.
<<if _storyClip is "dbb76299f5f8">>You force yourself upright and climb out through the vines, onto the broken deck of the overpass. On the far side the road simply stops. No trees. No moss. Dunes, rolling off into the glare, sand drifted over the old highway where nothing ever came back to grow.
You walk out onto the nearest ridge before your head catches up with your feet. Miles of nothing, and you with an empty bottle. Out there you last a morning.
You turn around. The green is hell, but hell has shade, and somewhere under all those leaves there has to be water. You walk back into it.<<else>>You force yourself upright and keep walking.<</if>>
Toward nothing.
Toward everything.
<div class="choice-container">
<<vchoice "Keep moving" "Prelude_Wasteland_Day2_Walk" "action" "run">>
</div><<run VaultUI.setBackground("prelude/reclaimed-day")>>
<<run VaultUI.setTimeOfDay("afternoon")>>
<<storyVideo "story/mv_prelude/day2_walk">>
Hours blur together. The green hell never ends. Your legs shake. Your vision swims.
You start to hallucinate. Sera walking beside you. Voices in the rustling leaves. A clear stream that vanishes when you reach it.
<<if $prelude.loveConfessed>>
//I love you too,// she says in your memory. Over and over. A mantra.
<</if>>
You're going to die out here.
The thought is strangely peaceful. At least you won't have to feel anymore.
Then you see it.
A shape through the trees. Not your imagination — too solid, too //strange//.
A hillside. And embedded in it, a door. Massive, circular, yellow metal set in a gray frame — like a gear waiting to turn. Ferns climb its edges. An old concrete path, cracked and overgrown, leads right to it.
Ancient. //Impossible.//
<div class="choice-container">
<<vchoice "Approach the door" "Prelude_Vault_Discovery" "action" "door-handle">>
</div><<run VaultUI.setBackground("prelude/vault-exterior")>>
<<run VaultUI.setTimeOfDay("evening")>>
<<run VaultUI.transition("fade")>>
The vault door looms before you. Twenty feet of circular metal, yellow and gray, set into the hillside like it grew there. A central wheel mechanism sits at its heart — old, rusted at the edges, but somehow still //intact//.
This shouldn't exist.
But neither should you, by all rights.
<<storyVideo "story/mv_prelude/vault_wheel">>
As you approach, something //clicks// deep inside the hill. Ancient mechanisms engaging. The wheel begins to turn on its own.
And impossibly, slowly, the massive gear-door rolls aside.
Cool air washes over you. Recycled. Filtered. //Alive.//
From the darkness beyond, a voice:
<<say "???" "Well, well. A visitor. How long has it been?">>
Footsteps. A figure emerges — tall, thin, one eye replaced with a mechanical apparatus that whirs as it focuses on you.
<<run VaultUI.showCharacter("groundskeeper", "center", "neutral")>>
<<say "Groundskeeper" "Don't just stand there, survivor. Come in before the night predators smell your blood.">>
He turns and walks back into the darkness.
<<run VaultUI.hideCharacter("groundskeeper")>>
<div class="choice-container">
<<vchoice "Enter the vault" "Prelude_Vault_Enter" "action" "door-handle">>
</div><<run VaultUI.setBackground("prelude/vault-entrance-hall")>>
<<run VaultUI.transition("fade")>>
You step inside.
<<storyVideo "story/mv_prelude/vault_enter">>
The door groans shut behind you, sealing out the Reclaimed. The silence is profound after two days of howling wind.
The Groundskeeper waits by an ancient console, his mechanical eye casting a faint red glow.
<<run VaultUI.showCharacter("groundskeeper", "right", "welcoming")>>
<<say "Groundskeeper" "This is the Vault of Duvarnach. I am its keeper. I have been... waiting.">>
He studies you with unsettling intensity.
<<say "Groundskeeper" "The vault provides shelter, power, and safety. In return, it requires a guardian. Someone to maintain it. Protect it.">>
He gestures at the vast hall around you.
<<say "Groundskeeper" "My time is ending. Yours... is just beginning.">>
<<run VaultUI.hideCharacter("groundskeeper")>>
<div class="choice-container">
<<vchoice "\"What is this place?\"" "Prelude_End" "talk" "alert">>
<<vchoice "\"I just need water.\"" "Prelude_End" "talk" "shower">>
</div><<run VaultUI.setBackground("prelude/vault-entrance-hall")>>
<<run VaultUI.showCharacter("groundskeeper", "right", "neutral")>>
<<say "Groundskeeper" "In time, you will learn everything. For now, rest. Recover.">>
<<storyVideo "story/mv_prelude/hidden_room">>
He presses a button. A hidden door slides open, revealing a small room with a bed. Clean water. Food.
<<say "Groundskeeper" "Tomorrow, we begin your education. The vault has... needs. And you have much to learn.">>
His mechanical eye whirs.
<<say "Groundskeeper" "Welcome to your new home.">>
The door closes behind you. You collapse onto the bed.
Sera's face floats behind your eyes. The dream-thing's whisper.
//We'll meet again.//
Whatever comes next, you survived.
Now you have to figure out how to //live//.
<<run VaultUI.hideCharacter("groundskeeper")>>
<<set $flags.arrivedUnwillingly to true>>
<<if $prelude && $prelude.seraFate === "taken">>
<<journalAdd "The caravan is gone. Everyone is dead or scattered. Sera... they took her. Those hooded figures - the Convergence, they called themselves. I couldn't stop them. I couldn't do anything but watch." "story">>
<<journalAdd "I wandered for days. No food, barely any water. Thought I was going to die out there in the dust. Then I found this place - the Vault. Some bald guy with a machine where one eye should be runs it. Calls himself the Groundskeeper. Says I can stay." "story">>
<<else>>
<<journalAdd "The caravan was attacked. I barely made it out alive. Wandered the Reclaimed for days, certain I was going to die." "story">>
<<journalAdd "Found shelter. A vault, hidden in the wastes. An old man - the Groundskeeper - took me in. I don't know what this place is, but it's better than dying out there." "story">>
<</if>>
<<run VaultUI.transition("fade")>>
<div class="scene-intro">
<h2>End of Prelude</h2>
<p>A new day begins...</p>
</div>
<div class="choice-container">
<<vchoice "Begin your new life" "Day1_Arrival" "action" "sun">>
</div><<getExhibTier "player">>
<h2>First Exposure</h2>
It happened suddenly. One moment your clothing was intact. The next—
A tear. A slash. A complete loss of fabric in a critical area.
You freeze. Your hands instinctively move to cover yourself, but there's not enough coverage. Not nearly enough.
Everything is exposed.
<<storyVideo "events/exhibitionism/first_exposure_player">>
<<if _exhibTier <= 0>>
Your face burns. Mortification floods through you. This can't be happening. Not here. Not now.
You desperately search for something—anything—to cover yourself. Your hands shake as you try to hide, but you're acutely aware that you're failing.
<<if setup.kiraWithYou()>>
<<getExhibTier "kira">>
<<if _exhibTier <= 1>>
<<say "Kira" "\"Oh! Oh god—\" She spins around, face flushed. \"What happened?!\"">>
<p class="thought">Even her embarrassment feels like judgment.</p>
<<elseif _exhibTier <= 3>>
<<say "Kira" "\"Well... that happened.\" She glances back, then quickly looks away. \"You, uh... might want to fix that.\"">>
<p class="thought">She's trying to be casual about it. Not working.</p>
<<else>>
<<say "Kira" "\"Looks like someone's having a bad day.\" She doesn't bother looking away. \"Or a good one, depending on perspective.\"">>
<p class="thought">Of course she's amused by your mortification.</p>
<</if>>
<</if>>
<<elseif _exhibTier <= 1>>
You feel your face flush, but you're managing it. Barely.
You cover yourself with your hands, acutely aware of how exposed you are. This is humiliating, but at least no one important is around.
<<if setup.kiraWithYou()>>
<<getExhibTier "kira">>
<<if _exhibTier <= 1>>
<<say "Kira" "\"Oh! Um...\" She's embarrassed too, which somehow makes this better. \"I, uh... didn't see anything. Much.\"">>
<<elseif _exhibTier <= 2>>
<<say "Kira" "\"Well, you're definitely exposed.\" She tries not to smirk. \"Need to find some new pants?\"">>
<<else>>
<<say "Kira" "\"Rough day for wardrobe malfunctions, huh? At least you're taking it in stride.\"">>
<</if>>
<</if>>
<<elseif _exhibTier <= 2>>
It's uncomfortable, but you're functioning. You cover yourself, but without the panic that would have seized you before.
This is... manageable.
<<if setup.kiraWithYou()>>
<<getExhibTier "kira">>
<<if _exhibTier <= 1>>
<<say "Kira" "\"I, um...\" She's looking away, but she's clearly noticed. \"Sorry, I can— I don't have to—\"">>
<p class="thought">She's more flustered than you are.</p>
<<elseif _exhibTier <= 3>>
<<say "Kira" "\"Looks like someone needs a wardrobe upgrade.\" She glances at you, then away. \"Shouldn't linger here though.\"">>
<<else>>
<<say "Kira" "\"That's quite the wardrobe malfunction. Not complaining, but you might want to fix that.\"">>
<</if>>
<</if>>
<<else>>
You don't even flinch. So what? It's just skin. Everyone has skin.
You keep moving without bothering to cover yourself much. If someone wants to look, let them.
<<if setup.kiraWithYou()>>
<<getExhibTier "kira">>
<<if _exhibTier <= 2>>
<<say "Kira" "\"You're not even...\" She stares. \"Seriously? You're just... okay with that?\"">>
<p class="thought">She seems genuinely confused by your comfort.</p>
<<elseif _exhibTier <= 3>>
<<say "Kira" "\"Not bothering to cover up anymore, huh?\" She watches you with interest. \"Admire the confidence.\"">>
<<else>>
<<say "Kira" "\"Looks good on you.\" She lets her eyes linger a moment longer than necessary. \"The exposure, I mean.\"">>
<</if>>
<</if>>
<</if>>
<<gainExhibitionism "player" 3>>
<<if $combat.active>>
<<if $flags.seductionUnlocked>>
<<combatVictoryTransition "continue">>
<<else>>
<div class="choice-container">
<<vchoice "Continue" "Combat_Victory_Simple" "action" "forward">>
</div>
<</if>>
<<else>>
<<vchoice "Continue" `setup.fightReturnPassage()` "action" "forward">>
<</if>><<getExhibTier "kira">>
<h2>Kira Exposed</h2>
You're fighting. Moving through combat together. And then—
Something catches her top. Claws. Blades. Pure bad luck.
The fabric tears. Not gradually. All at once. One moment she's covered. The next—
Kira stands there exposed. Her breasts bare. She makes a small, shocked sound.
<<if _exhibTier <= 0>>
<<say "Kira" "\"No, no, no—\" Her hands fly to cover herself. She's shaking. Mortified. \"Don't look! Don't— I can't—\"">>
She's frozen, caught between embarrassment and the need to keep fighting. The look in her eyes is pure panic.
<<if $companions[0].affection >= 20>>
<p class="thought">You should help. Say something. Do something.</p>
<div id="fx-choices">
<div class="choice-container">
<<link "\"It's okay. Let me cover you.\"">>
<<addTrust "kira" 5>>
<<addAffection "kira" 1>>
<<replace "#fx-choices">>
<p>You pull off your own shirt, toss it to her. She catches it, pulls it on with shaking hands. Grateful. Embarrassed. But the panic fades slightly.</p>
<<say "Kira" "\"Thank you. I— I can't... I wasn't ready for that.\"">>
<div class="choice-container">
<<vchoice "Continue" "Continue_from_Exposure_Comfort" "action" "forward">>
</div>
<</replace>>
<</link>>
<<link "\"We'll get you somewhere safe to fix this.\"">>
<<addTrust "kira" 3>>
<<replace "#fx-choices">>
<p>She nods, hand covering herself, trying to focus back on the fight. But her movements are scattered. Unfocused.</p>
<div class="choice-container">
<<vchoice "Continue" "Continue_from_Exposure_Distracted" "action" "forward">>
</div>
<</replace>>
<</link>>
</div>
</div>
<<else>>
<p>She's too mortified to acknowledge you. Just covers herself and tries to push through.</p>
<div class="choice-container">
<<vchoice "Continue" "Continue_from_Exposure_Alone" "action" "forward">>
</div>
<</if>>
<<elseif _exhibTier <= 1>>
<<say "Kira" "\"No— not— can't...\" She's turning away, arms crossed over her chest. Her face is crimson.">>
She's functioning, but barely. Every movement is self-conscious. Awkward.
<div id="fx-choices">
<<link "\"Kira, focus. We'll fix your shirt after.\"">>
<<addTrust "kira" 2>>
<<replace "#fx-choices">>
<p>She nods, forcing herself to keep fighting. But her efficiency has dropped noticeably.</p>
<p class="combat-effect">Kira's accuracy reduced by 15% this turn.</p>
<div class="choice-container">
<<vchoice "Continue" "Continue_from_Exposure_Distracted" "action" "forward">>
</div>
<</replace>>
<</link>>
<<link "\"You look fine. Really.\"">>
<<addTrust "kira" 1>>
<<clampStat "player.lust" 3>>
<<replace "#fx-choices">>
<p>She shoots you a look that's part grateful, part annoyed. But her embarrassment fades slightly.</p>
<<say "Kira" "\"Easy for you to say.\"">>
<div class="choice-container">
<<vchoice "Continue" "Continue_from_Exposure_Distracted" "action" "forward">>
</div>
<</replace>>
<</link>>
</div>
<<elseif _exhibTier <= 2>>
She glances down, then back at the fight. Not ideal, but she's not panicking.
<<say "Kira" "\"This is not ideal.\" She keeps one arm loosely over her chest. \"We're fixing this as soon as we can.\"">>
<div id="fx-choices">
<<link "\"Agreed. Keep your head in the fight.\"">>
<<addTrust "kira" 2>>
<<replace "#fx-choices">>
<p>She nods, pushing through the discomfort.</p>
<div class="choice-container">
<<vchoice "Continue" "Continue_from_Exposure_Fighting" "action" "forward">>
</div>
<</replace>>
<</link>>
<<link "\"Doesn't really bother you that much, does it?\"">>
<<clampStat "player.lust" 2>>
<<replace "#fx-choices">>
<<say "Kira" "\"I didn't say that. I said it's not ideal. There's a difference.\"">>
<div class="choice-container">
<<vchoice "Continue" "Continue_from_Exposure_Fighting" "action" "forward">>
</div>
<</replace>>
<</link>>
</div>
<<elseif _exhibTier <= 3>>
She glances down at her exposed chest, then back at the enemy. No panic. Just assessment.
<<say "Kira" "\"Well, that's annoying. But we've had worse.\"">>
She keeps fighting without bothering to cover herself. Her movements are smooth. Practiced.
<div id="fx-choices">
<<link "\"Not letting it distract you?\"">>
<<addTension "kira" 5>>
<<clampStat "player.lust" 3>>
<<replace "#fx-choices">>
<<say "Kira" "\"We're in combat. Vanity is a luxury.\" She glances at you with the faintest smirk. \"Besides, you're paying attention. That's distraction enough.\"">>
<div class="choice-container">
<<vchoice "Continue" "Continue_from_Exposure_Fighting" "action" "forward">>
</div>
<</replace>>
<</link>>
<div class="choice-container">
<<vchoice "Continue fighting" "Continue_from_Exposure_Fighting" "action" "map">>
</div>
</div>
<<elseif _exhibTier <= 4>>
She doesn't even look down. Just keeps fighting. Her exposed breasts don't seem to register as a problem.
<<say "Kira" "\"I'm shameless, not stupid. Let's focus on the fight.\"">>
She's efficient. Deadly. The exposure is almost irrelevant to her.
<div id="fx-choices">
<<link "Watch her fight">>
<<clampStat "player.lust" 5>>
<<addTension "kira" 3>>
<<replace "#fx-choices">>
<p>She's aware you're watching. Moves with a certain... precision. Confidence. She doesn't cover herself. Doesn't apologize.</p>
<div class="choice-container">
<<vchoice "Continue" "Continue_from_Exposure_Fighting" "action" "forward">>
</div>
<</replace>>
<</link>>
</div>
<<else>>
She glances down at her exposed breasts, then catches your eye. A deliberate look. Challenging. Almost inviting.
<<say "Kira" "\"Eyes on the enemy... or on me?\" She doesn't wait for an answer. \"Enjoy the view. But help me with these.\"">>
She's not bothered. She's aware. And she's enjoying your reaction.
<<clampStat "player.lust" 8>>
<<addTension "kira" 10>>
<div id="fx-choices">
<<link "\"Both look pretty good.\"">>
<<addTension "kira" 5>>
<<addAffection "kira" 1>>
<<replace "#fx-choices">>
<<say "Kira" "\"That's what I like to hear.\" She flashes a grin. \"Now let's finish this fight.\"">>
<div class="choice-container">
<<vchoice "Continue" "Continue_from_Exposure_Fighting" "action" "forward">>
</div>
<</replace>>
<</link>>
<<link "Focus on the fight">>
<<set $companions[0].affection += 1>>
<<replace "#fx-choices">>
<p>She notices. Approves. With barely a moment's delay, you're moving together again, and whatever advantage the enemy thought they had is gone.</p>
<div class="choice-container">
<<vchoice "Continue" "Continue_from_Exposure_Fighting" "action" "forward">>
</div>
<</replace>>
<</link>>
</div>
<</if>>
<<gainExhibitionism "kira" 5>><<getExhibTier "kira">>
<h2>Kira Fully Exposed</h2>
The fight isn't going well. Another hit. Another tear.
And then her pants give way completely. Not just torn— gone. Her underwear barely hanging on, and then that tears too.
Kira gasps, hands flying down to cover herself. Too late. You've both seen. The enemies have seen.
<<if _exhibTier <= 0>>
<<say "Kira" "\"Oh god— no, this can't— I'm naked!\" She's trying to cover both chest and pussy with her hands. Failing. Voice breaking. \"I can't fight like this! I can't—\"">>
She's on the verge of breaking down completely. Exposed. Vulnerable. Terrified.
<<if $companions[0].affection >= 30>>
<p class="thought">She needs help. Now.</p>
<div id="fx-choices">
<div class="choice-container">
<<link "\"Stay behind me. I'll protect you.\"">>
<<addTrust "kira" 8>>
<<addAffection "kira" 2>>
<<replace "#fx-choices">>
<<say "Kira" "\"Thank you. God, thank you. I— I'm sorry, I just—\"">>
<div class="choice-container">
<<vchoice "Continue" "Continue_from_Full_Exposure_Protected" "action" "forward">>
</div>
<</replace>>
<</link>>
<<link "\"We need to end this fight. Now.\"">>
<<addTrust "kira" 5>>
<<set $player.will += 2>>
<<replace "#fx-choices">>
<p>She nods, fear turning to desperation. You both attack with renewed fury.</p>
<div class="choice-container">
<<vchoice "Continue" "Continue_from_Full_Exposure_Fury" "action" "forward">>
</div>
<</replace>>
<</link>>
</div>
</div>
<<else>>
<p>She's too mortified to even speak. Just tries to cover herself and survive.</p>
<div class="choice-container">
<<vchoice "Continue" "Continue_from_Full_Exposure_Alone" "action" "forward">>
</div>
<</if>>
<<elseif _exhibTier <= 1>>
<<say "Kira" "\"Not this— not everything—\" She's covering herself, face burning. \"Just... let me fight.\"">>
She's functioning, but the humiliation is overwhelming.
<div class="choice-container">
<<link "\"I've got your back.\"">>
<<addTrust "kira" 3>>
<<goto "Continue_from_Full_Exposure_Supported">>
<</link>>
<<link "\"Focus. We can fix this after.\"">>
<<addTrust "kira" 1>>
<<goto "Continue_from_Full_Exposure_Distracted">>
<</link>>
</div>
<<elseif _exhibTier <= 2>>
She glances down, then back at the fight. Exposed, but not panicking.
<<say "Kira" "\"Well. This is awkward.\" A hint of dark humor. \"Let's just finish this.\"">>
<div class="choice-container">
<<link "\"Stay focused. We've got this.\"">>
<<addTrust "kira" 2>>
<<goto "Continue_from_Full_Exposure_Composed">>
<</link>>
<<link "\"You're handling this well.\"">>
<<set $companions[0].affection += 2>>
<<goto "Continue_from_Full_Exposure_Composed">>
<</link>>
</div>
<<elseif _exhibTier <= 3>>
She glances down at her naked lower half, then back at the enemies. A quick assessment. No panic.
<<say "Kira" "\"Could be worse. Let's finish this before it gets awkward.\"">>
She's fighting efficiently, not letting the exposure slow her down much.
<div id="fx-choices">
<<link "\"Not bothering you?\"">>
<<addTension "kira" 3>>
<<clampStat "player.lust" 3>>
<<replace "#fx-choices">>
<<say "Kira" "\"I didn't say that. But we have bigger problems right now.\"">>
<div class="choice-container">
<<vchoice "Continue" "Continue_from_Full_Exposure_Composed" "action" "forward">>
</div>
<</replace>>
<</link>>
<div class="choice-container">
<<vchoice "Keep fighting" "Continue_from_Full_Exposure_Composed" "action" "attack">>
</div>
</div>
<<elseif _exhibTier <= 4>>
She doesn't even look down. Just keeps moving. Completely naked from the waist down, and she's treating it like a minor inconvenience.
<<say "Kira" "\"Really? Now?\" She sighs. \"Fine. Let's just end this.\"">>
She's efficient. Deadly. The exposure barely registers.
<div id="fx-choices">
<<link "Watch her fight">>
<<clampStat "player.lust" 8>>
<<addTension "kira" 5>>
<<replace "#fx-choices">>
<p>She's aware you're watching. Doesn't bother covering. Moves with absolute confidence despite— or maybe because of— the exposure.</p>
<div class="choice-container">
<<vchoice "Continue" "Continue_from_Full_Exposure_Composed" "action" "forward">>
</div>
<</replace>>
<</link>>
<div class="choice-container">
<<vchoice "Focus on the fight" "Continue_from_Full_Exposure_Composed" "action" "attack">>
</div>
</div>
<<else>>
She glances down at her completely exposed lower half, then catches your eye. Deliberate. Challenging.
<<say "Kira" "\"Enjoying the view?\" She doesn't wait for an answer. \"Good. Now help me finish these bastards.\"">>
She's not just comfortable. She's owning it. Using it. The exposure is leverage, not shame.
<<clampStat "player.lust" 12>>
<<addTension "kira" 15>>
<div id="fx-choices">
<<link "\"Both the view and the fight look good.\"">>
<<addTension "kira" 8>>
<<addAffection "kira" 1>>
<<replace "#fx-choices">>
<<say "Kira" "\"That's what I like to hear.\" She grins wickedly. \"Now let's finish this.\"">>
<div class="choice-container">
<<vchoice "Continue" "Continue_from_Full_Exposure_Composed" "action" "forward">>
</div>
<</replace>>
<</link>>
<<link "Focus on the fight">>
<<set $companions[0].affection += 2>>
<<replace "#fx-choices">>
<p>She notices your discipline. Approves. You're both professionals, even when things get... distracting.</p>
<div class="choice-container">
<<vchoice "Continue" "Continue_from_Full_Exposure_Composed" "action" "forward">>
</div>
<</replace>>
<</link>>
</div>
<</if>>
<<gainExhibitionism "kira" 8>>Kira recovers. You're back in the fight together. Stronger for it.
<<gainExhibitionism "kira" 5>>
<<if $flags.seductionUnlocked>>
<<combatVictoryTransition "continue">>
<<else>>
<div class="choice-container">
<<vchoice "Continue" "Combat_Victory_Simple" "action" "forward">>
</div>
<</if>>Kira is focused but clearly distracted. You manage the fight, but it's harder this time.
<<gainExhibitionism "kira" 5>>
<<if $flags.seductionUnlocked>>
<<combatVictoryTransition "continue">>
<<else>>
<div class="choice-container">
<<vchoice "Continue" "Combat_Victory_Simple" "action" "forward">>
</div>
<</if>>Kira pushes through on her own. Manages the fight, but it takes everything she has.
<<gainExhibitionism "kira" 5>>
<<if $flags.seductionUnlocked>>
<<combatVictoryTransition "continue">>
<<else>>
<div class="choice-container">
<<vchoice "Continue" "Combat_Victory_Simple" "action" "forward">>
</div>
<</if>>The fight continues. Kira adapts. You're a better team because of it.
<<gainExhibitionism "kira" 5>>
<<if $flags.seductionUnlocked>>
<<combatVictoryTransition "continue">>
<<else>>
<div class="choice-container">
<<vchoice "Continue" "Combat_Victory_Simple" "action" "forward">>
</div>
<</if>><<getExhibTier "player">>
<<if _exhibTier === 1>>
<h2>Embarrassed Now</h2>
It's strange. A few days ago, being exposed meant panic. Shame. Desperation.
Now? You're still embarrassed. Still flustered. But the panic has faded.
You can function while exposed. Walk through the vault without total mortification. Make eye contact.
It's not comfort. Not yet. But it's acceptance.
<p class="thought">This is progress? Or a problem?</p>
<<elseif _exhibTier === 2>>
<h2>Getting Comfortable</h2>
You catch yourself standing bare in your quarters, and you don't immediately reach for clothes.
Huh.
When did this become manageable? A week ago it would have been unthinkable. Now it's just... a state you exist in. Uncomfortable, sure. But not catastrophic.
You can have thoughts besides "HIDE."
<p class="thought">Maybe exposure isn't the worst thing that can happen to you.</p>
<<elseif _exhibTier === 3>>
<h2>Acceptance</h2>
You're exposed in the commons. It happens. Happens enough now that you barely react.
Some people stare. Others don't. You used to care what they thought.
You're not sure when you stopped.
You move through the vault with a kind of easy indifference. Your body is just... part of you. Not something shameful. Not really anything worth hiding.
<p class="thought">This is it. This is what it feels like when modesty doesn't matter anymore.</p>
<<elseif _exhibTier === 4>>
<h2>Shameless</h2>
You don't cover anymore. There's no point.
You like being seen. The attention. The awareness of eyes on your body. It feels good.
Maybe it's arrogance. Maybe it's freedom. You're not sure there's a difference anymore.
When you move through the vault exposed, you move with purpose. Confidence. Like you're exactly where you want to be, looking exactly as you want to look.
<p class="thought">This is who you are now.</p>
<<elseif _exhibTier === 5>>
<h2>Exhibitionist</h2>
You catch yourself arranging your clothes to show more. Positioning yourself where light will hit your body just right. Timing your movements for maximum impact.
You're not just okay with being exposed.
You want it. You engineered it. You're enjoying every second of it.
And when you see Kira's eyes on you? That's the best part.
<p class="thought">You used to think this would be shameful. Turns out shame just needed time to die.</p>
<</if>>
<<set _tuDay to ({ Day5_Morning_Wake: 5, Day6_Morning_Wake: 6, Day7_Morning_Wake: 7 })[previous()] || 0>>
<<if _tuDay === 5>>
<div class="choice-container">
<<vchoice "Start your day" "Day5_Morning_Mirror" "move" "map">>
</div>
<<elseif _tuDay === 6>>
<div class="choice-container">
<<vchoice "Start your day" "Day6_Morning_Commons" "move" "map">>
</div>
<<elseif _tuDay === 7>>
<div class="choice-container">
<<vchoice "Start your day" "Day7_Morning_Commons" "move" "map">>
</div>
<<else>>
<div class="choice-container">
<<vchoice "Continue your day" "Vault_Hub" "move" "map">>
</div>
<</if>><<getExhibTier "kira">>
<<if _exhibTier gte 3>><<storyVideo "story/mv_exhib/tier_up_kira">><</if>>
<<if _exhibTier === 1>>
<h2>Kira Growing Comfortable</h2>
She's still embarrassed when exposed. Still covers herself. But there's less panic in it now.
She catches you watching sometimes. Doesn't immediately snap at you about it.
<<say "Kira" "\"What? Did I miss something?\"">>
It's not hostile. Just curious. Like she's acknowledging your gaze rather than denying it.
<<addTrust "kira" 2>>
<<elseif _exhibTier === 2>>
<h2>Kira's Walls Lowering</h2>
She's started being less careful with her clothing around you.
Not deliberate exposure. Just... less vigilant. Forgetting to immediately adjust something. Staying in a partially undressed state longer than necessary.
She almost seems to test your reactions sometimes.
<<say "Kira" "\"See something you like?\" She's not angry about it. Almost amused.">>
<<addAffection "kira" 1>>
<<elseif _exhibTier === 3>>
<h2>Kira's Acceptance</h2>
She stops bothering with the little gestures of modesty.
When she changes, she doesn't hide. When you see her partially clothed, she doesn't immediately cover. It's just... how things are now.
There's a confidence in it. Like she's decided her body is just a body, and judgment is someone else's problem.
<<say "Kira" "\"You're staring again.\"">>
She says it with a smile.
<<addTension "kira" 5>>
<<set $companions[0].affection += 2>>
<<elseif _exhibTier === 4>>
<h2>Kira Owns It</h2>
She's stopped pretending. She likes being seen.
She'll stretch in ways that show off her body. Adjust her clothing to be more revealing. Catch you watching and hold your gaze.
There's power in it. She knows the effect she has.
<<say "Kira" "\"You can touch, if you want. I don't mind.\"">>
She's not offering everything. Not yet. But the invitation is there.
<<addTension "kira" 10>>
<<addAffection "kira" 1>>
<<clampStat "player.lust" 10>>
<<elseif _exhibTier === 5>>
<h2>Kira Embraces It</h2>
She's become something else. The shy survivor is gone.
In her place: a woman who actively enjoys exposure. Who positions herself in the light. Who meets your stare and smiles. Who asks you to touch.
She might suggest going without underwear just to feel the freedom. Might wear clothes specifically chosen to show off what she can.
This is who she is now.
<<say "Kira" "\"I like this. I like how it makes you look at me. Like you can't help yourself.\"">>
<<addTension "kira" 15>>
<<addAffection "kira" 2>>
<<clampStat "player.lust" 15>>
<</if>>
<<set _tuDay to ({ Day5_Morning_Wake: 5, Day6_Morning_Wake: 6, Day7_Morning_Wake: 7 })[previous()] || 0>>
<<if _tuDay === 5>>
<div class="choice-container">
<<vchoice "Start your day" "Day5_Morning_Mirror" "move" "map">>
</div>
<<elseif _tuDay === 6>>
<div class="choice-container">
<<vchoice "Start your day" "Day6_Morning_Commons" "move" "map">>
</div>
<<elseif _tuDay === 7>>
<div class="choice-container">
<<vchoice "Start your day" "Day7_Morning_Commons" "move" "map">>
</div>
<<else>>
<div class="choice-container">
<<vchoice "Continue your day" "Vault_Hub" "move" "map">>
</div>
<</if>>You shield Kira, taking the hits meant for her. She recovers her composure behind you.
When the fight ends, she's grateful. Shaken, but grateful.
<<gainExhibitionism "kira" 8>>
<<if $flags.seductionUnlocked>>
<<combatVictoryTransition "continue">>
<<else>>
<div class="choice-container">
<<vchoice "Continue" "Combat_Victory_Simple" "action" "forward">>
</div>
<</if>>The fight ends quickly. Desperation and fury make you both more efficient than ever.
Kira finds something to cover herself as soon as it's over. Doesn't look at you.
<<gainExhibitionism "kira" 8>>
<<if $flags.seductionUnlocked>>
<<combatVictoryTransition "continue">>
<<else>>
<div class="choice-container">
<<vchoice "Continue" "Combat_Victory_Simple" "action" "forward">>
</div>
<</if>>Kira pushes through on her own. It takes everything she has, but she manages.
She covers herself immediately after the fight. Won't meet your eyes.
<<gainExhibitionism "kira" 8>>
<<if $flags.seductionUnlocked>>
<<combatVictoryTransition "continue">>
<<else>>
<div class="choice-container">
<<vchoice "Continue" "Combat_Victory_Simple" "action" "forward">>
</div>
<</if>>Kira fights with your support. The exposure is humiliating, but manageable with you at her side.
<<gainExhibitionism "kira" 8>>
<<if $flags.seductionUnlocked>>
<<combatVictoryTransition "continue">>
<<else>>
<div class="choice-container">
<<vchoice "Continue" "Combat_Victory_Simple" "action" "forward">>
</div>
<</if>>The fight continues, but Kira is clearly distracted. You both make it through, but it's harder than it should have been.
<<gainExhibitionism "kira" 8>>
<<if $flags.seductionUnlocked>>
<<combatVictoryTransition "continue">>
<<else>>
<div class="choice-container">
<<vchoice "Continue" "Combat_Victory_Simple" "action" "forward">>
</div>
<</if>>Kira adapts to the exposure. The fight continues. You're a better team because of it.
<<gainExhibitionism "kira" 8>>
<<if $flags.seductionUnlocked>>
<<combatVictoryTransition "continue">>
<<else>>
<div class="choice-container">
<<vchoice "Continue" "Combat_Victory_Simple" "action" "forward">>
</div>
<</if>><<widget "checkVaultDebt">>
<<if $flags.debtCollectionPending && $flags.vaultDebt >= 50>>
<<if $time.day !== $flags.lastDebtCollection>>
<<set _triggerChance to Math.min(0.6, $flags.vaultDebt / 150)>>
<<if random(0, 100) < (_triggerChance * 100)>>
<<goto "Vault_Debt_Collection">>
<</if>>
<</if>>
<</if>>
<</widget>>
<<widget "payVaultDebt">>
<<set _amount to _args[0] || 25>>
<<set $flags.vaultDebt to Math.max(0, $flags.vaultDebt - _amount)>>
<<set $flags.totalDebtPaid += _amount>>
<<set $flags.lastDebtCollection to $time.day>>
<<if $flags.vaultDebt < 25>>
<<set $flags.debtCollectionPending to false>>
<</if>>
<</widget>><<setBackground "vault">>
<h2><<icon "supernatural">> The Vault Calls</h2>
<p>You wake in darkness. The weight of your debt presses down on you.</p>
<p>Something is here. Something ancient. Something hungry.</p>
<div class="wip-notice-detailed">
<strong>⚠ WORK IN PROGRESS</strong><br><br>
The vault's debt collection system is under development.<br>
Full explicit scenes coming in a future update.<br><br>
<em>Current debt: <<print $flags.vaultDebt>></em>
</div>
<<payVaultDebt 25>>
<<set $flags.groundskeeperPresent to false>>
<p>When you wake again, you feel... lighter. The debt has been partially paid.</p>
<<if $flags.vaultDebt > 0>>
<p class="warning">Remaining debt: <<print $flags.vaultDebt>></p>
<<else>>
<p class="success">Your debt is cleared. For now.</p>
<</if>>
<div class="choice-container">
<<vchoice "Continue" "Vault_Hub" "action" "forward">>
</div><<widget "velithDreamDrainRoll">>
<<set _vddScene to null>>
<<set _vddAll to ["Velith_DreamDrain_Moonlight", "Velith_DreamDrain_Throat", "Velith_DreamDrain_Painted", "Velith_DreamDrain_Bound", "Velith_DreamDrain_Cuffed", "Velith_DreamDrain_Chains", "Velith_DreamDrain_Throne", "Velith_DreamDrain_Wings", "Velith_DreamDrain_Elf", "Velith_DreamDrain_Stare", "Velith_DreamDrain_Harness", "Velith_DreamDrain_Chair", "Velith_DreamDrain_Offered", "Velith_DreamDrain_Herself", "Velith_DreamDrain_Kitchen", "Velith_DreamDrain_Twins", "Velith_DreamDrain_Nightlamp", "Velith_DreamDrain_PinkLace", "Velith_DreamDrain_Archivist", "Velith_DreamDrain_Sunlit", "Velith_DreamDrain_Screens", "Velith_DreamDrain_Bombshell", "Velith_DreamDrain_Study", "Velith_DreamDrain_Mirror", "Velith_DreamDrain_NightBlue", "Velith_DreamDrain_Scholar", "Velith_DreamDrain_Shower", "Velith_DreamDrain_HeartLamp", "Velith_DreamDrain_Gloves", "Velith_DreamDrain_Pool", "Velith_DreamDrain_Lake"]>>
<<if !$flags.fishedAtLake>><<set _vddAll to _vddAll.filter(function (p) { return p !== "Velith_DreamDrain_Lake"; })>><</if>>
<<set _vddSuc to ($supernaturals && $supernaturals.succubus) ? $supernaturals.succubus : null>>
<<set _vddEdgeRelease to $arousal && $arousal.player && $arousal.player.edging && $arousal.player.daysAtHigh >= 5 && $player.lust >= 80>>
<<if _vddSuc && _vddSuc.met && (!$extremeContent || $extremeContent.supernatural !== false) && $time.day >= 9 && ($time.day - (_vddSuc.lastDreamVisit || 0)) >= 2 && !_vddEdgeRelease>>
<<if !$flags.velithDreamSeen || typeof $flags.velithDreamSeen !== "object">><<set $flags.velithDreamSeen to {}>><</if>>
<<set _vddPool to _vddAll.filter(function (p) { return !$flags.velithDreamSeen[p]; })>>
<<set _vddChance to 50>>
<<if _vddPool.length === 0>>
<<set _vddPool to _vddAll.filter(function (p) { return $flags.velithDreamSeen[p] === 1; })>>
<<set _vddChance to 15>>
<<if _vddPool.length > 1>><<set _vddPool to _vddPool.filter(function (p) { return p !== _vddSuc.lastDrainScene; })>><</if>>
<</if>>
<<if _vddPool.length > 0 && random(1, 100) <= _vddChance>>
<<set _vddScene to _vddPool.random()>>
<<set $flags.velithDreamSeen[_vddScene] to ($flags.velithDreamSeen[_vddScene] || 0) + 1>>
<<set _vddSuc.lastDrainScene to _vddScene>>
<<set _vddSuc.lastDreamVisit to $time.day>>
<</if>>
<</if>>
<</widget>>
<<widget "velithDreamLook">>
<<if _args[0]>><<run VaultUI.transition("supernatural", 1200)>><</if>>
<<run VaultUI.setSceneMode("dream")>>
<<run VaultUI.setBackground("prelude/dream-void")>>
<<run VaultUI.setTimeOfDay("supernatural")>>
<<run VaultUI.hideAllCharacters()>>
<</widget>><<velithDreamLook true>>
You fall asleep. Then you're looking down at yourself falling asleep.
An iron bed you've never owned. White pillow. Candles burning low on both nightstands, blue moonlight across the sheets. You lie flat on your back in your clothes, arms dead at your sides, mouth slack. Out cold.
You can see all of it. You can't move any of it.
A woman bends over your hips. Dark hair. Black leather jacket. Big silver hoops swinging from her ears. You've never seen this body before.
You know exactly who's wearing it.
<<say "Velith" "Don't wake up, sweet thing. You're so much easier to eat like this.">>
Your jeans are open. Your cock is already in her mouth.
<<storyVideo "characters/velith/dream_drain_1">>
Her fist wraps the base and her lips slide down to meet it, wet and slow, her head bobbing over your lap in the candlelight. You feel every inch of it from wherever you are. The heat of her tongue. The drag of her lips. The suck, pulling at something deeper than your cock.
Your body on the bed doesn't twitch. It just lies there and lets her.
She looks up. Not at the sleeping man. At YOU, hanging above the bed with nowhere to go.
<<say "Velith" "Your little vault is starving me. Nothing down here worth eating. Just you.">>
<<say "Velith" "So I take what I need. Whenever I'm hungry.">>
She sinks back down and sucks harder. Your balls draw up tight. The body on the bed jerks once, hips lifting off the mattress, and you cum into her mouth in long, hard pulses. She swallows every one. You feel it go with every swallow: the heat out of your hands, the strength out of your thighs, all of it sliding down her throat with your cum.
She wipes her mouth. The hoops glint.
<<say "Velith" "Mmm. That'll keep me alive another few days. Sleep.">>
The candles go out one by one.
<div class="choice-container">
<<vchoice "Wake" "Velith_DreamDrain_Wake" "move" "sunrise">>
</div><<velithDreamLook true>>
It's dark and too warm, and something heavy is lying on your chest.
You try to open your eyes and they only half obey. Blonde hair spills across your face. A woman's body is stretched on top of yours, soft and heavy, and her mouth is on your neck.
Blonde tonight. Velith picked it off some dead memory, pulled it on like a dress.
<<say "Velith" "Shh. Don't fight. You never win.">>
<<storyVideo "characters/velith/dream_drain_2">>
Her lips work along your throat, open-mouthed, sucking at the skin under your jaw. Her tongue drags up to your ear. Every pull of her mouth drains something out of you, and it comes out of you as a moan you can't swallow. Your head presses back into the pillow. Your mouth hangs open.
She grinds down on your cock. You're buried in her pussy and you don't remember going in. It doesn't matter. In here she doesn't ask. She decides, and the dream does it.
<<say "Velith" "Hear yourself. Moaning for me like a whore. You were supposed to be the strong one.">>
<<say "Velith" "Give it to me. I'm hungry.">>
Her cunt clamps tight around you and milks. You cum hard, deep inside her, your hips bucking under her weight while her mouth stays latched to your throat. She pulls it out of you from both ends. Your vision goes grey at the edges.
She lifts her head. Her mouth is wet. Blonde hair falls back from a face that's starting to go wrong. The eyes are the wrong colour now. Hers.
<<say "Velith" "Good boy. Back to sleep.">>
<div class="choice-container">
<<vchoice "Wake" "Velith_DreamDrain_Wake" "move" "sunrise">>
</div><<velithDreamLook true>>
Red light. Purple light. A bare wooden floor under your feet and nothing else in any direction.
You're standing. Naked. You don't remember undressing.
She walks out of the red. Black hair. Big curled ram horns, black streaked with red. Black tribal paint slashed across her face, down her arms, over her chest. Long silver nails capping every fingertip, metal and pointed. Black straps hugging her body where clothes should be.
She rolls her shoulders in it like a new coat, pleased with the fit.
<<say "Velith" "Do you like this one? I made the nails just for you.">>
She sinks to her knees in front of you. You try to step back. Your feet don't move. Your hands hang at your sides like they belong to someone else.
<<say "Velith" "No, no. You stay right there. My dream. My rules.">>
<<storyVideo "characters/velith/dream_drain_3_mouth">>
She takes your cock in her mouth and sucks, slow and deep, the horns rocking in front of your eyes. The silver nails keep hold of your shaft.
<<if _storyClip is "1512a452f505">>She tips her head back and drags her tongue along the underside of your cock, down toward your balls, then swallows you deep again and bobs.
<<elseif _storyClip is "722f80ae5dd4">>Her nails pump the base while her lips work the head, wet and tight. Then she looks up at you with the tip of your cock resting on her lips.
<<elseif _storyClip is "23fbc81f5c35">>She pulls off and strokes you with those nails, the metal cold and smooth around your shaft, and looks up at you from under the horns. Then she sinks back down and takes you deep.
<<else>>She pulls off and strokes you with those nails, the metal cold and smooth around your shaft, and looks up at you from under the horns. She drags her tongue along the underside, down toward your balls, and swallows you deep again.
<</if>>
<<say "Velith" "Mmm. I can taste how full you are. Days of it.">>
<div class="choice-container">
<<vchoice "She wants it deeper" "Velith_DreamDrain_Painted_Horns" "intimate" "corruption">>
</div><<velithDreamLook>>
Your hand moves.
You didn't move it. It rises on its own, fingers glowing faint purple, and closes on the top of her head, right between the horns.
<<say "Velith" "That's it. Hold on. Use me.">>
<<storyVideo "characters/velith/dream_drain_3_horns">>
Your hand shoves her down onto your cock. Again. Again. You're fucking her face and it isn't you doing it. It's her will in your arm, driving her own throat down on you as hard as she wants it. She kneels there and takes it, wet, gagging sounds, her painted, silver-nailed hand spread flat across your belly and hip, holding you where she wants you.
You feel her throat work around the head of your cock. She's pulling on you from the inside. Your knees shake.
She lets you have a breath's worth of relief and no more.
<div class="choice-container">
<<vchoice "The floor tips" "Velith_DreamDrain_Painted_Ride" "intimate" "corruption">>
</div><<velithDreamLook>>
The floor tips and you're on your back.
She's already on top of you, facing away, lowering herself onto your cock. Her pussy swallows you to the root.
<<storyVideo "characters/velith/dream_drain_3_ride">>
Reverse. Her painted back to you, black lines down her spine. Harness strapped across her shoulders, garter straps pulled tight over her hips, a sheer black thong dragged aside. A jewel glints between her ass cheeks: she's got a plug in her ass while she rides you.
Your hands are on her hips. She allows them there.
She bounces on you, slow and heavy and then faster, her ass slapping down on your thighs, her cunt dragging up the length of your cock and slamming back down. Wet sounds fill the red dark. Her hair swings over her shoulders and hides the horns.
<<say "Velith" "Feel that? You're about to pour into me. Not yet. Not in here.">>
She lifts off you right at the edge. Your cock slaps wet against your belly.
<<say "Velith" "I want to TASTE it.">>
<div class="choice-container">
<<vchoice "She kneels" "Velith_DreamDrain_Painted_Finish" "intimate" "corruption">>
</div><<velithDreamLook>>
You're standing again. She's on her knees again. The dream doesn't bother with how.
Her mouth hangs open under your cock, tongue out, flat and waiting. And your own hand is wrapped around your shaft, jerking it hard and fast. Hers is the rhythm in your wrist.
<<say "Velith" "Feed me. Right here. On my tongue.">>
<<storyVideo "characters/velith/dream_drain_3_finish">>
You cum. Thick ropes of it land on her tongue, across her lips, down her painted chin. She stays there with her mouth open, looking up at you, letting you see it pool on her tongue before she swallows.
Then she takes you back into her mouth and sucks you clean, slow, getting every last drop, one silver-nailed hand stroking the shaft to squeeze out more. The nails scrape gently along your cock. Her eyes don't leave yours.
Your knees buckle. The heat goes out of your chest as if she's sucked it straight up the shaft.
<<say "Velith" "Delicious. You were never strong enough to keep me out, you know. You're barely strong enough to stand.">>
She licks her lips.
<<say "Velith" "Same time tomorrow night. Or the next. You'll never know which.">>
<div class="choice-container">
<<vchoice "Wake" "Velith_DreamDrain_Wake" "move" "sunrise">>
</div><<velithDreamLook true>>
A bright bedroom. A wooden headboard. A huge red tapestry burning on the wall, all tangled flame and eyes.
You're naked on your back on white sheets. You try to sit up and your arms jerk short.
Red rope. Your wrists are tied to the headboard. It wasn't there a second ago.
<<say "Velith" "Oh, that? I wanted it. So it's there.">>
She's sitting on your chest. Long brown hair, pale at the ends. Curled horns, black and red. Black tribal paint crawling over her face, her arms, her back, her belly. Long silver nails on every finger, metal, pointed. Nothing on her but black straps.
New body, same smirk. You'd know that smirk in any skin.
<<say "Velith" "You thought you could keep me out. Bind me. Bargain with me. Look who's bound now.">>
<<say "Velith" "In here, you can't even lift your arms unless I let you.">>
<<storyVideo "characters/velith/dream_drain_4_tease">>
She sits on your chest and reaches back behind her. Her nails find your cock and stroke it, the metal tips tracing up the shaft, and she turns her face to you with her mouth open, laughing at you.
Then she swings a leg off and kneels at your hip. She wraps those silver-nailed fingers around your cock and pumps it, slow, watching it throb in her grip. You pull at the rope. It doesn't give. She leans in close over your face, mouth wide, close enough to breathe you in.
<<say "Velith" "Pull harder. I like watching you try.">>
<div class="choice-container">
<<vchoice "She climbs on" "Velith_DreamDrain_Bound_Ride" "intimate" "corruption">>
</div><<velithDreamLook>>
She straddles you facing you, braces her silver nails on the headboard above your tied wrists, and sinks down onto your cock.
<<storyVideo "characters/velith/dream_drain_4_ride">>
She rides you facing you, her painted ass rising and falling on your cock.
<<if _storyClip is "31cf19e0d0fa">>She reaches back, digs her nails into your thigh and grinds, slow and deep, your cock buried in her. Then she bounces. Her ass slaps down on you, and you feel your cock slide wet in and out of her pussy.
<<else>>She grips the headboard above your tied hands and rides. Her ass slaps down on you, over and over, her nails rattling on the wood.
She throws her head back, horns and teeth.
<</if>>
<<say "Velith" "Look at you. Tied up in your own dream. Hard for the thing eating you alive.">>
<<say "Velith" "Come on. Fill me up. I need it.">>
The rope bites your wrists. Your hips buck up into her anyway. She slams down and squeezes, and you cum inside her, hard, your whole body arching against the ropes. She keeps riding through it, milking every pulse out of you, and moans like she's eating. Not a drop runs back down your cock. Her cunt drinks it all.
The warmth goes with it. Your fingers turn cold in the ropes.
She sits there on your cock until you soften, then pats your thigh.
<<say "Velith" "Same bed next time? Or should I find a new one to tie you to?">>
The ropes let go. So does the dream.
<div class="choice-container">
<<vchoice "Wake" "Velith_DreamDrain_Wake" "move" "sunrise">>
</div><<velithDreamLook true>>
Purple light. Tall windows full of trees that don't grow anywhere anymore. Red candles in a black candelabra.
You're on your back on a white bed and your wrists are cuffed. Red cuffs, chained to the bed corners. You never saw them close.
She's pulled on a body with brown hair, curled horns, black paint and silver nails, and smoothed it down like a glove. She's lying between your legs with your cock in front of her face.
<<say "Velith" "I like this one. It makes you lie so still.">>
<<say "Velith" "And the cuffs. I know you'd rather be free. So you're not.">>
<<storyVideo "characters/velith/dream_drain_5_mouth">>
Her tongue slides over your cock, her eyes locked on yours, then she takes you in her mouth. Her horns fill your view as she bobs, deep, her silver-nailed fingers clasped around the base of your cock. She pulls up to suck on the head and looks at you again, lips wet, the tip resting on her mouth.
Down again. Deeper. She's in no hurry. She has all night and you have nowhere to go.
<<say "Velith" "You taste like a man who hasn't been emptied in days. I'll fix that.">>
<div class="choice-container">
<<vchoice "She mounts you" "Velith_DreamDrain_Cuffed_Ride" "intimate" "corruption">>
</div><<velithDreamLook>>
She crawls up your body and sits down on your cock, facing you.
<<storyVideo "characters/velith/dream_drain_5_ride">>
She rides you on her knees, hips rolling, her nails raking your chest. Red lines bloom where the silver passes. Her hair flies.
<<if _storyClip is "31320f405cb7">>She wraps her silver-nailed fingers around your throat, her hand on your face, and fucks you like that.
<<elseif _storyClip is "14caf01135a1">>She throws her head back and screams at the ceiling, then flips her hair and rides harder.
<<elseif _storyClip is "a99beadcabd6">>She flips her hair back and grins at you while she fucks you.
<<else>>She throws her head back and screams at the ceiling, then snaps forward and wraps her silver-nailed fingers around your throat and grins down at you while she fucks you.
<</if>>
Your cuffed hands clench on nothing.
<<say "Velith" "Can't touch me. Can't stop me. Can't even beg properly.">>
She laughs and rides you harder.
<div class="choice-container">
<<vchoice "Try to speak" "Velith_DreamDrain_Cuffed_Gag" "intimate" "corruption">>
</div><<velithDreamLook>>
You open your mouth to say something. Her name. Stop. Anything.
<<storyVideo "characters/velith/dream_drain_5_gag">>
She's still riding you, laughing. Then her silver-nailed hand clamps over your mouth and throat, and squeezes.
<<say "Velith" "No. Not a word. Your mouth isn't what I came for.">>
Her hips never stop. She fucks you with her hand sealed over your mouth, your breath hot against her palm, her nails pricking the skin of your jaw. The candles smear into red streaks. Your cock is the only part of you she hasn't blurred, and it's buried in her.
<div class="choice-container">
<<vchoice "She leans down" "Velith_DreamDrain_Cuffed_Close" "intimate" "corruption">>
</div><<velithDreamLook>>
She lets go of your mouth and you drag in air.
<<storyVideo "characters/velith/dream_drain_5_close">>
Close now. Her horns, her painted face, her body grinding down on you, your cock sliding deep into her pussy and back out.
<<if _storyClip is "3fa9d9dabe25">>She screams, mouth wide. She slides her silver-tipped fingers between her lips and licks them, then screams again and rides you, hands on your chest.
<<else>>Her painted belly and garter straps fill your eyes as she grinds. Then she rises over you, horns black against the ceiling, and raises her silver-nailed hands above your face like she's deciding which part of you to take.
<</if>>
<<say "Velith" "Now. Give me everything. I'm STARVING.">>
You cum. It's torn out of you. You pump up into her, cuffs rattling, and she grinds down and holds you inside her, draining every spurt, until there's nothing left and you're still twitching. When she finally lifts off, you're dry. Her pussy has taken every drop.
She sighs like a woman sitting down to a hot meal.
<<say "Velith" "There it is. One more day I don't fade. Thank you, sweet thing.">>
<<say "Velith" "Leave the cuffs on. You won't need your hands.">>
<div class="choice-container">
<<vchoice "Wake" "Velith_DreamDrain_Wake" "move" "sunrise">>
</div><<velithDreamLook true>>
Black vinyl under your back, cold and slick. Two bars of blue neon burning in the dark. Silver chains strung everywhere above you like a spider's web.
A woman bends over your crotch. Purple hair cut in a heavy bob, fringe falling over one eye. Two small black horns. Red lipstick. A black top pulled open at the sides so her big tits hang out bare.
Velith, in a body built for this room.
<<say "Velith" "Chains everywhere, and none of them on you. Don't flatter yourself. I don't need them for you.">>
<<storyVideo "characters/velith/dream_drain_6_mouth">>
Her red lips close around your cock, her fist tight around the base, and she sucks.
<<if _storyClip is "a9f87c0cc664">>She works the head with her mouth, bent low over you on her elbows. She pulls off, grinning, strokes you with long nails, and takes you back in.
<<elseif _storyClip is "c9e502b1b663">>She holds your cock up straight in her fist and smiles at it. She licks the tip. Then she swallows you, bobbing, all the way down to the base.
<<elseif _storyClip is "9bbb4ac06c3d">>Your tip rests on her tongue while she looks up at you. Then she bobs, deeper and deeper, until her face is buried at the base. She comes up with her lips around the head and her eyes on yours.
<<elseif _storyClip is "d13b34a0b9e7">>On all fours between your legs she bobs on you, steady and deep. She comes up with the head resting on her red lips and looks straight into your eyes.
<<elseif _storyClip is "43530a9cbb30">>She takes you halfway, then all the way down, her hair falling over your thighs, and comes back up with her lips wrapped around the head.
<<else>>She pulls off, grinning, and strokes you with long nails. She licks the tip, then swallows you again, bobbing, sliding down until her face is buried at the base. She comes up with the head resting on her red lips and looks straight into your eyes.
<</if>>
<<say "Velith" "I could live on you for a week. I might have to.">>
<div class="choice-container">
<<vchoice "She climbs up" "Velith_DreamDrain_Chains_Hang" "intimate" "corruption">>
</div><<velithDreamLook>>
She squats over you, knees wide, and sinks down on your cock facing you.
Then she reaches up. The chains come down to meet her hands, loop around her wrists, and hold her up.
<<say "Velith" "See? I'm the one in chains. And you still can't do a thing.">>
<<storyVideo "characters/velith/dream_drain_6_hang">>
She hangs from the chains and bounces on your cock, deep squats, her pussy slamming down to your root and rising off again. Her tits swing with every drop. She looks down at you, mouth open, tongue out, then tips her head back.
<<if _storyClip is "8784a9d836e5">>Your hands find her thighs. She lets them.<</if>>
<div class="choice-container">
<<vchoice "She lets go of the chains" "Velith_DreamDrain_Chains_Ride" "intimate" "corruption">>
</div><<velithDreamLook>>
<<storyVideo "characters/velith/dream_drain_6_ride">>
She lets go of the chains and shoves your legs up at her sides like you weigh nothing, and keeps riding. She squeezes her own tits through her top. Your cock slides in and out of her, wet.
<<if _storyClip is "734450c3988f">>She holds you by the ankles. Then she leans forward, arms braced, tits swinging, and moans every time you hit bottom, tongue out.<</if>>
<<say "Velith" "You feel that pull? That's me drinking. Keep still.">>
You couldn't move if you tried. You try anyway. Nothing.
<div class="choice-container">
<<vchoice "She leans in" "Velith_DreamDrain_Chains_Mana" "intimate" "corruption">>
</div><<velithDreamLook>>
She leans over you, braced on her arms, her tits hanging in your face, and grinds down hard.
<<storyVideo "characters/velith/dream_drain_6_mana">>
Her tongue lolls out. Her hips work in tight circles on your cock.
<<say "Velith" "Come on. Give me mana. Give me ALL of it.">>
She throws her head back and moans with her eyes shut, grinding, grinding, taking you so deep you feel her cunt kiss the base of your cock with every roll.
<div class="choice-container">
<<vchoice "She feeds you" "Velith_DreamDrain_Chains_Tits" "intimate" "corruption">>
</div><<velithDreamLook>>
She pushes a tit into your mouth.
<<storyVideo "characters/velith/dream_drain_6_tits">>
You suck on it because she wants you to. She smiles down at you, rides you, then throws her head back and moans, her purple hair swinging. She looks down again and licks her lips at you.
<<say "Velith" "Suckle, sweet thing. Fair trade. You feed me, I feed you.">>
Her pussy tightens around you. You cum with her nipple in your mouth, flooding her, your hips jerking up off the vinyl. She rides out every pulse and moans, long and low, like the first mouthful after a famine. None of it spills. Her pussy swallows it the way her mouth would.
<<say "Velith" "Oh, that's GOOD. Keep making it for me.">>
The neon flickers out. The chains stop swinging.
<div class="choice-container">
<<vchoice "Wake" "Velith_DreamDrain_Wake" "move" "sunrise">>
</div><<velithDreamLook true>>
Red curtains. Gold. A throne behind her, its posts carved with skulls.
You stand in front of it, naked and hard. She's bent at the waist with your cock in her mouth.
Dark hair twisted up in a bun. Little red horns, shiny as blood. Black-and-red makeup swept out from her eyes like wings. Red lips. Long red latex gloves up past her elbows.
The oldest costume there is. She thinks it's funny.
<<say "Velith" "Isn't this what your people drew me as? I thought I'd dress up.">>
<<storyVideo "characters/velith/dream_drain_7_mouth">>
She sucks you deep, one gloved hand wrapped around your shaft. She pulls off and thick strings of spit stretch from her red lips to your cock. She strokes you through the mess, eyes half closed, drool on her lips, then takes you back in with her mouth wide open. Off. On. Deeper every time, leaving you soaked.
<<say "Velith" "Sit down. Oh, wait. You can't. Let me help.">>
<div class="choice-container">
<<vchoice "She pushes you down" "Velith_DreamDrain_Throne_Ride" "intimate" "corruption">>
</div><<velithDreamLook>>
She shoves you back and you sit on her throne. Skulls at your shoulders.
<<storyVideo "characters/velith/dream_drain_7_throne">>
<<if _storyClip is "e072dd6c86ba">>She's naked now, except for the gloves and her red stockings. She climbs into your lap facing away from you, red-stockinged knees on the throne either side of your hips, and sits down on your cock.<<else>>She's naked now, except for the gloves and her red stockings. She climbs into your lap facing you, red-stockinged knees on the throne either side of your hips, and sits down on your cock.<</if>>
She rides you on the throne, her ass rising and slamming back down, your cock sliding in and out of her pussy. Your hands are on her hips and her ass. They got there on their own. She looks back over her shoulder at the empty hall, all winged black eyeliner and red mouth, and reaches one red-gloved arm out to the side like a queen waving at her court.
<<say "Velith" "My throne. My dream. My meal.">>
<<say "Velith" "Now give me what I came for. And I want to SEE it.">>
Your balls pull tight. She feels it and lifts off you at the last second.
<div class="choice-container">
<<vchoice "She kneels at the throne" "Velith_DreamDrain_Throne_Finish" "intimate" "corruption">>
</div><<velithDreamLook>>
The throne is behind you now and you're on your feet. She kneels naked on the red carpet in front of you, gloves to the elbow, head tipped back, mouth wide open under your cock.
<<storyVideo "characters/velith/dream_drain_7_finish">>
You cum on her tongue. Thick and white, pooling on it, running over her red lips and down her chin while she holds her mouth open and lets you watch. Then she closes her lips over the head and sucks the rest out of you, slow, cum dribbling from the corner of her mouth, her eyes shut like she's tasting wine.
<<say "Velith" "That's what keeps me breathing, sweet thing. Every thick drop.">>
Your legs shake. She licks the last of it off your cock.
<<say "Velith" "You're a good seat. Keep my throne warm.">>
<div class="choice-container">
<<vchoice "Wake" "Velith_DreamDrain_Wake" "move" "sunrise">>
</div><<velithDreamLook true>>
A clean room. Grey carpet, white furniture, a potted plant. Some pre-war apartment dug out of your memory, spotless and wrong.
She kneels between your thighs. Blonde hair. A black headdress with two great curved horns. Black feathered wings spread behind her. A strappy black leather harness over her tits.
Different hair, different tits, different mouth. The same slow once-over, like she's checking what's left in the larder.
<<say "Velith" "Do you know how many shapes I've worn to get fed? This one's a favourite. Look at the wings.">>
<<storyVideo "characters/velith/dream_drain_8_mouth">>
She wraps one hand around your cock and sucks it, lips sliding down to her fist. Her tongue flicks out over the head. She looks up at you, eyes wide, cheeks hollow. Then she braces both hands on your thighs and takes you without them, deep, slow, her eyes locked on yours the whole way down.
<<say "Velith" "Don't look away. I want you watching when I take it.">>
<div class="choice-container">
<<vchoice "The room changes" "Velith_DreamDrain_Wings_Ride" "intimate" "corruption">>
</div><<velithDreamLook>>
Purple sheets. Grey fur throws. A gold-framed mirror on the wall. You're on your back on a bed.
She straddles you facing you, black wings spread behind her, and sits down on your cock.
<<storyVideo "characters/velith/dream_drain_8_ride">>
She rides you, both hands reaching back to spread her own ass cheeks wide around your cock as it pumps in and out of her pussy. She bounces steady and hard. Near the end your hands land on her ass. She allows it.
<<say "Velith" "Feel it disappear. That's all you are to me, sweet thing. Something I sit on to eat.">>
<<say "Velith" "Now empty yourself. Not in there. In my mouth, where I can taste it.">>
She climbs off you and the bed is gone. You're standing over her.
<div class="choice-container">
<<vchoice "She opens her mouth" "Velith_DreamDrain_Wings_Finish" "intimate" "corruption">>
</div><<velithDreamLook>>
She kneels in front of you, horns and wings and harness, tongue out, eyes up.
<<storyVideo "characters/velith/dream_drain_8_finish">>
You cum across her tongue and lips. She keeps her mouth open and lets it sit there, cum on her tongue, looking up at you. Then she takes your cock in her hand and wraps her lips around it and sucks it clean, pulling out every last pulse, her eyes never leaving yours.
The wings rustle. She swallows.
<<say "Velith" "Better. Much better. Tomorrow I'll look like someone else. You'll still get hard.">>
<div class="choice-container">
<<vchoice "Wake" "Velith_DreamDrain_Wake" "move" "sunrise">>
</div><<velithDreamLook true>>
Dark blue walls. A padded, tufted headboard behind you.
She's lying on her front between your legs. Red hair. Pointed ears like something from a pre-war storybook. Curved grey horns. Blue lace lingerie that barely covers anything.
<<say "Velith" "Pointed ears tonight. Every little fantasy you ever had, I've already tried on.">>
<<storyVideo "characters/velith/dream_drain_9_mouth">>
She grips your cock and sucks it, her mouth hot and greedy, lips stretched around you.
<<say "Velith" "You can't keep me out. You can't even wake up. So lie back.">>
<div class="choice-container">
<<vchoice "She climbs on" "Velith_DreamDrain_Elf_Ride" "intimate" "corruption">>
</div><<velithDreamLook>>
She squats over you, knees up, feet planted, and drops onto your cock.
<<storyVideo "characters/velith/dream_drain_9_ride">>
The blue lace is open at the crotch. Her tits are out. She rides you facing you, bouncing on her heels, your cock plunging in and out of her pussy, and her mouth makes a perfect O as she watches your face.
<<say "Velith" "Oh. Oh, there it is. I can feel it coming up. Not inside. On my FACE.">>
She lifts off you and falls back onto the cushions.
<div class="choice-container">
<<vchoice "Give it to her" "Velith_DreamDrain_Elf_Finish" "intimate" "corruption">>
</div><<velithDreamLook>>
She lies back with both hands on her own horns, holding her head still for you. Your hand is on your cock and it's pumping. Her rhythm, not yours.
<<storyVideo "characters/velith/dream_drain_9_finish">>
She sticks her tongue out and you cum. It spatters her tongue, her lips, her cheeks. She squeezes her eyes shut and grins through it, horns in her fists, while you jerk out every last rope over her face.
She drags her tongue across her lips and swallows everything it catches.
<<say "Velith" "Mmm. Sweet. I'll be back before you've even refilled.">>
<div class="choice-container">
<<vchoice "Wake" "Velith_DreamDrain_Wake" "move" "sunrise">>
</div><<velithDreamLook true>>
Red light and blue light and nothing else.
<<storyVideo "characters/velith/dream_drain_10_crawl">>
<<if _storyClip is "bd803750a90a">>A pale woman has your cock in her mouth. Black hair, pointed ears, black paint smeared thick around her eyes. Black straps cinched around her thighs.<<else>>A pale woman has your cock in her mouth. Blue-black hair. Pale icy eyes. Black streaks running down her cheeks from her eyes like she's been crying ink. Black latex straps across big pale tits.<</if>>
It's her. Nobody else looks at your cock like it owes her money.
<<if _storyClip is "bd803750a90a">>She sucks you with her eyes fixed on yours. She pulls back to lick under the head, sinks down again, then pulls off with her mouth open and her tongue out, spit shining all down your cock.<<else>>She sucks you with her eyes fixed on yours. She crawls up over you without letting go, rising, staring, then sinks back down and swallows you deep. She licks the tip. She pulls off with her mouth open and a string of spit still joining her lip to your cock.<</if>>
<<say "Velith" "Don't blink. I like it when you watch me feed.">>
<div class="choice-container">
<<vchoice "Something's growing" "Velith_DreamDrain_Stare_Horns" "intimate" "corruption">>
</div><<velithDreamLook>>
<<storyVideo "characters/velith/dream_drain_10_horns">>
<<if _storyClip is "b8ad9b48fc79">>Horns push up out of her hair while she sucks you. Pale ribbed horns, curling up and back like a ram's, the candlelight crawling along the ridges. The mask is slipping. She doesn't care.<<else>>Horns push up out of her hair while she sucks you. Big black ram horns, curling back, their tips red as embers. The mask is slipping. She doesn't care.<</if>>
She sucks you slow now, eyes closed, one hand stroking the shaft. She licks the head. She pulls off with spit stringing from her lip, her hand tight around you.
<<say "Velith" "Do you know what happens to things like me when nobody feeds us? We thin out. We fade. We forget our own names.">>
<<say "Velith" "Not me. I've got you.">>
She takes you back in her mouth and sucks until you cum. She swallows it all, eyes still closed, throat working slowly, making it last.
<<say "Velith" "Good. Sleep now.">>
<div class="choice-container">
<<vchoice "Wake" "Velith_DreamDrain_Wake" "move" "sunrise">>
</div><<velithDreamLook true>>
Orange light. A curtain of gold tinsel behind her.
She's already on you. Red curls. A black leather harness strapped across her tits. Dark red boots up to her thighs. Tongue out.
Another stolen body. She hasn't even bothered to learn its smile.
<<storyVideo "characters/velith/dream_drain_11">>
She squats over you facing you and bounces on your cock, your shaft sliding wet in and out of her pussy, her tongue hanging out and her eyes on yours. She doesn't bother with a greeting. She doesn't bother letting you wake up first.
<<say "Velith" "Quick one tonight. I skipped the foreplay for you.">>
She drops down and grinds. You're close before you've even worked out where you are.
<div class="choice-container">
<<vchoice "She rolls over" "Velith_DreamDrain_Harness_Finish" "intimate" "corruption">>
</div><<velithDreamLook>>
The dream flips. She's on her back now, boots in the air, and your cock is buried in her ass.
<<storyVideo "characters/velith/dream_drain_11_finish">>
You cum deep in her ass. She grins up at you over her own thighs while you pull out, and a thin white thread of it slides out of her and hangs there.
<<say "Velith" "Look at that. It's crawling back to you. Too late.">>
She clenches, and it's gone back inside her.
<<say "Velith" "Thanks for dinner.">>
<div class="choice-container">
<<vchoice "Wake" "Velith_DreamDrain_Wake" "move" "sunrise">>
</div><<velithDreamLook true>>
A bright, ordinary room. Beige walls. You're sitting in a black chair and you can't get up.
She climbs onto your lap. Long black hair. Little red horns. Grey bat wings folded on her back. A black thong and strappy black heels, and the biggest ass you've ever seen.
Another borrowed body, built around that ass just to taunt you.
<<say "Velith" "Stay seated. You couldn't stand if I asked you to.">>
<<storyVideo "characters/velith/dream_drain_12">>
She straddles you facing you, knees on the seat, and rides your cock. Her huge ass grinds and bounces in your lap, swallowing your cock again and again, cheeks slapping your thighs. You grip the arms of the chair because it's the only thing she's left you.
<<say "Velith" "Such a shame you're so weak. It makes you so easy to eat.">>
You cum up into her with her ass pressed down in your lap. She rolls her hips slow on your cock until she's sure she has every drop. When she stands, there's nothing on you. Not a trace.
<<say "Velith" "Mmm. Don't get up.">>
<div class="choice-container">
<<vchoice "Wake" "Velith_DreamDrain_Wake" "move" "sunrise">>
</div><<velithDreamLook true>>
A white fur bed. Pink light.
She's lying on her back with her legs open for you. Black bob. Glossy black ram horns. A lace choker. A red satin corset pulled down under big bare tits. Black garter straps across her thighs.
She's laid herself out on the fur like dinner on a platter, and she knows it.
You're on your knees between her legs. You don't remember kneeling.
<<say "Velith" "Tonight I'll let you do the work. Or I'll let you think you are.">>
Your cock is at her ass. Your hips push forward. Not you. Her.
<<storyVideo "characters/velith/dream_drain_13">>
You fuck her ass. Your cock slides into her tight asshole, just under her bare pussy, over and over, steady and deep, your hips driving on a rhythm she's setting from inside your head. She moans with her mouth wide open, her eyes rolling back, her tits heaving.
<<say "Velith" "Harder. See? You can't even stop yourself. You can't stop anything I want.">>
Her ass clenches around you and you cum deep inside it. She moans like it's the best thing she's tasted in a hundred years.
<<say "Velith" "Every hole works. Did you think I'd let a drop go to waste?">>
<div class="choice-container">
<<vchoice "Wake" "Velith_DreamDrain_Wake" "move" "sunrise">>
</div><<velithDreamLook true>>
She's left the horns and wings off tonight. The hair is red where hers is black, but the face under it is the one from the ruins: small, pale, sharp little chin, the same mouth. Black lingerie, black stockings. As close as she comes to wearing herself in here.
You're on your back on a grey floor. She's lying between your legs with your cock already down her throat.
<<say "Velith" "Just me tonight. I'm too hungry to dress up.">>
<<storyVideo "characters/velith/dream_drain_14_mouth">>
<<if _storyClip is "147b9a99e1d0">>She sucks you slow and deep, her copper hair falling across your thighs. Her eyes stay on yours the whole time, big and innocent and utterly without mercy. Black fishnet straps cling to her shoulders, and spit foams white along your shaft every time she comes up.<<elseif _storyClip is "6b85679849f2">>She sucks you sloppy and loud, one fist pumping the base, bright red hair spilling over her bare shoulders. Every few strokes she pulls off, sticks her tongue out under your cock and looks up at you, then swallows you again.<<else>>She sucks you deep, all the way down, her hands spread on your hips and thighs, holding you flat. Her eyes stay on yours the whole time, big and innocent and utterly without mercy. Behind her, her ass sits high in black lace, stockings stretched over her thighs.<</if>>
She slides off just far enough to breathe.
<<say "Velith" "You taste like you missed me.">>
She swallows you again, deeper.
<div class="choice-container">
<<vchoice "The floor becomes a bed" "Velith_DreamDrain_Herself_Hair" "intimate" "corruption">>
</div><<velithDreamLook>>
You're standing now at the edge of a white bed. She lies on her front in front of you, stockinged legs bent up behind her, black lace over her ass, red hair tied back in a ponytail. Your cock is in her mouth.
<<storyVideo "characters/velith/dream_drain_14_hair">>
She bobs on you and looks up once, eyes shining. Then your hand is in her hair. You didn't put it there. It grabs her ponytail and pushes her head down onto your cock, again and again, fucking her mouth at the edge of the bed.
<<say "Velith" "Mmhm. Harder. I made you do that, you know. You'd never dare on your own.">>
Her throat takes all of it. You cum down it with your fist knotted in her hair, and she swallows every pulse, moaning around your cock, until your legs are shaking and you're empty.
She lets you go and wipes her mouth with the back of her hand.
<<say "Velith" "Remember this face, sweet thing. It's the one that's going to keep coming back.">>
<div class="choice-container">
<<vchoice "Wake" "Velith_DreamDrain_Wake" "move" "sunrise">>
</div><<velithDreamLook true>>
Sunlight. Real sunlight, warm through a window you'd forgotten existed. Granite counters. Wooden cupboards. A tap still running.
A kitchen from before. Somebody's. Maybe yours.
A woman stands at the sink with her back to you. Long honey-blonde hair. A dark red dress with little flowers on it, off the shoulders. She's humming. She's washing a glass.
You're standing behind her in a black t-shirt, watching yourself do it. Your hands on her hips. Your cock already in her.
You never had this. She knows. That's why she picked it.
<<say "Velith" "Nice, isn't it? A house. A woman. A Sunday. All the things the world took off you.">>
<<storyVideo "characters/velith/dream_drain_15">>
You fuck her from behind against the counter, slow and deep, her dress rucked up over her bare ass. Your hand slides up and yanks the neckline down. Her big soft tits spill out and swing over the sink with every thrust, and you grab one and squeeze it, thumb on the nipple, kneading it like you own it. She keeps her eyes down on the dishes. Her cheeks are pink. Her pussy is soaking.
<<say "Velith" "Don't stop. She'd never let you stop. She loves you, remember?">>
The pressure builds low in your belly. You push in as deep as she goes and hold there, and you cum inside her in thick, shuddering pulses.
You pull out. Your hand spreads her ass. Your cum wells out of her pink, swollen cunt and runs down, and it doesn't drip on the tiles. It sinks back into her. Into skin that isn't skin.
She pulls her dress down and turns off the tap. When she looks over her shoulder, the eyes are Velith's.
<<say "Velith" "A shame none of it was real. The cum was, though. Thank you for dinner.">>
The sunlight goes out like a candle.
<div class="choice-container">
<<vchoice "Wake" "Velith_DreamDrain_Wake" "move" "sunrise">>
</div><<velithDreamLook true>>
White sheets. Bright, flat light, like morning that never ends.
Two women lie on their backs side by side, legs open for you. One is tanned dark, with pale bikini lines cut across her tits and her hips. The other is pale all over, soft, a thin gold ring on her finger.
Both of them are her. You can feel it in your teeth.
<<say "Velith" "One body wasn't feeding me fast enough. So I brought two mouths.">>
<<storyVideo "characters/velith/dream_drain_16">>
<<if _storyClip is "a3bf45119a43">>For a heartbeat there are two mouths on you instead, cheek to cheek, a brunette and a black-haired one trading your cock back and forth between their lips. Then they lie back down and open their legs again, as if that never happened.
<</if>>You rub the head of your cock up and down the tanned one's pussy, slick and swollen, then shove inside her. The pale one reaches over and lays her hand on her sister's belly, feeling your cock move under the skin. Her ring glints. She's smiling.
<<say "Velith" "Now me. Don't be greedy with her.">>
You pull out wet and push straight into the pale one. Her hand slides between her own legs and rubs her clit in quick little circles while you pound her, the gold ring flashing. Two cunts, and they grip you exactly alike, the same squeeze on the same beat, like one muscle.
You cum inside the pale one, hips jerking, your cock pulsing deep in her while her fingers keep rubbing. Neither of them lets a drop out.
When you look again, there's one woman on the bed, stretched out and satisfied, and a thin gold ring lying on the empty pillow beside her.
<<say "Velith" "Two helpings. I'll sleep well tonight. You won't.">>
<div class="choice-container">
<<vchoice "Wake" "Velith_DreamDrain_Wake" "move" "sunrise">>
</div><<velithDreamLook true>>
A bedroom at night. A crumpled white duvet. One dim lamp somewhere behind you.
You're flat on your back. A woman is sitting on your cock with her back to you. Long dark hair down her back. Tanned skin. A huge round ass, already bouncing.
<<say "Velith" "Don't look at my face. Look at what you're feeding.">>
<<storyVideo "characters/velith/dream_drain_17">>
She rides you reverse, slamming her ass down on your cock and grinding it back up, her cheeks spreading around your shaft every time she drops. Her pussy is dripping down your balls. Your hand grips her ass and squeezes, spreads her open to watch yourself disappear into her.
Then you see your hand. Black ink crawls up the wrist and forearm. Tattoos you don't have.
<<say "Velith" "Oh, that? I borrowed him too. You don't mind sharing, do you?">>
She laughs and rides harder, hair swinging, ass clapping against your hips. Your borrowed hand holds on. Your real body does what she wants. You cum up into her with a groan you can't hold, and she grinds down and sits there, milking you, until your balls ache and there's nothing left.
<<say "Velith" "Mmm. Good boy. Whoever you are.">>
The lamp clicks off.
<div class="choice-container">
<<vchoice "Wake" "Velith_DreamDrain_Wake" "move" "sunrise">>
</div><<velithDreamLook true>>
You wake up in the dream with your cock already buried in her.
<<storyVideo "characters/velith/dream_drain_18">>
<<say "Velith" "Morning, sweet thing. Don't just lie on me. Fuck me.">>
You fuck her slow and deep, and her cunt is hot and soaking, sucking at you on every pull back. She's so wet you can hear it. Every time your hips hit hers she lets out a little broken moan, head pushed back into the pillow, mouth hanging open.
<<say "Velith" "Harder than that. You fuck like you're scared you'll wake up. You won't. Pound it.">>
You give it to her harder. Her tits bounce in the lace and her pussy grips you tighter the deeper you go, greedy, like it's trying to swallow your balls too.
Then she clamps down on you, once, hard enough to make your eyes water, and taps your hip with two fingers.
<<say "Velith" "Out. Put that cock in my mouth. I want to taste my own cunt on it.">>
<div class="choice-container">
<<vchoice "Feed her your cock" "Velith_DreamDrain_PinkLace_Mouth" "intimate" "lips">>
</div><<velithDreamLook>>
You kneel over her head with your cock still dripping from her pussy, and she turns her face up to it with her mouth already open.
<<storyVideo "characters/velith/dream_drain_18_mouth">>
You fuck her mouth. Her lips are slick with her own juice and they slide all the way along your shaft, wet and tight, her tongue flat underneath. She doesn't try to control it. She just lies there with her eyes shut and lets you use her face.
Her hand goes down between her legs and she rubs her pussy in quick hard circles while your cock pumps in and out of her mouth. She moans around it. You feel the moan in your balls.
<<say "Velith" "Mmm. Your cock and my cunt in the same mouthful. Keep fucking my face, I'm nearly there.">>
Her fingers speed up. Your balls pull up tight, and you cum in her mouth in thick hard pulses while she's still frigging herself. She seals her lips around you and swallows, and swallows again, and keeps sucking gently until your cock twitches dry on her tongue.
She licks her lips.
<<say "Velith" "Good boy. Not a drop wasted.">>
<div class="choice-container">
<<vchoice "Wake" "Velith_DreamDrain_Wake" "move" "sunrise">>
</div><<velithDreamLook true>>
She's wearing glasses tonight, and she's already on her knees.
<<if $flags.velithDreamSeen && $flags.velithDreamSeen["Velith_DreamDrain_Archivist"] >= 2>>
<<say "Velith" "Back in my library, sweet thing? You know the rules. Cock out, mouth shut.">>
<<else>>
<<say "Velith" "Quiet in the library. The only noise in here is going to be me choking on you.">>
<</if>>
<<storyVideo "characters/velith/dream_drain_19_mouth">>
<<set $flags.velithArchivistBody to _storyClip>>
<<if _storyClip is "b1bbbdc9d0ea">>She takes you all the way to the root with no hands, and you feel the back of her throat close around the head of your cock. She gags on it and doesn't pull off. Drool runs off her chin. When she finally comes up for air she peeks at you over her glasses with a filthy little smile, and sinks straight back down.
<<elseif _storyClip is "9ebe431e678d">>She bobs on you slow and steady, wet down to your balls, her throat opening a little more every time she sinks. She watches you over the frames the whole way down, and you can feel her swallowing around you.
<<elseif _storyClip is "f935b98c8099">>She flicks her tongue at the head, lets go, and swallows you whole. No hands. Her mouth is hot and sloppy and she drives it down your shaft over and over, peering up through her glasses every time your cock hits the back of her throat.
<<else>>She takes you deep with no hands, bobbing slow and wet, drool running off her chin, peering up through her glasses every time your cock hits the back of her throat.
<</if>>
<<say "Velith" "Mmph. You're leaking already. Overdue, aren't you? Days overdue.">>
<div class="choice-container">
<<vchoice "She grabs it with both hands" "Velith_DreamDrain_Archivist_Finish" "intimate" "hand">>
</div><<velithDreamLook>>
<<if $flags.velithArchivistBody is "9ebe431e678d" or $flags.velithArchivistBody is "f935b98c8099">>She blinks, and a different girl is behind the same glasses, just as hungry.
<</if>>
<<storyVideo "characters/velith/dream_drain_19_finish">>
She wraps both fists around your cock, one on top of the other, and jerks you hard while her lips suck at the head. Her spit makes it slippery. Every twist of her hands pulls you closer.
<<say "Velith" "Cum for me. Right in my mouth. I want to feel it hit my tongue.">>
You cum while she's sucking the tip. It floods her mouth and she keeps sucking, milking you with both hands until your knees shake. Then she swallows, pulls off, and sticks her tongue out under your cock to show you it's all gone.
She smiles up through her glasses.
<<say "Velith" "Paid in full. I'll be back to collect before the next load's due.">>
<div class="choice-container">
<<vchoice "Wake" "Velith_DreamDrain_Wake" "move" "sunrise">>
</div><<velithDreamLook true>>
You're on your back in the sun, and she's lying between your legs with her chin by your cock.
<<say "Velith" "Cute horns, aren't they? Don't be fooled. I'm going to suck you dry.">>
<<storyVideo "characters/velith/dream_drain_20">>
She sucks you slowly, so slowly you feel every inch of her lips sliding down your shaft and every inch of them dragging back up. Her tongue presses up under the head. She never takes her eyes off yours.
When she wants you to squirm she stops at the tip and holds it in her mouth, sucking gently, watching you twitch. Then she sinks down again until her lips touch her own fingers wrapped round the base.
<<say "Velith" "No rush. I like feeling you throb on my tongue. Beg me to go faster, if you want. I won't.">>
She doesn't. She keeps the same slow, wet pace until you can't hold it, and when you cum she seals her lips round you and swallows every pulse with her eyes still locked on yours.
She gives the head one more lick and rests her chin on your thigh.
<<say "Velith" "Sweet and slow, and still every drop. Mine.">>
<div class="choice-container">
<<vchoice "Wake" "Velith_DreamDrain_Wake" "move" "sunrise">>
</div><<velithDreamLook true>>
Red light, and her mouth already on you.
<<storyVideo "characters/velith/dream_drain_21">>
Her fist holds your cock up for her mouth. She circles the tip with a wet tongue, looking up at you through her fringe, then closes her lips and slides down, sucking hard, her hand pumping the shaft in time with her mouth.
<<say "Velith" "Look at me when I'm sucking your cock, sweet thing. Eyes down here.">>
She comes up to lick the head again, tongue flat, slow, lapping at the slit like she's tasting what's about to come out. Then she swallows you again.
<<say "Velith" "You're leaking on my tongue. Give me the rest. All of it.">>
She sucks you until your thighs shake. When you cum she keeps her tongue pressed under the head and takes every spurt, her fist squeezing up the shaft to milk out the last of it. She swallows with her eyes on yours.
<<say "Velith" "Lovely. Now sleep. You'll need it.">>
<div class="choice-container">
<<vchoice "Wake" "Velith_DreamDrain_Wake" "move" "sunrise">>
</div><<velithDreamLook true>>
She's kneeling by the bed with her mouth open and your cum already shining on her face.
<<say "Velith" "That's yours. I've been milking you for an hour. Now wake up and give me a fresh one.">>
<<storyVideo "characters/velith/dream_drain_22">>
Your hand is on your cock, jerking it an inch from her lips, and it's her rhythm in your wrist. She keeps her mouth wide and her tongue out, waiting for it.
<<say "Velith" "Put it in. Just the tip. Let me suck it out of you.">>
You feed her the head and she sucks it in short, greedy pulls while your fist works the shaft. Her tongue swirls under it. Every pull drags you closer.
<<say "Velith" "Right there. Cum in my mouth. Don't you dare miss.">>
You don't. You cum straight into her open mouth and it floods her tongue. She holds it there so you can see it, grinning up at you with her face glazed, then swallows.
<<say "Velith" "Mmm. That was the starter.">>
<div class="choice-container">
<<vchoice "She wants seconds" "Velith_DreamDrain_Bombshell_Finish" "intimate" "corruption">>
</div><<velithDreamLook>>
She blinks, and she's someone new with the same open mouth.
<<say "Velith" "New face, same hole. Did you think I'd stop at one?">>
<<storyVideo "characters/velith/dream_drain_22_finish">>
She strokes you hard with her mouth wide open under the head. You're already spent, and she doesn't care. Her fist drags another load out of you, and it spurts into her mouth and across her face while she laughs with her tongue out.
She doesn't stop. She keeps pumping your cock, cum on her lips and chin, sore and twitching in her grip, as if there's a third load in there she can squeeze out.
<<say "Velith" "There is. I can feel it. I'll come back for it another night.">>
She licks her lips clean and swallows.
<div class="choice-container">
<<vchoice "Wake" "Velith_DreamDrain_Wake" "move" "sunrise">>
</div><<velithDreamLook true>>
She's sitting at a desk with her tits out, and she's laughing at your cock before she's even touched it.
<<storyVideo "characters/velith/dream_drain_23">>
She grabs it and strokes, and her hand is warm and sure, and you're gone almost at once. You cum across her tits in thick white spurts.
She laughs harder, delighted.
<<say "Velith" "That's it? That fast? Oh, sweet thing. No, no, I didn't say stop.">>
She doesn't let go. She keeps jerking you through it, too sensitive, and she only laughs at the face you pull. She squeezes out another spurt onto her tits, and another, until they're dripping with you.
<<say "Velith" "Look at the state of me. You made a mess of my tits and you're still hard in my hand. Pathetic. I love it.">>
She tips her head back and smiles up at you, still pumping you slowly in her fist, and rubs your cum into her skin with her other hand like cream.
<<say "Velith" "Every drop's mine, even the ones I wear.">>
<div class="choice-container">
<<vchoice "Wake" "Velith_DreamDrain_Wake" "move" "sunrise">>
</div><<velithDreamLook true>>
She's kneeling between your thighs, smirking up at your cock.
<<say "Velith" "Look at you, hard before I've even touched it. Let's see how long you last in my mouth.">>
<<storyVideo "characters/velith/dream_drain_24">>
Her nails curl around the base and she sucks you, lips tight, cheeks hollow, looking up every few strokes to watch your face. She comes up and licks the head, slow and wet, then takes you back into her mouth and sucks harder.
<<say "Velith" "Mmm. You twitch every time I look at you. Keep your eyes on me while I suck this out of you.">>
She sucks until you can't hold it. You cum in her mouth and she keeps her eyes on yours while she swallows, her nails squeezing up the shaft to get the last of it.
She wipes her lip with one pale nail and sucks it clean.
<<say "Velith" "Next time you last longer, or I'll make you watch me do it again.">>
<div class="choice-container">
<<vchoice "Wake" "Velith_DreamDrain_Wake" "move" "sunrise">>
</div><<velithDreamLook true>>
Blue dark, and a warm mouth already closing around your cock.
<<say "Velith" "Shh. Quiet, sweet thing. Let me eat.">>
<<storyVideo "characters/velith/dream_drain_25">>
She swallows you slow, all the way down, until her throat squeezes the head. Hot and slick and tight, and she holds you there.
When she pulls off, spit hangs from her lip to your cock in thick strings. She doesn't wipe it. She sinks back down into the mess.
<<say "Velith" "Mm. Fuck, you're hard. Throbbing on my tongue like you've been saving it all day. Have you? Was this cock waiting for me?">>
Both her fists close on your shaft, slippery with drool, and twist as they pump. Her lips suck just the tip. Then her tongue drags across your slit, slow and filthy, and your legs almost go.
<<say "Velith" "Look at you shaking. I've barely started and you're already leaking into my mouth. Greedy little cock.">>
She slaps your cock on her flat tongue, wet smacks in the dark, and looks up at you with spit running down her chin while her fist keeps milking you.
Your balls pull up hard against your body.
<<say "Velith" "That's it. Give me that load. Right down my throat. Every fucking drop is mine.">>
Her lips seal tight around the head and she sucks hard. You cum, pulse after pulse into her hot mouth, and she keeps sucking and stroking straight through it. She swallows every spurt, moaning like it's the best thing she's tasted in a hundred years.
She doesn't let go until you're empty. The blue goes black.
<div class="choice-container">
<<vchoice "Wake" "Velith_DreamDrain_Wake" "move" "sunrise">>
</div><<velithDreamLook true>>
You're flat on your back, and a woman in glasses is bent over your hips with your cock in her mouth.
<<say "Velith" "Lie still, sweet thing. I'm studying.">>
<<storyVideo "characters/velith/dream_drain_26_mouth">>
Her lips are wet and tight and slide down your shaft slow, then all the way back up, over and over. She knows exactly how much you can take and gives you a little more.
<<say "Velith" "Mm. Thick. Heavy on my tongue. I could suck this cock all night and still not finish my reading.">>
She wraps her fist around the base and bobs on the head, sucking hard, and her tongue swirls under the rim until your hips jerk up off the bed.
<<say "Velith" "Did I say you could move? Hips down. Let me work. You just lie there and throb for me.">>
She takes you deep again. Your cock hits the back of her throat and she swallows around it, and a wet, choked hum buzzes all the way down your shaft.
The pressure builds low and hot. Your thighs lock.
<<say "Velith" "Such a short book you are. Go on, then. Fill my mouth. I want to taste how badly you needed this.">>
You cum hard. She takes you to the root and holds there, throat working, gulping down every thick pulse while her glasses slide down her nose. She keeps suckling the tip afterward, slow and greedy, drawing out the last drops until you twitch.
<<say "Velith" "Delicious. Full marks.">>
<div class="choice-container">
<<vchoice "Wake" "Velith_DreamDrain_Wake" "move" "sunrise">>
</div><<velithDreamLook true>>
Warm water pours over you, and a wet, topless woman is kneeling at your cock.
<<say "Velith" "Hold still, sweet thing. I'm thirsty.">>
<<storyVideo "characters/velith/dream_drain_27">>
She fists your shaft and takes you into her mouth. Her mouth is hotter than the water. She pulls on you in slow, sloppy sucks, looking up at you with water running off her lashes.
<<say "Velith" "Mm. So hard for me. Feel that? That's my tongue. Get used to it.">>
She slides off with a wet pop and stays there with her mouth hanging open and her tongue out, panting, water and spit dripping off her chin onto her tits.
<<say "Velith" "Look at it twitch. Your cock wants my mouth back so badly. Beg me with it.">>
She goes back down deeper. Her lips stretch further along your shaft every time and her fist squeezes the base. Her tits bounce, wet and heavy, with every bob. Each suck drags harder than the last.
<<say "Velith" "Don't you dare hold back on me. Shoot it in my mouth. I want it hot and thick.">>
Your knees shake. She feels your cock swell on her tongue and hums around it, sucking harder, and you cum. Spurt after spurt pumps into her mouth, and she swallows it all down, throat working, eyes on yours. The shower rinses nothing off her, because she didn't spill a drop.
She licks her lips.
<<say "Velith" "Good boy. Now wake up and dry off.">>
<div class="choice-container">
<<vchoice "Wake" "Velith_DreamDrain_Wake" "move" "sunrise">>
</div><<velithDreamLook true>>
Warm low light, and you're kneeling behind her, balls-deep already.
<<say "Velith" "Don't look for her face, sweet thing. Look at this ass. Fuck it.">>
<<storyVideo "characters/velith/dream_drain_28">>
You fuck her from behind, slow and steady. Her pussy is soaked and scalding, and it squeezes your cock on every thrust like it doesn't want to let go.
Your hips smack into that fat ass and it ripples against you. Every stroke comes with a wet, filthy slap.
<<say "Velith" "Yes. Deep like that. Feel how wet I am for you? That's all yours. Every stroke, I can feel your cock swelling inside me.">>
You grab her hip and pull her back onto you. She pushes into it, grinding her ass against your belly and taking you to the root.
<<say "Velith" "Good boy. Keep fucking me. Don't you dare slow down. I want to feel you lose it.">>
The pressure winds tighter and tighter at the base of your cock. Her cunt clenches around you and pulls you deeper, milking you on every thrust.
Your fingers dig into her hip. Your rhythm breaks.
<<say "Velith" "There. Inside me. Don't you fucking pull out. Cum in this pussy. Fill me up.">>
You slam in deep and hold there, and you cum. Your cock jerks inside her, pumping thick, hot spurts deep into her pussy, one after another. She grinds back and squeezes around you, milking out every drop and keeping it all inside.
<<say "Velith" "Mm. So much. All mine now.">>
The little hearts on the wall go dark one by one.
<div class="choice-container">
<<vchoice "Wake" "Velith_DreamDrain_Wake" "move" "sunrise">>
</div><<velithDreamLook true>>
Your shorts are shoved down, your cock is standing up, and a black leather glove is closing around it.
<<say "Velith" "Oh, don't get up, sweet thing. I don't think you could.">>
<<storyVideo "characters/velith/dream_drain_29">>
She strokes you slow and lazy. The leather is warm and tight, and it drags on the way up and glides on the way down. She never stops talking.
<<say "Velith" "Look at this. The big survivor. You've killed things with teeth, and one glove on your cock turns you into a whimpering mess.">>
Your cock pulses in her fist. She squeezes the head and smears your pre-cum around with her thumb.
<<say "Velith" "Leaking already? Filthy. Hands off the cushions. You don't get to touch me. You sit there and drip for me.">>
She leans in with her face right down by your cock, sneering, and her fist speeds up. It's fast and tight and merciless, and the leather squeaks wet on your shaft. Your hips jerk off the couch.
<<say "Velith" "Oh, you're going to cum from my glove. You actually are. What a weak, pathetic, delicious little cock. Go on. Pop for me.">>
Everything clenches. You cum hard, and she cups her gloved palm over the head and catches every spurt, stroking you through it and milking you dry.
Then she lifts the glove to her mouth and licks it clean, slow, all the way across the leather, while she stares at you.
<<say "Velith" "Mm. Didn't waste a drop.">>
<div class="choice-container">
<<vchoice "Wake" "Velith_DreamDrain_Wake" "move" "sunrise">>
</div><<velithDreamLook true>>
Blinding sun, warm water up to your chest, and a fat, wet ass already sitting on your cock.
<<say "Velith" "Don't bother with sunscreen, sweet thing. You won't last long enough to burn.">>
<<storyVideo "characters/velith/dream_drain_30">>
She rides you backwards and drops that heavy ass down on your cock again and again. Then she throws both middle fingers back over her shoulders, right in your face.
<<say "Velith" "That's what you get. You don't get my face. You get my ass and my pussy, and you're fucking grateful.">>
Her cunt is hot and tight and gripping, a scalding contrast to the pool. It drags up your shaft and slams back down. Water slaps and sprays around you both.
<<say "Velith" "Feel that? I'm fucking myself on you. You're not doing a thing. You're my pool toy. A hard little cock with a man stuck to it.">>
She braces on the tiles and rides harder. Her ass smacks down wet and loud, and her pussy clamps on every bounce until you can't breathe.
<<say "Velith" "Twitching already? Pathetic. Do it. Cum in me. Pump it deep, I'm not getting off until I've got all of it.">>
She grinds all the way down and squeezes, and flips you off one last time without looking. You cum. You pump spurt after spurt up into her, hips jerking under her weight. She stays seated, rolling her hips slowly, and keeps every drop of it inside her.
<<say "Velith" "Mm. Warm. Good pool toy.">>
The water turns white.
<div class="choice-container">
<<vchoice "Wake" "Velith_DreamDrain_Wake" "move" "sunrise">>
</div><<velithDreamLook true>>
You dream you're on the dock at night, and something pulls the line.
<<storyVideo "story/fishers_lake_dream/rise">>
<<if _storyClip is "33ede288be94" or _storyClip is "1d4eea1eaa7a">>In the dream the night has turned to glaring noon. She hauls herself up your dock ladder out of the black water, dripping, lake-weed in her hair, a stranger's face that grins with Velith's teeth.
<<elseif _storyClip is "6f2426bc189c">>The water's warm as blood. She swims out of it toward you, smiling up at the dock, lake-weed in her hair, a stranger's face that grins with Velith's teeth.
<<else>>The water's warm as blood. She rises to the waist in it, lake-weed in her hair, a stranger's face that grins with Velith's teeth.
<</if>>
<<say "Velith" "You've been feeding everything in this lake but me.">>
<div class="choice-container">
<<vchoice "Look at her" "Velith_DreamDrain_Lake_Water" "intimate" "corruption">>
</div><<velithDreamLook>><<set $flags.lakeDreamGift to true>>
<<storyVideo "story/fishers_lake_dream/water">>
<<if _storyClip is "f2ce93de4bdb">><<say "Velith" "Come down, then. Or stand there hard on my dock all night.">>
You come down to the flat rock at the water's edge, and she climbs into your lap with the lake still running off her.
<<else>><<say "Velith" "Come in, then. Or stand there hard on my dock all night.">>
You come in.
<</if>>
She rides you slow, your hands full of her ass, until you cum inside her. She keeps every drop.
<div class="choice-container">
<<vchoice "Wake" "Velith_DreamDrain_Wake" "move" "sunrise">>
</div><<run VaultUI.setSceneMode(null)>>
<<set _vdwGrove to $currentLocation === setup.GROVE_NODE.id>>
<<set _vdwHers to !_vdwGrove && setup.kiraNightMorning()>>
<<if _vdwGrove>>
<<run VaultUI.setBackgroundDirect(setup.GROVE_BG.villa)>>
<<else>>
<<set $currentLocation to _vdwHers ? "vault" : "quarters">>
<<run VaultUI.setBackground(_vdwHers ? "kira_room" : "quarters")>>
<</if>>
<<run VaultUI.setTimeOfDay("morning")>>
<<run VaultUI.hideAllCharacters()>>
<<set _vdwSuc to ($supernaturals && $supernaturals.succubus) ? $supernaturals.succubus : null>>
<<if _vdwSuc && _vdwSuc.lastDrainApplied !== $time.day>>
<<set _vdwSuc.lastDrainApplied to $time.day>>
<<set _vdwSuc.fed to (_vdwSuc.fed || 0) + 1>>
<<set $player.lust to 0>><<run setup.playerReleased()>>
<<if $arousal && $arousal.player>>
<<run setup.stopEdging()>>
<<set $arousal.player.daysAtHigh to 0>>
<<set $arousal.player.lastRelease to $time.day>>
<<set $arousal.player.releaseQuality to "velith_dream_drain">>
<</if>>
<<clampStat "player.health" -15 1 $player.maxHealth>>
<<clampStat "player.energy" -40 0 $player.maxEnergy>>
<<addCorruption 12>>
<<if _vdwSuc.fed === 1>>
<<journalAdd "She came back. Not in the flesh. In my sleep. Velith came to me in a body she'd stolen, used me and drank me dry, and I couldn't lift a finger. I woke up empty. She's feeding on me to stay alive, and I'm not strong enough to stop her." "story">>
<</if>>
<<toast "Velith fed on you: Health -15, Energy -40, Lust 0, Corruption +3" "warning">>
<</if>>
<<storyVideo "story/mv_velith_drain/wake">>
You wake up already exhausted.
The sheets are dry. Not a drop anywhere. She took all of it.
Your balls ache, hollow. Your cock is sore and soft against your thigh. Your arms feel like wet sand and your head is full of cotton.
<<if _vdwSuc && (_vdwSuc.lastDrainScene === "Velith_DreamDrain_Bound" || _vdwSuc.lastDrainScene === "Velith_DreamDrain_Cuffed")>>
There are faint red marks around your wrists. You never went to bed tied.
<</if>>
Behind your eyes, very faintly, someone is purring.
<em>She'll be back. She's always hungry.</em>
<<if _vdwGrove>>
<<set _vdwNext to "Location_VerdantOutpost">>
<<elseif $flags.vaultCrisisActive && $vault.crisis && !$vault.crisis.expeditionForced>>
<<set _vdwNext to "Vault_Resource_Crisis">>
<<elseif $flags.vaultResourceWarning && $vault.crisis && !$vault.crisis.warningAcknowledged>>
<<set _vdwNext to "Vault_Resource_Warning">>
<<else>>
<<set _vdwNext to setup.groveMorningEvent() || setup.kiraNightWake() || "Quarters_Hub">>
<</if>>
<div class="choice-container">
<<vchoice "Drag yourself up" _vdwNext "move" "sunrise">>
</div><<widget "uinvRemoveItem">>
<<set _itemName to _args[0]>>
<<set _quantity to _args[1] || 1>>
<<set _bagName to _args[2] || "player">>
<<if typeof UInv !== 'undefined'>>
<<run UInv.DeleteItem(_bagName, _itemName, _quantity)>>
<</if>>
<</widget>>
<<widget "uinvEquip">>
<<set _itemName to _args[0]>>
<<set _slot to _args[1] || "weapon">>
<<set _owner to _args[2] || "player">>
<<set _invBag to _owner>>
<<set _equipBag to _owner + " equipped">>
<<if typeof UInv !== 'undefined' && UInv.BagExists(_invBag) && UInv.BagExists(_equipBag)>>
<<if UInv.BagHasItem(_invBag, _itemName)>>
<<set _types to UInv.GetItemPropertyValue(_invBag, _itemName, "type") || []>>
<<if _types.includes("armor") || _types.includes("wearable")>>
<<set _slot to "armor">>
<<elseif _types.includes("weapon")>>
<<set _slot to "weapon">>
<<elseif _types.includes("accessory")>>
<<set _slot to "accessory">>
<</if>>
<<if _slot === "armor" && _owner === "player">>
<<set _armorItem to _itemName>>
<<uinvEquipArmor _armorItem>>
<<set $equipSuccess to !!setup.wornArmor()>>
<<else>>
<<set _currentItems to UInv.GetItemsArray(_equipBag)>>
<<for _equipped range _currentItems>>
<<set _equippedTypes to UInv.GetItemPropertyValue(_equipBag, _equipped, "type") || []>>
<<if _slot === "armor" && (_equippedTypes.includes("armor") || _equippedTypes.includes("wearable"))>>
<<run UInv.MoveItem(_equipBag, _invBag, _equipped, 1)>>
<<elseif _slot === "weapon" && _equippedTypes.includes("weapon")>>
<<run UInv.MoveItem(_equipBag, _invBag, _equipped, 1)>>
<<elseif _slot === "accessory" && _equippedTypes.includes("accessory")>>
<<run UInv.MoveItem(_equipBag, _invBag, _equipped, 1)>>
<</if>>
<</for>>
<<run UInv.MoveItem(_invBag, _equipBag, _itemName, 1)>>
<<set $equipSuccess to true>>
<<if _slot === "weapon" && _owner === "player">>
<<run setup.equipWeapon(_itemName)>>
<</if>>
<</if>>
<<else>>
<<set $equipSuccess to false>>
<</if>>
<<else>>
<<set $equipSuccess to false>>
<</if>>
<</widget>>
<<widget "uinvUnequip">>
<<set _itemName to _args[0]>>
<<set _owner to _args[1] || "player">>
<<set _invBag to _owner>>
<<set _equipBag to _owner + " equipped">>
<<set $inventoryFull to false>>
<<if typeof UInv !== 'undefined' && UInv.BagExists(_equipBag) && UInv.BagExists(_invBag)>>
<<if UInv.BagHasItem(_equipBag, _itemName)>>
<<if setup.bagFits(_invBag, _itemName, 1) gte 1>>
<<run UInv.MoveItem(_equipBag, _invBag, _itemName, 1)>>
<<set $unequipSuccess to true>>
<<if _owner === "player" && $equipped && $equipped.weapon && $equipped.weapon.id === _itemName>>
<<run setup.equipWeapon(null)>>
<</if>>
<<else>>
<<set $unequipSuccess to false>>
<<set $inventoryFull to true>>
<</if>>
<<else>>
<<set $unequipSuccess to false>>
<</if>>
<<else>>
<<set $unequipSuccess to false>>
<</if>>
<</widget>>
<<widget "uinvUseItem">>
<<set _itemName to _args[0]>>
<<set _bagName to _args[1] || "player">>
<<set $itemUsed to false>>
<<set $useFeedback to "">>
<<if typeof UInv !== 'undefined' && UInv.BagExists(_bagName) && UInv.BagHasItem(_bagName, _itemName)>>
<<set _item to UInv.GetItemObject(_bagName, _itemName)>>
<<if _item.type && _item.type.includes("medical") && _item.healAmount>>
<<set $player.health to Math.min($player.maxHealth, $player.health + _item.healAmount)>>
<<run UInv.DeleteItem(_bagName, _itemName, 1)>>
<<set $itemUsed to true>>
<<set $healAmount to _item.healAmount>>
<<set $useFeedback to "Healed for " + _item.healAmount + " HP!">>
<<elseif _item.type && _item.type.includes("food") && _item.hungerRestore>>
<<set _hungerGain to Math.min($player.maxHunger - $player.hunger, _item.hungerRestore)>>
<<set $player.hunger to Math.min($player.maxHunger, $player.hunger + _item.hungerRestore)>>
<<if _item.energyRestore>>
<<set $player.energy to Math.min($player.maxEnergy, $player.energy + _item.energyRestore)>>
<<set $useFeedback to "Food +" + _hungerGain + ", Energy +" + _item.energyRestore>>
<<else>>
<<set $useFeedback to "Food +" + _hungerGain>>
<</if>>
<<run UInv.DeleteItem(_bagName, _itemName, 1)>>
<<set $itemUsed to true>>
<<elseif _item.type && _item.type.includes("water")>>
<<set _hungerGain to 0>>
<<set _energyGain to 0>>
<<set _healthLoss to 0>>
<<if _item.hungerRestore>>
<<set _hungerGain to Math.min($player.maxHunger - $player.hunger, _item.hungerRestore)>>
<<set $player.hunger to Math.min($player.maxHunger, $player.hunger + _item.hungerRestore)>>
<</if>>
<<if _item.energyRestore>>
<<set _energyGain to Math.min($player.maxEnergy - $player.energy, _item.energyRestore)>>
<<set $player.energy to Math.min($player.maxEnergy, $player.energy + _item.energyRestore)>>
<</if>>
<<if _item.healthPenalty>>
<<set _healthLoss to Math.min(_item.healthPenalty, Math.max(0, $player.health - 1))>>
<<set $player.health to Math.max(1, $player.health - _item.healthPenalty)>>
<</if>>
<<if _hungerGain > 0 || _energyGain > 0>>
<<set $useFeedback to "Hydration +" + _hungerGain>>
<<if _energyGain > 0>>
<<set $useFeedback to $useFeedback + ", Energy +" + _energyGain>>
<</if>>
<<if _healthLoss > 0>>
<<set $useFeedback to $useFeedback + " (but lost " + _healthLoss + " HP from contamination!)">>
<</if>>
<<elseif _healthLoss > 0>>
<<set $useFeedback to "Drank contaminated water. Lost " + _healthLoss + " HP!">>
<<else>>
<<set $useFeedback to "Already full!">>
<</if>>
<<run UInv.DeleteItem(_bagName, _itemName, 1)>>
<<set $itemUsed to true>>
<<elseif _item.type && _item.type.includes("drink") && _item.energyRestore>>
<<set _energyGain to Math.min($player.maxEnergy - $player.energy, _item.energyRestore)>>
<<set $player.energy to Math.min($player.maxEnergy, $player.energy + _item.energyRestore)>>
<<if _energyGain > 0>>
<<set $useFeedback to "Energy +" + _energyGain>>
<<else>>
<<set $useFeedback to "Already at full energy!">>
<</if>>
<<run UInv.DeleteItem(_bagName, _itemName, 1)>>
<<set $itemUsed to true>>
<<else>>
<<set $itemUsed to false>>
<<set $useFeedback to "Cannot use this item.">>
<</if>>
<</if>>
<</widget>>
<<widget "uinvStoreInVault">>
<<set _itemName to _args[0]>>
<<set _quantity to _args[1] || 1>>
<<set $storeSuccess to false>>
<<if typeof UInv !== 'undefined' && UInv.BagExists("player") && UInv.BagExists("vault")>>
<<if UInv.BagHasItem("player", _itemName)>>
<<set _quantity to Math.min(_quantity, UInv.BagHasItem("player", _itemName))>>
<<if setup.bagFits("vault", _itemName, _quantity) gt 0>>
<<run UInv.MoveItem("player", "vault", _itemName, _quantity)>>
<<set $storeSuccess to true>>
<<else>>
<<set $vaultFull to true>>
<</if>>
<</if>>
<</if>>
<</widget>>
<<widget "uinvRetrieveFromVault">>
<<set _itemName to _args[0]>>
<<set _quantity to _args[1] || 1>>
<<set $retrieveSuccess to false>>
<<set $inventoryFull to false>>
<<if typeof UInv !== 'undefined' && UInv.BagExists("vault") && UInv.BagExists("player")>>
<<if UInv.BagHasItem("vault", _itemName)>>
<<set _quantity to setup.bagFits("player", _itemName, Math.min(_quantity, UInv.BagHasItem("vault", _itemName)))>>
<<if _quantity gt 0>>
<<run UInv.MoveItem("vault", "player", _itemName, _quantity)>>
<<set $retrieveSuccess to true>>
<<else>>
<<set $inventoryFull to true>>
<</if>>
<</if>>
<</if>>
<</widget>>
<<widget "uinvGetVaultCount">>
<<if typeof UInv !== 'undefined' && UInv.BagExists("vault")>>
<<set $vaultItemCount to UInv.GetItemsArray("vault").length>>
<<set $vaultMaxSlots to UInv.GetBagPropertyValue("vault", "maxSlots") || 100>>
<<else>>
<<set $vaultItemCount to 0>>
<<set $vaultMaxSlots to 100>>
<</if>>
<</widget>>
<<widget "uinvWearClothing">>
<<set _itemName to _args[0]>>
<<set _owner to _args[1] || "player">>
<<set _wardrobeBag to _owner + " wardrobe">>
<<set _wornBag to _owner + " worn">>
<<set $wearSuccess to false>>
<<if typeof UInv !== 'undefined' && UInv.BagExists(_wardrobeBag) && UInv.BagExists(_wornBag)>>
<<if UInv.BagHasItem(_wardrobeBag, _itemName)>>
<<set _slot to UInv.GetItemPropertyValue(_wardrobeBag, _itemName, "slot")>>
<<set _currentItems to UInv.GetItemsArray(_wornBag)>>
<<for _worn range _currentItems>>
<<set _wornSlot to UInv.GetItemPropertyValue(_wornBag, _worn, "slot")>>
<<if _wornSlot === _slot>>
<<run UInv.MoveItem(_wornBag, _wardrobeBag, _worn, 1)>>
<</if>>
<</for>>
<<run UInv.MoveItem(_wardrobeBag, _wornBag, _itemName, 1)>>
<<set $wearSuccess to true>>
<<if _owner === "player">>
<<set $clothing.player[_slot] to setup.clothingValue(UInv.GetItemPropertyValue(_wornBag, _itemName, "durability"))>>
<<elseif _owner === "kira">>
<<set $clothing.kira[_slot] to setup.clothingValue(UInv.GetItemPropertyValue(_wornBag, _itemName, "durability"))>>
<</if>>
<<updateExposure _owner true>>
<</if>>
<</if>>
<</widget>>
<<widget "uinvRemoveClothing">>
<<set _slot to _args[0]>>
<<set _owner to _args[1] || "player">>
<<set _wardrobeBag to _owner + " wardrobe">>
<<set _wornBag to _owner + " worn">>
<<set $removeSuccess to false>>
<<if typeof UInv !== 'undefined' && UInv.BagExists(_wornBag) && UInv.BagExists(_wardrobeBag)>>
<<set _currentItems to UInv.GetItemsArray(_wornBag)>>
<<for _worn range _currentItems>>
<<set _wornSlot to UInv.GetItemPropertyValue(_wornBag, _worn, "slot")>>
<<if _wornSlot === _slot>>
<<run UInv.MoveItem(_wornBag, _wardrobeBag, _worn, 1)>>
<<set $removeSuccess to true>>
<<if _owner === "player">>
<<set $clothing.player[_slot] to 0>>
<<elseif _owner === "kira">>
<<set $clothing.kira[_slot] to 0>>
<</if>>
<<updateExposure _owner>>
<<break>>
<</if>>
<</for>>
<</if>>
<</widget>>
<<widget "uinvGetWornClothing">>
<<set _slot to _args[0]>>
<<set _owner to _args[1] || "player">>
<<set _wornBag to _owner + " worn">>
<<set $wornItem to null>>
<<set $wornItemDurability to 0>>
<<if typeof UInv !== 'undefined' && UInv.BagExists(_wornBag)>>
<<set _items to UInv.GetItemsArray(_wornBag)>>
<<for _itemName range _items>>
<<set _itemSlot to UInv.GetItemPropertyValue(_wornBag, _itemName, "slot")>>
<<if _itemSlot === _slot>>
<<set $wornItem to _itemName>>
<<set $wornItemDurability to setup.clothingValue(UInv.GetItemPropertyValue(_wornBag, _itemName, "durability"))>>
<<break>>
<</if>>
<</for>>
<</if>>
<</widget>>
<<widget "uinvRepairClothing">>
<<set _slot to _args[0]>>
<<set _amount to _args[1] || 50>>
<<set _owner to _args[2] || "player">>
<<set _wornBag to _owner + " worn">>
<<if _slot === "underwear">>
<<if $clothing && $clothing[_owner]>>
<<set _currentDur to setup.clothingValue($clothing[_owner].underwear)>>
<<set $clothing[_owner].underwear to Math.max(_currentDur, Math.min(100, _currentDur + (Number(_amount) || 0)))>>
<<updateExposure _owner true>>
<</if>>
<<elseif typeof UInv !== 'undefined' && UInv.BagExists(_wornBag)>>
<<set _items to UInv.GetItemsArray(_wornBag)>>
<<for _itemName range _items>>
<<set _itemSlot to UInv.GetItemPropertyValue(_wornBag, _itemName, "slot")>>
<<if _itemSlot === _slot>>
<<set _maxDur to UInv.GetItemPropertyValue(_wornBag, _itemName, "maxDurability") || 100>>
<<set _currentDur to setup.clothingValue(UInv.GetItemPropertyValue(_wornBag, _itemName, "durability"), _maxDur)>>
<<set _newDur to Math.max(_currentDur, Math.min(_maxDur, _currentDur + (Number(_amount) || 0)))>>
<<run UInv.SetItemPropertyValue(_wornBag, _itemName, "durability", _newDur)>>
<<if _owner === "player">>
<<set $clothing.player[_slot] to _newDur>>
<<elseif _owner === "kira">>
<<set $clothing.kira[_slot] to _newDur>>
<</if>>
<<updateExposure _owner true>>
<<break>>
<</if>>
<</for>>
<</if>>
<</widget>>
<<widget "uinvGetWardrobeItems">>
<<set _slot to _args[0] || "all">>
<<set _owner to _args[1] || "player">>
<<set _wardrobeBag to _owner + " wardrobe">>
<<set $wardrobeItems to []>>
<<if typeof UInv !== 'undefined' && UInv.BagExists(_wardrobeBag)>>
<<set _items to UInv.GetItemsArray(_wardrobeBag)>>
<<if _slot === "all">>
<<set $wardrobeItems to _items>>
<<else>>
<<for _itemName range _items>>
<<set _itemSlot to UInv.GetItemPropertyValue(_wardrobeBag, _itemName, "slot")>>
<<if _itemSlot === _slot>>
<<run $wardrobeItems.push(_itemName)>>
<</if>>
<</for>>
<</if>>
<</if>>
<</widget>>
<<widget "uinvEquipArmor">>
<<set _armorName to _args[0]>>
<<set _source to _args[1] || "uinv">>
<<set _eaSwap to typeof UInv !== 'undefined' && UInv.BagHasItem("player", _armorName)>>
<<uinvUnequipArmor `_eaSwap ? "swap" : ""`>>
<<set _equipped to $inventoryFull>>
<<if !_equipped && typeof UInv !== 'undefined' && UInv.BagHasItem("player", _armorName)>>
<<set _equipped to !!setup.wearArmorItem(_armorName)>>
<</if>>
<<if !_equipped && $wardrobe && $wardrobe.player && $wardrobe.player.armorStorage>>
<<set _storageIndex to -1>>
<<for _i, _armor range $wardrobe.player.armorStorage>>
<<if _armor.name === _armorName>>
<<set _storageIndex to _i>>
<<break>>
<</if>>
<</for>>
<<if _storageIndex >= 0>>
<<set _storedArmor to $wardrobe.player.armorStorage[_storageIndex]>>
<<set $equipped.armor to clone(_storedArmor)>>
<<run $wardrobe.player.armorStorage.splice(_storageIndex, 1)>>
<<set _equipped to true>>
<</if>>
<</if>>
<</widget>>
<<widget "uinvUnequipArmor">>
<<set _unequipped to false>>
<<set $inventoryFull to false>>
<<set _uaSwap to _args[0] === "swap">>
<<if !$wardrobe.player.armorStorage>>
<<set $wardrobe.player.armorStorage to []>>
<</if>>
<<if typeof UInv !== 'undefined' && UInv.BagExists("player armor")>>
<<set _uaWorn to UInv.GetItemsArray("player armor")>>
<<if _uaWorn.length > 0>>
<<set _uaArmorName to _uaWorn[0]>>
<<if setup.armorDurability()>>
<<run UInv.SetItemPropertyValue("player armor", _uaArmorName, "durability", setup.armorDurability().current)>>
<</if>>
<<if _uaSwap || setup.bagFree("player") gte 1>>
<<run UInv.MoveItem("player armor", "player", _uaArmorName)>>
<<set _unequipped to true>>
<<else>>
<<set $inventoryFull to true>>
<<toast "Your backpack is full: make room before you take off your armor." "warning">>
<</if>>
<</if>>
<</if>>
<<if $inventoryFull>>
<<elseif !_unequipped && $equipped && $equipped.armor>>
<<run $wardrobe.player.armorStorage.push(clone($equipped.armor))>>
<<set _unequipped to true>>
<</if>>
<<if !$inventoryFull && $equipped && $equipped.armor>>
<<set $equipped.armor to null>>
<</if>>
<</widget>>
<<widget "uinvGetEquippedArmor">>
<<set $equippedArmor to null>>
<<set $equippedArmorData to null>>
<<set _ea to setup.wornArmor()>>
<<if _ea>>
<<set _ead to setup.armorDurability()>>
<<set _armorBag to null>>
<<if typeof UInv !== 'undefined' && UInv.BagExists("player armor") && UInv.GetItemsArray("player armor").length > 0>>
<<set $equippedArmor to UInv.GetItemsArray("player armor")[0]>>
<<set _armorBag to "player armor">>
<</if>>
<<if _armorBag>>
<<set $equippedArmorData to {
name: $equippedArmor,
displayName: UInv.GetItemPropertyValue(_armorBag, $equippedArmor, "singular") || $equippedArmor,
defense: _ea.defense || UInv.GetItemPropertyValue(_armorBag, $equippedArmor, "defense") || 0,
durability: _ead.current,
maxDurability: _ead.max,
magicResist: UInv.GetItemPropertyValue(_armorBag, $equippedArmor, "magicResist") || 0,
magicBonus: UInv.GetItemPropertyValue(_armorBag, $equippedArmor, "magicBonus") || 0,
image: UInv.GetItemPropertyValue(_armorBag, $equippedArmor, "image") || ""
}>>
<<else>>
<<set $equippedArmor to _ea.name>>
<<set _armorId to String(_ea.name).toLowerCase().replace(/ /g, "_")>>
<<set $equippedArmorData to {
name: _ea.name,
displayName: _ea.name,
defense: _ea.defense || 0,
durability: _ead.current,
maxDurability: _ead.max,
magicResist: _ea.magicResist || 0,
magicBonus: _ea.magicBonus || 0,
image: _ea.image || setup.itemImage(String(_ea.name))
}>>
<</if>>
<</if>>
<</widget>>
<<widget "uinvGetAvailableArmor">>
<<set $availableArmor to []>>
<<if typeof UInv !== 'undefined' && UInv.BagExists("player")>>
<<set _allItems to UInv.GetItemsArray("player")>>
<<for _itemName range _allItems>>
<<set _itemType to UInv.GetItemPropertyValue("player", _itemName, "type")>>
<<if _itemType && _itemType.includes("armor")>>
<<set _armorId to _itemName.toLowerCase().replace(/ /g, "_")>>
<<run $availableArmor.push({
name: _itemName,
displayName: UInv.GetItemPropertyValue("player", _itemName, "singular") || _itemName,
defense: UInv.GetItemPropertyValue("player", _itemName, "defense") || 0,
durability: setup.clothingValue(UInv.GetItemPropertyValue("player", _itemName, "durability"), UInv.GetItemPropertyValue("player", _itemName, "maxDurability") || 100),
maxDurability: UInv.GetItemPropertyValue("player", _itemName, "maxDurability") || 100,
image: setup.itemImage(_itemName, "player"),
source: "uinv"
})>>
<</if>>
<</for>>
<</if>>
<<if $wardrobe && $wardrobe.player && $wardrobe.player.armorStorage && $wardrobe.player.armorStorage.length > 0>>
<<for _armor range $wardrobe.player.armorStorage>>
<<set _armorId to _armor.name.toLowerCase().replace(/ /g, "_")>>
<<run $availableArmor.push({
name: _armor.name,
displayName: _armor.name,
defense: _armor.defense || 0,
durability: setup.clothingValue(_armor.currentDurability, _armor.maxDurability || 100),
maxDurability: _armor.maxDurability || 100,
image: _armor.image || setup.itemImage(String(_armor.name)),
source: "storage"
})>>
<</for>>
<</if>>
<</widget>>
<<widget "uinvDamageArmor">>
<<set _armorHit to setup.damageArmor(_args[0] || 0)>>
<</widget>>
<<widget "uinvRepairArmor">>
<<run setup.repairArmor(_args[0] || 0)>>
<</widget>><<widget "addItem">>
<<set _item to _args[0]>>
<<set _qty to _args[1] || 1>>
<<if typeof _item === "object">>
<<set _itemId to _item.id || _item.name || "">>
<<else>>
<<set _itemId to _item>>
<</if>>
<<set _uinvName to setup.itemName(_itemId)>>
<<if setup.isScrap(_uinvName)>>
<<run setup.giveItem(_uinvName, _qty)>>
<<else>>
<<set _aiGot to setup.giveItem(_uinvName, _qty, {leave: true})>>
<<if _aiGot.left gt 0>>
<<notify "error">>Backpack full! Could not pick up <<print _qty>> <<print _uinvName>>.<</notify>>
<<set _addItemNotice to {type: "danger", text: "Backpack full! Could not pick up " + _qty + " " + _uinvName + "."}>>
<</if>>
<</if>>
<</widget>>
<<widget "hasItem">>
<<set _itemId to _args[0]>>
<<set _qty to _args[1] || 1>>
<<set _uinvName to _itemId.replace(/_/g, " ").toLowerCase()>>
<<if typeof UInv !== 'undefined' && UInv.BagExists("player") && UInv.BagHasItem("player", _uinvName)>>
<<set _count to UInv.GetItemPropertyValue("player", _uinvName, "UInvQuantity")>>
<<else>>
<<set _count to 0>>
<</if>>
<<set $hasItem to _count >= _qty>>
<</widget>>
<<widget "scrapBalance">>
<p class="scrap-balance"><<icon "scrap">> You have <strong><<print Math.max(0, Number($vault.scrap) || 0)>></strong> scrap.</p>
<</widget>>
<<widget "lootLeftList">>
<div class="loot-left-box" @id="'loot-left-' + (_args[0] || 'postBattle')"><<lootLeftItems _args[0] _args[1] _args[2]>></div>
<</widget>>
<<widget "lootLeftItems">>
<<set _llKey to _args[0] || "postBattle">>
<<set _llSel to _args[1] || "">>
<<set _llPsg to _args[2] || "">>
<<set _llBox to State.variables[_llKey]>>
<<if _llBox && _llBox.leftLoot && _llBox.leftLoot.length gt 0>>
<div class="loot-left">
<p class="loot-left-hint">No room in your backpack for these. Drop something to make room, or leave them here.</p>
<ul class="loot-list">
<<for _lli, _left range _llBox.leftLoot>>
<<capture _lli, _llKey, _llSel, _llPsg>>
<li class="loot-item loot-item-left">
<span class="loot-name"><<print _left.name>><<if (_left.qty || 1) gt 1>> x<<print _left.qty>><</if>></span>
<<if _left.from>><span class="loot-source">(from <<print _left.from>>)</span><</if>>
<<link "[Take]">>
<<if !setup.postBattleTakeLeft(_lli, _llKey)>><<toast "Still no room in your backpack. Drop something first." "warning">><</if>>
<<if _llPsg>>
<<replace _llSel>><<include _llPsg>><</replace>>
<<else>>
<<replace `"#loot-left-" + _llKey`>><<lootLeftItems _llKey>><</replace>>
<</if>>
<</link>>
</li>
<</capture>>
<</for>>
</ul>
<p class="loot-left-actions"><<link "[Open backpack]">><<run setup.menuOverlay.open("Inventory_Menu")>><</link>></p>
</div>
<</if>>
<</widget>><<set setup.kinkConfig = {
enabled: true,
showNotifications: true,
showInCompanionUI: true,
useVideos: false,
useImages: false,
videoBasePath: "media/kinks/",
imageBasePath: "media/kinks/images/",
requireMinTrust: 20,
requireMinAffection: 15,
discoveryChance: 100
}>>
<<set setup.kinks = {
rough_play: {
id: "rough_play",
name: "Rough Play",
description: "Enjoys being handled forcefully",
icon: "grab",
category: "physical",
mediaPath: "rough/",
effects: {
lustBonus: 10,
tensionBonus: 5,
trustChange: 0
},
dialogueUnlocks: ["kira_rough_tease", "kira_rough_request"],
discoveryText: "likes it rough"
},
hair_pulling: {
id: "hair_pulling",
name: "Hair Pulling",
description: "Gets aroused when her hair is grabbed",
icon: "hand",
category: "physical",
mediaPath: "hair/",
effects: {
lustBonus: 8,
tensionBonus: 3,
trustChange: 0
},
dialogueUnlocks: ["kira_hair_option"],
discoveryText: "loves having her hair pulled"
},
choking: {
id: "choking",
name: "Breath Play",
description: "Aroused by hand on throat",
icon: "choke",
category: "physical",
mediaPath: "choke/",
effects: {
lustBonus: 12,
tensionBonus: 8,
trustChange: -2
},
dialogueUnlocks: ["kira_choke_option"],
discoveryText: "gets wet when you wrap your hand around her throat"
},
submission: {
id: "submission",
name: "Submission",
description: "Enjoys giving up control completely",
icon: "kneel",
category: "psychological",
mediaPath: "submission/",
effects: {
lustBonus: 8,
tensionBonus: 5,
submissionBonus: 5
},
dialogueUnlocks: ["kira_submit_dialogue", "kira_orders"],
discoveryText: "craves being told what to do"
},
praise: {
id: "praise",
name: "Praise Kink",
description: "Melts when told she's being good",
icon: "star",
category: "psychological",
mediaPath: "praise/",
effects: {
lustBonus: 5,
tensionBonus: 2,
affectionBonus: 3,
trustBonus: 2
},
dialogueUnlocks: ["kira_praise_options", "kira_good_girl"],
discoveryText: "gets desperate when you call her a good girl"
},
degradation: {
id: "degradation",
name: "Degradation",
description: "Secretly aroused by being called filthy names",
icon: "lips",
category: "psychological",
mediaPath: "degradation/",
effects: {
lustBonus: 12,
tensionBonus: 10,
trustChange: -3,
submissionBonus: 5
},
dialogueUnlocks: ["kira_degrade_options", "kira_slut_response"],
discoveryText: "gets soaking wet when you call her a slut"
},
exhibitionism: {
id: "exhibitionism",
name: "Exhibitionism",
description: "Aroused by being watched or exposed",
icon: "eye",
category: "situational",
mediaPath: "exhib/",
effects: {
lustBonus: 10,
tensionBonus: 8,
exhibitionismBonus: 5
},
dialogueUnlocks: ["kira_public_tease", "kira_show_off"],
discoveryText: "gets off on being watched"
},
edging: {
id: "edging",
name: "Edging",
description: "Enjoys being kept on the edge",
icon: "hourglass",
category: "situational",
mediaPath: "edging/",
effects: {
lustBonus: 15,
tensionBonus: 15,
trustChange: -2
},
dialogueUnlocks: ["kira_edge_options", "kira_denial_beg"],
discoveryText: "loves being denied, even when she's begging"
},
cnc: {
id: "cnc",
name: "Consensual Non-Consent",
description: "Fantasizes about being 'forced'",
icon: "mask",
category: "situational",
mediaPath: "cnc/",
effects: {
lustBonus: 15,
tensionBonus: 12,
submissionBonus: 8
},
dialogueUnlocks: ["kira_cnc_fantasy", "kira_struggle_play"],
discoveryText: "fantasizes about you taking her whether she wants it or not"
},
oral_fixation: {
id: "oral_fixation",
name: "Oral Fixation",
description: "Loves having something in her mouth",
icon: "tongue",
category: "acts",
mediaPath: "oral/",
effects: {
lustBonus: 8,
tensionBonus: 5
},
dialogueUnlocks: ["kira_oral_eager"],
discoveryText: "can't resist wrapping her lips around your cock"
},
anal: {
id: "anal",
name: "Anal",
description: "Enjoys backdoor pleasure",
icon: "target",
category: "acts",
mediaPath: "anal/",
effects: {
lustBonus: 12,
tensionBonus: 10,
trustChange: 3
},
dialogueUnlocks: ["kira_anal_option", "kira_anal_request"],
discoveryText: "loves it when you fuck her ass"
},
creampie: {
id: "creampie",
name: "Breeding Kink",
description: "Gets off on being filled",
icon: "droplet",
category: "acts",
mediaPath: "breed/",
effects: {
lustBonus: 15,
tensionBonus: 12,
affectionBonus: 5
},
dialogueUnlocks: ["kira_breed_beg", "kira_fill_me"],
discoveryText: "begs you to cum inside her"
}
}>>
<<set setup.companionKinks = {
kira: {
available: [
"rough_play", "hair_pulling", "choking",
"submission", "praise", "degradation",
"exhibitionism", "edging", "cnc",
"oral_fixation", "anal", "creampie"
],
defaultDiscovered: [],
discoveryConditions: {
rough_play: {
trigger: "combat_or_sex",
minTension: 40,
description: "Discovered during rough handling"
},
hair_pulling: {
trigger: "sex_scene",
minTension: 30,
description: "Discovered when grabbing her hair"
},
choking: {
trigger: "sex_scene",
minTrust: 50,
minTension: 50,
description: "Discovered during intense moment"
},
submission: {
trigger: "dialogue_or_sex",
minSubmission: 40,
description: "Revealed through submissive behavior"
},
praise: {
trigger: "dialogue",
minAffection: 40,
description: "Noticed during praise"
},
degradation: {
trigger: "sex_scene",
minTension: 60,
minSubmission: 30,
description: "Discovered during dirty talk"
},
exhibitionism: {
trigger: "travel_event",
minExhibitionism: 30,
description: "Revealed during exposure event"
},
edging: {
trigger: "sex_scene",
minTension: 70,
description: "Discovered when denied release"
},
cnc: {
trigger: "dialogue_or_sex",
minTrust: 60,
minSubmission: 50,
description: "Confessed during intimate moment"
},
oral_fixation: {
trigger: "sex_scene",
minLust: 50,
description: "Obvious from enthusiasm"
},
anal: {
trigger: "sex_scene",
minTrust: 55,
minTension: 50,
description: "Discovered during anal play"
},
creampie: {
trigger: "sex_scene",
minAffection: 50,
minLust: 60,
description: "Begged for it herself"
}
}
}
}>>
<<widget "randomizeKinks">>
<<set _compId to _args[0]>>
<<set _count to _args[1] || 2>>
<<if setup.companionKinks[_compId]>>
<<set _available to setup.companionKinks[_compId].available.slice()>>
<<set _selected to []>>
<<for _i to 0; _i < _count && _available.length > 0; _i++>>
<<set _randIndex to random(0, _available.length - 1)>>
<<run _selected.push(_available[_randIndex])>>
<<run _available.splice(_randIndex, 1)>>
<</for>>
<<for _i, _comp range $companions>>
<<if _comp.id === _compId>>
<<set $companions[_i].actualKinks to _selected>>
<<break>>
<</if>>
<</for>>
<</if>>
<</widget>>
<<widget "companionHasKink">>
<<set _compId to _args[0]>>
<<set _kinkId to _args[1]>>
<<set _hasActualKink to false>>
<<for _comp range $companions>>
<<if _comp.id === _compId>>
<<if _comp.actualKinks && _comp.actualKinks.includes(_kinkId)>>
<<set _hasActualKink to true>>
<</if>>
<<break>>
<</if>>
<</for>>
<</widget>>
<<widget "hasKink">>
<<set _partnerId to _args[0]>>
<<set _kinkId to _args[1]>>
<<set _hasKink to false>>
<<for _comp range $companions>>
<<if _comp.id === _partnerId>>
<<if _comp.kinks && _comp.kinks.includes(_kinkId)>>
<<set _hasKink to true>>
<</if>>
<<break>>
<</if>>
<</for>>
<</widget>>
<<widget "getDiscoveredKinks">>
<<set _partnerId to _args[0]>>
<<set _discoveredKinks to []>>
<<for _comp range $companions>>
<<if _comp.id === _partnerId>>
<<set _discoveredKinks to _comp.kinks || []>>
<<break>>
<</if>>
<</for>>
<</widget>>
<<widget "applyKinkEffects">>
<<set _partner to _args[0]>>
<<set _kinkId to _args[1]>>
<<set _kink to setup.kinks[_kinkId]>>
<<if _kink && _kink.effects>>
<<if _kink.effects.lustBonus>>
<<set _kinkLustBonus to _kink.effects.lustBonus || 0>>
<<clampStat "companions[0].lust" _kinkLustBonus>>
<</if>>
<<if _kink.effects.tensionBonus>>
<<set _kinkTensionBonus to _kink.effects.tensionBonus || 0>>
<<clampStat "companions[0].tension" _kinkTensionBonus>>
<</if>>
<<if _kink.effects.submissionBonus>>
<<set $companions[0].submission += _kink.effects.submissionBonus>>
<</if>>
<<if _kink.effects.affectionBonus>>
<<set $companions[0].affection += _kink.effects.affectionBonus>>
<</if>>
<<if _kink.effects.trustBonus>>
<<set $companions[0].trust += _kink.effects.trustBonus>>
<</if>>
<<if _kink.effects.trustChange>>
<<set $companions[0].trust += _kink.effects.trustChange>>
<</if>>
<<if _kink.effects.exhibitionismBonus>>
<<gainExhibitionism "kira" _kink.effects.exhibitionismBonus>>
<</if>>
<</if>>
<</widget>>
<<widget "getKinkMedia">>
<<set _kinkId to _args[0]>>
<<set _mediaType to _args[1] || "video">>
<<set _kink to setup.kinks[_kinkId]>>
<<if _kink>>
<<if _mediaType === "video" && setup.kinkConfig.useVideos>>
<<set _mediaPath to setup.kinkConfig.videoBasePath + _kink.mediaPath>>
<<elseif _mediaType === "image" && setup.kinkConfig.useImages>>
<<set _mediaPath to setup.kinkConfig.imageBasePath + _kink.mediaPath>>
<<else>>
<<set _mediaPath to "">>
<</if>>
<<else>>
<<set _mediaPath to "">>
<</if>>
<</widget>>
<<widget "discoverKink">>
<<set _partnerId to _args[0]>>
<<set _kinkId to _args[1]>>
<<if !setup.kinkConfig || !setup.kinkConfig.enabled>>
<<else>>
<<set _compIndex to -1>>
<<for _i, _comp range $companions>>
<<if _comp.id === _partnerId>>
<<set _compIndex to _i>>
<<break>>
<</if>>
<</for>>
<<if _compIndex >= 0>>
<<if !$companions[_compIndex].kinks>>
<<set $companions[_compIndex].kinks to []>>
<</if>>
<<set _hasActualKink to $companions[_compIndex].actualKinks && $companions[_compIndex].actualKinks.includes(_kinkId)>>
<<if _hasActualKink && !$companions[_compIndex].kinks.includes(_kinkId)>>
<<set _kinkData to setup.kinks[_kinkId]>>
<<if _kinkData>>
<<run $companions[_compIndex].kinks.push(_kinkId)>>
<<if setup.kinkConfig.showNotifications>>
<div class="kink-discovery">
<<if _kinkData.icon>>
<span class="kink-icon"><<icon _kinkData.icon>></span>
<<else>>
<span class="kink-icon"><<icon "idea">></span>
<</if>>
<div class="kink-info">
<span class="kink-label">Discovered</span>
<span class="kink-name"><<print _kinkData.name>></span>
<<if setup.kinkNarratives && setup.kinkNarratives[_kinkId] && setup.kinkNarratives[_kinkId].discovery>>
<span class="kink-text"><<kinkNarrative _kinkId "discovery">></span>
<<else>>
<span class="kink-text"><<print $companions[_compIndex].name>> <<print _kinkData.discoveryText>>...</span>
<</if>>
</div>
<<if setup.kinkConfig.useVideos && _kinkData.mediaPath>>
<<getKinkMedia _kinkId "video">>
<<if _mediaPath>>
<div class="kink-video-container" @data-video-path="(_mediaPath)">
</div>
<</if>>
<</if>>
</div>
<</if>>
<<applyKinkEffects _partnerId _kinkId>>
<<set $flags["kink_" + _kinkId + "_discovered"] to true>>
<<else>>
<<run $companions[_compIndex].kinks.push(_kinkId)>>
<<if setup.kinkConfig.showNotifications>>
<div class="kink-discovery">
<span class="kink-icon"><<icon "idea">></span>
<span class="kink-text">You discovered something about <<print $companions[_compIndex].name>>...</span>
</div>
<</if>>
<</if>>
<</if>>
<</if>>
<</if>>
<</widget>>
<<widget "checkKinkDiscovery">>
<<if !setup.kinkConfig || !setup.kinkConfig.enabled>>
<<else>>
<<set _trigger to _args[0]>>
<<set _compId to _args[1] || "kira">>
<<set _comp to null>>
<<set _compIndex to -1>>
<<for _i, _c range $companions>>
<<if _c.id === _compId>>
<<set _comp to _c>>
<<set _compIndex to _i>>
<<break>>
<</if>>
<</for>>
<<if _comp && _comp.actualKinks>>
<<set _conditions to setup.companionKinks[_compId] ? setup.companionKinks[_compId].discoveryConditions : {}>>
<<for _kinkId range _comp.actualKinks>>
<<if _comp.kinks && _comp.kinks.includes(_kinkId)>>
<<continue>>
<</if>>
<<set _cond to _conditions[_kinkId]>>
<<if !_cond>>
<<continue>>
<</if>>
<<set _triggerMatches to false>>
<<if _cond.trigger === _trigger>>
<<set _triggerMatches to true>>
<<elseif _cond.trigger === "combat_or_sex" && (_trigger === "combat" || _trigger === "sex_scene")>>
<<set _triggerMatches to true>>
<<elseif _cond.trigger === "dialogue_or_sex" && (_trigger === "dialogue" || _trigger === "sex_scene")>>
<<set _triggerMatches to true>>
<</if>>
<<if !_triggerMatches>>
<<continue>>
<</if>>
<<set _meetsRequirements to true>>
<<if _cond.minTrust && (_comp.trust || 0) < _cond.minTrust>>
<<set _meetsRequirements to false>>
<</if>>
<<if _meetsRequirements && _cond.minTension && (_comp.tension || 0) < _cond.minTension>>
<<set _meetsRequirements to false>>
<</if>>
<<if _meetsRequirements && _cond.minLust && (_comp.lust || 0) < _cond.minLust>>
<<set _meetsRequirements to false>>
<</if>>
<<if _meetsRequirements && _cond.minAffection && (_comp.affection || 0) < _cond.minAffection>>
<<set _meetsRequirements to false>>
<</if>>
<<if _meetsRequirements && _cond.minSubmission && (_comp.submission || 0) < _cond.minSubmission>>
<<set _meetsRequirements to false>>
<</if>>
<<if _meetsRequirements && _cond.minExhibitionism && ($exhibitionism[_comp.id] || 0) < _cond.minExhibitionism>>
<<set _meetsRequirements to false>>
<</if>>
<<if _meetsRequirements>>
<<if (_comp.trust || 0) < setup.kinkConfig.requireMinTrust>>
<<set _meetsRequirements to false>>
<</if>>
<<if (_comp.affection || 0) < setup.kinkConfig.requireMinAffection>>
<<set _meetsRequirements to false>>
<</if>>
<</if>>
<<if _meetsRequirements && setup.kinkConfig.discoveryChance < 100>>
<<if random(1, 100) > setup.kinkConfig.discoveryChance>>
<<set _meetsRequirements to false>>
<</if>>
<</if>>
<<if _meetsRequirements>>
<<discoverKink _compId _kinkId>>
<</if>>
<</for>>
<</if>>
<</if>>
<</widget>>
<<widget "tryDiscoverKink">>
<<if !setup.kinkConfig || !setup.kinkConfig.enabled>>
<<else>>
<<set _compId to _args[0]>>
<<set _kinkId to _args[1]>>
<<set _comp to null>>
<<for _c range $companions>>
<<if _c.id === _compId>>
<<set _comp to _c>>
<<break>>
<</if>>
<</for>>
<<if _comp>>
<<if _comp.actualKinks && _comp.actualKinks.includes(_kinkId)>>
<<if !_comp.kinks || !_comp.kinks.includes(_kinkId)>>
<<set _conditions to setup.companionKinks[_compId] ? setup.companionKinks[_compId].discoveryConditions : {}>>
<<set _cond to _conditions[_kinkId]>>
<<set _meetsRequirements to true>>
<<if _cond>>
<<if _cond.minTrust && (_comp.trust || 0) < _cond.minTrust>>
<<set _meetsRequirements to false>>
<</if>>
<<if _meetsRequirements && _cond.minTension && (_comp.tension || 0) < _cond.minTension>>
<<set _meetsRequirements to false>>
<</if>>
<<if _meetsRequirements && _cond.minLust && (_comp.lust || 0) < _cond.minLust>>
<<set _meetsRequirements to false>>
<</if>>
<<if _meetsRequirements && _cond.minAffection && (_comp.affection || 0) < _cond.minAffection>>
<<set _meetsRequirements to false>>
<</if>>
<<if _meetsRequirements && _cond.minSubmission && (_comp.submission || 0) < _cond.minSubmission>>
<<set _meetsRequirements to false>>
<</if>>
<<if _meetsRequirements && _cond.minExhibitionism && ($exhibitionism[_comp.id] || 0) < _cond.minExhibitionism>>
<<set _meetsRequirements to false>>
<</if>>
<</if>>
<<if _meetsRequirements>>
<<if (_comp.trust || 0) < setup.kinkConfig.requireMinTrust>>
<<set _meetsRequirements to false>>
<</if>>
<<if (_comp.affection || 0) < setup.kinkConfig.requireMinAffection>>
<<set _meetsRequirements to false>>
<</if>>
<</if>>
<<if _meetsRequirements && setup.kinkConfig.discoveryChance < 100>>
<<if random(1, 100) > setup.kinkConfig.discoveryChance>>
<<set _meetsRequirements to false>>
<</if>>
<</if>>
<<if _meetsRequirements>>
<<discoverKink _compId _kinkId>>
<</if>>
<</if>>
<</if>>
<</if>>
<</if>>
<</widget>><<set setup.kinkNarratives = {
rough_play: {
discovery: [
"The way she moans when you shove her against the wall tells you everything. She doesn't want gentle. She wants to be fucking used.",
"You grab her hair and yank—hard. Instead of crying out in pain, she whimpers with need, her cunt visibly clenching through her soaked underwear.",
"When you pin her wrists above her head, she stops struggling. Not because she's given up. Because she's finally getting what she wants.",
"Her whole body shudders when you manhandle her into position. 'Harder,' she breathes, and you realize she's been waiting for someone to stop treating her like glass."
],
during: [
"You slam into her without mercy, and she screams—not in pain, but in desperate, filthy gratitude.",
"Your hand cracks across her ass and she pushes back for more, begging you to leave marks.",
"You fuck her like you're trying to break her, and she takes every brutal thrust with hungry moans.",
"She's going to have bruises tomorrow. From the way she's cumming around your cock, she can't fucking wait."
],
after: [
"She's covered in marks—bite marks, handprints, scratches. She traces them with her fingers, smiling.",
"Her voice is hoarse from screaming. Her body is wrecked. She's never looked more satisfied.",
"'Again,' she whispers, even though she can barely move. 'Do that to me again.'"
]
},
hair_pulling: {
discovery: [
"Your fist closes in her hair and she fucking melts. Eyes rolling back, mouth falling open, a moan ripping out of her throat.",
"You grab a handful of her hair and tug. Her knees nearly buckle. 'Oh fuck,' she gasps, 'do that again.'",
"The moment your fingers tangle in her hair and pull, her pussy clenches so hard you can see it. She's absolutely dripping.",
"One sharp yank on her hair and she's panting, desperate, grinding against nothing like a bitch in heat."
],
during: [
"You use her hair like a handle, forcing her head where you want it while you fuck her throat.",
"Every thrust, you pull her hair harder. Every pull makes her cunt tighter around your cock.",
"You drag her head back by her hair, exposing her throat, and she moans like you've given her a gift.",
"She's on all fours and you're using her hair to slam her back onto your cock with every stroke."
],
after: [
"Her scalp tingles where you grabbed her. She can still feel your grip. She hopes she can feel it for days.",
"She runs her fingers through her tangled, fucked-up hair and smiles like she's won something."
]
},
choking: {
discovery: [
"Your hand wraps around her throat—just resting there—and her eyes go glassy with want. Her hips buck. Her cunt floods.",
"The lightest pressure on her throat and she's gasping, not from lack of air but from how desperately she needs more.",
"You feel her pulse hammering under your palm. Her pupils are blown. She's never been this wet in her life.",
"'Squeeze,' she whispers, tilting her chin up to give you better access. 'Please. I need it.'"
],
during: [
"You control her air while you fuck her. Let her breathe when she's good. Squeeze when you want to feel her cunt spasm.",
"Her face is flushed, eyes watering, mouth open in a silent scream as you choke her through an orgasm that wrecks her whole body.",
"You tighten your grip and she cums instantly, clenching around you so hard it almost hurts.",
"She can barely breathe and she's thanking you between gasps, begging you not to stop."
],
after: [
"There are faint marks on her throat. She touches them reverently, already missing the pressure.",
"Her voice is rough. Her throat aches. She hasn't stopped smiling since you let go."
]
},
submission: {
discovery: [
"The moment you give her an order, something shifts in her eyes. Relief. Gratitude. Like she's been waiting her whole life for someone to take control.",
"She drops to her knees without being asked. Looks up at you. Waits. Her whole body radiating need to be told what to do.",
"'Yes,' she says. Not reluctant. Not hesitant. Eager. Desperate to obey. To be good for you.",
"You tell her to stay and she stays. Tell her to strip and she strips. Every command makes her wetter than the last."
],
during: [
"She follows every order perfectly, eagerly, her cunt dripping with each act of obedience.",
"'Thank you,' she gasps when you use her. 'Thank you for telling me what to do. Thank you for using me.'",
"She's nothing but a vessel for your pleasure right now, and she's never been happier.",
"Every command you give her makes her cunt clench. Being controlled gets her off harder than any touch."
],
after: [
"She curls up at your feet, still floating in that space where she doesn't have to think. Just obey. Just be good.",
"'Tell me what to do tomorrow,' she murmurs. 'I want to be yours all the time.'"
]
},
praise: {
discovery: [
"'Good girl.' Two words and she's fucking ruined. Thighs clenching, nipples hardening, a desperate whine escaping her throat.",
"You tell her she's being so good and she nearly cums on the spot. Her whole body trembles with pathetic, needy gratitude.",
"The praise hits her like a drug. Her eyes go hazy, her breathing quickens, and you can see the wet spot spreading on her underwear.",
"'Such a good girl for me.' She makes a sound that's barely human—pure need, pure submission, pure desperate want for more."
],
during: [
"'You're being so good,' you tell her as you fuck her. 'Such a perfect little fucktoy.' She cums screaming.",
"Every 'good girl' makes her clench tighter. By the end she's cumming continuously, drunk on praise and cock.",
"'You take me so well. Such a good slut.' She's crying now—overwhelmed, overstimulated, desperately happy.",
"You praise her through every orgasm and she falls apart completely, sobbing with gratitude and pleasure."
],
after: [
"She's still glowing from your words. 'Was I good?' she asks, needing to hear it again. Always needing to hear it.",
"'Tell me I was good,' she begs, even though you've said it a dozen times. She's addicted to your approval."
]
},
degradation: {
discovery: [
"You call her a slut and she cums. Just like that. The word alone enough to push her over the edge.",
"'Desperate little whore.' Her eyes go wide, her cunt spasms, and she moans like you've just given her exactly what she needed.",
"The filthier the name, the harder she gets off. Slut makes her wet. Whore makes her drip. Cumslut makes her fucking gush.",
"'What a pathetic, needy fucktoy.' She should be angry. Instead she's squirting, shame and arousal twisted together into something explosive."
],
during: [
"'You're nothing but a set of holes,' you tell her as you fuck her. 'Just a warm place to dump my cum.' She thanks you.",
"You call her every filthy name you can think of and she gets wetter with each one, cumming harder each time.",
"'Worthless cocksleeve. Desperate cumdump.' Every word makes her cunt grip you tighter.",
"'Say it,' you demand. 'Tell me what you are.' 'I'm your whore,' she sobs happily. 'Your dirty fucking slut.'"
],
after: [
"She's covered in your cum and still mumbling the names you called her, getting off on the memory.",
"'I'm such a slut,' she whispers to herself, touching her ruined pussy. 'Such a dirty fucking whore.' And she smiles."
]
},
exhibitionism: {
discovery: [
"Someone might see. Someone might be watching right now. The thought makes her cunt clench so hard she nearly cums.",
"She's terrified of being caught and soaking wet because of it. Her shame and her arousal feeding each other.",
"The exposure is supposed to be humiliating. Instead it's making her drip down her thighs.",
"'Someone could walk in,' she whispers, and you watch her pussy visibly pulse with need at the thought."
],
during: [
"She's fucking you where anyone could see, and every time someone walks nearby her cunt tightens with terrified arousal.",
"'They can see,' she gasps. 'They can see you fucking me.' She cums harder than she ever has.",
"The door isn't locked. Anyone could walk in. She's never been wetter in her life.",
"She's putting on a show and she knows it. The thought of being watched makes her cum over and over."
],
after: [
"'Do you think anyone saw?' she asks, voice shaky, already getting turned on again at the possibility.",
"She can't stop thinking about it. The exposure. The risk. Her hand is between her legs again within minutes."
]
},
edging: {
discovery: [
"You stop right before she cums and she screams—not in frustration, but in agonized pleasure. She wants the denial as much as the release.",
"'Don't let me cum,' she begs, even as her body writhes for it. She wants to be kept on the edge. Needs it.",
"The longer you deny her, the more desperate she gets. And the more desperate she gets, the wetter she becomes.",
"She's been on the edge for so long she's delirious, and she's begging you not to let her cum yet. Begging you to keep torturing her."
],
during: [
"You edge her for the tenth time and she's crying, shaking, a puddle beneath her. She's never felt anything this intense.",
"'Please don't let me cum,' she sobs, even as she grinds desperately against your hand. 'Not yet. Please not yet.'",
"Every time you bring her to the edge and stop, her cunt spasms with denial. She's going to be ruined when you finally let her.",
"She's so far gone she can't form words anymore. Just desperate sounds. Begging for denial and release in equal measure."
],
after: [
"When you finally let her cum, she blacks out. Comes to sobbing, still convulsing, ruined beyond words.",
"'Again,' she whispers when she can speak. 'Edge me again. Make me wait. Please.'"
]
},
cnc: {
discovery: [
"'Take me,' she whispers. 'Even if I say no. Especially if I say no.' Her darkest fantasy, finally spoken aloud.",
"She confesses to fantasies of being used against her will. Being held down. Being taken. Her cunt floods at the admission.",
"'I want you to make me,' she admits, face burning with shame and arousal. 'I want to fight and lose.'",
"The safeword is in place. The trust is established. Now she wants you to take what you want, whether she 'wants' it or not."
],
during: [
"She fights you. Struggles. Says no. But her cunt is soaking and she's cumming on your cock even as she 'resists.'",
"'Stop,' she cries out, shoving at you weakly. 'Please stop.' She's never been wetter. Never cum harder.",
"You pin her down and take her, ignoring her protests, and she falls apart completely—the fantasy made real.",
"'No, no, no,' she moans, even as her pussy grips you and she shakes through another orgasm."
],
after: [
"She's in your arms, aftercare washing over her, still trembling. 'That was... everything I wanted. Everything I needed.'",
"'Can we do that again?' she asks, still floating. 'I want you to take me again. Make me take it.'"
]
},
oral_fixation: {
discovery: [
"She takes your cock in her mouth and her eyes roll back. Not because you're making her—because having something to suck is its own reward.",
"The way she moans around your cock tells you everything. She doesn't just give head. She craves it. Needs it.",
"She's not sucking you off as a favor. She's doing it because having her mouth full makes her cunt drip.",
"'Please,' she begs, mouth already open. 'Please let me suck you. I need it. I need something in my mouth.'"
],
during: [
"She chokes herself on your cock willingly, eagerly, drool running down her chin, eyes glazed with worship.",
"You don't need to guide her. She's fucking her own throat on you, desperate for more, deeper, harder.",
"She cums from sucking you off. No one touching her cunt. Just the act of being used like a fleshlight for your cock.",
"Her jaw aches and she doesn't care. She'd suck you until it breaks if you let her."
],
after: [
"Her lips are swollen, her throat raw, and she's already looking at your cock like she wants to do it again.",
"'I love the way you taste,' she murmurs, licking cum from her lips. 'I could do that forever.'"
]
},
anal: {
discovery: [
"The first time you press against her ass, she pushes back. Eager. Wanting. 'Please,' she whispers. 'I need it there.'",
"She admits she's been thinking about it. Fantasizing. Fingering her own ass and wishing it was your cock.",
"You slide a finger in her ass and she cums instantly, her whole body seizing with unexpected pleasure.",
"'My ass,' she begs, spreading herself open for you. 'Please fuck my ass. I need to feel you there.'"
],
during: [
"You fuck her ass and she screams, not in pain but in overwhelming fullness, cumming with every thrust.",
"She's pushing back onto your cock, taking you deeper in her ass, begging for more, harder, faster.",
"'Ruin my ass,' she moans. 'Make me feel it tomorrow. Make me feel you every time I sit down.'",
"You fill her ass with cum and she cums with you, clenching around you, milking every drop."
],
after: [
"She's stretched and sore and smiling. 'I can still feel you,' she whispers happily. 'I want to always feel you.'",
"'Next time,' she says, already planning, 'I want it harder. Deeper. I want to feel you for a week.'"
]
},
creampie: {
discovery: [
"'Cum inside me,' she begs, legs wrapping around you to hold you deep. 'Please. I need to feel you fill me.'",
"The moment you mention cumming in her, her cunt spasms. She wants it. Needs it. Has to feel you empty inside her.",
"'Breed me,' she whispers, and the raw, desperate need in her voice makes you throb. 'Put a baby in me. Even if it's just pretend.'",
"She won't let you pull out. Holds you deep with her legs while her pussy milks you, desperate for every drop."
],
during: [
"'Fill me,' she screams as you fuck her. 'Cum in me. Give it to me. I need to feel it. I need to be full of you.'",
"You cum inside her and she cums too, clenching around you, milking every drop like her body was made for this.",
"'Breed me,' she moans with every thrust. 'Make me yours. Fill me up. Put your cum where it belongs.'",
"She can feel you throbbing inside her, about to cum, and she begs for it like her life depends on it."
],
after: [
"Your cum is leaking out of her and she pushes it back in, desperate not to waste a single drop.",
"She lies there with her legs up, keeping your cum inside her, smiling like she's won something precious.",
"'Stay in me,' she murmurs. 'Don't pull out yet. I want to feel you. I want to feel full of you forever.'"
]
}
}>>;
<<widget "kinkNarrative">>
<<set _kinkId to _args[0]>>
<<set _phase to _args[1] || "discovery">>
<<if setup.kinkNarratives[_kinkId] && setup.kinkNarratives[_kinkId][_phase]>>
<<set _pool to setup.kinkNarratives[_kinkId][_phase]>>
<<print _pool[random(0, _pool.length - 1)]>>
<</if>>
<</widget>>
<<widget "kinkSceneNarrative">>
<<set _specificKink to _args[0] || null>>
<<getCompanion "kira">>
<<if $tempCompanion && $tempCompanion.kinks && $tempCompanion.kinks.length > 0>>
<<if _specificKink && $tempCompanion.kinks.includes(_specificKink)>>
<p class="explicit kink-flavor"><<kinkNarrative _specificKink "during">></p>
<<else>>
<<set _randomKink to $tempCompanion.kinks[random(0, $tempCompanion.kinks.length - 1)]>>
<<if setup.kinkNarratives[_randomKink] && setup.kinkNarratives[_randomKink].during>>
<p class="explicit kink-flavor"><<kinkNarrative _randomKink "during">></p>
<</if>>
<</if>>
<</if>>
<</widget>>
<<widget "kinkAfterNarrative">>
<<set _specificKink to _args[0] || null>>
<<getCompanion "kira">>
<<if $tempCompanion && $tempCompanion.kinks && $tempCompanion.kinks.length > 0>>
<<if _specificKink && $tempCompanion.kinks.includes(_specificKink)>>
<p class="explicit kink-flavor"><<kinkNarrative _specificKink "after">></p>
<<else>>
<<set _randomKink to $tempCompanion.kinks[random(0, $tempCompanion.kinks.length - 1)]>>
<<if setup.kinkNarratives[_randomKink] && setup.kinkNarratives[_randomKink].after>>
<p class="explicit kink-flavor"><<kinkNarrative _randomKink "after">></p>
<</if>>
<</if>>
<</if>>
<</widget>>
<<widget "kinkMatchNarrative">>
<<set _sceneType to _args[0]>>
<<set _phase to _args[1] || "during">>
<<getCompanion "kira">>
<<if $tempCompanion && $tempCompanion.kinks>>
<<set _matched to false>>
<<switch _sceneType>>
<<case "rough">>
<<if $tempCompanion.kinks.includes("rough_play") && !_matched>>
<p class="explicit kink-flavor"><<kinkNarrative "rough_play" _phase>></p>
<<set _matched to true>>
<</if>>
<<if $tempCompanion.kinks.includes("hair_pulling") && !_matched>>
<p class="explicit kink-flavor"><<kinkNarrative "hair_pulling" _phase>></p>
<<set _matched to true>>
<</if>>
<<if $tempCompanion.kinks.includes("choking") && !_matched && random(1,100) <= 50>>
<p class="explicit kink-flavor"><<kinkNarrative "choking" _phase>></p>
<<set _matched to true>>
<</if>>
<<case "submissive">>
<<if $tempCompanion.kinks.includes("submission") && !_matched>>
<p class="explicit kink-flavor"><<kinkNarrative "submission" _phase>></p>
<<set _matched to true>>
<</if>>
<<if $tempCompanion.kinks.includes("praise") && !_matched>>
<p class="explicit kink-flavor"><<kinkNarrative "praise" _phase>></p>
<<set _matched to true>>
<</if>>
<<case "degrading">>
<<if $tempCompanion.kinks.includes("degradation") && !_matched>>
<p class="explicit kink-flavor"><<kinkNarrative "degradation" _phase>></p>
<<set _matched to true>>
<</if>>
<<case "oral">>
<<if $tempCompanion.kinks.includes("oral_fixation") && !_matched>>
<p class="explicit kink-flavor"><<kinkNarrative "oral_fixation" _phase>></p>
<<set _matched to true>>
<</if>>
<<case "anal">>
<<if $tempCompanion.kinks.includes("anal") && !_matched>>
<p class="explicit kink-flavor"><<kinkNarrative "anal" _phase>></p>
<<set _matched to true>>
<</if>>
<<case "climax">>
<<if $tempCompanion.kinks.includes("creampie") && !_matched>>
<p class="explicit kink-flavor"><<kinkNarrative "creampie" _phase>></p>
<<set _matched to true>>
<</if>>
<<if $tempCompanion.kinks.includes("edging") && !_matched>>
<p class="explicit kink-flavor"><<kinkNarrative "edging" _phase>></p>
<<set _matched to true>>
<</if>>
<</switch>>
<</if>>
<</widget>><<run VaultUI.setBackground("bathroom")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<h2>Bathroom</h2>
A small but functional washroom. Sink, toilet, and a shower stall with a faded curtain. The water pressure is surprisingly good — one of the vault's few luxuries.
Steam clings to the cracked mirror when the water runs hot.
<<if $time.phase === "morning">>
The pipes groan to life. Morning routines. Others might need this space soon.
<<elseif $time.phase === "evening">>
The dim lighting makes the room feel smaller. More intimate.
<</if>>
<div class="choice-container">
<<vchoice "Take a shower" "Bathroom_Shower" "action" "shower">>
<<vchoice "Use the sink" "Bathroom_Sink" "action" "shower">>
<<vchoice "Check mirror" "Bathroom_Mirror" "action" "search">>
<<vchoice "Leave" "Vault_Hub" "move" "return">>
</div><<storyVideo "story/mv_bathroom/sink">>
You wash your hands and face at the sink. The water is cold but clean.
Better than anything in the Reclaimed.
<<set $player.energy to Math.min($player.maxEnergy, $player.energy + 2)>>
<div class="choice-container">
<<vchoice "Back" "Bathroom_Hub" "move" "return">>
</div><<if $player.corruption >= 50>><<storyVideo "story/bathroom_mirror/wrong">><<elseif $player.corruption >= 30>><<storyVideo "story/bathroom_mirror/violet">><<elseif $player.corruption >= 10>><<storyVideo "story/bathroom_mirror/different">><<else>><<storyVideo "story/bathroom_mirror/worn">><</if>>
You look at yourself in the cracked mirror.
<<if $player.corruption >= 50>>
For a moment, your reflection seems WRONG. Eyes too bright. Something moving behind them.
You blink. Normal again.
<<say "Narrator" "Was that your imagination? Or did your reflection smile a moment after you did?">>
<<elseif $player.corruption >= 30>>
Your eyes catch the light strangely. A hint of violet at the edges when you turn your head.
The corruption is showing. Subtly. But it's there.
<<elseif $player.corruption >= 10>>
Something different about your eyes. Harder to pin down. But definitely... different.
<<else>>
Tired. Worn. But alive.
<</if>>
<div class="choice-container">
<<vchoice "Back" "Bathroom_Hub" "move" "return">>
</div><<run VaultUI.setBackground("bathroom")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<<storyVideo "story/mv_bathroom/shower">>
You step into the shower stall. Pull the faded curtain closed.
The water takes a moment to heat. Then HOT water cascades over you. One of the vault's few luxuries.
Steam fills the small space. The heat feels incredible on your muscles.
<<if $player.lust >= 40>>
The heat, the privacy, the water on your skin... your thoughts drift.
Your body is responding. Arousal building in the steamy privacy.
<div class="choice-container">
<<vchoice "Just shower normally" "Bathroom_Shower_Normal" "action" "shower">>
<<if !setup.sceneHidden("reliefNonSexual")>><<vchoice "Take a COLD shower (reduce arousal)" "Bathroom_ColdShower" "action" "crystal">><</if>>
<<vchoice "Take care of yourself" "Bathroom_Masturbate" "intimate" "hand">>
</div>
<<else>>
The water feels good. Washing away the grime and sweat of survival.
<<advanceTime 0 15>>
<<set $player.energy to Math.min($player.maxEnergy, $player.energy + 5)>>
<div class="choice-container">
<<vchoice "Finish showering" "Bathroom_Hub" "move" "shower">>
</div>
<</if>><<run VaultUI.setBackground("bathroom")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<<storyVideo "story/mv_bathroom/shower_normal">>
You let the hot water wash over you. A rare moment of peace.
The steam, the heat, the sound of water — meditative.
<<advanceTime 0 15>>
<<set $player.energy to Math.min($player.maxEnergy, $player.energy + 5)>>
<div class="choice-container">
<<vchoice "Finish showering" "Bathroom_Hub" "move" "shower">>
</div><<run VaultUI.setBackground("bathroom")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
The hot water runs over your body. Steam fills the small space. Privacy. Heat. Arousal.
Your hand drifts lower.
<<storyVideo "story/bathroom_kira_joins_shower/masturbate">>
You stroke yourself under the spray. The water making everything slick.
Images flood your mind. Kira. Her body. The way she looks at you sometimes.
<<if $flags.sleptWithKira>>
Memories of her. The sounds she makes. How she feels wrapped around you.
<<elseif $companions[0] && $companions[0].tension >= 50>>
Fantasies of her. What it would be like. How she'd taste.
<</if>>
Your breathing gets heavier. Hand moving faster.
<<set _catchChance to 0>>
<<if $companions[0] && !setup.kiraAway() && $companions[0].currentLocation !== "medical">>
<<set _catchChance to 15>>
<<if $companions[0].currentLocation === "commons" || $companions[0].currentLocation === "quarters">>
<<set _catchChance to 25>>
<</if>>
<<if $time.phase === "morning">>
<<set _catchChance += 10>>
<</if>>
<</if>>
<<if _catchChance > 0 && random(1, 100) <= _catchChance>>
<div class="choice-container">
<<vchoice "Continue" "Bathroom_Caught" "action" "forward">>
</div>
<<else>>
The water covers any sounds you make.
You're close. So close. Hand pumping faster under the hot spray.
<div class="narrative-video intimate">
<<if $preferences.showVideos>>
<<if !_storyClip>><<showEventMedia "intimate/shower_masturbate_male">><</if>>
<</if>>
</div>
You finish with a groan, come washing away in the water. Relief floods through you.
<<advanceTime 0 30>>
<<set $player.lust to Math.max(10, $player.lust - 35)>><<run setup.playerReleased()>>
You lean against the tile wall, catching your breath. Satisfied.
<div class="choice-container">
<<vchoice "Finish showering" "Bathroom_Hub" "move" "shower">>
</div>
<</if>><<showCharacter "kira" "right" "surprised">>
The door opens. You forgot to lock it.
Kira stands there, frozen.
<<storyVideo "story/bathroom_kira_joins_shower/caught">>
The shower curtain is thin — translucent when wet. She can see your SILHOUETTE. See what you're doing.
Her eyes widen. Drop to the obvious motion of your hand.
<<say "Kira" "I— shit. Sorry. I didn't—">>
She doesn't leave immediately. Her gaze lingers. Locked on you through the curtain.
You freeze, hand still wrapped around yourself. Hard. Caught.
<<addTension "kira" 15>>
<<clampStat "player.lust" 10>>
<<if $companions[0] && $companions[0].tension >= 60>>
She swallows hard. Breath coming faster. Staring.
<<say "Kira" "Do you... want help with that?">>
Her voice is thick. Aroused.
<div class="choice-container">
<<vchoice "Yes. Join me." "Bathroom_Kira_Helps" "intimate" "check">>
<<vchoice "No, just give me a minute" "Bathroom_Kira_Leaves" "action" "door-handle">>
</div>
<<else>>
<<say "Kira" "I'll just... go. Sorry.">>
She pulls the door shut. Fast.
You hear her footsteps retreat quickly.
<<set $flags.kiraCaughtShower to true>>
The mood is ruined. But something shifted between you. She SAW you. And she didn't look disgusted.
<div class="choice-container">
<<vchoice "Finish alone" "Bathroom_Hub" "move" "shower">>
</div>
<</if>><<showCharacter "kira" "right" "flustered">>
<<say $player.name "Just... give me a minute.">>
<<say "Kira" "Right. Yeah. I'll... wait.">>
She backs out, closes the door.
You hear her footsteps retreat quickly.
<<set $flags.kiraCaughtShower to true>>
The moment is gone. But the image of her face — the way she looked at you — stays with you.
<div class="choice-container">
<<vchoice "Finish up" "Bathroom_Hub" "move" "return">>
</div><<say $player.name "Yes. Join me.">>
<<showCharacter "kira" "center" "aroused" "naked">>
She hesitates only a moment. Then steps inside. Closes the door behind her. Locks it this time.
<<say "Kira" "Don't say anything.">>
<<storyVideo "story/bathroom_kira_joins_shower/kira_helps">>
Steam swirls as she pulls off her shirt. Then her pants. Naked.
She steps into the spray with you. The shower is barely big enough for two.
<<sexScene "kira" "spontaneous" "passionate" "bathroom">>
Her wet body presses against yours. Skin on skin. Hot water streaming over both of you.
<div class="choice-container">
<<vchoice "..." "Bathroom_Kira_Shower_Sex" "intimate" "lust">>
</div><<sexPhase "action">>
<<showCharacter "kira" "center" "passionate" "naked">>
<<advanceTime 0 30>>
Wet skin against wet skin. The shower is cramped. Intimate. Nowhere to go but against each other.
<<storyVideo "story/bathroom_kira_joins_shower/kira_shower_sex">>
<<if _storyClip is "35a804e212c9">>She turns to the wall, braces both hands on the wet tile and pushes back against you, grinding her ass on your cock while your mouth finds her neck. Taking over where you left off.<<elseif _storyFamily is "sf_cg_bathroom_kira_joins_shower_02">>She drops to her knees on the wet tile and takes your still-hard cock into her mouth, eyes up on yours. Taking over where you left off.<<else>>Her hand wraps around your still-hard cock. Taking over where you left off.<</if>>
<div class="narrative-video intimate">
<<if $preferences.showVideos>>
<<if !_storyClip>><<showEventMedia "intimate/kira_shower_handjob">><</if>>
<</if>>
</div>
<<if _storyFamily is "sf_cg_bathroom_kira_joins_shower_02">><<performSexAct "oral_receive">><<else>><<performSexAct "handjob_receive">><</if>>
<<say "Kira" "I've thought about this. Your body. What you look like when you come.">>
<<if _storyFamily is "sf_cg_bathroom_kira_joins_shower_02">>She pulls off long enough to lick the head, tongue out, grinning up at you. Then she takes you back in. She watches your face while your hands find her wet hair and push her deeper.<<elseif _storyClip is "35a804e212c9">>She reaches back between her legs and strokes you against her, slow and firm, watching you over her shoulder.<<else>>Her grip is firm, confident. She watches your face as she strokes.<</if>>
<<if _storyFamily is "sf_cg_bathroom_kira_joins_shower_02">>Water runs down her bare back, over the curve of her ass. You can't help but stare.<<elseif _storyClip is "35a804e212c9">>Water runs down her spine and over the curve of her ass, pressed right up against you. You can't help but stare.<<else>>Water cascades over her breasts. You can't help but stare.<</if>>
<<say $player.name "Kira—">>
<<say "Kira" "Shh. Let me.">>
<<if $companions[0] && $companions[0].tension >= 70>>
<div class="choice-container">
<<vchoice "Return the favor" "Bathroom_Sex_Mutual" "intimate" "grab">>
<<vchoice "More than hands" "Bathroom_Sex_Full" "intimate" "rapid-strikes">>
<<vchoice "Let her finish you" "Bathroom_Sex_Receive" "intimate" "check">>
</div>
<<else>>
<div class="choice-container">
<<vchoice "Return the favor" "Bathroom_Sex_Mutual" "intimate" "grab">>
<<vchoice "Let her finish you" "Bathroom_Sex_Receive" "intimate" "check">>
</div>
<</if>><<sexScene "kira" "mutual" "intimate" "shower">>
<<showCharacter "kira" "center" "aroused" "naked">>
<<advanceTime 0 30>>
Your hand finds her pussy. She gasps against your neck.
<<say "Kira" "Oh— fuck— yes—">>
<<storyVideo "characters/kira/bathroom_kira_shower_mutual">>
<<sexPhase "action">>
<<performSexAct "touch_intimate">>
You finger her while she strokes you. Water streaming over both of you. Mutual pleasure in the steamy privacy.
She's already wet from more than just the shower. Your fingers slide inside easily.
<<say "Kira" "Don't stop— please—">>
Your thumb finds her clit. Rubbing while fingering her. She moans, pressing into your hand.
<<performSexAct "fingering">>
<<if _storyClip is "17a164c5f35a">>She sinks onto her back on the wet tile and pulls you over her face. You feed her your cock and bend down between her thighs, fingers still buried in her while she sucks you. Both of you building together.<<else>>Her hand pumps you faster. Matching your rhythm. Both of you building together.<</if>>
<div class="narrative-video intimate">
<<if $preferences.showVideos>>
<<if !_storyClip>><<showEventMedia "intimate/shower_mutual_orgasm">><</if>>
<</if>>
</div>
<<say "Kira" "I'm close— oh god—">>
<<say $player.name "Me too—">>
<<sexPhase "climax">>
<<performSexAct "climax_together">>
<<if _storyClip is "17a164c5f35a">>You come together. Her pussy clenching around your fingers while you spill down her throat. The water washing the rest away.<<else>>You come together. Her pussy clenching around your fingers while you spill over her hand. The water washing it all away.<</if>>
Both of you lean against each other, panting. Steam swirling.
<<endSexScene>>
<<set $player.lust to 0>><<run setup.playerReleased()>>
<<if $companions[0]>>
<<clampStat "companions[0].tension" -30>>
<</if>>
<<relationChange "kira" "affection" 2>>
<<set $flags.showerSexKira to true>>
<<say "Kira" "That was... we should shower more often.">>
<div class="choice-container">
<<vchoice "Finish up together" "Bathroom_Hub" "move" "shower">>
</div><<showCharacter "kira" "center" "desperate" "naked">>
<<advanceTime 0 45>>
<<say $player.name "I want more than hands.">>
She bites her lip. Eyes dark with need.
<<say "Kira" "The shower is small.">>
<<say $player.name "We'll make it work.">>
<<storyVideo "story/bathroom_kira_joins_shower/sex_receive">>
<<if _storyFamily is "sf_cg_bathroom_kira_joins_shower_02">>She shoves you down onto the wet tile, steps over you and squats, feet planted either side of your hips, grinning down at you.<<elseif _storyClip is "1bca67b378e3">>She sits down on the tiled ledge, pulls you in by the hips and takes you in her mouth first, slow and deep, getting you slick. Then she stands, turns and braces her hands against the tile wall. Ass toward you. Looking back over her shoulder.<<else>>She turns, bracing her hands against the tile wall. Ass toward you. Looking back over her shoulder.<</if>>
<<say "Kira" "Then take it. Fuck me under the water.">>
<<sexPhase "action">>
<<if _storyFamily is "sf_cg_bathroom_kira_joins_shower_02">><<performSexAct "position_cowgirl">><<else>><<performSexAct "position_standing_doggy">><</if>>
You grip her hips. Position yourself. The water makes everything slick.
<<performSexAct "penetrate">>
<<if _storyFamily is "sf_cg_bathroom_kira_joins_shower_02">>She sinks down onto you an inch at a time, tight and slick with more than shower water, until she's sitting on your hips with every inch of you inside her.<<else>>You slide into her. She's tight, wet from more than the shower. You push in deep.<</if>>
<<say "Kira" "Oh FUCK— yes—">>
<div class="narrative-video intimate">
<<if $preferences.showVideos>>
<<if !_storyClip>><<showEventMedia "intimate/kira_shower_fuck">><</if>>
<</if>>
</div>
<<performSexAct "thrust_fast">>
<<if _storyFamily is "sf_cg_bathroom_kira_joins_shower_02">>The shower is cramped. She plants her feet on the tile and rides you hard, your hands on her waist.<<else>><<set _w26clip to _storyClip>><<set _w26fam to _storyFamily>><<storyVideo "story/bathroom_kira_joins_shower/sex_full_2_hair">><<set _w26a to _storyClip>><<set _storyClip to _w26clip>><<set _storyFamily to _w26fam>>
The shower is cramped. The footing treacherous. You have to brace against the wall while fucking her.<</if>>
Water streams over your joined bodies. Her moans echo off the tiles.
<<say "Kira" "Harder— the water— it feels so good—">>
<<if _storyFamily is "sf_cg_bathroom_kira_joins_shower_02">>She arches back, head thrown up to the ceiling, and moans louder.<<else>>You grip her wet hair. Pull her head back. She moans louder.<</if>>
The shower curtain tears slightly from the intensity. Neither of you cares.
<<sexPhase "climax">>
<<say "Kira" "I'm gonna— come inside me— please—">>
<<performSexAct "climax_together">>
<<if _storyFamily is "sf_cg_bathroom_kira_joins_shower_02">>She grinds down on you and you EXPLODE. Filling her under the hot spray. She comes with you, pussy clenching, legs shaking.<<else>>You bury yourself deep and EXPLODE. Filling her under the hot spray. She comes with you, pussy clenching, legs shaking.<</if>>
<<endSexScene>>
<<if _storyFamily is "sf_cg_bathroom_kira_joins_shower_02">>She almost slips off you on the wet tile, catching herself on your chest. Both laughing breathlessly.<<else>>You almost slip, catching yourselves on the wall. Both laughing breathlessly.<</if>>
<<set $player.lust to 0>><<run setup.playerReleased()>>
<<if $companions[0]>>
<<set $companions[0].tension to Math.max(20, $companions[0].tension - 40)>>
<</if>>
<<relationChange "kira" "affection" 3>>
<<relationChange "kira" "trust" 1>>
<<set $flags.showerSexKira to true>>
<<set $flags.sleptWithKira to true>>
You hold each other as the water cools.
<<say "Kira" "Fuck. That was...">>
<<if _storyFamily is "sf_cg_bathroom_kira_joins_shower_02">>She doesn't finish. She folds down onto your chest instead, wet hair dripping on your face, and laughs into your neck.<<else>>She doesn't finish. Just leans back into you. Satisfied.<</if>>
<div class="choice-container">
<<vchoice "Dry off together" "Bathroom_Hub" "move" "shower">>
</div><<sexScene "kira" "service" "intimate" "shower">>
<<showCharacter "kira" "center" "focused" "naked">>
<<advanceTime 0 30>>
<<say $player.name "Keep going. Finish me.">>
<<storyVideo "characters/kira/bathroom_kira_shower_handjob_finish">>
<<if _storyClip is "6b4f38fcd215">>She soaps both hands and stacks them round your cock, twisting them in opposite directions, lather squeezing out between her fingers and slopping onto her tits.<<else>>Her hand works you expertly. The water making it slick. Perfect.<</if>>
<<sexPhase "action">>
<<performSexAct "handjob_receive">>
She knows exactly what she's doing. Grip firm. Pace perfect. Watching your face for reactions.
<<say "Kira" "Come for me. Let me see you come.">>
It doesn't take long. You're already worked up. Her hand, the water, the intimacy.
<<sexPhase "climax">>
<<performSexAct "climax_player">>
You finish with a groan. Coming over her hand, the water washing it away immediately.
She keeps stroking through it. Drawing out every pulse.
<<endSexScene>>
<<set $player.lust to 0>><<run setup.playerReleased()>>
<<if $companions[0]>>
<<clampStat "companions[0].tension" -20>>
<</if>>
<<relationChange "kira" "affection" 1>>
<<set $flags.handjobFromKira to true>>
<<say "Kira" "You owed me one.">>
She smirks and slips out of the shower, leaving you to finish washing. Ass swaying as she grabs a towel.
<div class="choice-container">
<<vchoice "Finish showering" "Bathroom_Hub" "move" "shower">>
</div><<set $currentLocation to "nomad_route">>
<<run VaultUI.setBackgroundDirect("media/backgrounds/vault/exterior/nomad_route.webp")>>
<<if setup.kiraWithYou()>>
<<showCharacter $expeditionCompanion "left" "neutral">>
<</if>>
<<if setup.caravanDue()>>
<<set _cvDue to setup.caravanDue()>>
<h2>The Nomad Caravan Route</h2>
<<storyVideo "story/nomad_route/arrival">>
<<if setup.caravanDueLater()>>
<p>Her wagons stand on the packed earth beside the leaning mile marker again, on another run west, the mules already out of the traces. The caravan master sees you coming up the highway and has her ledger open before you reach her.</p>
<<else>>
<p>The wagons roll off the highway onto a stretch of packed earth beside a leaning mile marker, where a hundred caravans have camped before this one and left their ash in the same ring of stones. The drivers have the mules out of the traces before the wheels stop turning. The crates come down off the tailboard one at a time, and the caravan master counts them out loud, slapping each lid as it lands.</p>
<</if>>
<<if _cvDue.crates >= setup.ECONOMY.caravan.crates>>
<<say "Caravan master" "All of them, hired. Every fucking crate, and the mules still have all their legs. I've had worse hands than you. Not many better.">>
<<else>>
<<say "Caravan master" `_cvDue.crates + " of " + setup.ECONOMY.caravan.crates + ". I can count the gap, hired, and so can my strongbox."`>>
<</if>>
<<if setup.kiraWithYou()>>
<<say "Kira" "Pay day. Try to look like you earned it.">>
<</if>>
<div class="choice-container">
<<vchoice "Collect your pay" "Caravan_Paid" "action" "scrap">>
</div>
<<else>>
<h2>The Nomad Caravan Route</h2>
<p>The old highway runs west out of the ruins, four lanes wide, split down the middle by a strip of dead grass. Weeds have broken the asphalt into plates, and the plates are scored with ruts, deep and fresh: iron-rimmed wheels, hooves, the drag marks of something too heavy to carry. Whoever uses this road doesn't stop on it long.</p>
<p>A concrete mile marker leans at the verge, every face of it chalked: arrows, tallies, a wagon drawn in four strokes, a skull with a line through it. Beside it a ring of blackened stones holds old ash and the smell of burnt fat. The wind comes down the highway with nothing to stop it and pulls at your clothes.</p>
<<if setup.caravanState().paid > 0>>
<p>Your own mark is on the stone now, in the caravan master's heavy hand: a crate, and a tally beside it.</p>
<</if>>
<<if setup.kiraWithYou()>>
<<say "Kira" "Nobody stays out here. They pass through and keep their mouths shut. My kind of people.">>
<</if>>
<div class="choice-container">
<<vchoice "Return to map" "WorldMap_View" "move" "map">>
<<vchoice "Return to vault" "Journey_ReturnToVault" "action" "return">>
</div>
<</if>><<set $currentLocation to "market">>
<<run VaultUI.setBackgroundDirect("media/backgrounds/vault/exterior/market_day.webp")>>
<<set _cvLeft to setup.caravanPayOnce(null, setup.ECONOMY.caravan.firstTo)>>
<<if _cvLeft && _cvLeft.kiraTrust>><<relationChange "kira" "trust" 1>><</if>>
<<if setup.kiraWithYou()>>
<<showCharacter $expeditionCompanion "left" "neutral">>
<</if>>
<<set _cvOffer to setup.caravanOffer()>>
<<set _cvGreet to setup.caravanGreeting()>>
<<set _cvKira to setup.caravanKiraChoice()>>
<<set _cvC to setup.ECONOMY.caravan>>
<<set _cvLock to setup.travelLock("nomad_route")>>
<h2>The Wagons</h2>
<<if _cvGreet is "first">>
<p>She's halfway under the third wagon when you walk up, swearing at an axle in a voice that carries to the far end of the post. She hauls herself out, wipes her hands down her thighs, and looks you over the way she'd look over a mule at a sale: legs, shoulders, whether you'll pull or kick.</p>
<<say "Caravan master" "You're the one who turned this market over before anybody could squat in it. Means you can walk, you can fight, and you're too thick to be scared of the road. Good. I run wagons west to the Nomad Route. The raiders like my wagons more than I do. I pay hired blades to change their minds.">>
<<elseif _cvGreet is "found">>
<<say "Caravan master" "There you are, hired. You turned the place over like I told you, and the traders came crawling in behind you, same as I said they would. Your mark's still on my board. Now we can talk about real work.">>
<<elseif _cvGreet is "walked">>
<p>She sees you coming from the far end of the line and doesn't stop what she's doing. On the side of the lead wagon hangs a board chalked with names and tallies, and she taps one line with the butt of her whip without looking at it. Yours, under a heading that says WALKED OFF.</p>
<<say "Caravan master" "Look who crawled back. You took my job and left my wagons on the road with their arses hanging out. That's on the board, hired. Chalk doesn't wash off in the rain. I've tried.">>
<<elseif _cvGreet is "carried">>
<p>On the side of the lead wagon hangs her board, chalked with names and tallies. Your line is under WALKED OFF with the others, but she has drawn something new beside it: a stick figure with another one slung over its shoulder.</p>
<<say "Caravan master" "Heard you carried your fighter home over your shoulder and left my wagons standing on the highway. Can't fault the carrying, hired. It still goes on the board. Chalk doesn't care why.">>
<<elseif _cvGreet is "short">>
<<say "Caravan master" "Last run you let the bastards have a crate. I paid you for what got there. Don't make me pay you for less.">>
<<elseif _cvGreet is "full">>
<<say "Caravan master" "Every crate, last time. My drivers drank to you, and they don't drink to anybody, me included. Don't let it go to your head.">>
<<else>>
<<say "Caravan master" "Hired. You walking or talking?">>
<</if>>
<<if _cvLeft>>
<p>Before anything else she unlocks the strongbox and counts out what she still owes you for the Old Town run: <<print _cvLeft.pay>> scrap.</p>
<</if>>
<<if _cvOffer.ok>>
<<set _cvCargo to setup.CARAVAN_CARGO[setup.caravanState().taken % setup.CARAVAN_CARGO.length]>>
<p>Three wagons stand in the line with their shafts down, canvas tops patched and patched again, the mules dozing in the traces. In the bed of the last one, lashed under a tarp, sit the crates: <<print _cvC.crates>> of them, stencilled with the marks of a place that doesn't exist any more.</p>
<<say "Caravan master" `_cvC.crates + " crates of " + _cvCargo + " to the Nomad Route. " + _cvC.base + " scrap when they get there, all of them. Every crate the raiders take, its share comes off your pay. Every pack of the fuckers you put in the dirt, " + _cvC.perFightWon + " more. Walk off the job and all you get is your name on my board."`>>
<<if setup.kiraWithYou()>>
<<if _cvKira is "comes">>
<<say "Kira" "Scrap for walking next to some mules? I'm in. Somebody has to watch your back while you watch her crates.">>
<<elseif _cvKira is "hurt">>
<<say "Kira" "Not hurt like this. I'd slow the wagons down and get you killed. Go. I'll be at the vault, bleeding on something.">>
<p class="narrator">Kira won't come this time. She heads home if you take the job.</p>
<<elseif _cvKira is "trust">>
<<say "Kira" "Her crates, her problem. I'm not bleeding for some stranger's cargo. Go if you want, idiot. I'll see you at the vault.">>
<p class="narrator">Kira won't come this time. She heads home if you take the job.</p>
<</if>>
<</if>>
<div class="choice-container">
<<if _cvLock>>
<<vchoiceDisabled `"Take the job (" + _cvLock + ")"` "action" "forward">>
<<else>>
<<link `'<span class="choice-button action"><span class="gi gi-forward gi-large"></span><span class="label">Take the job</span></span>'`>><<if setup.caravanTake()>><<startJourney "nomad_route">><<run setup.caravanSetOut()>><<goto "Journey_Start">><<else>><<goto "Caravan_Offer">><</if>><</link>>
<</if>>
<<vchoice "Not today" "Location_Market" "move" "back">>
</div>
<<else>>
<<if _cvOffer.why is "cooldown" && _cvOffer.daysLeft > 1>>
<<say "Caravan master" `"Next wagons go west in " + _cvOffer.daysLeft + " days. Be here or don't. I'll find somebody."`>>
<<elseif _cvOffer.why is "cooldown">>
<<say "Caravan master" "Next wagons go west tomorrow. Be here or don't. I'll find somebody.">>
<<elseif _cvOffer.why is "open" && setup.caravanDue()>>
<<say "Caravan master" "You walked off before I paid you, hired. Your scrap's sitting in my strongbox out at the Nomad Route. Go and fetch it, then we'll talk about more work.">>
<<else>>
<<say "Caravan master" "No work for you today, hired. Go on, you're standing in my mules' light.">>
<</if>>
<div class="choice-container">
<<vchoice "Back to the post" "Location_Market" "move" "back">>
</div>
<</if>><<set $currentLocation to "nomad_route">>
<<run VaultUI.setBackgroundDirect("media/backgrounds/vault/exterior/nomad_route.webp")>>
<<set _cvPay to setup.caravanPayOnce()>>
<<set _cvR to _cvPay || setup.caravanState().last>>
<<if _cvPay && _cvPay.kiraTrust>><<relationChange "kira" "trust" 1>><</if>>
<<set _cvNext to setup.caravanOffer().daysLeft>>
<<set _cvFreight to setup.caravanFreight(_cvR)>>
<<if setup.kiraWithYou() && !_cvFreight>>
<<showCharacter $expeditionCompanion "left" "neutral">>
<</if>>
<h2>Paid</h2>
<<if _cvR && _cvR.outcome is "paid">>
<<storyVideo "story/caravan/paid">>
<<if _storyClip is "74f57dd033c4">><p>She pays you beside the lead wagon, out of a flat box set down open on the gravel, picking the scrap out a piece at a time, holding each one up and turning it so you can both see it before it goes into your hands: <<print _cvR.pay>> scrap<<if _cvR.won > 0>>, the fight money in with it<</if>>. When the count is done she snaps the box shut and tucks it back under her arm.</p><<else>><p>She pays you off the tailboard of the lead wagon, out of a strongbox with three locks on it, counting the scrap into your hands a piece at a time so you can both watch it land: <<print _cvR.pay>> scrap<<if _cvR.won > 0>>, the fight money in with it<</if>>. When the count is done she shuts the box and sits on it.</p><</if>>
<<if _cvR.crates >= setup.ECONOMY.caravan.crates>>
<<say "Caravan master" "Full pay. And I'll say this once: you're the first hired I haven't wanted to leave in a ditch. I'm chalking your mark on the stone. Don't let it go to your head.">>
<<else>>
<<say "Caravan master" "Every crate the bastards got, its share stays in my box. I told you the terms, hired. I don't do charity and I don't do sorry.">>
<</if>>
<<farCarryFareLine _cvR.fare>>
<<if _cvR.quiet>>
<<say "Caravan master" "Base pay and no fight money: nobody came for my crates, so nobody went in the ditch. Don't sulk about it, hired. That's the best kind of day out there.">>
<</if>>
<<if _cvFreight>>
<<say "Caravan master" `"The empties go back to Trader's Rest at dusk. She can lie in the lead wagon till then. After that she's your problem and not my freight. Next wagons go west " + (_cvNext > 1 ? "in " + _cvNext + " days" : "as soon as they're loaded") + ". Be there or don't."`>>
<<else>>
<<if _cvNext > 1>>
<<say "Caravan master" `"I'll have the empties back at Trader's Rest by dark. Next wagons go west in " + _cvNext + " days. Be there or don't."`>>
<<else>>
<<say "Caravan master" "I'll have the empties back at Trader's Rest by dark. Next wagons go west as soon as they're loaded. Be there or don't.">>
<</if>>
<</if>>
<<if setup.kiraWithYou() && !_cvFreight>>
<<if _cvR.kiraTrust>>
<<say "Kira" "Every crate. Not bad, vault boy. Not bad at all.">>
<<else>>
<<say "Kira" "Scrap's scrap. Let's go before she finds us another job.">>
<</if>>
<</if>>
<<else>>
<p>The wagons are unloaded and the caravan master is busy shouting at a driver about a mule. There's nothing more to collect here.</p>
<</if>>
<div class="choice-container">
<<if _cvFreight>>
<<vchoice "Go to the lead wagon" "Far_Carry_Wagon_Bed" "move" "forward">>
<<else>>
<<vchoice "Look around the route" "Location_NomadRoute" "move" "search">>
<<vchoice "Return to map" "WorldMap_View" "move" "map">>
<<vchoice "Return to vault" "Journey_ReturnToVault" "action" "return">>
<</if>>
</div><<set $currentLocation to "the_crossway">>
<<run VaultUI.setBackgroundDirect("media/backgrounds/vault/exterior/the_crossway.webp")>>
<<if setup.kiraWithYou()>>
<<showCharacter $expeditionCompanion "left" "neutral">>
<</if>>
<<set _cvDue to setup.caravanFirstRunDue()>>
<<set _cvC to setup.ECONOMY.caravan>>
<h2>The Wagons</h2>
<<if _cvDue>>
<<set _cvGreet to setup.caravanGreeting()>>
<<set _cvKira to setup.caravanKiraChoice()>>
<<set _cvLock to setup.travelLock(_cvC.firstTo)>>
<<set _cvCargo to setup.CARAVAN_CARGO[setup.caravanState().taken % setup.CARAVAN_CARGO.length]>>
<<if _cvGreet is "first">>
<p>Two drivers sit on the tailboards with rifles across their knees, watching every road at once. The swearing under the middle wagon stops when they whistle, and a woman with long copper-red hair under a tan cowboy hat hauls herself out, wipes her hands down her thighs and looks you over the way she'd look over a mule at a sale: legs, shoulders, whether you'll pull or kick.</p>
<<say "Caravan master" "You've got a weapon and you're still walking around with it. That's more than my last hired blades can say. Raiders hit us on the east road. The gutless shits I paid to stop them took their scrap up front and ran the minute the arrows started, and now I've got three wagons, two drivers, a cracked axle and nobody to watch my crates.">>
<<say "Caravan master" "Old Town's up that road. Somebody's barricaded the square, and whoever they are, they let wagons along the outer street to the west road if you pay their toll. I'll pay the toll. I need you to get my wagons as far as their barricade with the crates still on them.">>
<<elseif _cvGreet is "walked">>
<p>On the side of the lead wagon hangs a board chalked with names and tallies, and she taps one line with the butt of her whip without looking at it. Yours, under a heading that says WALKED OFF.</p>
<<say "Caravan master" "Look who crawled back. You took my job and left my wagons standing on the road with their arses hanging out. That's on the board, hired. And I'm still stuck at this fucking junction, so I'm still hiring. Don't make me chalk you up twice.">>
<<elseif _cvGreet is "carried">>
<p>On the side of the lead wagon hangs her board, chalked with names and tallies. Your line is under WALKED OFF, with something new drawn beside it: a stick figure with another one slung over its shoulder.</p>
<<say "Caravan master" "Heard you carried your fighter off the road and left my wagons standing. Can't fault the carrying, hired. It still goes on the board. And I'm still stuck here, so I'm still hiring.">>
<<else>>
<<say "Caravan master" "Still here, hired, and so are my wagons. You walking or talking?">>
<</if>>
<<say "Caravan master" `_cvC.crates + " crates of " + _cvCargo + " to the barricade in Old Town. " + _cvC.base + " scrap when they get there, all of them. Every crate the bastards take, its share comes off your pay. Every pack of them you put in the dirt, " + _cvC.perFightWon + " more. Walk off the job and all you get is your name on my board."`>>
<<if setup.kiraWithYou()>>
<<if _cvKira is "comes">>
<<say "Kira" "Mules, crates and a woman who swears more than I do. Fine, I'm in. Somebody has to stop you getting shot over somebody else's cargo.">>
<<elseif _cvKira is "hurt">>
<<say "Kira" "Not like this. I'd slow her wagons down and get us both killed. Go. I'll be at the vault.">>
<p class="narrator">Kira won't come this time. She heads home if you take the job.</p>
<<elseif _cvKira is "trust">>
<<say "Kira" "A stranger's wagons, a stranger's crates. I'm not bleeding for either. Go if you want, idiot. I'll see you at the vault.">>
<p class="narrator">Kira won't come this time. She heads home if you take the job.</p>
<</if>>
<</if>>
<div class="choice-container">
<<if _cvLock>>
<<vchoiceDisabled `"Take the job (" + _cvLock + ")"` "action" "forward">>
<<else>>
<<link `'<span class="choice-button action"><span class="gi gi-forward gi-large"></span><span class="label">Take the job</span></span>'`>><<if setup.caravanTake(null, "crossroads_central")>><<startJourney "crossroads_central">><<run setup.caravanSetOut(null, "crossroads_central")>><<goto "Journey_Start">><<else>><<goto "Caravan_Crossway">><</if>><</link>>
<</if>>
<<vchoice "Not now" "Location_Crossway" "move" "back">>
</div>
<<else>>
<p>The verge where her wagons stood is empty, only wheel ruts and mule dung left in the dirt.</p>
<div class="choice-container">
<<vchoice "Back to the junction" "Location_Crossway" "move" "back">>
</div>
<</if>><<set _cvDue to setup.caravanDue(null, "crossroads_central")>>
<<set _cvNew to (_cvDue && _cvDue.newPlaces) || []>>
<<run setup.oldTownReveal()>>
<<if _cvNew.length>>
<<notify "discovery">>New locations discovered: <<= _cvNew.join(", ")>><</notify>>
<</if>>
<<if setup.kiraWithYou()>>
<<showCharacter $expeditionCompanion "left" "neutral">>
<</if>>
<h2>The Barricade</h2>
<p>The road into Old Town runs past an old market at the edge of the ruins, gutted down to its frames: rusted shutters, shop fronts with no glass left in them, rubble heaped in the aisles. Over the gate somebody has nailed up a sheet of tin and painted it, so fresh the white letters have run: TRADER'S REST. There's nobody under it. Nothing moves in there but a dog, and it bolts from the wheels. Then the street narrows between burnt-out shops, and the lead driver hauls on the reins.</p>
<p>The square ahead is closed. Burnt-out cars stand nose to tail across the street, packed with sandbags and scrap, rifle barrels laid along their roofs. Nobody shows a face.</p>
<<say "Voice from the barricade" "That's far enough. Wagons go round by the outer street. Toll first.">>
<p>The caravan master climbs down with her strongbox and walks out alone into the middle of the street. A bucket comes down on a rope from behind the cars. She counts scrap into it out loud, piece by piece, and the bucket goes back up. Somebody behind the sandbags counts it again, slower.</p>
<<say "Voice from the barricade" "Outer street. Keep rolling. Anybody steps off it, we shoot them.">>
<p>Two of the cars roll back on ropes, just far enough, and the mouth of a narrow street opens along the edge of the square.</p>
<<say "Caravan master" "Every time. Every fucking time I pay them and they count it twice. That's as far as you go, hired. Come and get your scrap before the mules decide they've had enough.">>
<<if setup.kiraWithYou()>>
<<say "Kira" "Rifles on the cars and not one face. I hate people who can shoot you without showing themselves.">>
<</if>>
<div class="choice-container">
<<vchoice "Collect your pay" "Caravan_OldTown_Paid" "action" "scrap">>
</div><<set $currentLocation to "crossroads_central">>
<<run VaultUI.setBackgroundDirect("media/backgrounds/vault/reclaimed-crossroads/crossroads_central.webp")>>
<<set _cvPay to setup.caravanPayOnce(null, "crossroads_central")>>
<<set _cvR to _cvPay || setup.caravanState().last>>
<<if _cvPay && _cvPay.kiraTrust>><<relationChange "kira" "trust" 1>><</if>>
<<set _cvFreight to setup.caravanFreight(_cvR)>>
<<if setup.kiraWithYou() && !_cvFreight>>
<<showCharacter $expeditionCompanion "left" "neutral">>
<</if>>
<h2>Paid</h2>
<<if _cvR && _cvR.outcome is "paid">>
<p>She pays you off the tailboard of the lead wagon, out of a strongbox with three locks on it, counting the scrap into your hands a piece at a time so you can both watch it land: <<print _cvR.pay>> scrap<<if _cvR.won > 0>>, the fight money in with it<</if>>.</p>
<<if _cvR.crates >= setup.ECONOMY.caravan.crates>>
<<say "Caravan master" "Every crate, and the faceless bastards behind those cars never got their hands on one. You'll do, hired.">>
<<else>>
<<say "Caravan master" `_cvR.crates + " of " + setup.ECONOMY.caravan.crates + " got here, so that's what you're paid for. Those were the terms, hired. I don't do charity."`>>
<</if>>
<<farCarryFareLine _cvR.fare>>
<<if _cvR.quiet>>
<<say "Caravan master" "No fight money: nobody came for my crates, so nobody went in the ditch. Don't sulk, hired. That's the best kind of day out there.">>
<</if>>
<p>She unhooks the chalk board from the side of the lead wagon, finds a clean corner and draws a crate with a tally beside it. Your mark.</p>
<<say "Caravan master" "That market we came past, with the paint still running on the sign. Trader's Rest, somebody wants it called, and there's not one fucking trader in it. Nobody sets up shop where nobody's turned the place over first. Could be anything living in that rubble. Turn it over, hired. Pick it clean, and the traders will come in behind you, and so will I. You'll find my wagons there. I've always got crates, and I'm always short of hired who don't run.">>
<<if _cvFreight>>
<<say "Caravan master" "And get her down off my crates. She's paid as far as here.">>
<p>You lift Kira down over the tailboard. Her head rolls against your shoulder, and her boots drag two lines in the dust before you get her up.</p>
<<elseif setup.kiraWithYou()>>
<<if _cvR.kiraTrust>>
<<say "Kira" "Every crate, and nobody we paid shot at us. Not bad, vault boy.">>
<<else>>
<<say "Kira" "Scrap's scrap. Now let's get out from under those rifles.">>
<</if>>
<</if>>
<p>The drivers crack their whips. The wagons creak into the outer street one by one, along the edge of the square and out of sight toward the west road. Behind you the cars roll shut again on their ropes. Nobody behind the sandbags says a word to you.</p>
<<else>>
<p>The wagons are gone down the outer street, and the cars have rolled shut behind them. There's nothing more to collect here.</p>
<</if>>
<div class="choice-container">
<<if _cvFreight>>
<<vchoice "Carry her home" "Kira_Unconscious_Carry_Home" "action" "walk">>
<<else>>
<<vchoice "Return to map" "WorldMap_View" "move" "map">>
<<vchoice "Return to vault" "Journey_ReturnToVault" "action" "return">>
<</if>>
</div><<widget "hollowMapFind">>
<<run setup.hollowDiscover()>>
<div class="hollow-map-find">
<p>Under the driver's seat, wedged into the springs, there is a square of oilcloth folded small and tied with wire. You pick the wire loose.</p>
<p>A map, drawn in charcoal by someone who pressed hard. The road is a double line. The Wreckage is a cluster of boxes. The Nest is a square with a row of strokes beside it: five of them, four crossed out. Little "T" marks run along the road. Off the track, in the empty ground between the Nest and the Wreckage, there is a circle, gone over again and again until the cloth almost tore. Beside it, one word in the same hard hand: HOLLOW.</p>
<div class="narrative-image"><img src="assets/images/narrative/hollow-map.webp" alt="A charcoal map: the Nest, the Wreckage, toll marks and one heavy circle"></div>
<<if setup.kiraWithYou()>>
<<say "Kira" "That's the Nest. And that's us, right about... here.">>
<<say "Kira" "Four crossed out. Somebody keeps count of the dead crews. Somebody keeps sending new ones.">>
<<say "Kira" "And the T's are the toll spots. All of it runs back to that circle. It's not a camp. It's a fucking barracks.">>
<<else>>
<p>Four crews crossed out, and someone still keeping count. The toll marks, the Nest, the road: all of it is drawn leading back to that circle.</p>
<</if>>
<p>You fold it into your pocket.</p>
<p class="discovery-note"><<icon "map">> New place on your map: The Hollow.</p>
</div>
<</widget>>
<<widget "hollowWave">>
<<set _hwMale to ["raider_grunt", "raider_scout", "raider_brute", "raider_machete", "raider_blade"]>>
<<set _hwFemale to ["raider_huntress", "raider_vixen", "raider_whip", "raider_amazon", "raider_temptress"]>>
<<set _hwTierList to setup.hollowWaveTiers(_args[0], !!setup.roadCombatCompanion())>>
<<set _hollowEnemies to []>>
<<for _hwK to 0; _hwK lt _hwTierList.length; _hwK++>>
<<set _hwType to (random(1, 100) <= 70 ? _hwFemale.random() : _hwMale.random())>>
<<createEnemy _hwType _hwTierList[_hwK]>>
<<run _hollowEnemies.push(clone(_returnEnemy))>>
<</for>>
<</widget>>
<<widget "hollowFightRules">>
<<set $combat.returnPassage to "Hollow_Aftermath">>
<<set $combat.victoryPassage to _args[0]>>
<<set $combat.noKiraWatch to true>>
<<if $combat.companionInCombat === "kira">><<set $combat.kiraTargetBonus to setup.HOLLOW_KIRA_TARGET_BONUS>><</if>>
<</widget>><<run VaultUI.setBackgroundDirect("media/backgrounds/wasteland/convoy/convoy_day.webp")>>
<<advanceTime 0 20>>
You go back to the lead truck. Last time you went through the back and the boxes. You never looked under the cab's seats.
<<if setup.hollowMapFindable()>>
<<hollowMapFind>>
<<else>>
Nothing but rust and old wrappers.
<</if>>
<div class="choice-container">
<<vchoice "Continue exploring" "WorldMap_View" "move" "map">>
<<vchoice "Return to vault" "Journey_ReturnToVault" "move" "house">>
</div><<set $currentLocation to "hollow">>
<<setBackground "location:hollow">>
<<setTimeOfDay $time.phase>>
<<run setup.hollowNodeCompat(State.variables)>>
<<if setup.kiraWithYou()>>
<<showCharacter $expeditionCompanion "left" "alert">>
<</if>>
<<set _hwNewCrew to setup.hollowRepopulate()>>
<<if $locations.hollow.firstDay === undefined>><<set $locations.hollow.firstDay to $time.day>><</if>>
<<set _hwFirst to ($locations.hollow.firstDay === $time.day && !$locations.hollow.raids)>>
<h2>The Hollow</h2>
<<if !$locations.hollow.cleared>>
<<if _hwFirst>>
You follow the dirt track off the road until the hedge comes up on your left. It is too thick and too straight: somebody planted it, a long time ago, and then let it go wild. It runs in a ring. Nothing in it but leaves and thorns as far as you can see.
Then a gap, closed with the tailgate of a truck hung on chains. Somebody scratched the word into the paint, the same hard letters as on the map: HOLLOW. Under it, the toll mark. Pikes are wired into the hedge on both sides.
Behind it: smoke, tarps, a watch platform built up into the trees. And voices. Not three or four, like at the Nest. A dozen, maybe more.
<<if setup.kiraWithYou()>>
<<say "Kira" "Hollow. Cute. They named their hole.">>
<<say "Kira" "Count the voices. That's more than the Nest ever had. And they'll go for me first. They always do, with a woman who fights back.">>
<</if>>
<<else>>
<<if _hwNewCrew>>
The bodies are gone from the clearing. Fresh tarps, a new fire, a new face up on the platform. The hedge has its crew back already.
<<if setup.kiraWithYou()>>
<<say "Kira" "Of course they're back. This is where they come from.">>
<</if>>
<<else>>
The tailgate hangs on its chains across the gap. Smoke behind the hedge, voices, someone laughing up on the platform.
<</if>>
<<if setup.kiraWithYou()>>
<<say "Kira" "Same deal as last time. They go for me, you put them down fast.">>
<</if>>
<</if>>
<<if $locations.hollow.sneakUsed>>
Round the back, where the tree came down, the gap in the hedge is staked shut now. Fresh pikes, still white where they were cut. They know somebody got in.
<</if>>
<div class="choice-container">
<<vchoice "Hit the gate" "Hollow_Attack" "action" "attack">>
<<if !$locations.hollow.sneakUsed>>
<<vchoice "Circle the hedge and look for a way in" "Hollow_Sneak" "action" "gagged">>
<</if>>
<<vchoice "Back off down the track" "WorldMap_View" "move" "walk">>
</div>
<<else>>
The tailgate lies in the dirt where you left it. The fire pit is cold and the platform is empty. For now the Hollow is yours.
<div class="choice-container">
<<if !$locations.hollow.searched>>
<<vchoice "Search the tents again" "Hollow_Search" "action" "search">>
<</if>>
<<vchoice "Return to map" "WorldMap_View" "move" "map">>
</div>
<</if>><<set _travelMinutes to random(20, 30)>>
<<advanceTime 0 _travelMinutes>>
You go at the gate. The chains take two hard kicks before the tailgate swings in.
<<if setup.kiraWithYou()>>
<<say "Kira" "Stay close. Don't let them pull me away from you.">>
<</if>>
A shout from the platform. Raiders come out from under the tarps, grabbing weapons.
<div class="choice-container">
<<vchoice "Fight!" "Hollow_Wave1" "action" "attack">>
</div><<set $locations.hollow.raids to ($locations.hollow.raids || 0) + 1>>
<<hollowWave 1>>
<<startCombat _hollowEnemies `setup.roadCombatCompanion()` true>>
<<hollowFightRules "Hollow_Between">>
<<goto "Combat_Start">><<if $combat.seductionWin>>
<<include "Hollow_Aftermath">>
<<else>>
<<run VaultUI.setBackgroundDirect("media/backgrounds/wasteland/camp/camp_night.webp")>>
<h2>The Horn</h2>
The last of them goes down by the fire pit. For a breath it is quiet.
Then a horn up on the platform, long and ugly, and the tarps at the back of the clearing start to move. More of them. They took their time getting their boots on.
<<if setup.kiraWithYou()>>
<<if $companions[0].health lt 40>>
<<run VaultUI.showCharacter("kira", "center", "worried")>>
<<say "Kira" "I'm fine. Shut up. I'm fine.">>
She isn't. She's holding her side, and the next ones are already looking at her.
<<else>>
<<run VaultUI.showCharacter("kira", "center", "alert")>>
<<say "Kira" "Second wave. Your call. Hold the gap, or grab what we can and go.">>
<</if>>
<</if>>
<div class="choice-container">
<<vchoice "Hold the gap" "Hollow_Wave2" "action" "attack">>
<<vchoice "Pull back with what you can grab" "Hollow_PullBack" "move" "run">>
</div>
<</if>><<hollowWave 2>>
<<startCombat _hollowEnemies `setup.roadCombatCompanion()` true>>
<<hollowFightRules "Hollow_Victory">>
<<goto "Combat_Start">><<run VaultUI.setBackground("reclaimed-day")>>
<<set _travelMinutes to random(20, 30)>>
<<advanceTime 0 _travelMinutes>>
<h2>Pulled Back</h2>
You grab what lies closest to the gap, a pack off one of the bodies and a crate by the fire, and you go out through the tailgate before the second wave reaches it. The horn goes on behind you for a long time. The Hollow is still theirs.
<<set _hwStored to []>>
<<if $locations.hollow.lootedRaid !== $locations.hollow.raids>>
<<set $locations.hollow.lootedRaid to $locations.hollow.raids>>
<<set _got to setup.giveItem("ammo", 3)>><<if _got.stored > 0>><<run _hwStored.push("Ammunition x" + _got.stored)>><</if>>
<<set _got to setup.giveItem("canned food", 2)>><<if _got.stored > 0>><<run _hwStored.push("Canned Food x" + _got.stored)>><</if>>
<<set _got to setup.giveItem("bandage", 1)>><<if _got.stored > 0>><<run _hwStored.push("Bandage x" + _got.stored)>><</if>>
<</if>>
<div class="loot-display">
<h4>Grabbed:</h4>
<ul>
<li>Ammunition x3</li>
<li>Canned Food x2</li>
<li>Bandage x1</li>
</ul>
<<if _hwStored.length > 0>><p class="loot-stored">Your backpack is full. Sent to the vault storage: <<print _hwStored.join(", ")>>.</p><</if>>
</div>
<<if setup.kiraWithYou()>>
<<run VaultUI.showCharacter("kira", "center", "neutral")>>
<<say "Kira" "We'll be back. They know it too.">>
<</if>>
<div class="choice-container">
<<vchoice "Continue exploring" "WorldMap_View" "move" "map">>
<<vchoice "Return to vault" "Journey_ReturnToVault" "move" "house">>
</div><<include "Hollow_Aftermath">><<run VaultUI.setBackground("reclaimed-day")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<<if $combat.result === "defeat">>
<h2>Driven Off</h2>
<<if setup.kiraWithYou()>>Kira half-carries you out through the gap and down the track, and doesn't stop until the horn behind you stops.<<else>>You drag yourself out through the gap and down the track, and don't stop until the horn behind you stops.<</if>> Nobody follows. They don't need to. The Hollow is still theirs.
<<if setup.kiraWithYou()>>
<<run VaultUI.showCharacter("kira", "center", "worried")>>
<<say "Kira" "They let us go. They want us to come back. Next time we come back ready.">>
<</if>>
<div class="choice-container">
<<vchoice "Continue exploring" "WorldMap_View" "move" "map">>
<<vchoice "Return to vault" "Journey_ReturnToVault" "move" "house">>
</div>
<<elseif $combat.result === "fled" || $combat.result === "fled_with_kira">>
<h2>Escaped</h2>
You break out through the gap and run. The hedge swallows the shouting behind you. The Hollow is still theirs.
<<if setup.kiraWithYou()>>
<<run VaultUI.showCharacter("kira", "center", "neutral")>>
<<say "Kira" "Too many of them. Next time we thin them out first.">>
<</if>>
<div class="choice-container">
<<vchoice "Continue exploring" "WorldMap_View" "move" "map">>
<<vchoice "Return to vault" "Journey_ReturnToVault" "move" "house">>
</div>
<<elseif ($combat.result === "victory" && !$combat.seductionWin) || $locations.hollow.cleared>>
<<set _hwNew to setup.hollowClear()>>
<<run VaultUI.setBackgroundDirect("media/backgrounds/vault/exterior/raider_camp_interior.webp")>>
<h2>The Hollow Is Yours</h2>
The second wave breaks. The last of them run for the back of the hedge and don't come back. The platform is empty.
<<if setup.kiraWithYou()>>
<<run VaultUI.showCharacter("kira", "center", "amused")>>
<<say "Kira" "That's their stores tent. Let's see what the tolls bought them.">>
<</if>>
Behind the tarps there is a long tent with a candle chandelier and tables stacked with everything the tolls took off the road. One whole table is medicine: boxed dressings, sutures, antiseptic, more than the vault's medical bay has seen in years.
<<set _hwStored to []>>
<<if _hwNew>>
<<set _got to setup.giveItem("scrap metal", 10)>><<if _got.stored > 0>><<run _hwStored.push("Scrap Metal x" + _got.stored)>><</if>>
<<set _got to setup.giveItem("ammo", 8)>><<if _got.stored > 0>><<run _hwStored.push("Ammunition x" + _got.stored)>><</if>>
<<set _got to setup.giveItem("canned food", 5)>><<if _got.stored > 0>><<run _hwStored.push("Canned Food x" + _got.stored)>><</if>>
<<set _got to setup.giveItem("water", 4)>><<if _got.stored > 0>><<run _hwStored.push("Clean Water x" + _got.stored)>><</if>>
<<set _got to setup.giveItem("stimpack", 3)>><<if _got.stored > 0>><<run _hwStored.push("Stimpack x" + _got.stored)>><</if>>
<<set _got to setup.giveItem("medical supplies", 2)>><<if _got.stored > 0>><<run _hwStored.push("Medical Supplies x" + _got.stored)>><</if>>
<<set _got to setup.giveItem("basic tools", 1)>><<if _got.stored > 0>><<run _hwStored.push("Basic Tools x" + _got.stored)>><</if>>
<<set $vault.scrap += 5>>
<<set $vault.medical to (Number($vault.medical) || 0) + setup.HOLLOW_MEDICAL_WIN>>
<</if>>
<div class="loot-display">
<h4>Found:</h4>
<ul>
<li>Scrap Metal x10</li>
<li>Ammunition x8</li>
<li>Canned Food x5</li>
<li>Clean Water x4</li>
<li>Stimpack x3</li>
<li>Medical Supplies x2</li>
<li>Basic Tools x1</li>
<li>Medical supplies x<<= setup.HOLLOW_MEDICAL_WIN>> (to the medical bay)</li>
</ul>
<<if _hwStored.length > 0>><p class="loot-stored">Your backpack is full. Sent to the vault storage: <<print _hwStored.join(", ")>>.</p><</if>>
</div>
<<if setup.kiraWithYou()>>
<<say "Kira" "Don't get comfortable. They'll have a new crew in here in two days.">>
<</if>>
<div class="choice-container">
<<vchoice "Continue exploring" "WorldMap_View" "move" "map">>
<<vchoice "Return to vault" "Journey_ReturnToVault" "move" "house">>
</div>
<<elseif $combat.result === "seduced" || $combat.seductionWin>>
<<set _hwHer to ($combat.seducedGender === "female")>>
<h2>Slipped Out</h2>
You walk out the way you came in.
<<if _hwHer>>The raider you seduced is in no state to stop you, and the others back off from the gap rather than end up like her.<<else>>The raider you faced has dropped his weapon and wants no more of this, and the others let you go.<</if>>
Nobody follows you down the track. The Hollow and everything behind its hedge are still theirs.
<<if setup.kiraWithYou()>>
<<run VaultUI.showCharacter("kira", "center", "neutral")>>
<<say "Kira" "We walk out with nothing. Again. Next time we take the whole damn hedge.">>
<</if>>
<div class="choice-container">
<<vchoice "Continue exploring" "WorldMap_View" "move" "map">>
<<vchoice "Return to vault" "Journey_ReturnToVault" "move" "house">>
</div>
<<else>>
<h2>Terms</h2>
You back out through the gap with every raider in the clearing watching you go. They let you walk. That is all they let you take.
<<if setup.kiraWithYou()>>
<<run VaultUI.showCharacter("kira", "center", "neutral")>>
<<say "Kira" "Alive. Don't get used to it.">>
<</if>>
<div class="choice-container">
<<vchoice "Continue exploring" "WorldMap_View" "move" "map">>
<<vchoice "Return to vault" "Journey_ReturnToVault" "move" "house">>
</div>
<</if>><<set _travelMinutes to random(30, 45)>>
<<advanceTime 0 _travelMinutes>>
<<set $locations.hollow.raids to ($locations.hollow.raids || 0) + 1>>
<<set _sneakRoll to random(1, 100) + $player.agility>>
<<if _sneakRoll >= 80 && !$locations.hollow.sneakUsed>>
<<set $locations.hollow.sneakUsed to true>>
<<run VaultUI.setBackgroundDirect("media/backgrounds/vault/exterior/raider_camp_interior.webp")>>
<h2>Through the Hedge</h2>
Round the back the hedge thins where a tree came down. You crawl through on your belly, thorns in your hair, and come up behind a long tent. Nobody on this side. Inside: tables, crates, a candle chandelier nobody is watching, and a shelf of boxed medicine.
<<if setup.kiraWithYou()>>
Kira keeps watch at the flap, knife out, while you fill your pack.
<</if>>
<<set _hwStored to []>>
<<if $locations.hollow.lootedRaid !== $locations.hollow.raids>>
<<set $locations.hollow.lootedRaid to $locations.hollow.raids>>
<<set _got to setup.giveItem("ammo", 4)>><<if _got.stored > 0>><<run _hwStored.push("Ammunition x" + _got.stored)>><</if>>
<<set _got to setup.giveItem("canned food", 2)>><<if _got.stored > 0>><<run _hwStored.push("Canned Food x" + _got.stored)>><</if>>
<<set _got to setup.giveItem("stimpack", 1)>><<if _got.stored > 0>><<run _hwStored.push("Stimpack x" + _got.stored)>><</if>>
<<set _got to setup.giveItem("medical supplies", 1)>><<if _got.stored > 0>><<run _hwStored.push("Medical Supplies x" + _got.stored)>><</if>>
<<set $vault.medical to (Number($vault.medical) || 0) + setup.HOLLOW_MEDICAL_SNEAK>>
<</if>>
<div class="loot-display">
<h4>Stolen:</h4>
<ul>
<li>Ammunition x4</li>
<li>Canned Food x2</li>
<li>Stimpack x1</li>
<li>Medical Supplies x1</li>
<li>Medical supplies x<<= setup.HOLLOW_MEDICAL_SNEAK>> (to the medical bay)</li>
</ul>
<<if _hwStored.length > 0>><p class="loot-stored">Your backpack is full. Sent to the vault storage: <<print _hwStored.join(", ")>>.</p><</if>>
</div>
<<if setup.kiraWithYou()>>
<<say "Kira" "In and out under a dozen of them. Okay. That was good.">>
<<relationChange "kira" "trust" 1>>
<</if>>
<div class="choice-container">
<<vchoice "Out the way you came" "WorldMap_View" "move" "run">>
</div>
<<else>>
<h2>Spotted!</h2>
You are halfway through the thin part of the hedge when somebody up on the platform whistles. Then the horn.
<<if setup.kiraWithYou()>><<say "Raider" "Back fence! Two of them! Get the woman!">><<else>><<say "Raider" "Back fence! Somebody's in the hedge!">><</if>>
<<if setup.kiraWithYou()>>
<<say "Kira" "Shit. Of course they want me.">>
<</if>>
<div class="choice-container">
<<vchoice "Fight!" "Hollow_Wave1" "action" "attack">>
<<vchoice "Run for it!" "WorldMap_View" "action" "run">>
</div>
<</if>><<set _travelMinutes to random(20, 30)>>
<<advanceTime 0 _travelMinutes>>
<<set _hwFirstSearch to !$locations.hollow.searched>>
<<set $locations.hollow.searched to true>>
You go through the tents one more time.
<<if _hwFirstSearch && random(1, 100) >= 40>>
Under a cot, a tin box the crew left behind.
<<set _got to setup.giveItem("scrap metal", 3)>>
<<set _got2 to setup.giveItem("bandage", 1)>>
<div class="loot-display">
<h4>Found:</h4>
<ul>
<li>Scrap Metal x3</li>
<li>Bandage x1</li>
</ul>
</div>
<<else>>
Nothing left. The place is picked clean.
<</if>>
<div class="choice-container">
<<vchoice "Return to map" "WorldMap_View" "move" "map">>
</div>SECTION 19B: HUB NAVIGATION WIDGETS
============================================================= */
<<widget "hubLocation">>
<<set _hlName to _args[0]>>
<<set _hlTarget to _args[1]>>
<<set _hlLocationId to _args[2]>>
<<set _hlIcon to _args[3]>>
<<set _hlNote to _args[4] || "">>
<<set _hlPeopleHere to []>>
<<for _comp range $companions>>
<<if _comp.currentLocation === _hlLocationId>>
<<run _hlPeopleHere.push(_comp)>>
<</if>>
<</for>>
<<capture _hlName, _hlTarget, _hlLocationId, _hlIcon, _hlNote>>
<div class="hub-location" @data-location="_hlLocationId">
<<set _iconHTML to _hlIcon ? '<span class="gi gi-' + _hlIcon + ' gi-small"></span> ' : ''>>
<<link `_iconHTML + _hlName` _hlTarget>>
<<set $currentLocation to _hlLocationId>>
<</link>>
<<if _hlPeopleHere.length gt 0>>
<span class="location-indicator person">
<<for _p range _hlPeopleHere>>
<<print _p.name>>
<</for>>
</span>
<</if>>
<<if _hlNote>>
<span class="reason"><<= _hlNote>></span>
<</if>>
</div>
<</capture>>
<</widget>>
<<widget "updateCompanionLocations">>
<<if $companions && $companions.length gt 0>>
<<for _i, _comp range $companions>>
<<if _comp.id === "kira">>
<<if setup.kiraAtCenter()>>
<<set $companions[_i].currentLocation to "grove_center">>
<<elseif setup.kiraAway()>>
<<set $companions[_i].currentLocation to "scavenging">>
<<elseif $companions[_i].currentLocation !== "medical" || !setup.kiraStaysInMedical($companions[_i]) || setup.kiraFirstComa()>>
<<set $companions[_i].currentLocation to "kira_quarters">>
<</if>>
<<run setup.kiraCommonsRoll()>>
<</if>>
<</for>>
<</if>>
<</widget>>
<<widget "supplyDaysLeft">>
<<set _sdlDays to setup.vaultDaysLeft(_args[0])>>
<span @class="'days-left' + (_sdlDays !== null && _sdlDays <= 2 ? ' low' : '')" @data-days="_sdlDays === null ? '' : _sdlDays"><<print setup.vaultDaysLeftText(_args[0])>></span>
<</widget>>
<<widget "autoStoreVaultSupplies">>
<<if typeof UInv !== 'undefined' && UInv.BagExists("player")>>
<<set _storedItems to []>>
<<if UInv.BagHasItem("player", "dirty water")>>
<<set _dirtyWaterCount to UInv.GetItemPropertyValue("player", "dirty water", "UInvQuantity") || 1>>
<<if _dirtyWaterCount > 0>>
<<if UInv.BagExists("vault")>>
<<run UInv.MoveItem("player", "vault", "dirty water", _dirtyWaterCount)>>
<<else>>
<<run UInv.DeleteItem("player", "dirty water", _dirtyWaterCount)>>
<</if>>
<<run _storedItems.push(_dirtyWaterCount + " dirty water")>>
<</if>>
<</if>>
<<if UInv.BagHasItem("player", "canned food")>>
<<set _cannedCount to setup.autoStoreCount("canned food")>>
<<if _cannedCount > 0>>
<<set $vault.food += _cannedCount * 2>>
<<run UInv.DeleteItem("player", "canned food", _cannedCount)>>
<<run _storedItems.push(_cannedCount + " canned food (+"+(_cannedCount * 2)+" vault food)")>>
<</if>>
<</if>>
<<set _asKept to []>>
<<for _asFish range setup.FISH_KINDS>>
<<set _asN to setup.autoStoreCount(_asFish)>>
<<if _asN gt 0>>
<<if UInv.BagExists("vault") && setup.bagFits("vault", _asFish, _asN) gt 0>>
<<run UInv.MoveItem("player", "vault", _asFish, _asN)>>
<<run _storedItems.push(_asN + " " + _asFish + " (to storage)")>>
<<run setup.noteFishKept(_asFish, 0)>>
<<elseif _asFish === "fish">>
<<set $vault.food += _asN>>
<<run UInv.DeleteItem("player", "fish", _asN)>>
<<run _storedItems.push(_asN + " fish (+" + _asN + " vault food, storage is full)")>>
<<else>>
<<if setup.noteFishKept(_asFish, _asN)>><<run _asKept.push(_asN + " " + setup.FISH_NAMES[_asFish])>><</if>>
<</if>>
<</if>>
<</for>>
<<if UInv.BagHasItem("player", "ration")>>
<<set _rationCount to setup.autoStoreCount("ration")>>
<<if _rationCount > 0>>
<<set $vault.food += _rationCount>>
<<run UInv.DeleteItem("player", "ration", _rationCount)>>
<<run _storedItems.push(_rationCount + " ration" + (_rationCount > 1 ? "s" : "") + " (+"+_rationCount+" vault food)")>>
<</if>>
<</if>>
<<if UInv.BagHasItem("player", "water")>>
<<set _waterCount to UInv.GetItemPropertyValue("player", "water", "UInvQuantity") || 1>>
<<if _waterCount > 0>>
<<set $vault.water += _waterCount>>
<<run UInv.DeleteItem("player", "water", _waterCount)>>
<<run _storedItems.push(_waterCount + " water (+"+_waterCount+" vault water)")>>
<</if>>
<</if>>
<<if _storedItems.length > 0>>
<<notify "success">>Auto-stored: <<print _storedItems.join(", ")>><</notify>>
<</if>>
<<if _asKept.length > 0>>
<<notify "warning">>The vault's storage is full, so <<print _asKept.join(" and ")>> <<print (_asKept.length === 1 && /^1 /.test(_asKept[0])) ? "stays" : "stay">> in your pack.<</notify>>
<</if>>
<</if>>
<</widget>>
/* =============================================================<<run VaultUI.setBackground("kira_room")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<<set _krGoto to null>>
<<set _krWake to $flags.kiraRoomWakeView is true>>
<<set $flags.kiraRoomWakeView to false>>
<<if setup.kiraFirstComa()>>
<<set _krGoto to "Kira_Room_Coma_Visit">>
<</if>>
<<if !_krGoto && setup.kiraAway()>>
<<set _krGoto to setup.kiraAtCenter() ? "Kira_Room_Away_Center" : "Kira_Room_Away_Run">>
<</if>>
<<if !_krWake>>
<<if !_krGoto && typeof setup.groveKiraDenTalkDue === "function" && setup.groveKiraDenTalkDue()>>
<<set _krGoto to "Kira_Room_Den_Talk">>
<</if>>
<<if !_krGoto && setup.kiraUseTalkDue()>>
<<set _krGoto to "Kira_Room_Use_Talk">>
<</if>>
<<if !_krGoto && setup.kiraHidesOverClothes()>>
<<set _krGoto to "Kira_Room_Locked">>
<</if>>
<<if !_krGoto && setup.kiraRoomFirstVisitDue()>>
<<set _krGoto to "Kira_Room_FirstVisit">>
<</if>>
<<if !_krGoto && $time.day >= 8 && previous() is "Vault_Hub" && ($flags.kiraWaitOwed || ($flags.kiraWaitChosen && !$flags.sleptWithKira))>>
<<set _krGoto to "Day8_Kira_Ready">>
<</if>>
<<if !_krGoto && setup.denKiraTalkDue()>>
<<set _krGoto to "Kira_Room_DenNight">>
<</if>>
<<if !_krGoto && $companions && $companions.length > 0 && $companions[0] && $time.day >= 3 && (!$flags.lastKiraRoomEventDay || $time.day > $flags.lastKiraRoomEventDay)>>
<<set _krEvents to []>>
<<if $companions[0].tension >= 80 && !$flags.sleptWithKira>><<run _krEvents.push(["Kira_Room_Event_HighTension", 40])>><</if>>
<<if $player.dominance >= 25 && $companions[0].tension >= 75 && setup.kiraRoomSexOpen()>><<run _krEvents.push(["Kira_Room_Event_Dominance", 20])>><</if>>
<<if $companions[0].tension >= 70>><<run _krEvents.push(["Kira_Room_Event_Masturbating", 20])>><</if>>
<<if $player.lust >= 70 && $flags.sleptWithKira>><<run _krEvents.push(["Kira_Room_Event_HighLust", 30])>><</if>>
<<if $player.lust >= 65 && $companions[0].tension >= 65 && !$flags.sleptWithKira && $companions[0].trust >= 30>><<run _krEvents.push(["Kira_HelpEachOther_Menu", 25])>><</if>>
<<if $player.corruption >= 35 && $companions[0].tension >= 60 && setup.kiraRoomSexOpen()>><<run _krEvents.push(["Kira_Room_Event_Corruption", 20])>><</if>>
<<if $extremeContent.supernatural && setup.ruinsFirstVisitDone() && $companions[0].trust >= 90 && $companions[0].tension >= 90 && setup.kiraRoomSexOpen()>><<run _krEvents.push(["Kira_Room_Event_Velith", 15])>><</if>>
<<if ($time.phase === "morning" || $time.phase === "evening") && $companions[0].tension >= 45 && $companions[0].trust >= 30 && !$flags.kiraIsUnconscious && !$flags.kiraInComa && $companions[0].status !== "unconscious" && (!$flags.kiraShowerPeekSeen || $time.day >= ($flags.kiraShowerPeekDay || 0) + setup.kiraShowerPeekCooldownDays)>><<run _krEvents.push(["Kira_Room_Event_ShowerPeek", 25])>><</if>>
<<set _krEvent to setup.rollChanceEvent(_krEvents)>>
<<if _krEvent>>
<<set $flags.lastKiraRoomEventDay = $time.day>>
<<set _krGoto to _krEvent>>
<</if>>
<</if>>
<<if !_krGoto && setup.kiraFootlockerFound(previous())>>
<<set _krGoto to "Kira_Room_Footlocker_Open">>
<</if>>
<</if>>
<<if _krGoto>><<goto _krGoto>><</if>>
<<if $companions && $companions.length > 0 && $companions[0]>>
<<showCharacter "kira" "center" "neutral">>
<<describeKiraRoom>>
<<if !_krWake>>
Kira looks up as you enter.
<<if $companions[0].tension >= 70>>
<<say "Kira" "You. Here.">>
Her voice is rough. The tension between you fills the small room.
<<elseif $companions[0].tension >= 50>>
<<say "Kira" "Didn't expect company.">>
She doesn't tell you to leave.
<<elseif $companions[0].trust >= 40>>
<<say "Kira" "Hey. Need something?">>
<<else>>
<<say "Kira" "What do you want?">>
Guarded. This is her space.
<</if>>
<</if>>
<div class="choice-container">
<<vchoice "Talk" "Kira_Room_Talk" "talk" "talk">>
<<if setup.kiraRunAskable()>>
<<link `'<span class="choice-button talk"><span class="gi gi-map gi-large"></span><span class="label">Ask her to go out scavenging</span></span>'`>><<run setup.kiraRunState().from = "Kira_Room">><<goto "Kira_Scav_Ask">><</link>>
<</if>>
<<if !setup.sceneHidden("reliefNonSexual") && ($player.lust >= 40 || ($companions && $companions[0] && $companions[0].tension >= 40)) && $companions && $companions[0] && $companions[0].trust >= 30>>
<<vchoice "Have a deep conversation" "Kira_DeepConversation" "talk" "broken-heart">>
<</if>>
<<if $flags && !$flags.askedAboutKiraRoom>>
<<vchoice "Ask about her room" "Kira_Room_Tour" "talk" "house">>
<</if>>
<<if $flags && $flags.seraPhotoSeen && !$flags.askedAboutSeraPhoto>>
<<vchoice "Ask about the photo" "Kira_Talk_Sera" "talk" "search">>
<</if>>
<<if $companions && $companions[0] && $companions[0].affection >= 20>>
<<vchoice "Offer to spar" "Kira_Room_Spar" "action" "attack">>
<</if>>
<<if $companions && $companions[0] && $companions[0].affection >= 25>>
<<vchoice "Flirt" "Kira_Room_Flirt" "intimate" "lips">>
<</if>>
<<if $companions && $companions[0] && $companions[0].tension >= 50 && $companions[0].trust >= 40 && setup.kiraRoomKissOpen()>>
<<vchoice "Step closer" "Kira_Room_Approach" "intimate" "broken-heart">>
<</if>>
<<if $player.lust >= 60 && $companions && $companions[0] && $companions[0].tension >= 60 && $companions[0].trust >= 25 && !$flags.sleptWithKira>>
<<vchoice "\"We could... help each other\"" "Kira_HelpEachOther_Menu" "intimate" "shower">>
<</if>>
<<if $flags && setup.kiraRoomSexOpen() && ($flags.sleptWithKira || ($companions && $companions[0] && $companions[0].tension >= 60 && $companions[0].trust >= 50))>>
<<vchoice "Close the door behind you" "Kira_Room_Initiate" "intimate" "rapid-strikes">>
<</if>>
<<vchoice "Leave her be" "Vault_Hub" "move" "return">>
</div>
<<else>>
<p>This room is empty. No one lives here yet.</p>
<div class="choice-container">
<<vchoice "Leave" "Vault_Hub" "move" "return">>
</div>
<</if>><<run VaultUI.setBackground("hallway")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<<getExhibTier "kira">>
The door to Kira's room is shut. You try the handle — locked.
<<if _exhibTier <= 0>>
<<say "Kira" "Go AWAY!">>
Her voice is muffled through the door. She sounds furious. Humiliated. You can hear her pacing.
<<say "Kira" "I'm not coming out like this. Don't even ask.">>
<<else>>
<<say "Kira" "Not now.">>
A pause. Then quieter:
<<say "Kira" "I need... just fix my clothes. Storage room. There's cloth in there.">>
<</if>>
<p class="warning"><<icon "alert">> Kira's clothing is too damaged. Repair or replace her clothes at the storage room before she'll come out.</p>
<div class="choice-container">
<<vchoice "Go to Storage" "Vault_Storage" "action" "armor">>
<<vchoice "Leave" "Vault_Hub" "move" "return">>
</div><<set $flags.visitedKiraRoom to true>>
<<run VaultUI.setBackground("kira_room")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<<showCharacter "kira" "center" "surprised">>
You find Kira's room and knock.
<<say "Kira" "It's open.">>
You enter. She's sitting on the bed, cleaning her machete. Her eyes narrow.
<<say "Kira" "Looking for something?">>
The room is sparse. A weapon rack. Training dummy. Small desk. The bed she's sitting on. Not much else.
<em>This is a room for surviving, not living.</em>
<div class="choice-container">
<<vchoice "Just wanted to see where you stay" "Kira_Room_Curious" "talk" "talk">>
<<vchoice "Wanted to talk privately" "Kira_Room_Private" "talk" "locked">>
<<vchoice "Sorry, I'll go" "Kira_Room_Leave" "action" "return">>
</div><<showCharacter "kira" "center" "guarded">>
<<say "Kira" "Not much to see.">>
She gestures vaguely.
<<say "Kira" "Bed. Weapons. That's about it. I don't need much.">>
A pause.
<<say "Kira" "The Groundskeeper gave me this room when I first got here. Said the vault had plenty of empty ones.">>
Something flickers across her face.
<<say "Kira" "There used to be more people.">>
<<set $flags.askedAboutKiraRoom to true>>
<<relationChange "kira" "trust" 1>>
<div class="choice-container">
<<vchoice "Continue" "Kira_Room" "move" "map">>
</div><<showCharacter "kira" "center" "cautious">>
<<say $player.name "Wanted to talk privately.">>
<<say "Kira" "About?">>
She sets the machete aside. Listening.
<<relationChange "kira" "trust" 1>>
<div class="choice-container">
<<vchoice "About us" "Kira_Room_AboutUs" "talk" "broken-heart">>
<<vchoice "About what happened" "Kira_Room_AboutEvent" "talk" "alert">>
<<vchoice "Never mind" "Kira_Room" "action" "return">>
</div><<say $player.name "Sorry, I'll go.">>
<<say "Kira" "Wait.">>
She stands.
<<say "Kira" "You can stay. If you want.">>
It's not much. But from her, it means something.
<<relationChange "kira" "affection" 1>>
<div class="choice-container">
<<vchoice "Stay" "Kira_Room" "move" "map">>
</div><<set $lastLocation to "Kira_Room_Talk">>
<<checkIntrusiveThought>>
<<showCharacter "kira" "center" "thoughtful">>
<<advanceTime 0 12>>
<<say $player.name "Want to talk?">>
She leans back against the wall.
<<say "Kira" "Sure. About what?">>
<div class="choice-container">
<<vchoice "About your past" "Kira_Talk_Past" "talk" "scroll">>
<<if setup.kiraSisterMentioned()>>
<<vchoice "About your sister" "Kira_Talk_Sera" "talk" "broken-heart">>
<</if>>
<<vchoice "About the vault" "Kira_Talk_Vault" "talk" "factory">>
<<vchoice "Never mind" "Kira_Room" "action" "return">>
</div><<set $flags.askedAboutKiraRoom to true>>
<<showCharacter "kira" "center" "thoughtful">>
<<say $player.name "Tell me about your room?">>
She looks around as if seeing it for the first time.
<<say "Kira" "Weapon rack. Bed. Training dummy for when I can't sleep.">>
Her eyes land on the footlocker under the bed. Just for a moment.
<<say "Kira" "That's about it.">>
<<if $companions[0].trust >= 50>>
You notice her gaze.
<div class="choice-container">
<<vchoice "What's in the footlocker?" "Kira_Room_Footlocker" "talk" "crystal">>
<<vchoice "Don't pry" "Kira_Room" "action" "return">>
</div>
<<else>>
<div class="choice-container">
<<vchoice "Continue" "Kira_Room" "move" "map">>
</div>
<</if>><<run VaultUI.setBackground("kira_room")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<<showCharacter "kira" "center" "thoughtful">>
Her door is open. Kira is on her knees beside the bed with the footlocker pulled out in front of her, the lid up, both hands inside it. She doesn't hear you until you are in the room.
The lid comes down fast. She stays where she is, one hand flat on top of it.
<<say "Kira" "Knock next time.">>
<div class="choice-container">
<<vchoice "What's in the footlocker?" "Kira_Room_Footlocker" "talk" "crystal">>
<<vchoice "Don't pry" "Kira_Room" "action" "return">>
</div><<set $flags.kiraFootlockerAsked to true>>
<<showCharacter "kira" "center" "vulnerable">>
<<say "Kira" "That's...">>
She goes quiet. Then, slowly:
<<say "Kira" "My sister's things. What she had on her when...">>
She trails off.
<<say "Kira" "I couldn't just leave them. Couldn't throw them away.">>
<<if $companions[0].trust >= 60>>
<<set $flags.kiraFootlockerDone to true>>
<div class="choice-container">
<<vchoice "Can I see?" "Kira_Room_SeraItems" "talk" "search">>
<<vchoice "Thank you for keeping them" "Kira_Room_Thanks" "talk" "hand">>
</div>
<<else>>
<<addTension "kira" 5>>
<<say "Kira" "Maybe... maybe someday I'll show you.">>
<div class="choice-container">
<<vchoice "Continue" "Kira_Room" "move" "map">>
</div>
<</if>><<showCharacter "kira" "center" "vulnerable">>
Kira hesitates. Then she kneels, pulls out the footlocker, and opens it.
Inside:
- A scarf, faded blue
- A small journal
- A photograph
<<say "Kira" "She'd have liked you.">>
She hands you the photograph.
<<say "Kira" "Nell.">>
Her sister. Smiling. Kira is next to her, younger-looking, almost smiling too.
<<set $flags.seraPhotoSeen to true>>
<<relationChange "kira" "trust" 2>>
<<relationChange "kira" "affection" 1>>
<<addTension "kira" 10>>
<div class="choice-container">
<<vchoice "She looks happy" "Kira_Room_PhotoHappy" "talk" "broken-heart">>
<<vchoice "You were close" "Kira_Room_PhotoClose" "talk" "broken-heart">>
<<vchoice "Stay silent, just looking" "Kira_Room_PhotoSilent" "action" "...">>
</div><<storyVideo "story/mv_kira_room/sera_photo">>
<<say $player.name "She looks happy.">>
<<say "Kira" "She was. For a while.">>
Kira takes the photo back gently.
<<say "Kira" "After Dad, it was just the two of us on the road. I kept her alive. She made it easier.">>
<<relationChange "kira" "affection" 1>>
<div class="choice-container">
<<vchoice "Continue" "Kira_Room" "move" "map">>
</div><<say $player.name "You were close.">>
<<say "Kira" "Yeah. We were.">>
Her voice cracks slightly.
<<say "Kira" "She was... she was the only person I ever trusted.">>
<<relationChange "kira" "trust" 1>>
<div class="choice-container">
<<vchoice "Continue" "Kira_Room" "move" "map">>
</div><<storyVideo "story/mv_kira_room/sera_photo">>
You stay silent, just looking at her sister's smiling face.
Kira sits beside you. Also silent.
Sometimes there are no words.
<<relationChange "kira" "affection" 2>>
<<addTension "kira" 5>>
<div class="choice-container">
<<vchoice "Continue" "Kira_Room" "move" "map">>
</div><<say $player.name "Thank you for keeping them.">>
<<say "Kira" "I couldn't let them go. It felt like... letting HER go.">>
She closes the footlocker.
<<say "Kira" "I'm glad you're here. She'd want that.">>
<<relationChange "kira" "trust" 2>>
<<relationChange "kira" "affection" 2>>
<div class="choice-container">
<<vchoice "Continue" "Kira_Room" "move" "map">>
</div><<run VaultUI.setBackground("kira_room")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<<if $companions[0].trust < 40>>
You shouldn't. This feels wrong.
<div class="choice-container">
<<vchoice "Leave" "Vault_Hub" "move" "return">>
</div>
<<else>>
You look around the small room.
The bed is made with military precision. Weapon rack holds her machete and a backup knife, both well-maintained.
<div class="choice-container">
<<vchoice "Check the desk" "Kira_Room_Desk" "action" "search">>
<<vchoice "Look at the weapons" "Kira_Room_Weapons" "action" "attack">>
<<if $companions[0].trust >= 50>>
<<vchoice "Check under the bed" "Kira_Room_UnderBed" "action" "crystal">>
<</if>>
<<vchoice "Stop snooping" "Vault_Hub" "move" "return">>
</div>
<</if>>The desk has a map of the Reclaimed. Locations are marked:
- X's over dangerous areas
- Circles around resource spots
- A question mark over the Overgrown Ruins
<<if $flags.succubusFirstEncounterComplete>>
<em>The Overgrown Ruins. Where you met Velith.</em>
<</if>>
There's also a small book. A journal?
<<if $companions[0].trust >= 60>>
<div class="choice-container">
<<vchoice "Read the journal" "Kira_Room_Journal" "action" "book">>
<<vchoice "Leave it alone" "Kira_Room_Snoop" "action" "return">>
</div>
<<else>>
You shouldn't read her private thoughts. Not yet.
<div class="choice-container">
<<vchoice "Back" "Kira_Room_Snoop" "move" "return">>
</div>
<</if>><<if random(1, 100) <= 30>>
<<goto "Kira_Room_Caught">>
<<else>>
<<storyVideo "story/mv_kira_room/journal">>
You open the journal carefully.
Most entries are short. Survival notes. Resource counts.
A more recent entry catches your eye:
<div class="journal-entry">
"Can't stop thinking about them. Shouldn't feel this way. It's wrong.
But the way they look at me sometimes..."
</div>
<<set $flags.readKiraJournal to true>>
<<addTension "kira" 15>>
You close the journal. Your heart is pounding.
<div class="choice-container">
<<vchoice "Leave before she returns" "Vault_Hub" "move" "run">>
</div>
<</if>>The weapon rack is immaculate. Her machete hangs beside a backup knife.
Both blades are clean, sharp, well-maintained.
She takes care of her weapons better than she takes care of herself.
<div class="choice-container">
<<vchoice "Back" "Kira_Room_Snoop" "move" "return">>
</div>You kneel and look under the bed.
A footlocker. Locked.
<<if $flags.seraPhotoSeen>>
You know what's in there. Nell's things.
<<else>>
You wonder what she keeps in there.
<</if>>
<div class="choice-container">
<<vchoice "Back" "Kira_Room_Snoop" "move" "return">>
</div><<showCharacter "kira" "center" "angry">>
<<say "Kira" "What are you doing?">>
She's in the doorway. Eyes hard.
<<say "Kira" "In my room. Going through my things.">>
<div class="choice-container">
<<vchoice "I'm sorry. I shouldn't have—" "Kira_Room_CaughtApology" "talk" "hand">>
<<vchoice "I wanted to understand you better" "Kira_Room_CaughtExplain" "talk" "talk">>
<<vchoice "Say nothing" "Kira_Room_CaughtSilent" "action" "...">>
</div><<showCharacter "kira" "center" "hurt">>
<<say "Kira" "Yeah. You shouldn't have.">>
She crosses her arms.
<<say "Kira" "Get out.">>
<<relationChange "kira" "trust" -2>>
<<set $flags.kiraRoomBanned to true>>
<<set $flags.kiraRoomBannedUntil to $time.day + 3>>
<p class="consequence">Trust decreased. Kira won't let you in her room for a few days.</p>
<div class="choice-container">
<<vchoice "Leave" "Vault_Hub" "move" "return">>
</div><<say $player.name "I wanted to understand you better.">>
<<showCharacter "kira" "center" "conflicted">>
<<say "Kira" "By invading my privacy?">>
She's angry. But there's something else too.
<<say "Kira" "If you want to know me, ASK. Don't sneak around.">>
<<relationChange "kira" "trust" -1>>
<<addTension "kira" 10>>
<div class="choice-container">
<<vchoice "Leave" "Vault_Hub" "move" "return">>
</div>You say nothing. There's no excuse.
<<showCharacter "kira" "center" "disappointed">>
<<say "Kira" "Nothing to say? Fine.">>
<<say "Kira" "Just... go.">>
<<relationChange "kira" "trust" -2>>
<div class="choice-container">
<<vchoice "Leave" "Vault_Hub" "move" "return">>
</div><<showCharacter "kira" "center" "amused">>
<<advanceTime 0 15>>
You lean against the doorframe, casual.
<<say $player.name "You know, I like your room.">>
<<say "Kira" "It's four walls and a bed.">>
<<say $player.name "The bed's nice.">>
<<set $flags.kiraFlirtedInRoom to true>>
<<storyVideo "story/kiraroom_kiss/flirt__flirt">>
<<if _storyFamily is "sf_cg_kiraroom_kiss_04">>She catches your meaning. The smile starts slow, then breaks into a laugh, and she winks at you.<<else>>She catches your meaning. A smile tugs at her lips.<</if>>
<<say "Kira" "Is it now?">>
<<addTension "kira" 10>>
<<if $companions[0].tension >= 60>>
The air shifts. Charged.
<div class="choice-container">
<<if setup.kiraRoomKissOpen()>><<vchoice "Step closer" "Kira_Room_Approach" "intimate" "broken-heart">><</if>>
<<vchoice "Just teasing" "Kira_Room" "talk" "lips">>
</div>
<<else>>
<<relationChange "kira" "affection" 1>>
<div class="choice-container">
<<vchoice "Continue" "Kira_Room" "move" "map">>
</div>
<</if>><<showCharacter "kira" "center" "receptive">>
<<advanceTime 0 10>>
<<storyVideo "story/kiraroom_kiss/approach">>
<<if _storyFamily is "sf_cg_kiraroom_kiss_04">>She's already stretched out on her back on the bed, lilac tank, bare legs, one knee up, watching you come. You cross the room and lean over her from the head of the bed, your face upside down above hers, close enough to feel her breath on your chin.<<else>>You step closer. The room feels smaller. The bed very present.<</if>>
Kira's breath catches.
<<say "Kira" "What are you—">>
<<if _storyFamily is "sf_cg_kiraroom_kiss_04">>She doesn't finish. Doesn't pull away.<<else>>She doesn't finish. Doesn't step back.<</if>>
<<addTension "kira" 10>>
<<if $companions[0].tension >= 70>>
The tension snaps.
<<say "Kira" "Damn it.">>
<<if _storyFamily is "sf_cg_kiraroom_kiss_04">>She reaches up, grabs the back of your neck and pulls your mouth down onto hers.<<else>>She grabs your collar and pulls you into a kiss.<</if>>
<div class="choice-container">
<<vchoice "Continue" "Kira_Room_Kiss" "action" "forward">>
</div>
<<else>>
<div class="choice-container">
<<vchoice "Kiss her" "Kira_Room_Kiss" "intimate" "lips">>
<<vchoice "Touch her face" "Kira_Room_Touch" "intimate" "grab">>
<<vchoice "Step back" "Kira_Room" "action" "return">>
</div>
<</if>><<advanceTime 0 8>>
<<storyVideo "story/kiraroom_kiss/touch__touch">>
<<if _storyFamily is "sf_cg_kiraroom_kiss_04">>You reach down, touch her face gently. Her tank has slipped off one breast; you kiss the nipple, then trail your mouth up her throat to her ear.<<else>>You reach up, touch her face gently.<</if>>
<<showCharacter "kira" "center" "vulnerable">>
She leans into your hand. Eyes closing.
<<say "Kira" "This is...">>
<<say $player.name "Complicated?">>
<<say "Kira" "Yeah.">>
But she doesn't pull away.
<<relationChange "kira" "affection" 2>>
<<addTension "kira" 10>>
<div class="choice-container">
<<vchoice "Continue" "Kira_Room" "move" "map">>
</div><<showCharacter "kira" "center" "passionate">>
<<advanceTime 0 20>>
Your lips meet. Hungry. Desperate.
<<storyVideo "characters/kira/room_kiss">>
All that tension, all those loaded glances — it pours into this moment.
<<set $flags.kissedKira to true>>
<<addTension "kira" 15>>
<<relationChange "kira" "affection" 2>>
<<set _kissFamily to previous() is "Kira_Room_Approach" && ($media && $media.storyFamilies && $media.storyFamilies.cg_kiraroom_kiss) ? $media.storyFamilies.cg_kiraroom_kiss.family : null>>
<<set _sparFamily to previous() is "Kira_Room_Spar" && ($media && $media.storyFamilies && $media.storyFamilies.cg_kiraroom_kiss) ? $media.storyFamilies.cg_kiraroom_kiss.family : null>>
<<if _kissFamily is "sf_cg_kiraroom_kiss_04">>She's flat on her back on the bed. You kiss her upside down, hungry, then crawl over her, her hands on your face.<<elseif _sparFamily is "sf_cg_kiraroom_kiss_04">>You roll her under you on the bed and kiss her, hungry, her hands in your hair.<<else>>Her back hits the wall. Then the desk. Papers scatter.<</if>>
<<say "Kira" "The door—">>
<div class="choice-container">
<<vchoice "Close it" "Kira_Room_DoorClose" "intimate" "door-handle">>
<<vchoice "Leave it" "Kira_Room_DoorOpen" "intimate" "search">>
<<vchoice "Stop, breathe" "Kira_Room_Pause" "action" "meditation">>
</div>You reach back and swing the door shut. The click of the latch is loud.
<<say "Kira" "Good.">>
<<storyVideo "story/kiraroom_kiss/door_close__door_close">>
<<if _storyFamily is "sf_cg_kiraroom_kiss_04">>She pulls you down onto the bed with her.<<else>>She pulls you toward the bed.<</if>>
<<if setup.kiraRoomSexOpen() && $companions[0].trust >= 50 && ($flags.sleptWithKira || $companions[0].tension >= 65)>>
<div class="choice-container">
<<vchoice "Continue" "Kira_Room_Sex_Start" "action" "forward">>
</div>
<<else>>
<<if _storyFamily is "sf_cg_kiraroom_kiss_04">>You end up sprawled across her narrow bed, her mouth on yours, her hands dragging down your bare back.<<else>>You fall onto the narrow bed together. Kissing. Touching.<</if>>
<<if _storyFamily is "sf_cg_kiraroom_kiss_04">>She lets your hand slide up under her top, then catches your wrist and pins it there before it goes any lower.<<else>>But she stops your hand before it goes too far.<</if>>
<<say "Kira" "Not... not yet. I want to. But not yet.">>
<<addTension "kira" 10>>
<div class="choice-container">
<<vchoice "That's okay" "Kira_Room_Respect" "talk" "check">>
<<vchoice "When?" "Kira_Room_When" "talk" "alert">>
</div>
<</if>><<advanceTime 0 5>>
You leave the door open. The risk adds to the intensity.
<<storyVideo "story/kiraroom_kiss/door_close__door_open">>
<<say "Kira" "Risky.">>
But she doesn't stop kissing you.
<<addTension "kira" 15>>
<div class="choice-container">
<<vchoice "Continue" "Kira_Room" "move" "map">>
</div><<advanceTime 0 10>>
You pull back, breathing hard.
<<showCharacter "kira" "center" "flushed">>
<<storyVideo "story/kiraroom_kiss/pause">>
<<say $player.name "Wait. We should—">>
<<say "Kira" "Yeah. Too fast.">>
<<if _storyFamily is "sf_cg_kiraroom_kiss_04">>She lets her head drop back and grins up at you, mouth kiss-swollen, eyes still bright. Neither of you believes this is over.<<else>>But the tension is still there. Coiled. Waiting.<</if>>
<<addTension "kira" 5>>
<div class="choice-container">
<<vchoice "Continue" "Kira_Room" "move" "map">>
</div><<advanceTime 0 10>>
<<say $player.name "That's okay. I can wait.">>
<<showCharacter "kira" "center" "grateful">>
<<say "Kira" "Thank you.">>
<<storyVideo "story/kiraroom_kiss/respect">>
She kisses you softly. Once.
<<say "Kira" "Soon. I promise.">>
<<relationChange "kira" "trust" 2>>
<div class="choice-container">
<<vchoice "Leave her to rest" "Vault_Hub" "move" "door-handle">>
</div><<advanceTime 0 15>>
<<say $player.name "When?">>
<<showCharacter "kira" "center" "thoughtful">>
<<storyVideo "story/kiraroom_kiss/when">>
<<say "Kira" "When I'm sure.">>
<<say $player.name "Sure of what?">>
<<say "Kira" "That this is real. That you won't leave.">>
<<addTension "kira" 5>>
<div class="choice-container">
<<vchoice "I'm not going anywhere" "Kira_Room_Reassure" "talk" "broken-heart">>
</div><<advanceTime 0 10>>
<<say $player.name "I'm not going anywhere.">>
<<showCharacter "kira" "center" "vulnerable">>
<<storyVideo "story/kiraroom_kiss/reassure">>
<<say "Kira" "You say that now.">>
<<say $player.name "And I'll keep saying it.">>
<<if _storyFamily is "sf_cg_kiraroom_kiss_04">>Your hand slides down the side of her throat, thumb stroking slow. She closes her eyes and lets you.<<else>>She searches your eyes.<</if>>
<<say "Kira" "Okay.">>
<<relationChange "kira" "trust" 2>>
<div class="choice-container">
<<vchoice "Leave her to rest" "Vault_Hub" "move" "door-handle">>
</div><<showCharacter "kira" "center" "knowing">>
You close the door behind you. The click is deliberate.
<<storyVideo "story/kiraroom_bed_sex/onto_bed">>
<<if _storyFamily is "sf_cg_kiraroom_bed_sex_04">>Kira looks up. She knows what that means. Her fingers find the edge of her panties and tug, slow, while she smiles at you.<<else>>Kira looks up. She knows what that means.<</if>>
<<if $flags.sleptWithKira>>
<<say "Kira" "Again?">>
She's smiling.
<<say "Kira" "Come here.">>
<div class="choice-container">
<<vchoice "Continue" "Kira_Room_Sex_Start" "action" "forward">>
</div>
<<else>>
<<say "Kira" "You're sure?">>
<div class="choice-container">
<<vchoice "I'm sure" "Kira_Room_Sex_Start" "intimate" "lips">>
<<vchoice "Maybe not yet" "Kira_Room" "action" "return">>
</div>
<</if>><<run VaultUI.setBackground("kira_room")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<<showCharacter "kira" "center" "intimate">>
<<run document.body.classList.add("scene-mode-intimate")>>
<<sexScene "kira" "romantic" "passionate" "kira-room">>
The narrow bed creaks as you fall onto it together.
<<if !$flags.sleptWithKira>>
<<say "Kira" "I've wanted this. Fought it. But I've wanted it.">>
Her hands shake slightly as she pulls at your clothes.
<<say "Kira" "Tell me you want this too.">>
<div class="choice-container">
<<vchoice "I want you" "Kira_Sex_FirstTime" "intimate" "lips">>
<<vchoice "Show her how much" "Kira_Sex_FirstTime" "intimate" "rapid-strikes">>
</div>
<<else>>
<<say "Kira" "Get over here.">>
No hesitation this time. You know each other's bodies now.
<div class="choice-container">
<<vchoice "Continue" "Kira_Sex_Familiar" "action" "forward">>
</div>
<</if>><<sexPhase "buildup">>
<<advanceTime 0 30>>
<<storyVideo "story/kiraroom_bed_sex/foreplay__foreplay">>
<<performSexAct "kiss_deep">>
The kiss deepens. Hungry. Desperate. All the weeks of tension pouring into this moment.
Her hands fumble with your shirt. Trembling slightly. This matters to her.
<<performSexAct "undress_partial">>
Clothes peel away. Slowly at first, then with increasing urgency. Her shirt hits the floor. Then yours.
<<showCharacter "kira" "center" "aroused">>
She's beautiful. Battle-hardened body, lean muscle, a handful of soft, natural breasts. Real and solid and YOURS.
<<say "Kira" "Don't stare.">>
But she's not really complaining. Her nipples are hard, betraying her arousal.
<<sexPhase "action">>
<<performSexAct "touch_body">>
You explore her. Hands trailing over her stomach, her sides. Learning the topography of her body. She shivers under your touch.
Your thumb brushes her nipple. She gasps, arching into your hand.
<<say "Kira" "Fuck— that's—">>
You do it again. She bites her lip.
<<performSexAct "touch_intimate">>
Your hand slides lower. Between her legs. She's soaked. Absolutely drenched.
<<say $player.name "You're so wet.">>
<<say "Kira" "I've wanted this for weeks. Of course I am.">>
Your fingers slide through her wetness. She trembles, legs spreading instinctively.
<<say "Kira" "Please— I need you inside me—">>
<div class="choice-container">
<<vchoice "Take your time with her" "Kira_Sex_Slow" "intimate" "night">>
<<vchoice "Give her what she needs now" "Kira_Sex_Direct" "intimate" "rapid-strikes">>
</div><<advanceTime 0 45>>
<<say $player.name "I'm going to taste you first.">>
<<showCharacter "kira" "center" "aroused">>
You push her back onto the narrow bed. She falls, watching you, pupils blown wide.
<<storyVideo "story/kiraroom_bed_sex/oral_her__oral_her">>
<<performSexAct "oral_give">>
You kiss down her body. Her neck. Her breasts, taking each nipple in your mouth until she's squirming. Down her stomach.
<<if _storyFamily is "sf_cg_kiraroom_bed_sex_04">>You push her knees back to her chest. She grabs her own legs and holds them up and wide for you without being asked.<<else>>She spreads her legs for you without being asked.<</if>>
Your mouth finds her pussy. She's soaked, the taste of her flooding your tongue.
<<say "Kira" "Oh FUCK—">>
<<if _storyFamily is "sf_cg_kiraroom_bed_sex_04">>Her hands stay locked around her legs, holding herself open for your mouth.<<else>>Her hands grip your hair, not forcing, just holding on.<</if>>
You lick slowly at first. Teasing. Your tongue working up her pussy lips, finding her clit.
<<performSexAct "oral_give">>
<<say "Kira" "Don't stop— please don't fucking stop—">>
You focus on her clit now. Circling it. Sucking gently. Your fingers slide inside her, curling to find that spot.
She's close. You can feel it in how her thighs tremble. How her pussy clenches around your fingers.
<<say "Kira" "I'm gonna— oh god I'm—">>
<<sexPhase "climax">>
<<performSexAct "climax_partner">>
She comes HARD. Her whole body goes rigid, then shakes. Your name torn from her throat like a prayer.
You don't stop. Drawing it out. Making her ride the waves until she's pushing at your head, oversensitive.
<div class="narrative-video intimate">
<<if $preferences.showVideos>>
<<if !_storyClip>><<showEventMedia "intimate/kira_orgasm_oral">><</if>>
<</if>>
</div>
<<say "Kira" "Holy shit. That was...">>
She can't finish the sentence. Still trembling.
<div class="choice-container">
<<vchoice "Now it's time for everything" "Kira_Sex_Together" "intimate" "rapid-strikes">>
</div><<advanceTime 0 30>>
<<say $player.name "I need to be inside you.">>
<<showCharacter "kira" "center" "desperate">>
<<performSexAct "position_missionary">>
You position yourself above her. The head of your cock presses against her pussy. Looking into her eyes.
<<say "Kira" "Yes. Please. I need to feel you.">>
<<performSexAct "penetrate">>
You push inside. Slowly. Inch by inch. She's tight, wet, PERFECT. Watching her face as you fill her.
Her mouth falls open. A moan escaping.
<<say "Kira" "Oh fuck— you're— you feel so good—">>
You bottom out. Fully inside her. She wraps her legs around you, holding you there.
<<say "Kira" "Finally. FINALLY.">>
<<performSexAct "thrust_slow">>
You start to move. Slow, deep strokes. Each one making her gasp. Her pussy gripping you like a vice.
<<say "Kira" "Harder— please— I won't break—">>
You increase the pace. The narrow bed creaking beneath you. Her breasts bouncing with each thrust.
This isn't just sex. This is CONNECTION. Every thrust saying what words can't.
<<say "Kira" "I'm close— oh god I'm so close—">>
Your hand finds her clit. Rubbing while you fuck her.
<<sexPhase "climax">>
<<say "Kira" "Yes— YES— I'm—">>
<<performSexAct "climax_together">>
She comes with a CRY, her pussy clenching around your cock in rhythmic pulses. It triggers your own orgasm. You finish DEEP inside her, her name torn from your throat.
You collapse onto her. Both panting. Hearts racing. Still connected.
<<say "Kira" "That was... fuck...">>
<div class="choice-container">
<<vchoice "Aftermath" "Kira_Room_Aftermath" "move" "map">>
</div><<advanceTime 0 30>>
She pulls you up from between her legs. Kisses you, tasting herself on your lips.
<<performSexAct "position_missionary">>
<<say "Kira" "I want all of you. Now.">>
<<storyVideo "story/kiraroom_bed_sex/missionary_climax">>
<<performSexAct "penetrate">>
<<if _storyFamily is "sf_cg_kiraroom_bed_sex_04">>You kneel up between her thighs, push her legs up by the ankles and enter her in one smooth stroke. She's still trembling from her first orgasm, sensitive and swollen.<<else>>You enter her in one smooth stroke. She's still trembling from her first orgasm, sensitive and swollen.<</if>>
<<say "Kira" "Oh FUCK— still so sensitive—">>
<<performSexAct "thrust_slow">>
You move slowly at first. Letting her adjust. Her pussy is gripping you impossibly tight, still fluttering from her orgasm.
But she wants more. Needs more.
<<say "Kira" "Harder— don't hold back—">>
You don't. Picking up speed. Each thrust punching a moan from her throat.
<<performSexAct "thrust_fast">>
The bed SLAMS against the wall. Neither of you cares.
<<say "Kira" "Yes— fuck yes— I'm gonna come again—">>
Already. She's so sensitive. You can feel her building toward another peak.
<<sexPhase "climax">>
<<performSexAct "climax_together">>
She screams this time. A second orgasm ripping through her as you fill her. You finish together, violent and beautiful.
<div class="narrative-video intimate">
<<if $preferences.showVideos>>
<<if !_storyClip>><<showEventMedia "intimate/kira_intense_orgasm">><</if>>
<</if>>
</div>
Two orgasms. She's wrecked. Perfect.
<div class="choice-container">
<<vchoice "Aftermath" "Kira_Room_Aftermath" "move" "map">>
</div><<sexPhase "action">>
<<advanceTime 0 30>>
No awkwardness. No hesitation. You know each other's bodies now.
<<performSexAct "kiss_deep">>
She's already pulling at your clothes, hungry.
<<performSexAct "undress_partial">>
Shirts off. Pants down. Efficient. You know what she likes now.
<<storyVideo "characters/kira/room_sex">>
<<performSexAct "position_doggy">>
She turns around, gets on her hands and knees without being asked. Ass in the air. Looking back at you with dark, hungry eyes.
<<say "Kira" "Come on. Fuck me like you mean it.">>
<<performSexAct "penetrate">>
You grip her hips and slam into her. No gentleness. She doesn't want gentle.
<<say "Kira" "FUCK— yes—">>
<<performSexAct "thrust_fast">>
Hard. Fast. Claiming. Your hips slapping against her ass. The bed SLAMMING against the wall with each thrust.
<div class="narrative-video intimate">
<<if $preferences.showVideos>>
<<if !_storyClip>><<showEventMedia "intimate/kira_doggy_hard">><</if>>
<</if>>
</div>
She's pushing back to meet you. Matching your rhythm. Taking everything you give.
<<say "Kira" "Harder— fuck me harder—">>
You reach forward, grab her hair. Pull her head back. She MOANS.
<<say "Kira" "Oh god yes— like that— I'm gonna—">>
<<sexPhase "climax">>
<<performSexAct "climax_together">>
You both come hard. Her pussy milking your cock. You fill her, buried to the hilt.
She collapses forward onto the bed. You follow, still inside her.
<<say "Kira" "Fuck. Every time.">>
Quick. Intense. Perfect.
<div class="choice-container">
<<vchoice "Aftermath" "Kira_Room_Aftermath" "move" "map">>
</div><<sexPhase "aftermath">>
<<endSexScene>>
<<run VaultUI.setBackground("kira_room")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<<showCharacter "kira" "center" "satisfied">>
<<advanceTime 0 15>>
<<storyVideo "story/kiraroom_bed_sex/afterglow">>
<<if _storyClip is "a75e642c57ca">>Tangled together. Sweat cooling. She lifts a hand toward the ceiling and you meet it, fingers lacing, sliding apart, lacing again.<<else>>Tangled together. Sweat cooling.<</if>>
<<if $companions[0].romanceStage < 2>><<set $companions[0].romanceStage to 2>><</if>>
<<if !$flags.sleptWithKira>>
<<set $flags.sleptWithKira to true>>
Something has shifted. The tension is different now. Not gone, but changed.
<<say "Kira" "That was...">>
<<say $player.name "Yeah.">>
She laughs softly.
<<say "Kira" "Worth the wait.">>
<<relationChange "kira" "trust" 2>>
<<relationChange "kira" "affection" 3>>
<<set $companions[0].tension to Math.max(30, $companions[0].tension - 30)>>
<<else>>
<<say "Kira" "Mmm.">>
She's content. Relaxed in a way you rarely see.
<<relationChange "kira" "affection" 1>>
<</if>>
<div class="choice-container">
<<if $time.phase === "night" || $time.phase === "late_night">>
<<vchoice "Stay the night" "Kira_Room_StayNight" "intimate" "night">>
<<else>>
<<vchoiceDisabled "Stay the night (it isn't night yet)" "intimate" "night">>
<</if>>
<<vchoice "Get dressed" "Kira_Room_GetDressed" "action" "armor">>
</div><<say $player.name "Can I stay?">>
<<showCharacter "kira" "center" "soft">>
<<say "Kira" "I'd like that.">>
You curl up together in the narrow bed. Her body warm against yours.
<<set $flags.sleptInKirasRoom to true>>
<<set $flags.sleptInSameRoom to true>>
<<set $flags.kiraNightDay to $time.day>>
Sleep comes easy.
<div class="choice-container">
<<vchoice "Dream..." "Quarters_Sleep" "move" "night">>
</div><<set $flags.kiraRoomWakeView to true>>
<<goto "Kira_Room">>You get dressed. She watches from the bed.
<<storyVideo "story/kiraroom_bed_sex/after__room_get_dressed">>
<<showCharacter "kira" "center" "content">>
<<say "Kira" "Leaving already?">>
<<say $player.name "Should probably get some rest.">>
<<say "Kira" "...come back anytime.">>
<div class="choice-container">
<<vchoice "Leave" "Vault_Hub" "move" "door-handle">>
</div><<set $lastLocation to "Kira_Talk_Past">>
<<checkIntrusiveThought>>
<<showCharacter "kira" "center" "thoughtful">>
<<advanceTime 0 35>>
<<say "Kira" "My past? Not much to tell.">>
But she continues anyway.
<<say "Kira" "Grew up in a settlement. Small. Everyone knew everyone. Raiders came one night.">>
Her voice is flat.
<<say "Kira" "Me, my sister and Dad were the only ones who made it out.">>
<<if $flags.kiraTalkPastDay !== $time.day>>
<<set $flags.kiraTalkPastDay to $time.day>>
<<relationChange "kira" "trust" 1>>
<</if>>
<div class="choice-container">
<<vchoice "Continue" "Kira_Room" "move" "map">>
</div><<set $lastLocation to "Kira_Talk_Sera">>
<<checkIntrusiveThought>>
<<showCharacter "kira" "center" "sad">>
<<advanceTime 0 40>>
<<say "Kira" "Nell... she saved my life.">>
<<say "Kira" "I kept her alive. Turned out she was keeping me alive.">>
<<say "Kira" "Without her I'd have quit years ago.">>
<<if $flags.seraPhotoSeen>>
<<say "Kira" "That's why I kept her things. It's all I have left of her.">>
<<set $flags.askedAboutSeraPhoto to true>>
<</if>>
<<if $flags.kiraTalkSeraDay !== $time.day>>
<<set $flags.kiraTalkSeraDay to $time.day>>
<<relationChange "kira" "trust" 2>>
<<relationChange "kira" "affection" 1>>
<</if>>
<div class="choice-container">
<<vchoice "Continue" "Kira_Room" "move" "map">>
</div><<set $lastLocation to "Kira_Talk_Vault">>
<<checkIntrusiveThought>>
<<showCharacter "kira" "center" "neutral">>
<<advanceTime 0 15>>
<<say "Kira" "The vault? It's... better than outside.">>
<<say "Kira" "Safe. Mostly. The Groundskeeper is strange, but he doesn't bother me.">>
<<say $player.name "Do you think you'll stay?">>
She pauses.
<<say "Kira" "I don't know. Depends.">>
<<say $player.name "On what?">>
She looks at you.
<<say "Kira" "On whether I have a reason to.">>
<<addTension "kira" 10>>
<div class="choice-container">
<<vchoice "Continue" "Kira_Room" "move" "map">>
</div><<showCharacter "kira" "center" "vulnerable">>
<<say $player.name "About us.">>
<<say "Kira" "Us?">>
<<if $companions[0].affection >= 30>>
<<say "Kira" "There's an 'us'?">>
She's not being sarcastic. She genuinely wants to know.
<div class="choice-container">
<<vchoice "I think there could be" "Kira_AboutUs_Yes" "talk" "broken-heart">>
<<vchoice "If you want there to be" "Kira_AboutUs_Maybe" "talk" "broken-heart">>
</div>
<<else>>
<<say "Kira" "I... don't know if I'm ready for that conversation.">>
<<addTension "kira" 5>>
<div class="choice-container">
<<vchoice "Continue" "Kira_Room" "move" "map">>
</div>
<</if>><<say $player.name "I think there could be.">>
<<showCharacter "kira" "center" "hopeful">>
<<say "Kira" "Yeah?">>
<<say $player.name "Yeah.">>
She smiles. Small, but real.
<<say "Kira" "Okay. Let's... see where this goes.">>
<<relationChange "kira" "affection" 2>>
<<addTension "kira" 10>>
<div class="choice-container">
<<vchoice "Continue" "Kira_Room" "move" "map">>
</div><<say $player.name "If you want there to be.">>
<<showCharacter "kira" "center" "thoughtful">>
<<say "Kira" "I do. I think. It scares me, but... I do.">>
<<relationChange "kira" "affection" 2>>
<<addTension "kira" 8>>
<div class="choice-container">
<<vchoice "Continue" "Kira_Room" "move" "map">>
</div><<showCharacter "kira" "center" "curious">>
<<say "Kira" "About what happened? You'll need to be more specific.">>
<div class="choice-container">
<<if $flags.succubusFirstEncounterComplete>>
<<vchoice "About the succubus" "Kira_AboutEvent_Succubus" "talk" "corruption">>
<</if>>
<<vchoice "About yesterday" "Kira_AboutEvent_Yesterday" "talk" "talk">>
<<vchoice "Never mind" "Kira_Room" "action" "return">>
</div><<showCharacter "kira" "center" "serious">>
<<say "Kira" "The demon. Velith.">>
She says the name carefully.
<<say "Kira" "You know that's not normal, right? Having a succubus mark you?">>
<<say $player.name "I'm aware.">>
<<say "Kira" "And you're... okay with it?">>
<div class="choice-container">
<<vchoice "I don't have a choice" "Kira_Room" "talk" "map">>
<<vchoice "I'm managing" "Kira_Room" "talk" "map">>
</div><<showCharacter "kira" "center" "amused">>
<<say "Kira" "Yesterday was... yesterday. What specifically?">>
<<say $player.name "Just checking in.">>
<<say "Kira" "I'm fine. We're fine.">>
<<relationChange "kira" "affection" 1>>
<div class="choice-container">
<<vchoice "Continue" "Kira_Room" "move" "map">>
</div><<showCharacter "kira" "center" "competitive">>
<<advanceTime 0 45>>
<<say $player.name "Want to spar?">>
She eyes the training dummy.
<<say "Kira" "In here? We'll break something.">>
<<say $player.name "So?">>
She grins. Rare.
<<say "Kira" "Alright. But don't blame me when you get hurt.">>
<<set _heatedSpar to ($companions[0].tension >= 50 && $flags.kiraFlirtedInRoom)>>
<<if _heatedSpar>><<storyVideo "story/kiraroom_kiss/flirt__spar">><</if>>
<<if !_heatedSpar>><<storyVideo "story/kiraroom_kiss/spar_plain">><</if>>
<<if _storyFamily is "sf_cg_kiraroom_kiss_04">>Light sparring turns into wrestling on her bed. Playful. She's holding back.<<else>>Light sparring. Playful. She's holding back.<</if>>
<<if _heatedSpar>>
<<if _storyFamily is "sf_cg_kiraroom_kiss_04">>You end up flat on your back on her bed, her thighs locked round your hips. She drags your shirt up over your head, grinning. Her body pressed against yours.<<else>>You end up pinned against the wall. Her body pressed against yours.<</if>>
<<say "Kira" "I win.">>
Neither of you moves.
<<addTension "kira" 10>>
<div class="choice-container">
<<if setup.kiraRoomKissOpen()>><<vchoice "Kiss her" "Kira_Room_Kiss" "intimate" "lips">><</if>>
<<vchoice "Yield" "Kira_Room" "action" "return">>
</div>
<<else>>
<<relationChange "kira" "affection" 1>>
<div class="choice-container">
<<vchoice "Continue" "Kira_Room" "move" "map">>
</div>
<</if>><<showCharacter "kira" "center" "desperate">>
You enter. Kira is pacing. Agitated.
She turns. Sees you.
<<if $companions[0].trust >= 70>>
<<say "Kira" "Finally. Get over here.">>
No hesitation. She knows what she wants from you.
<<elseif $companions[0].trust >= 50>>
<<say "Kira" "Oh. You.">>
The tension is thick enough to cut.
<<say "Kira" "I've been... thinking.">>
<<else>>
<<say "Kira" "What do you want?">>
Her voice is sharp, but her eyes betray her. The way they drop to your body. Back up.
<<say "Kira" "Never mind. I don't care.">>
<</if>>
<<storyVideo "story/kiraroom_high_tension/kira_room_event_high_tension">>
She crosses to you. Fast.
<<if $companions[0].submission >= 65>>
<<say "Kira" "I need... please. I can't stop thinking about—">>
She trails off, looking almost ashamed of her own desire.
<<elseif $companions[0].submission <= 35>>
<<say "Kira" "Too much thinking. Not enough action.">>
<<if _storyFamily is "sf_cg_kiraroom_high_tension_04">>She grabs your face in both hands, pulling you down to her level.<<else>>She grabs your collar, pulling you down to her level.<</if>>
<<else>>
<<say "Kira" "Too much thinking. Not enough—">>
<</if>>
She doesn't finish. Just grabs you and kisses you hard.
<<addTension "kira" -20>>
<<clampStat "player.lust" 20>>
<div class="choice-container">
<<vchoice "Give her what she needs" "Kira_Event_DespSex" "intimate" "rapid-strikes">>
<<if $player.dominance >= 35>>
<<vchoice "Make her beg for it first" "Kira_Event_DespDom" "dominate" "crown">>
<</if>>
<<if $companions[0].trust >= 60>>
<<vchoice "Slow down... I've got you" "Kira_Event_DespTender" "intimate" "broken-heart">>
<</if>>
<<vchoice "Slow down, talk first" "Kira_Event_TalkFirst" "talk" "talk">>
</div><<sexScene "kira" "desperate" "rough" "kira-room">>
<<advanceTime 0 35>>
No words. Just NEED.
<<performSexAct "kiss_deep">>
The kiss is violent. Teeth clash. She's clawing at your clothes.
<<storyVideo "story/kiraroom_high_tension/desp_tender" "" "characters/kira/room_sex">>
Your shirt tears. Buttons scatter. She doesn't care. Neither do you.
<<performSexAct "undress_partial">>
Her hands are everywhere. Your chest. Your belt. Yanking your pants down.
<<if _storyFamily is "sf_cg_kiraroom_high_tension_04">>You shove her back onto the bed. The pillows go flying.<<else>>You sweep the desk clear with one arm. Papers, her map, weapons oil— everything crashes to the floor.<</if>>
<<showCharacter "kira" "center" "desperate">>
<<if _storyFamily is "sf_cg_kiraroom_high_tension_04">>She falls onto her back and spreads her legs immediately, pulling you between them.<<else>>You lift her onto the desk. She spreads her legs immediately, pulling you between them.<</if>>
<<say "Kira" "Now. I need you NOW. Don't make me fucking wait.">>
<<sexPhase "action">>
<<if _storyFamily is "sf_cg_kiraroom_high_tension_04">><<performSexAct "position_missionary">><<else>><<performSexAct "position_desk">><</if>>
You yank her pants down to her ankles. She's not wearing underwear. Soaked already.
<div class="narrative-video intimate">
<<if $preferences.showVideos>>
<<if !_storyClip>><<showEventMedia "intimate/kira_desk_sex">><</if>>
<</if>>
</div>
<<performSexAct "penetrate">>
You SLAM into her. No buildup. She's wet enough. Desperate enough.
<<say "Kira" "FUCK— YES—">>
<<if _storyFamily is "sf_cg_kiraroom_high_tension_04">>Her head falls back. You fuck her hard on her own bed, the frame scraping across the floor with each brutal thrust.<<else>>Her head falls back. You fuck her hard on her own desk. The furniture scraping across the floor with each brutal thrust.<</if>>
<<performSexAct "thrust_fast">>
<<say "Kira" "Harder— fucking WRECK me—">>
You grip her throat. Not choking. Just holding. Claiming.
She comes IMMEDIATELY from that. Eyes rolling back.
<<say "Kira" "Oh god oh god oh GOD—">>
But you don't stop. Fucking her through her orgasm. Using her.
<<if _storyFamily is "sf_cg_kiraroom_high_tension_04">>The bed is slamming against the wall. Someone will hear. Neither of you cares.<<else>>The desk is slamming against the wall. Someone will hear. Neither of you cares.<</if>>
<<sexPhase "climax">>
<<say "Kira" "Come inside me— fucking fill me—">>
<<performSexAct "climax_together">>
You bury yourself to the hilt and EXPLODE. Filling her. She comes again from feeling you pump into her, screaming.
<<if _storyFamily is "sf_cg_kiraroom_high_tension_04">>A slat in the bed cracks. You both collapse onto the sheets, still joined, panting like animals.<<else>>The desk leg cracks. You both collapse onto it, still joined, panting like animals.<</if>>
No tenderness. Just raw need released.
<<set $flags.sleptWithKira to true>>
<div class="choice-container">
<<vchoice "Aftermath" "Kira_Event_DespAfter" "move" "map">>
</div><<showCharacter "kira" "center" "desperate">>
<<say $player.name "Wait. Talk to me first.">>
<<say "Kira" "I don't want to TALK. I want—">>
<<say $player.name "I know. But talk first.">>
She pulls back, frustrated.
<<say "Kira" "Fine. What?">>
<<say $player.name "What's going on? This isn't like you.">>
<<say "Kira" "I just... the tension. It's too much. Every time you're near me I want to—">>
She stops.
<<say $player.name "Want to what?">>
<<say "Kira" "Fuck you. Claim you. Make sure you're MINE.">>
The admission hangs there.
<<addTension "kira" 10>>
<div class="choice-container">
<<vchoice "I'm already yours" "Kira_Event_DespSex" "intimate" "broken-heart">>
<<vchoice "Then do it" "Kira_Event_DespSex" "intimate" "rapid-strikes">>
</div><<showCharacter "kira" "center" "desperate">>
<<sexScene "kira" "desperate" "dominant" "kira-room">>
<<storyVideo "story/kiraroom_high_tension/desp_dom">>
<<if _storyFamily is "sf_cg_kiraroom_high_tension_04">>You catch her by the hair. Stop her.<<else>>You catch her wrists. Stop her.<</if>>
<<say $player.name "Not yet.">>
<<if $companions[0].submission >= 60>>
Her breath catches. A shiver runs through her.
<<say "Kira" "Please—">>
<<else>>
She tries to push forward, but you hold her firm.
<<say "Kira" "Don't tease me. Not now.">>
<</if>>
<<say $player.name "You want this? Beg.">>
<<if $companions[0].submission >= 70>>
<<if _storyFamily is "sf_cg_kiraroom_high_tension_04">>She drops onto her back on the bed without hesitation, mouth open.<<else>>She drops to her knees without hesitation.<</if>>
<<say "Kira" "Please. I need you. I'll do anything.">>
<<addTension "kira" -10>>
<<set $companions[0].submission += 3>>
<<elseif $companions[0].submission >= 50>>
A moment of resistance. Then she relents.
<<say "Kira" "...Please. I need you inside me.">>
<<set $companions[0].submission += 2>>
<<else>>
She glares at you, but her hips are still pressing forward.
<<say "Kira" "Fuck you. ...Fine. Please.">>
<<set $companions[0].submission += 1>>
<</if>>
<<if _storyFamily is "sf_cg_kiraroom_high_tension_04">>You pin her on her back on the bed, fist her hair and feed her your cock. She takes it to the throat, gagging, spit running down her chin, one hand rubbing between her legs. Then you haul her up onto her hands and knees and keep fucking her face until her eyes water.
<</if>><<say $player.name "Good girl.">>
<div class="choice-container">
<<vchoice "Take her" "Kira_Event_DespSex" "intimate" "rapid-strikes">>
</div><<showCharacter "kira" "center" "vulnerable">>
<<sexScene "kira" "desperate" "tender" "kira-room">>
<<advanceTime 0 40>>
You catch her face in your hands. Gentle.
<<say $player.name "Hey. Slow down. I've got you.">>
<<if $companions[0].affection >= 50>>
Something in her breaks. Not in a bad way. The desperation shifts to something softer.
<<say "Kira" "I just... I needed...">>
<<else>>
She tries to push forward, but you hold her gaze.
<<say "Kira" "I don't need soft. I need—">>
<<say $player.name "I know what you need.">>
<</if>>
You kiss her. Slow this time. Deep.
<<performSexAct "kiss_deep">>
Her hands stop clawing. Start holding.
<<say "Kira" "...okay.">>
<<storyVideo "story/kiraroom_high_tension/desp_tender">>
<<if _storyFamily is "sf_cg_kiraroom_high_tension_04">>You guide her to the bed. Lay her down. She's already bare for you; you take your time with your hands on her anyway.<<else>>You guide her to the bed. Lay her down. Take your time undressing her.<</if>>
<<performSexAct "undress_slow">>
<<say "Kira" "You don't have to—">>
<<say $player.name "I want to.">>
<<if _storyFamily is "sf_cg_kiraroom_high_tension_04">>When you finally slide into her you take your time about it, all the way to the root. Her eyes fall half shut, her mouth drops open, and you watch her face the whole time.<<else>>When you finally slide into her, it's slow. Deliberate. Her eyes never leave yours.<</if>>
<<performSexAct "penetrate">>
<<say "Kira" "Oh...">>
You make love to her. Not fucking. Not desperate rutting. Something more.
<<set $companions[0].affection += 5>>
<<set $companions[0].trust += 3>>
<<addTension "kira" -40>>
<<set $flags.sleptWithKira to true>>
<div class="choice-container">
<<vchoice "..." "Kira_Event_DespTenderAfter" "intimate" "broken-heart">>
</div><<endSexScene>>
<<showCharacter "kira" "center" "vulnerable">>
<<storyVideo "story/kiraroom_high_tension/desp_tender_after__desp_tender_after">>
Afterward, she curls into you. Quiet.
<<say "Kira" "I didn't know I needed that.">>
<<say $player.name "Which part?">>
<<say "Kira" "The... slow part. Someone giving a shit about what I actually need, not just what I'm screaming for.">>
<<if $companions[0].trust >= 70>>
She looks up at you.
<<say "Kira" "Thank you.">>
<<else>>
She doesn't meet your eyes.
<<say "Kira" "Don't get used to me being soft.">>
<</if>>
<div class="choice-container">
<<vchoice "Continue" "Kira_Room" "move" "map">>
</div><<endSexScene>>
<<showCharacter "kira" "center" "satisfied">>
<<storyVideo "story/kiraroom_high_tension/desp_tender_after__desp_after">>
<<if _storyFamily is "sf_cg_kiraroom_high_tension_04">>The sheets are soaked. She's sprawled on her back, slick with sweat, your hand still pinning her wrist above her head, you still moving inside her.<<else>>Papers are everywhere. Her desk is a mess.<</if>>
<<say "Kira" "I needed that.">>
<<say $player.name "I noticed.">>
<<if _storyFamily is "sf_cg_kiraroom_high_tension_04">>She sticks her tongue out at you and laughs, breathless.<<else>>She laughs, breathless.<</if>>
<<set $companions[0].tension to Math.max(20, $companions[0].tension - 40)>>
<<relationChange "kira" "affection" 2>>
<div class="choice-container">
<<vchoice "Continue" "Kira_Room" "move" "map">>
</div><<showCharacter "kira" "center" "shocked">>
You open the door without knocking.
Kira is on the bed. Hand between her legs. Eyes closed.
<<storyVideo "story/kiraroom_masturbating/kira_room_event_masturbating">>
<<if _storyFamily is "sf_cg_kiraroom_masturbating_04">>She doesn't hear you at first. Her hand slides up under her tank, over her tits, then back down her bare belly and between her legs. Then her eyes open, and she freezes.<<else>>She freezes when she hears you.<</if>>
<<if $companions[0].trust >= 70>>
Her face flushes, but she doesn't cover up immediately.
<<say "Kira" "Shit— I was just—">>
She looks embarrassed, but not ashamed. Not with you.
<<elseif $companions[0].trust >= 50>>
<<say "Kira" "Oh god— I didn't—">>
Her face is crimson. She grabs the sheet to cover herself.
<<else>>
<<say "Kira" "What the FUCK?! Ever heard of knocking?!">>
She yanks the covers over herself, furious and mortified.
<</if>>
<<clampStat "player.lust" 30>>
<<addTension "kira" 20>>
<div class="choice-container">
<<if $companions[0].trust >= 60>>
<<vchoice "Don't stop on my account" "Kira_Event_WatchMast" "intimate" "search">>
<</if>>
<<if $companions[0].trust >= 50>>
<<vchoice "Want help with that?" "Kira_Event_HelpMast" "intimate" "grab">>
<</if>>
<<if $player.dominance >= 40>>
<<vchoice "Don't stop. That's an order." "Kira_Event_WatchMastDom" "dominate" "crown">>
<</if>>
<<if $companions[0].submission >= 60 && $companions[0].trust >= 50>>
<<vchoice "Were you thinking about me?" "Kira_Event_MastConfess" "intimate" "talk">>
<</if>>
<<vchoice "Sorry, I'll leave" "Kira_Event_MastLeave" "action" "door-handle">>
</div><<say $player.name "Don't stop on my account.">>
<<showCharacter "kira" "center" "aroused">>
<<say "Kira" "You want to WATCH?">>
<<say $player.name "Yeah. Keep going. Show me.">>
She swallows hard. Then slowly, deliberately, her hand moves again between her legs.
<<storyVideo "story/kiraroom_masturbating/watch_mast__watch_mast">>
<<performSexAct "masturbate_partner">>
<<if _storyFamily is "sf_cg_kiraroom_masturbating_04">>She props herself up, knees wide, the lilac slip she sleeps in rucked up around her hips. Her eyes flick to yours as she touches herself. Two fingers sliding through her wetness, circling her clit.<<else>>Her eyes lock with yours as she touches herself. Two fingers sliding through her wetness, circling her clit.<</if>>
<<say "Kira" "Is this what you want to see?">>
Her voice is thick with arousal and shame and HEAT.
<<say $player.name "Yes. Don't look away from me.">>
<<if _storyFamily is "sf_cg_kiraroom_masturbating_04">>She tries. Her eyes keep sliding shut and her head tips back, mouth open, and every time she drags them back to you she's a little further gone. It's filthy, and she knows exactly how good she looks doing it.<<else>>She doesn't. Maintaining eye contact as she pleasures herself. It's obscene. It's beautiful.<</if>>
Her breathing gets heavier. Her fingers moving faster. Spreading herself so you can see everything.
<<say "Kira" "I'm thinking about you when I do this. Always you.">>
<<clampStat "player.lust" 20>>
<div class="choice-container">
<<vchoice "Watch her finish" "Kira_Event_WatchFinish" "intimate" "search">>
<<vchoice "Replace her fingers with yours" "Kira_Event_HelpMast" "intimate" "lips">>
</div><<say $player.name "Come for me. I want to watch you come.">>
<<showCharacter "kira" "center" "desperate">>
<<performSexAct "masturbate_partner">>
<<storyVideo "story/kiraroom_masturbating/watch_mast_dom_beg">>
Her fingers work frantically now. Rubbing her clit in tight circles. Her other hand pinching her nipple.
The performance is for you. Every moan. Every gasp. She's giving you a SHOW.
<div class="narrative-video intimate">
<<if $preferences.showVideos>>
<<if !_storyClip>><<showEventMedia "intimate/kira_masturbate_orgasm">><</if>>
<</if>>
</div>
<<say "Kira" "Oh god— I'm— watching me makes you hard doesn't it—">>
<<say $player.name "So fucking hard.">>
<<say "Kira" "Good— oh FUCK I'm coming—">>
<<performSexAct "climax_partner">>
She comes HARD. Back arching off the bed. Thighs clamping around her own hand. Your name screamed to the ceiling.
Her pussy pulses, visible wetness coating her fingers. She doesn't stop touching herself, riding it out, whimpering from oversensitivity.
<<if _storyFamily is "sf_cg_kiraroom_masturbating_04">>Finally she collapses. Chest heaving. You kneel on the bed, drag two fingers through the mess she's made and push them into her mouth. She sucks them without opening her eyes.<<else>>Finally she collapses. Chest heaving. Fingers still between her legs.<</if>>
<<say "Kira" "Did you... enjoy the show?">>
<<say $player.name "Fuck yes.">>
<<addTension "kira" -15>>
<<relationChange "kira" "affection" 2>>
<<clampStat "player.lust" 15>>
<div class="choice-container">
<<vchoice "Your turn now" "Kira_Event_MutualMast" "intimate" "rapid-strikes">>
<<vchoice "That was beautiful" "Kira_Room" "talk" "broken-heart">>
</div><<say $player.name "Want help with that?">>
<<showCharacter "kira" "center" "desperate">>
<<say "Kira" "Please. God, please.">>
You cross to the bed. She moves her hand. Lets you take over.
<<storyVideo "story/kiraroom_masturbating/watch_mast_dom_beg">>
<<performSexAct "touch_intimate">>
Your fingers slide through her wetness. She's SOAKED. Dripping onto the sheets.
<<say "Kira" "Oh fuck— your fingers— they're bigger—">>
You slide two inside her. She cries out, hips bucking up.
<<performSexAct "touch_intimate">>
You finger her with purpose. Curling to hit her G-spot. Your thumb finding her clit.
<<say "Kira" "Right there— don't stop— FUCK don't stop—">>
She's already close. You can feel her pussy starting to clench.
You add a third finger. Stretching her. Thumb working her clit in circles.
<div class="narrative-video intimate">
<<if $preferences.showVideos>>
<<if !_storyClip>><<showEventMedia "intimate/kira_fingered_orgasm">><</if>>
<</if>>
</div>
<<say "Kira" "I'm gonna— oh god oh FUCK—">>
<<performSexAct "climax_partner">>
She EXPLODES on your hand. Pussy clamping down on your fingers, wetness gushing. You keep fingering her through it, brutal and perfect.
She's shaking, thighs clamping around your wrist, riding your hand.
<<if _storyFamily is "sf_cg_kiraroom_masturbating_04">>Finally she goes limp. Panting. You pull your fingers out of her and push them into her mouth. She sucks them clean, moaning, eyes closed, holding your wrist there.<<else>>Finally she goes limp. Panting. Your fingers still inside her.<</if>>
<<say "Kira" "Holy... fuck...">>
<<addTension "kira" -10>>
<<clampStat "player.lust" 25>>
<div class="choice-container">
<<vchoice "She should return the favor" "Kira_Event_ReturnFavor" "intimate" "lips">>
<<vchoice "That was enough" "Kira_Room" "talk" "map">>
</div><<say "Kira" "Your turn.">>
Still catching her breath, she sits up, eyes on your cock, rock hard against the front of your pants.
<<performSexAct "undress_partial">>
<<storyVideo "story/kiraroom_masturbating/mutual_mast" "kira-returnfavor-video" "characters/kira/room_blowjob">>
<<if _storyFamily is "sf_cg_kiraroom_masturbating_04">>You shove your jeans open. She reaches over, wraps her hand around your cock and pulls it free, hard and aching.<<else>>She pulls your pants down. Your cock springs free, hard and aching.<</if>>
<<say "Kira" "Fair is fair. And I owe you.">>
<<performSexAct "oral_receive">>
She takes you in her mouth. No hesitation. No teasing. Just hungry, grateful service.
Her tongue works your shaft. Hand stroking what doesn't fit. She's GOOD at this.
<<say $player.name "Fuck— just like that—">>
She moans around you, the vibration making your toes curl.
She takes you deeper. Gagging slightly but not stopping. Determined to make you feel as good as you made her feel.
<div class="narrative-video intimate">
<<if $preferences.showVideos>>
<<if !_storyClip>><<showEventMedia "intimate/kira_blowjob">><</if>>
<</if>>
</div>
<<if _storyClip is "d922c3f587f0">>She's on all fours on the bed, ass in the air. You reach over her back and push two fingers into her cunt. She's soaked, and she grinds back onto your hand without once letting your cock out of her mouth.<<else>>Her hand cups your balls. Gentle pressure. Her mouth working faster.<</if>>
<<say $player.name "I'm close— Kira—">>
<<if _storyClip is "d922c3f587f0">>You fist her hair and hold her down on you. She lets you. She gags, spit running off her chin, and keeps going.<<else>>She doubles down. Sucking harder. Wanting it.<</if>>
<<performSexAct "climax_player">>
<<if _storyClip is "93b0caad2a9e">>You come with a groan, flooding her mouth. She doesn't swallow yet. She opens wide to show you, tongue white with it, eyes laughing up at you, then goes back down and sucks you clean, slow and thorough.
<span id="kira-returnfavor-after-climax"></span><<done>><<run $('[id="kira-returnfavor-video"]').last().insertAfter('#kira-returnfavor-after-climax')>><</done>><<else>>You come with a groan. Flooding her mouth. She swallows it all, throat working, not spilling a drop.<</if>>
She pulls off with a wet pop. Licks her lips.<<if _storyClip is "d922c3f587f0">>
Then she drops flat on her stomach. Done.<</if>>
<<say "Kira" "Mmm. You taste good.">>
<<addTension "kira" -15>>
<<relationChange "kira" "affection" 2>>
<div class="choice-container">
<<vchoice "Catch your breath" "Kira_Room" "move" "map">>
</div><<say $player.name "My turn now.">>
<<showCharacter "kira" "center" "interested">>
You undress. She watches, still flushed from her orgasm.
<<performSexAct "masturbate_player">>
<<say "Kira" "Show me.">>
<<storyVideo "story/kiraroom_masturbating/mutual_mast">>
<<if _storyFamily is "sf_cg_kiraroom_masturbating_04">>You stroke yourself while she watches. Turnabout. It lasts about five strokes. She reaches over, knocks your hand away and takes over, pumping you slow.<<else>>You stroke yourself while she watches. Turnabout.<</if>>
<<if _storyFamily is "sf_cg_kiraroom_masturbating_04">><<performSexAct "oral_receive">><</if>>
<<say "Kira" "You look good like that. Desperate.">>
<<performSexAct "climax_player">>
<<if _storyFamily is "sf_cg_kiraroom_masturbating_04">>She sits up and swallows your cock. You finish in her mouth, her eyes on yours the whole time.<<else>>You finish under her gaze.<</if>>
<<addTension "kira" -20>>
<<relationChange "kira" "affection" 2>>
<div class="choice-container">
<<vchoice "Continue" "Kira_Room" "move" "map">>
</div><<showCharacter "kira" "center" "shocked">>
<<say $player.name "Don't stop. That's an order.">>
<<storyVideo "story/kiraroom_masturbating/watch_mast__watch_mast_dom">>
<<if $companions[0].submission >= 60>>
A visible shiver runs through her. Her hand hesitates... then moves again.
<<say "Kira" "Y-yes...">>
<<else>>
<<say "Kira" "You can't just—">>
<<say $player.name "I can. And I am. Keep going.">>
A long pause. Then her hand moves, slower than before, but moving.
<</if>>
Her eyes are locked on yours now. Defiant but obeying.
<<say $player.name "Eyes on me. Don't stop until I tell you to.">>
<<performSexAct "masturbate_partner">>
<<set $companions[0].submission += 2>>
<<clampStat "player.lust" 15>>
She works herself under your gaze, her breathing getting heavier. The humiliation seems to turn her on more.
<<if $companions[0].submission >= 70>>
<<say "Kira" "Please... can I come? I need to come.">>
<<else>>
<<say "Kira" "I hate that you're making me— oh fuck—">>
<</if>>
<div class="choice-container">
<<vchoice "Make her beg more" "Kira_Event_WatchMastDomBeg" "dominate" "crown">>
<<vchoice "Let her finish" "Kira_Event_WatchFinish" "intimate" "check">>
</div><<showCharacter "kira" "center" "desperate">>
<<say $player.name "You want to come? Convince me.">>
<<if $companions[0].submission >= 65>>
Her pride crumbles beautifully.
<<say "Kira" "Please— I need it— I'll do anything— please let me come for you—">>
<<else>>
She glares at you, but her hand never stops.
<<say "Kira" "Please. I'm asking nicely. Let me finish.">>
<</if>>
<<say $player.name "Good girl. Come.">>
<<storyVideo "story/kiraroom_masturbating/watch_mast_dom_beg">>
<<performSexAct "climax_partner">>
<<if _storyFamily is "sf_cg_kiraroom_masturbating_04">>She comes HARD on command. The power exchange making it more intense. You rub your fingers through her soaked pussy while she shakes, then push them into her mouth. She sucks them clean, like she's been told to.<<else>>She comes HARD on command. The power exchange making it more intense.<</if>>
<<set $companions[0].submission += 3>>
<<addTension "kira" -20>>
<div class="choice-container">
<<vchoice "Continue" "Kira_Room" "move" "map">>
</div><<showCharacter "kira" "center" "flushed">>
<<say $player.name "Were you thinking about me?">>
<<storyVideo "story/kiraroom_masturbating/mast_confess">>
<<if $companions[0].affection >= 60>>
She meets your eyes. Honest.
<<say "Kira" "...Yes. I always think about you.">>
<<elseif $companions[0].trust >= 55>>
She looks away, embarrassed.
<<say "Kira" "Maybe. Sometimes. Shut up.">>
<<else>>
<<say "Kira" "That's none of your business.">>
But her blush says everything.
<</if>>
<<say $player.name "What were you imagining?">>
<<if $companions[0].submission >= 55>>
<<say "Kira" "You... taking me. Using me. Not asking permission.">>
<<elseif $companions[0].affection >= 55>>
<<say "Kira" "Us. Together. Like last time but... slower.">>
<<else>>
<<say "Kira" "I'm not telling you that.">>
<</if>>
<<if _storyFamily is "sf_cg_kiraroom_masturbating_04">>She dragged her panties back on when you walked in. Her hand has been back inside them the whole time she's been talking. Then she gives up, lifts her legs, peels them off over her feet and dangles them at you, grinning.
<</if>>
<<addTension "kira" 10>>
<<clampStat "player.lust" 10>>
<div class="choice-container">
<<vchoice "Make it real" "Kira_Event_HelpMast" "intimate" "grab">>
<<vchoice "Tell me more" "Kira_Event_MastConfessMore" "talk" "talk">>
</div><<showCharacter "kira" "center" "aroused">>
<<say $player.name "I want to hear all of it.">>
<<storyVideo "story/kiraroom_masturbating/watch_mast__mast_confess_more">>
She hesitates. Then starts talking, her hand moving slowly between her legs again.
<<if $companions[0].submission >= 60>>
<<say "Kira" "I imagine you pinning me down. Making me take it. Making me beg.">>
<<elseif $companions[0].affection >= 60>>
<<say "Kira" "I imagine waking up next to you. Morning sex. Lazy and sweet.">>
<<else>>
<<say "Kira" "I imagine shutting you up. Using your mouth. Making YOU beg.">>
<</if>>
<<clampStat "player.lust" 15>>
<<addTension "kira" 15>>
<div class="choice-container">
<<vchoice "Show me" "Kira_Event_HelpMast" "intimate" "rapid-strikes">>
</div><<say $player.name "Sorry, I'll leave.">>
<<showCharacter "kira" "center" "embarrassed">>
<<storyVideo "story/kiraroom_masturbating/mast_leave">>
<<if $companions[0].trust >= 60>>
<<say "Kira" "Wait—">>
<<if _storyFamily is "sf_cg_kiraroom_masturbating_04">>She stops herself. Laughs, red to the ears, and shakes her head.<<else>>She stops herself. Shakes her head.<</if>>
<<say "Kira" "Never mind. Go.">>
<<else>>
<<say "Kira" "Yeah. Please.">>
<</if>>
You close the door quickly.
<<addTension "kira" 10>>
<div class="choice-container">
<<vchoice "Leave" "Vault_Hub" "move" "door-handle">>
</div><<showCharacter "kira" "center" "flushed">>
<<storyVideo "story/kiraroom_corruption/kira_room_event_corruption">>
<<if _storyFamily is "sf_cg_kiraroom_corruption_04">>Kira is painting her lips by candlelight when you come in and drop into the chair at her table. She touches her hair, glances back at you over her shoulder. Then she stares.<<else>>When you enter, Kira stares at you.<</if>>
<<if $companions[0].trust >= 70>>
<<say "Kira" "You're doing it again. That... thing.">>
She knows you. Knows when the darkness is rising.
<<elseif $companions[0].trust >= 50>>
<<say "Kira" "There's something... different about you today.">>
She can't look away.
<<else>>
<<say "Kira" "What the hell is wrong with your eyes?">>
<<if _storyFamily is "sf_cg_kiraroom_corruption_04">>She turns a shoulder to you and watches you sidelong, the way she'd watch a stray dog she isn't sure will bite.<<else>>She takes a half-step back. Uncertain.<</if>>
<</if>>
<<say "Kira" "Your eyes. They're...">>
The corruption is showing. Just slightly. Enough to mesmerize her.
<<if $player.corruption >= 50>>
Purple light pulses in your irises. Visible. Hungry.
<<if $companions[0].submission >= 60>>
<<say "Kira" "Whatever you're becoming... I think I want it to claim me.">>
<<else>>
<<say "Kira" "What the fuck ARE you?">>
But she's not running. She's drawn closer.
<</if>>
<<elseif $player.corruption >= 40>>
Purple flickers at the edges of your irises. She sees it.
<<if $companions[0].trust >= 60>>
<<say "Kira" "I should be scared. Why am I not scared?">>
<<else>>
<<say "Kira" "What are you becoming?">>
<</if>>
But she's not scared. She's AROUSED.
<<else>>
Something in your gaze is... off. She feels it more than sees it.
<<say "Kira" "Are you okay? You look...">>
<</if>>
<<addTension "kira" 15>>
<<clampStat "player.lust" 20>>
<div class="choice-container">
<<vchoice "Use the effect" "Kira_Event_CorruptSeduce" "intimate" "corruption">>
<<if $player.corruption >= 45>>
<<vchoice "Let it consume her" "Kira_Event_CorruptConsume" "supernatural" "terror">>
<</if>>
<<if $companions[0].trust >= 65>>
<<vchoice "Help me fight it" "Kira_Event_CorruptTogether" "talk" "broken-heart">>
<</if>>
<<vchoice "Fight it down" "Kira_Event_CorruptResist" "action" "armor">>
</div>You let the corruption show. Stop hiding it. Let her see what you're becoming.
<<showCharacter "kira" "center" "entranced">>
Purple light flickers in your eyes. Growing brighter. Your skin feels hot.
<<say "Kira" "I should be scared. But I'm not.">>
She steps closer, drawn like a moth to flame. Unable to resist.
<<say "Kira" "Do it. Whatever you want to do. I need to feel it.">>
<<performSexAct "dark_allure_partner">>
Your supernatural allure WASHES over her like a wave. She gasps, legs going weak.
<<say "Kira" "Oh fuck— what IS that—">>
Dark energy. Seductive. Corrupting.
<<sexScene "kira" "supernatural" "intense" "kira-room">>
What follows is different from your other encounters. There's POWER in it. Dark power.
<<sexPhase "action">>
<<storyVideo "story/kiraroom_corruption/corrupt_consume__corrupt_consume" "" "characters/kira/room_corrupt_seduce">>
<<if _storyFamily is "sf_cg_kiraroom_corruption_04">><<performSexAct "position_cowgirl">><<else>><<performSexAct "position_missionary">><</if>>
<<if _storyFamily is "sf_cg_kiraroom_corruption_04">>You carry her to the bed and drop her on it, climb over her and push your cock into her mouth from above. She's trembling, and it isn't fear. It's NEED. Then she wriggles out from under you, climbs on with her back to you and sinks down.<<else>>You lay her on the bed. She's trembling. Not from fear. From NEED.<</if>>
<<performSexAct "penetrate">>
<<if _storyClip is "3d8804958a9e">>You enter her, your hand closing around her throat. Purple energy crackles where your bodies join.<<elseif _storyFamily is "sf_cg_kiraroom_corruption_04">>She sinks all the way down, taking you deep in her ass. Purple energy crackles where your bodies join.<<else>>You enter her. Purple energy crackles where your bodies join.<</if>>
<div class="narrative-video intimate">
<<if $preferences.showVideos>>
<<if !_storyClip>><<showEventMedia "intimate/corruption_sex">><</if>>
<</if>>
</div>
<<if _storyFamily is "sf_cg_kiraroom_corruption_04">><<say "Kira" "I can't even see you— I can FEEL you glowing— oh god it feels—">><<else>><<say "Kira" "Your eyes— they're GLOWING— oh god it feels—">><</if>>
The corruption flows from you into her with each thrust. She can FEEL it. Dark tendrils of energy seeping into her.
<<performSexAct "thrust_fast">>
<<if _storyFamily is "sf_cg_kiraroom_corruption_04">>She rides you harder. The room darkens. Purple light pulsing with your heartbeat.<<else>>You fuck her harder. The room darkens. Purple light pulsing with your heartbeat.<</if>>
<<say "Kira" "Yes— corrupt me— make me like you— I don't care—">>
She's begging for it. Begging to be CHANGED.
<<performSexAct "corruption_transfer">>
<<say $player.name "You're mine now. Body and soul.">>
<<say "Kira" "Yes— YOURS— fuck YOURS—">>
<<sexPhase "climax">>
<<performSexAct "climax_together">>
You both come VIOLENTLY. Purple energy EXPLODES between you. The corruption flooding into her.
<<if _storyFamily is "sf_cg_kiraroom_corruption_04">>Purple light flashes through her as she comes. Changed. Corrupted.<<else>>Her eyes flash purple for just a moment as she comes. Changed. Corrupted.<</if>>
<<if _storyFamily is "sf_cg_kiraroom_corruption_04">>She collapses back against your chest. Both glowing faintly with residual energy.<<else>>You collapse onto her. Both glowing faintly with residual energy.<</if>>
<<addCorruption 3>>
<<addCorruption 5 "kira">>
<<set $flags.sleptWithKira to true>>
<div class="choice-container">
<<vchoice "Aftermath" "Kira_Event_CorruptAfter" "move" "map">>
</div><<endSexScene>>
<<showCharacter "kira" "center" "changed">>
<<storyVideo "story/kiraroom_corruption/corrupt_after">>
<<if _storyFamily is "sf_cg_kiraroom_corruption_04">>She's face-down in the sheets, hair soaked and stuck to her face, still shuddering with the last of it. Then she lifts her hands and looks at them.<<else>>She's breathing hard. Looking at her hands.<</if>>
<<say "Kira" "I felt... something. Power.">>
<<say $player.name "The corruption. It affected you too.">>
<<say "Kira" "I don't mind.">>
She meets your eyes. Unafraid.
<<relationChange "kira" "affection" 2>>
<<set $flags.kiraCorrupted to true>>
<div class="choice-container">
<<vchoice "Continue" "Kira_Room" "move" "map">>
</div><<showCharacter "kira" "center" "entranced">>
<<sexScene "kira" "supernatural" "consuming" "kira-room">>
You stop fighting. Let the darkness FLOOD through you.
<<say $player.name "Come here.">>
Your voice is layered. Echoing with something inhuman.
<<if $companions[0].submission >= 65>>
She walks to you without hesitation. Offering herself.
<<say "Kira" "Take me. Whatever you are now. Take me.">>
<<else>>
She tries to resist. Fails. Her legs carry her to you against her will.
<<say "Kira" "What are you doing to me— I can't—">>
<</if>>
<<storyVideo "story/kiraroom_corruption/corrupt_consume__corrupt_consume">>
<<if _storyFamily is "sf_cg_kiraroom_corruption_04">>Purple energy crackles around you both as you take her. Roughly. Possessively. You carry her to the bed, climb over her and fuck her mouth from above. Then she crawls on top, back to you, and sinks down, taking you deep in her ass.<<else>>Purple energy crackles around you both as you take her. Roughly. Possessively.<</if>>
<<performSexAct "corruption_claim">>
<<if _storyFamily is "sf_cg_kiraroom_corruption_04">>The corruption doesn't just seep into her. It DEVOURS. She comes screaming, squirting all over you.<<else>>The corruption doesn't just seep into her. It DEVOURS.<</if>>
<<if $companions[0].trust >= 60>>
<<say "Kira" "Yes— more— make me YOURS—">>
<<else>>
<<say "Kira" "Stop— don't— oh god don't STOP—">>
<</if>>
<<addCorruption 5>>
<<addCorruption 10 "kira">>
<<set $companions[0].submission += 5>>
<<set $flags.sleptWithKira to true>>
<div class="choice-container">
<<vchoice "Claim her completely" "Kira_Event_CorruptAfter" "supernatural" "crown">>
</div><<showCharacter "kira" "center" "concerned">>
<<say $player.name "Help me. It's getting stronger.">>
<<if $companions[0].affection >= 60>>
She's at your side immediately. Hands on your face.
<<say "Kira" "I'm here. Focus on me. Just me.">>
<<else>>
She hesitates, then moves closer.
<<say "Kira" "What do I do? How do I help?">>
<</if>>
You close your eyes. Focus on her voice. Her touch. Something HUMAN to anchor to.
<<say $player.name "Just... stay. Talk to me.">>
<<if $companions[0].trust >= 75>>
She holds you. Tightly.
<<say "Kira" "You're not a monster. Whatever this is, we'll figure it out together.">>
<<set $companions[0].affection += 3>>
<<set $companions[0].trust += 2>>
<<else>>
<<say "Kira" "I don't know what you're becoming. But I'm not leaving.">>
<<set $companions[0].trust += 3>>
<</if>>
The purple fades from your eyes. Slowly. The warmth of her presence pushing the darkness back.
<<addCorruption -2>>
<div class="choice-container">
<<vchoice "Thank her" "Kira_Room" "talk" "broken-heart">>
</div>You force the corruption down. Hide it.
<<showCharacter "kira" "center" "confused">>
<<if $companions[0].trust >= 60>>
<<say "Kira" "I saw it. Don't pretend I didn't.">>
<<say $player.name "I know. I'm... working on it.">>
<<say "Kira" "We can talk about it. When you're ready.">>
<<else>>
<<say "Kira" "It's gone. What was that?">>
<<say $player.name "Nothing. Just tired.">>
She doesn't believe you. But she doesn't push.
<</if>>
<div class="choice-container">
<<vchoice "Continue" "Kira_Room" "move" "map">>
</div><<showCharacter "kira" "center" "submissive">>
You enter and close the door. The click is final.
<<say $player.name "On the bed. Now.">>
<<storyVideo "story/kiraroom_dominance/kira_room_event_dominance">>
Your voice has AUTHORITY. Command.
<<if $companions[0].submission >= 70>>
<<if _storyFamily is "sf_cg_kiraroom_dominance_04">>She moves immediately. No hesitation. Sits on the edge of the bed in her sheer black bra and garter belt, eyes down, and rolls on the black stockings you laid out, one leg, then the other.<<else>>She moves immediately. No hesitation. Sits on the bed, eyes down.<</if>>
<<say "Kira" "Yes.">>
The word is soft. Eager.
<<elseif $companions[0].submission >= 55>>
Kira's eyes widen. Then she obeys.
<<say "Kira" "What are you—">>
<<say $player.name "Quiet.">>
She closes her mouth. Watching. Waiting.
<<else>>
She doesn't move immediately. Challenges you with her eyes.
<<say "Kira" "And if I don't?">>
<<say $player.name "Then I'll put you there myself.">>
A heartbeat. Then she moves to the bed. Testing you, but not refusing.
<</if>>
<<set $player.dominance += 5>>
<<addTension "kira" 10>>
<div class="choice-container">
<<vchoice "Make her strip slowly" "Kira_Event_DomStrip" "intimate" "armor">>
<<vchoice "Take control completely" "Kira_Event_DomClaim" "intimate" "crown">>
<<if $companions[0].submission >= 60>>
<<vchoice "Test her submission" "Kira_Event_DomTest" "dominate" "crown">>
<</if>>
<<if $companions[0].trust >= 65>>
<<vchoice "I've got you. Trust me." "Kira_Event_DomTender" "intimate" "broken-heart">>
<</if>>
<<if $companions[0].submission <= 40 && $companions[0].trust >= 50>>
<<vchoice "Let her challenge you" "Kira_Event_DomReverse" "intimate" "rapid-strikes">>
<</if>>
</div><<say $player.name "Strip. Slowly.">>
<<storyVideo "story/kiraroom_dominance/dom_strip__dom_strip">>
<<showCharacter "kira" "center" "submissive">>
<<if _storyFamily is "sf_cg_kiraroom_dominance_04">><<else>><<performSexAct "undress_partner_slow">><</if>>
<<if _storyFamily is "sf_cg_kiraroom_dominance_04">>She obeys. There's barely anything left on her to take off, so she shows herself off instead, piece by piece: turns to the mirror, bends, lets you look at her ass in the thong and garters, buckles a black choker around her throat. Her eyes find yours in the mirror.<<else>>She obeys. Piece by piece. Her eyes never leaving yours.<</if>>
<<say "Kira" "Like this?">>
<<say $player.name "Slower.">>
She's shaking slightly. Aroused by the control.
<<clampStat "player.lust" 20>>
<<set $companions[0].submission += 5>>
<div class="choice-container">
<<vchoice "Make her touch herself" "Kira_Event_DomTouch" "intimate" "grab">>
<<vchoice "Take her now" "Kira_Event_DomClaim" "intimate" "rapid-strikes">>
</div><<say $player.name "Touch yourself. Show me.">>
<<showCharacter "kira" "center" "aroused">>
She hesitates only a moment. Then her hand moves between her legs.
<<performSexAct "masturbate_partner">>
<<say "Kira" "Is this what you want?">>
<<say $player.name "Faster.">>
She obeys. Her breathing quickens.
<<say $player.name "Stop.">>
She stops immediately, whimpering.
<<say $player.name "Good girl.">>
The words make her moan.
<div class="choice-container">
<<vchoice "Let her finish" "Kira_Event_DomAllow" "intimate" "check">>
<<if !setup.sceneHidden("kiraBeg")>><<vchoice "Deny her release" "Kira_Event_DomDeny" "intimate" "check">><</if>>
<<vchoice "Finish her yourself" "Kira_Event_DomFinish" "intimate" "rapid-strikes">>
</div><<say $player.name "Finish. But keep your eyes on me.">>
<<storyVideo "story/kiraroom_dominance/dom_allow__dom_allow">>
<<performSexAct "masturbate_partner">>
<<if _storyFamily is "sf_cg_kiraroom_dominance_04">>You push her onto her back, one stockinged leg up over your shoulder, and fuck her ass while she touches herself, staring into your eyes. Submissive. Obedient.<<else>>She touches herself while staring into your eyes. Submissive. Obedient.<</if>>
<<if _storyFamily is "sf_cg_kiraroom_dominance_04">><<set $flags.sleptWithKira to true>><</if>>
<<performSexAct "climax_partner">>
<<say "Kira" "Oh god— thank you—">>
She comes hard, thanking you for PERMISSION.
<<set $companions[0].submission += 8>>
<div class="choice-container">
<<vchoice "Continue" "Kira_Room" "move" "map">>
</div><<say $player.name "No. Not yet.">>
<<showCharacter "kira" "center" "desperate">>
<<say "Kira" "Please—">>
<<say $player.name "I said no.">>
She whimpers but obeys. Denied.
<<addTension "kira" 20>>
<<set $companions[0].submission += 10>>
<<set $flags.kiraDenied to true>>
<<say "Kira" "You're cruel.">>
But there's heat in her voice.
<div class="choice-container">
<<vchoice "Maybe later" "Kira_Room" "talk" "map">>
</div><<say $player.name "I'll finish you. But only because you obeyed.">>
<<storyVideo "story/kiraroom_dominance/dom_allow__dom_allow">>
<<if _storyFamily is "sf_cg_kiraroom_dominance_04">><<performSexAct "penetrate">><<else>><<performSexAct "touch_intimate">><</if>>
<<if _storyFamily is "sf_cg_kiraroom_dominance_04">><<set $flags.sleptWithKira to true>><</if>>
<<if _storyFamily is "sf_cg_kiraroom_dominance_04">>You don't replace her fingers. You push her onto her back, hook one stockinged leg up and slide your cock into her ass. She gasps at the stretch.<<else>>Your fingers replace hers. She gasps at the contact.<</if>>
<<if _storyFamily is "sf_cg_kiraroom_dominance_04">>You're not gentle. Deep strokes into her ass while her fingers work her pussy. She's SOAKED.<<else>>You're not gentle. Two fingers plunging into her wetness. She's SOAKED.<</if>>
<<if _storyFamily is "sf_cg_kiraroom_dominance_04">><<performSexAct "thrust_deep">><<else>><<performSexAct "touch_intimate">><</if>>
<<if _storyFamily is "sf_cg_kiraroom_dominance_04">>You fuck her ass ruthlessly, holding her leg up and open. She stares up at you, mouth open, rubbing her clit in frantic circles.<<else>>You finger-fuck her ruthlessly. Curling to hit her G-spot with each thrust. Your other hand pinning her wrist above her head.<</if>>
<<say "Kira" "Oh fuck oh fuck oh FUCK—">>
<<if _storyFamily is "sf_cg_kiraroom_dominance_04">>She's writhing, trying to close her legs. You force them open with your hand.<<else>>She's writhing, trying to close her legs. You force them open with your knee.<</if>>
<<if _storyFamily is "sf_cg_kiraroom_dominance_04">><<performSexAct "thrust_hard">><<else>><<performSexAct "finger_penetrate">><</if>>
<<if _storyFamily is "sf_cg_kiraroom_dominance_04">>You bottom out in her ass and hold there, stretching her, while her fingers grind frantic circles on her clit.<<else>>Three fingers now. Stretching her. Your thumb grinding against her clit.<</if>>
<<say "Kira" "Please— I can't— it's too much— please let me—">>
<<say $player.name "Not yet. Hold it.">>
She WHIMPERS. Trying to obey. Trying not to come without permission.
<<if _storyFamily is "sf_cg_kiraroom_dominance_04">>You can feel her ass fluttering around your cock. Right on the edge. Begging for release.<<else>>You can feel her pussy fluttering. Right on the edge. Begging for release.<</if>>
<div class="narrative-video intimate">
<<if $preferences.showVideos>>
<<if !_storyClip>><<showEventMedia "intimate/kira_edged_orgasm">><</if>>
<</if>>
</div>
<<say $player.name "Now. Come for me NOW.">>
<<performSexAct "climax_partner">>
Permission granted. She DETONATES.
<<if _storyFamily is "sf_cg_kiraroom_dominance_04">>Her whole body convulses. Her ass clenching so hard around your cock it almost hurts. Wetness flooding her fingers.<<else>>Her whole body convulses. Pussy clenching so hard around your fingers it almost hurts. Wetness flooding your hand.<</if>>
<<say "Kira" "FUCK— THANK YOU— THANK YOU—">>
Thanking you for allowing her to come. Perfect submission.
<<if _storyFamily is "sf_cg_kiraroom_dominance_04">>You keep fucking her, drawing it out until she's sobbing from oversensitivity.<<else>>You keep fingering her, drawing it out until she's sobbing from oversensitivity.<</if>>
<<set $companions[0].submission += 5>>
<div class="choice-container">
<<vchoice "Now take care of me" "Kira_Event_DomOral" "intimate" "lips">>
</div><<say $player.name "Now. On your knees. Take care of me.">>
<<showCharacter "kira" "center" "eager">>
<<storyVideo "story/kiraroom_dominance/dom_oral" "" "characters/kira/room_blowjob">>
<<if _storyFamily is "sf_cg_kiraroom_dominance_04">>You lie back on the leather chaise. She drops to her knees beside it immediately. Submissive. Eager to serve.<<else>>She slides off the bed immediately, drops to her knees. Submissive. Eager to serve.<</if>>
<<if _storyFamily is "sf_cg_kiraroom_dominance_04">>She bends over your lap. She looks up at you, waiting for permission.<<else>>You stand before her. She looks up at you, waiting for permission.<</if>>
<<say $player.name "Go ahead. Show me what that mouth can do.">>
<<performSexAct "oral_receive">>
She takes you in her mouth. Eager. Grateful. Trying to please her dom.
Her tongue swirls around the head of your cock. Hand stroking the shaft. Eyes locked on yours.
<<say $player.name "Good girl. Just like that.">>
The praise makes her moan around you. She takes you deeper.
<div class="narrative-video intimate">
<<if $preferences.showVideos>>
<<if !_storyClip>><<showEventMedia "intimate/kira_submissive_blowjob">><</if>>
<</if>>
</div>
You grip her hair. Not forcing, but CONTROLLING. Guiding her pace.
<<performSexAct "oral_receive">>
She lets you use her mouth. Submitting completely. Gagging when you go deep but not pulling back.
<<say $player.name "That's it. Take it all.">>
She tries. Tears in her eyes from the effort. Beautiful.
<<say $player.name "I'm going to come in your mouth. Swallow it all.">>
She nods, unable to speak with you in her throat.
<<performSexAct "climax_player">>
You finish. Flooding her mouth. She swallows, throat working, not spilling a drop like a good girl.
You pull out. She gasps for air, lips swollen, looking up for approval.
<<say $player.name "Very good. Such a good girl for me.">>
<<say "Kira" "Thank you.">>
She's thanking you for USING her.
<<set $player.dominance += 5>>
<<set $companions[0].submission += 10>>
<div class="choice-container">
<<vchoice "Continue" "Kira_Room" "move" "map">>
</div><<say $player.name "On your hands and knees.">>
<<storyVideo "story/kiraroom_dominance/dom_touch__dom_claim">>
<<showCharacter "kira" "center" "submissive">>
<<if _storyFamily is "sf_cg_kiraroom_dominance_04">>She obeys instantly. Down on all fours on the leather chaise, heels and garters on, presenting herself. You kneel behind her first and bury your tongue in her until she's pushing back against your face.<<else>>She obeys instantly. Presenting herself.<</if>>
<<sexScene "kira" "dominant" "rough" "kira-room">>
<<sexPhase "action">>
<<performSexAct "position_doggy">>
<<performSexAct "penetrate">>
<<if _storyFamily is "sf_cg_kiraroom_dominance_04">>Then you stand, spread her cheeks, and take her ass. Hard.<<else>>You grip her hips. Take her hard.<</if>>
<<performSexAct "thrust_fast">>
<<say "Kira" "Yes— use me—">>
The submission in her voice is intoxicating.
<<sexPhase "climax">>
<<performSexAct "climax_together">>
You both finish. She collapses forward.
<<endSexScene>>
<<set $player.dominance += 8>>
<<set $companions[0].submission += 10>>
<<set $flags.sleptWithKira to true>>
<div class="choice-container">
<<vchoice "Aftermath" "Kira_Room" "move" "map">>
</div><<say $player.name "How far will you go for me?">>
<<showCharacter "kira" "center" "uncertain">>
<<say "Kira" "What do you mean?">>
<<say $player.name "I want to test something. Your limits.">>
<<storyVideo "story/kiraroom_dominance/dom_test">>
<<if _storyFamily is "sf_cg_kiraroom_dominance_04">>She swallows. Her fingers fumble at the garter clasps, then go still. Hair falls over her face.<<else>>She swallows.<</if>>
<<say "Kira" "Okay.">>
<div class="choice-container">
<<if !setup.sceneHidden("kiraBeg")>><<vchoice "Make her beg" "Kira_Event_Beg" "intimate" "hand">><</if>>
<<vchoice "Command her to strip" "Kira_Event_DomStrip" "intimate" "armor">>
<<vchoice "Never mind" "Kira_Room" "action" "return">>
</div><<say $player.name "Beg me to touch you.">>
<<showCharacter "kira" "center" "desperate">>
<<say "Kira" "Please. Touch me.">>
<<say $player.name "You can do better than that.">>
She drops to her knees.
<<say "Kira" "Please. I need you. I'll do anything. Just— please—">>
Perfect submission.
<<set $companions[0].submission += 10>>
<div class="choice-container">
<<vchoice "Reward her" "Kira_Event_DomFinish" "intimate" "check">>
<<if !setup.sceneHidden("kiraBeg")>><<vchoice "Make her wait" "Kira_Event_DomDeny" "intimate" "check">><</if>>
</div><<showCharacter "kira" "center" "vulnerable">>
<<sexScene "kira" "dominant" "tender" "kira-room">>
<<storyVideo "story/kiraroom_dominance/dom_strip__dom_tender">>
<<say $player.name "I've got you. Trust me.">>
Your voice is commanding but warm. Safe.
<<if $companions[0].submission >= 60>>
<<if _storyFamily is "sf_cg_kiraroom_dominance_04">>She melts back into the couch cushions, one arm behind her head. Surrendering completely.<<else>>She melts into the bed. Surrendering completely.<</if>>
<<say "Kira" "I trust you. Do whatever you want.">>
<<else>>
She relaxes slightly. Still alert, but willing.
<<say "Kira" "...Okay. I trust you.">>
<</if>>
<<if _storyFamily is "sf_cg_kiraroom_dominance_04">>You spread her thighs and go down on her slowly. Worshipfully. Kissing each inch of skin on the way.<<else>>You undress her slowly. Worshipfully. Kissing each inch of skin as you reveal it.<</if>>
<<performSexAct "undress_slow">>
<<say "Kira" "You're being so... gentle. I thought you wanted to—">>
<<say $player.name "I do. But there's more than one way to dominate.">>
You take your time. Exploring her body. Making her wait for every touch.
<<performSexAct "finger_penetrate">>
<<say "Kira" "Please—">>
<<say $player.name "I decide when. Not you.">>
<<if $companions[0].affection >= 60>>
She whimpers. Trusting you completely.
<<say "Kira" "Yes. Okay. Whatever you want.">>
<<else>>
<<say "Kira" "...Okay.">>
<</if>>
You bring her to the edge. Again and again. Controlled. Patient.
<<performSexAct "climax_partner">>
When you finally let her come, it's shattering.
<<set $companions[0].submission += 5>>
<<set $companions[0].trust += 3>>
<<set $companions[0].affection += 3>>
<<endSexScene>>
<div class="choice-container">
<<vchoice "Hold her" "Kira_Room" "intimate" "broken-heart">>
</div><<showCharacter "kira" "center" "defiant">>
You see the challenge in her eyes. And you let her take it.
<<say $player.name "Think you can do better?">>
<<say "Kira" "I KNOW I can.">>
She moves fast. Shoving you onto the bed. Climbing on top.
<<if $companions[0].trust >= 60>>
<<say "Kira" "Your turn to follow orders.">>
There's no malice in it. Just heat.
<<else>>
<<say "Kira" "Don't move.">>
She's proving a point.
<</if>>
She pins your wrists. Kisses you hard.
<<performSexAct "kiss_deep">>
<<say "Kira" "You don't always get to be in charge.">>
<<set $player.submission += 3>>
<<set $companions[0].submission to Math.max(30, $companions[0].submission - 5)>>
<<addTension "kira" -20>>
<div class="choice-container">
<<vchoice "Let her take control" "Kira_Event_ReverseSubmit" "intimate" "hand">>
<<vchoice "Fight for dominance" "Kira_Event_DomClaim" "dominate" "rapid-strikes">>
</div><<showCharacter "kira" "center" "confident">>
<<sexScene "kira" "dominant_kira" "intense" "kira-room">>
You relax. Let her have this.
<<say "Kira" "Good boy.">>
<<storyVideo "characters/kira/room_dom_reverse">>
<<if _storyClip is "ca42b409ed48">>She turns her back to you, squats over your cock and rides you. Hard. One hand rubbing her clit. Using you for her pleasure.<<else>>She rides you. Hard. Using you for her pleasure.<</if>>
<<performSexAct "position_cowgirl">>
<<performSexAct "thrust_fast">>
<<if $companions[0].trust >= 65>>
<<say "Kira" "God I needed this. Needed YOU.">>
<<else>>
<<say "Kira" "Just shut up and let me—">>
<</if>>
She takes what she wants. It's... freeing. Not having to be in control.
<<performSexAct "climax_together">>
<<endSexScene>>
<<set $player.submission += 5>>
<<set $flags.sleptWithKira to true>>
<div class="choice-container">
<<vchoice "Catch your breath" "Kira_Room" "move" "map">>
</div><<showCharacter "kira" "center" "aware">>
<<storyVideo "story/kiraroom_high_lust/kira_room_event_high_lust">>
<<if _storyClip is "9cbee05fc9f3">>You walk in with your cock hard in your pants, and there's no hiding it. You try to look busy at her little hotplate. It doesn't work. She sidles up beside you, close enough to bump your hip.<<else>>You walk in with your cock hard in your pants, and there's no hiding it.<</if>>
<<if $companions[0].trust >= 70>>
<<say "Kira" "Oh. You look... wound up.">>
Her gaze is knowing. Warm.
<<elseif $companions[0].trust >= 50>>
<<say "Kira" "You're... wound up.">>
Her eyes drop to the evidence.
<<else>>
<<say "Kira" "What— is that—">>
She's trying not to stare. Failing.
<</if>>
<<if $flags.sleptWithKira>>
<<if $companions[0].affection >= 60>>
<<say "Kira" "Get over here. Let me take care of you.">>
She's not asking.
<<elseif $companions[0].trust >= 55>>
<<say "Kira" "Want me to help with that?">>
She's offering.
<<else>>
<<say "Kira" "I could... if you want...">>
Hesitant but willing.
<</if>>
<div class="choice-container">
<<vchoice "Yes" "Kira_Event_QuickRelief" "intimate" "lips">>
<<if $player.dominance >= 35>>
<<vchoice "On your knees" "Kira_Event_QuickReliefDom" "dominate" "crown">>
<</if>>
<<if $companions[0].affection >= 55>>
<<vchoice "I want more than quick" "Kira_Event_LustSlow" "intimate" "broken-heart">>
<</if>>
<<vchoice "I can handle it" "Kira_Room" "action" "return">>
</div>
<<else>>
<<if $companions[0].tension >= 70>>
<<say "Kira" "Maybe... I could—">>
She stops herself. But she's thinking about it.
<<else>>
<<say "Kira" "Maybe... take a cold shower?">>
<</if>>
She's trying not to stare.
<<addTension "kira" 10>>
<div class="choice-container">
<<vchoice "Continue" "Kira_Room" "move" "map">>
</div>
<</if>><<say "Kira" "Come here.">>
<<showCharacter "kira" "center" "confident">>
She drops to her knees without ceremony.
<<performSexAct "oral_receive">>
This isn't lovemaking. It's SERVICE. Quick relief.
<<say "Kira" "Let me help.">>
Her mouth is skilled. Efficient.
<<performSexAct "oral_receive">>
<<performSexAct "climax_player">>
You finish fast. She swallows, wipes her mouth.
<<say "Kira" "Better?">>
<<say $player.name "Much.">>
<<set $player.lust to Math.max(20, $player.lust - 50)>>
<<relationChange "kira" "affection" 1>>
<div class="choice-container">
<<vchoice "Continue" "Kira_Room" "move" "map">>
</div><<showCharacter "kira" "center" "submissive">>
<<say $player.name "On your knees.">>
<<storyVideo "story/kiraroom_high_lust/quick_relief__quick_relief_dom" "" "characters/kira/room_blowjob">>
<<if $companions[0].submission >= 60>>
She drops immediately. Eager.
<<say "Kira" "Yes.">>
<<else>>
She hesitates. Then obeys.
<<say "Kira" "Bossy today.">>
<</if>>
<<performSexAct "oral_receive">>
You grip her hair. Control the pace. This isn't about her pleasure.
<<say $player.name "That's it. Take it.">>
<<if $companions[0].submission >= 65>>
She moans around you. Loving being used.
<<else>>
She takes it. Lets you use her mouth.
<</if>>
<<performSexAct "climax_player">>
<<say $player.name "Swallow.">>
<<if _storyFamily is "sf_cg_kiraroom_high_lust_04">>She does. Then you take her by both hands and haul her up off her knees.<<else>>She does.<</if>>
<<set $player.lust to Math.max(15, $player.lust - 55)>>
<<set $companions[0].submission += 3>>
<div class="choice-container">
<<vchoice "Continue" "Kira_Room" "move" "map">>
</div><<showCharacter "kira" "center" "soft">>
<<sexScene "kira" "intimate" "slow" "kira-room">>
<<storyVideo "story/kiraroom_high_lust/quick_relief__lust_slow">>
<<say $player.name "I don't want quick. I want you.">>
<<if $companions[0].affection >= 70>>
Her expression softens.
<<say "Kira" "...me too.">>
<<else>>
<<say "Kira" "Okay. Come here.">>
<</if>>
You take your time. Undressing each other slowly. Kissing. Touching.
<<performSexAct "undress_slow">>
<<performSexAct "kiss_deep">>
<<say "Kira" "You're not usually like this.">>
<<say $player.name "I want to actually BE with you. Not just... release.">>
<<if $companions[0].trust >= 65>>
She pulls you closer.
<<say "Kira" "I want that too.">>
<<else>>
<<say "Kira" "...okay.">>
<</if>>
You make love. Slowly. Eyes locked.
<<performSexAct "penetrate">>
<<performSexAct "thrust_slow">>
<<performSexAct "climax_together">>
<<endSexScene>>
<<set $player.lust to Math.max(10, $player.lust - 60)>>
<<set $companions[0].affection += 5>>
<<set $companions[0].trust += 2>>
<div class="choice-container">
<<vchoice "Hold her" "Kira_Room" "intimate" "broken-heart">>
</div><<showCharacter "kira" "center" "confused">>
You're talking with Kira when she suddenly gasps.
<<say "Kira" "What— I feel—">>
<<showCharacter "velith" "left" "amused">>
<<storyVideo "story/kiraroom_velith/kira_room_event_velith">>
<<if _storyClip is "4a23329c4d3f">>Velith materializes on Kira's bed in a violet haze, in the pale-haired costume she wore in your dreams: black lines painted down her cheeks and breasts, horns, chains. She crawls toward you across the sheets on all fours.
<<say "Velith" "Recognise it? You saw it first, in your head. Now she gets a look.">>
<<else>>Velith materializes in the room. Just visible enough.<</if>>
<<say "Velith" "Don't mind me. Continue.">>
<<showCharacter "kira" "right" "shocked">>
Kira can SEE her.
<<if $companions[0].affection >= 80>>
<<say "Kira" "The demon. She's— is this what you've been dealing with?">>
She moves closer to you. Protective.
<<else>>
<<say "Kira" "The demon. She's HERE.">>
Fear, but not panic. She trusts you to handle it.
<</if>>
<<say "Velith" "I wanted to meet your little human. She's cute.">>
<<if _storyClip is "4a23329c4d3f">>Velith prowls the bed around Kira like a predator.<<else>>Velith circles Kira like a predator.<</if>>
<<say "Velith" "She wants you. I can smell it on her.">>
<<if $companions[0].submission >= 70>>
<<say "Kira" "I— what is she talking about—">>
She looks to you for guidance. Submissive even now.
<<elseif $companions[0].submission <= 40>>
<<say "Kira" "Get away from me, demon.">>
She raises a fist. Ready to fight.
<<else>>
Kira flushes. Unable to deny it.
<</if>>
<<addTension "kira" 20>>
<<clampStat "player.lust" 20>>
<<clampStat "companions[0].lust" 25>>
<div class="choice-container">
<<vchoice "Tell Velith to leave" "Kira_Event_VelithLeave" "action" "check">>
<<vchoice "See what happens" "Kira_Event_VelithStay" "intimate" "search">>
<<if $companions[0].submission >= 60 && $companions[0].trust >= 85>>
<<vchoice "All three of us" "Kira_Event_Threesome" "intimate" "rapid-strikes">>
<</if>>
<<if false && $player.corruption >= 50>>
<<vchoice "Let Velith have her way" "Kira_Event_VelithClaim" "supernatural" "terror">>
<</if>>
</div><<say $player.name "Velith. Leave.">>
<<showCharacter "velith" "center" "amused">>
<<say "Velith" "Protective. Sweet.">>
She fades.
<<say "Velith" "But I'll be back. We all will.">>
<<showCharacter "kira" "center" "shaken">>
<<if previous() is "Kira_Event_VelithStay">><<storyVideo "story/kiraroom_velith/velith_leave">><</if>>
<<if _storyClip is "c8d6e5f0f033">>Kira lies sprawled on her bed where the demon left her, tank shoved down under her bare tits, panties kicked off onto the sheet. Her eyes are squeezed shut, her mouth open; one hand clutches her breast, the other presses flat to her belly, right where Velith's finger went down. Kira is trembling.<<else>>Kira is trembling.<</if>>
<<say "Kira" "She's... always there? Watching?">>
<div class="choice-container">
<<vchoice "Sometimes" "Kira_Room" "talk" "map">>
</div>You say nothing. Let Velith stay.
<<showCharacter "velith" "left" "pleased">>
<<showCharacter "kira" "right" "aroused">>
<<say "Velith" "Oh, this will be FUN.">>
<<storyVideo "story/kiraroom_velith/velith_stay">>
<<if _storyClip is "7cd49f66cf39">>Velith trails a finger down Kira's belly. Kira's own hand follows it as if pulled, over her hip and under the pink lace of her panties. Kira gasps.<<else>>Velith trails a finger down Kira's arm. Kira gasps.<</if>>
<<say "Kira" "She's— I can FEEL her—">>
<<say "Velith" "Your human is delicious. May I taste?">>
She's asking YOU for permission. Like Kira is yours to share.
<div class="choice-container">
<<vchoice "Velith can watch, not touch" "Kira_Event_VelithWatch" "intimate" "search">>
<<vchoice "No. Kira is mine" "Kira_Event_VelithLeave" "action" "check">>
</div><<say $player.name "You can watch. Not touch.">>
<<showCharacter "velith" "left" "amused">>
<<say "Velith" "Mmm. A show. How generous.">>
She reclines on air. Watching.
<<showCharacter "kira" "right" "nervous">>
<<say "Kira" "You want me to— with HER watching?">>
<<say $player.name "Yes.">>
<<sexScene "kira" "exhibition" "watched" "kira-room">>
Kira is nervous at first. But Velith's presence is ELECTRIC.
<<sexPhase "action">>
<<storyVideo "story/kiraroom_velith/velith_watch__velith_watch">>
<<performSexAct "kiss_deep">>
<<performSexAct "penetrate">>
<<if _storyFamily is "sf_cg_kiraroom_velith_04">>You fuck Kira while a demon watches. Every time you pull out she gushes, soaking the sheet under her, and Velith laughs softly.<<else>>You make love to Kira while a demon watches.<</if>>
<<say "Velith" "Beautiful. The way she trembles for you.">>
Velith's commentary makes it HOTTER.
<<sexPhase "climax">>
<<performSexAct "climax_together">>
You finish together, Velith applauding slowly.
<<addCorruption 5>>
<<addCorruption 5 "kira">>
<<set $companions[0].submission += 5>>
<<set $flags.sleptWithKira to true>>
<div class="choice-container">
<<vchoice "Aftermath" "Kira_Event_VelithAfter" "move" "map">>
</div><<endSexScene>>
<<showCharacter "velith" "center" "satisfied">>
<<say "Velith" "Delightful. We should do this again.">>
She fades.
<<showCharacter "kira" "center" "overwhelmed">>
<<storyVideo "story/kiraroom_velith/velith_after">>
<<if _storyFamily is "sf_cg_kiraroom_velith_04">>Kira is still coming apart under you, soaking the sheets, screaming, shaking and gasping as the last of the demon's shape fades.<<else>>Kira is shaking.<</if>>
<<say "Kira" "That was... I've never...">>
<<relationChange "kira" "affection" 1>>
<<set $flags.velithWatchedSex to true>>
<div class="choice-container">
<<vchoice "Continue" "Kira_Room" "move" "map">>
</div><<say $player.name "All three of us.">>
<<showCharacter "velith" "left" "delighted">>
<<showCharacter "kira" "right" "shocked">>
<<say "Velith" "Oh YES. I was HOPING you'd say that.">>
<<say "Kira" "Are you SERIOUS? A threesome with a DEMON?">>
<<say $player.name "If you want.">>
Kira looks between you and Velith. Fear. Arousal. Curiosity.
<<say "Kira" "I... fuck it. Okay. Yes. Let's do this.">>
<<sexScene "kira_velith" "threesome" "supernatural" "kira-room">>
What follows is beyond human experience.
<<sexPhase "buildup">>
<<storyVideo "story/kiraroom_velith/velith_stay">>
<<if _storyClip is "7cd49f66cf39">>Velith glides to Kira. Trails a gloved fingertip down her cheek, her throat, her belly, and hooks it into the lace of her panties. Kira's own hand follows, sliding in underneath.<<else>>Velith glides to Kira. Trails a gloved fingertip down her cheek.<</if>>
<<say "Velith" "You're beautiful. Mortal. Fragile. I'm going to enjoy breaking you gently.">>
Velith kisses Kira. You watch, cock hardening, as woman and demon's tongues entwine.
<<performSexAct "lesbian_kiss">>
Kira moans into the kiss. Velith's hands exploring her body with inhuman grace.
<<say "Kira" "Oh god— she's— her tongue is—">>
Velith's tongue is long. Prehensile. Doing things no human could.
<<say "Velith" "Your turn, sweet thing. Come join us.">>
You step forward. Velith positions Kira between you. Demon behind, you in front.
<<sexPhase "action">>
<div class="narrative-video intimate">
<<if $preferences.showVideos>>
<<if !_storyClip>><<showEventMedia "intimate/kira_velith_threesome">><</if>>
<</if>>
</div>
<<performSexAct "threesome_mff">>
You kiss Kira while Velith's hands roam her body from behind. Supernatural touch making Kira gasp and arch.
<<say "Velith" "Fuck her. I want to watch you claim your human.">>
<<performSexAct "position_missionary">>
You lay Kira on the bed. Velith kneels beside, watching with hungry eyes.
<<performSexAct "penetrate">>
You enter Kira. She cries out. Velith's hand finds Kira's clit, rubbing while you fuck.
<<say "Kira" "Oh FUCK— both of you— I can't—">>
<<performSexAct "thrust_fast">>
You pound into Kira. Velith's supernatural fingers on her clit. The demon's other hand playing with Kira's nipples.
Kira is being pleasured by human and demon simultaneously. It's OVERWHELMING her.
<<say "Velith" "She's close. I can taste it. Make her come on your cock.">>
Velith's fingers work faster. Supernatural pleasure amplifying everything.
<<say "Kira" "I can't— it's too much— oh GOD—">>
<<sexPhase "climax">>
<<performSexAct "climax_together">>
Kira SCREAMS. Her orgasm is violent, supernatural-enhanced. Pussy clamping down on you like a vice.
You finish DEEP inside her, groaning. Velith watches, pleased, licking her lips.
<<say "Velith" "Beautiful. The way humans break.">>
Purple energy crackles between all three of you. The corruption spreading.
All three of you tangled together. Woman. Man. Demon. Forbidden and perfect.
<<addCorruption 10>>
<<addCorruption 15 "kira">>
<<set $flags.threesomeWithVelith to true>>
<<set $flags.sleptWithKira to true>>
<div class="choice-container">
<<vchoice "Aftermath" "Kira_Event_ThreesomeAfter" "move" "map">>
</div><<endSexScene>>
<<showCharacter "velith" "center" "satisfied">>
<<say "Velith" "Exquisite. Your human is a treasure.">>
<<storyVideo "story/kiraroom_velith/velith_watch__threesome_after">>
She kisses Kira once more, then fades.
<<showCharacter "kira" "center" "changed">>
Kira is trembling. Changed.
<<say "Kira" "I can't... that was...">>
She looks at you.
<<say "Kira" "What are we becoming?">>
<<relationChange "kira" "affection" 2>>
<<set $companions[0].submission += 5>>
<div class="choice-container">
<<vchoice "Continue" "Kira_Room" "move" "map">>
</div><<sexScene "kira" "adrenaline" "rough" "kira-room">>
No gentleness. Just primal, animalistic NEED.
<<sexPhase "action">>
<<storyVideo "characters/kira/room_sex">>
You slam her against the wall. She wraps her legs around you.
<<performSexAct "position_against_wall">>
Clothes are yanked aside. No time to undress properly. Just need access.
<<performSexAct "penetrate">>
<<if previous() === "Kira_Scav_WoundUp">>
You DRIVE into her. She's already soaking. She has been since the second one stopped moving, hours ago, out there on her own.
<<else>>
You DRIVE into her. She's already wet from the adrenaline. From watching you fight.
<</if>>
<<say "Kira" "FUCK— YES—">>
You fuck her standing. Brutal. Using the wall for leverage.
<<performSexAct "thrust_fast">>
Each thrust bouncing her against the concrete. She doesn't care. Matching your intensity.
<div class="narrative-video intimate">
<<if $preferences.showVideos>>
<<if !_storyClip>><<showEventMedia "intimate/kira_wall_fuck">><</if>>
<</if>>
</div>
<<if previous() === "Kira_Scav_WoundUp">>
<<say "Kira" "Harder— fuck me like I put those two in the dirt— use me—">>
<<else>>
<<say "Kira" "Harder— fuck me like you fought— use me—">>
<</if>>
Battle lust translating directly to sexual lust. Pure aggression channeled into fucking.
You bite her neck. She SCREAMS. Nails raking your back.
<<say $player.name "Mine. You're fucking MINE.">>
<<say "Kira" "Yours— always yours— oh god I'm coming—">>
<<sexPhase "climax">>
<<performSexAct "climax_together">>
You both come HARD. Still standing. Still against the wall. Violent and primal and perfect.
Your legs almost give out. You stumble to the bed, still inside her, both collapsing.
<<endSexScene>>
<<say "Kira" "Fuck. That was...">>
<<say $player.name "Intense.">>
<<if previous() === "Kira_Scav_WoundUp">>
<<say "Kira" "Remind me to go out and kill things more often.">>
<<else>>
<<say "Kira" "We should go fight things more often.">>
<</if>>
<<addAffection "kira" 1>>
<<set $flags.sleptWithKira to true>>
<div class="choice-container">
<<vchoice "Catch your breath" "Kira_Room" "move" "map">>
</div><<run VaultUI.setBackground("kira_room")>>
<<run setup.kiraUseAllow()>>
<h2>Kira's Room</h2>
<p>Kira is sitting on the edge of her bed when you come in, boots off, hands between her knees. She doesn't say hello. She pats the blanket next to her and waits until you sit.</p>
<<say "Kira" "Remember what I told you when they let me out of the Center? About the post?">>
<p>She doesn't wait for an answer. Her cheeks are already red.</p>
<<say "Kira" "I said not yet. ...It's yet. I trust you. More than I trusted that post, anyway, and I let that thing hold me up for days.">>
<<say "Kira" "So you don't have to ask. Tied up, wrecked after a fight, out cold, whatever. Use me. And if it's them, at the post or in a fight, let them. I'll love every second of it and tell you all about it after. Red still means stop. Got it?">>
<p class="discovery-note"><<icon "partner">> Kira has given you her permission. From now on her trust doesn't drop when she's used: at the post, in or after a fight, or traded on the road.</p>
<div class="choice-container">
<<vchoice "Got it" "Kira_Room" "intimate" "heart">>
<<vchoice "Leave" "Vault_Hub" "move" "return">>
</div><<run VaultUI.setBackground("bathroom")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<<set $flags.kiraShowerPeekSeen to true>>
<<set $flags.kiraShowerPeekDay to $time.day>>
Her door is open and the room is empty: the blanket shoved to the foot of the bed for once, her boots kicked off by the footlocker.
Then you hear it: water hammering on tile across the corridor. The washroom door stands a hand's width open, steam curling out through the gap.
You step closer. The air there is warm and wet and smells of cheap soap and her.
Through the gap you can see the glass stall, fogged at the edges, and Kira under the spray with her back to you, naked.
<<storyVideo "characters/kira/room_shower_peek">>
She works both hands through her wet hair, elbows up, water sheeting down her spine. Then the soap. She lathers her shoulders, her back, and runs her soapy palms down over her ass, squeezing, spreading the suds into the crack. She bends at the waist to scrub her calves and her ass tips up toward the gap. She takes her time about it, and suds slide down the backs of her thighs.
She has no idea you're here.
Your cock is hard in your pants before you decide anything. You press the heel of your hand against it and it throbs.
<<clampStat "player.lust" 10>>
<<if $flags.sleptWithKira && $companions[0].affection >= 50 && ($player.lust >= 60 || $player.corruption >= 35 || $companions[0].tension >= 70)>>
<<set _peekTo to "Kira_Event_ShowerPeek_Show">>
<<elseif random(1, 100) <= 35>>
<<set _peekTo to "Kira_Event_ShowerPeek_Caught">>
<<else>>
<<set _peekTo to "Kira_Event_ShowerPeek_Watch">>
<</if>>
<div class="choice-container">
<<vchoice "Keep watching" _peekTo "intimate" "eye">>
<<vchoice "Back off before she sees you" "Vault_Hub" "move" "return">>
</div><<run VaultUI.setBackground("bathroom")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
You stay. You don't breathe.
<<storyVideo "story/mv_kira_shower_peek/watch">>
She rinses her hair under the spray, the water pounding her shoulders. Soap runs down her spine, into the crack of her ass, down the backs of her thighs.
You drag your zip down and pull your cock out. Stroke it slowly, in time with her hands on her body.
She half turns, eyes shut against the water. For a second you see the side of one wet tit, the nipple hard from the heat. Her hand slides down her belly and rinses her pussy. One pass. Two.
You grip yourself harder. Precum slicks your thumb. The water covers the sound of your breathing.
The spray cuts off.
You shove your cock back in your pants and step away from the gap. Your pulse is hammering in your ears. Behind you, she hums something tuneless and reaches for her towel.
She has no idea. She never will.
<<set $flags.kiraShowerPeekWatched to true>>
<<clampStat "player.lust" 15>>
<<advanceTime 0 15>>
For the rest of the day you can't look at her without seeing water running off those tits.
<div class="choice-container">
<<vchoice "Walk it off" "Vault_Hub" "move" "return">>
</div><<run VaultUI.setBackground("bathroom")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<<showCharacter "kira" "right" "surprised" "naked">>
You lean in too far and the door creaks on its hinge.
Kira's head snaps round. Her eyes land dead on the gap, on you, and on the hand you've got clamped over your cock through your pants.
<<storyVideo "characters/kira/room_shower_peek_caught">>
She looks back over her shoulder, soap sliding down her ass, and stares right at you. Then she laughs. Short, sharp, disbelieving. She doesn't cover up.
<<if $flags.kiraCaughtShower>>
<<say "Kira" "Huh. Payback.">>
<<else>>
<<say "Kira" "Seriously? You fucking creep.">>
<</if>>
Heat floods your face. You're caught with a hard-on and nowhere to put your hands.
<<set _peekHot to $companions[0].tension >= 60>>
<<set $flags.kiraCaughtPeeking to true>>
<<addTension "kira" 15>>
<<clampStat "player.lust" 10>>
<<if _peekHot>>
<<showCharacter "kira" "right" "aroused" "naked">>
Her gaze drops to your crotch. Stays there. She swallows.
<<say "Kira" "How long?">>
<<say $player.name "Long enough.">>
<<say "Kira" "Enjoy it?">>
You don't answer. You don't have to. Your cock is straining against your pants.
She turns to face you, wet tits on full show, and shuts the water off. Steam hangs between you. Her nipples are hard.
<<say "Kira" "Well. Don't just stand there. Get in.">>
<div class="choice-container">
<<vchoice "Get in" "Kira_Event_ShowerPeek_Join" "intimate" "shower">>
<<vchoice "Back out, face burning" "Kira_Event_ShowerPeek_Out" "action" "door-handle">>
</div>
<<else>>
The grin drops off her face.
<<say "Kira" "Out. Now.">>
You back away. She yanks the door shut. The lock clacks.
<<relationChange "kira" "trust" -3>>
You stand in the corridor with your cock throbbing and your face on fire. She SAW you. And she didn't look away first.
<div class="choice-container">
<<vchoice "Leave" "Vault_Hub" "move" "return">>
</div>
<</if>><<run VaultUI.setBackground("bathroom")>>
<<showCharacter "kira" "right" "amused" "naked">>
<<say $player.name "I— sorry. I'll go.">>
<<say "Kira" "Your loss.">>
You pull the door shut. Behind it the water starts running again.
<<advanceTime 0 10>>
<div class="choice-container">
<<vchoice "Leave" "Vault_Hub" "move" "return">>
</div><<run VaultUI.setBackground("bathroom")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<<showCharacter "kira" "center" "aroused" "naked">>
You stay, and she looks back over her shoulder straight at the gap, straight at you, without a flicker of surprise.
<<say "Kira" "Heard you in the corridor. You breathe like a bull.">>
<<say "Kira" "Stay there. Watch.">>
<<storyVideo "characters/kira/room_shower_show">>
She turns to face you and soaps her hands, taking her time, then lathers her tits with both palms, squeezing them together and rolling the nipples until they stand out hard. Suds and water run down her belly. She plays to the gap like she knows exactly where you're standing.
Her soapy hand slides down. She spreads her pussy open with two fingers and rubs, slow, so you can see everything. Then she turns, soaps her ass with both hands and looks at you over her shoulder.
<<say "Kira" "This what you came for?">>
<<say $player.name "Fuck. Yes.">>
<<say "Kira" "Then get it out. Let me see.">>
You pull your cock out right there in the doorway. She turns back to you, watches you stroke it and bites her lip, two fingers rubbing tight circles over her clit.
<<sexScene "kira" "spontaneous" "passionate" "bathroom">>
<<performSexAct "masturbate_partner">>
<<say "Kira" "Harder. Like you mean it.">>
Her hips roll against her hand. Water streams off her chin. Soap suds slide down the inside of her thighs.
<<set $flags.kiraShowerShow to true>>
<<relationChange "kira" "affection" 2>>
<<clampStat "player.lust" 15>>
<div class="choice-container">
<<vchoice "Get in with her" "Kira_Event_ShowerPeek_Join" "intimate" "shower">>
<<vchoice "Watch her come" "Kira_Event_ShowerPeek_ShowFinish" "intimate" "eye">>
</div><<run VaultUI.setBackground("bathroom")>>
<<showCharacter "kira" "center" "desperate" "naked">>
You stay in the doorway, stroking, and don't take your eyes off her.
She fucks two fingers into herself, the heel of her hand grinding her clit, her other hand braced flat on the tile. Her thighs start to shake.
<<say "Kira" "Don't stop. Don't you— fuck—">>
<<performSexAct "climax_partner">>
She comes with her eyes locked on your cock. Her mouth drops open. Her knees buckle and her pussy clenches around her fingers, and she rides it out against her hand, gasping your name into the steam.
You come a second later. Thick ropes onto the wet floor between you. Your legs nearly go.
She laughs, breathless, and angles the shower head down to hose your cum off the floor.
<<say "Kira" "Knock next time.">>
<<say "Kira" "Or don't.">>
<<addTension "kira" -15>>
<<set $player.lust to Math.max(10, $player.lust - 35)>><<run setup.playerReleased()>>
<<advanceTime 0 20>>
<div class="choice-container">
<<vchoice "Leave her to rinse off" "Vault_Hub" "move" "return">>
</div><<run VaultUI.setBackground("bathroom")>>
<<showCharacter "kira" "center" "aroused" "naked">>
You shove the door open and lock it behind you. Kick your boots off. Your shirt hits the floor, then your pants.
She turns the water back on and watches you strip, arms folded under her wet tits.
<<say "Kira" "Look at you. Rock hard from looking.">>
<<sexScene "kira" "spontaneous" "passionate" "bathroom">>
You step into the spray. She pulls you in by the hips. Her slick body presses against yours, her nipples hard against your chest, your cock trapped hot between you.
<div class="choice-container">
<<vchoice "..." "Bathroom_Kira_Shower_Sex" "intimate" "lust">>
</div><<run VaultUI.setBackground("kira_room")>>
<<run VaultUI.hideAllCharacters()>>
<h2>Kira's Room</h2>
<p>Her bed is made, tight as a soldier's. Her spare knife is gone from the crate by the door, and so is her pack. She's out at <<= setup.kiraRunSiteName($companions[0].away ? $companions[0].away.site : "")>> and won't be back before evening.</p>
<div class="choice-container">
<<vchoice "Leave" "Vault_Hub" "move" "return">>
</div><<set _scFrom to ($companions[0].scav && $companions[0].scav.from) || "Vault_Hub">>
<<if _scFrom === "Kira_Room">>
<<run VaultUI.setBackground("kira_room")>>
<<else>>
<<run VaultUI.setBackground("vault-entrance-interior")>>
<</if>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<<run VaultUI.hideAllCharacters()>>
<<set _scAway to $companions[0].away>>
<<set _scCan to setup.kiraRunCan()>>
<<set _scTrust to Number($companions[0].trust) || 0>>
<<set _scPressed to !!($companions[0].scav && $companions[0].scav.pressDay === $time.day)>>
<h2>A Day Out</h2>
<<if _scAway && setup.kiraOnRun()>>
<<set _scBack to _scFrom === "Entrance_Hub" ? "Entrance_Hub" : "Vault_Hub">>
<<storyVideo "story/kira_scav/leave">>
<p><<if _storyClip is "e370442c046e">>She shrugs her pack on, tugs the straps tight across her chest and grins at you once.<<elseif _storyClip is "d59e78191d30">>She crouches by the supply crates, tests the edge of her machete against one and straps her gear on tight.<<elseif _storyClip is "d44f02f78e5d">>She checks her pistol, tugs her vest straps tight and moves out.<<else>>She checks the edge of her machete, cinches her pack and pulls the strap tight across her chest.<</if>> <<= setup.kiraRunSiteName(_scAway.site, null, true)>>, then. She doesn't look back at the vault until the door is open.</p>
<<if _scTrust gte 50>>
<<say "Kira" "Back by evening. Don't do anything fucking stupid while I'm gone. That's my job.">>
<<elseif _scTrust gte 35>>
<<say "Kira" "Back by evening. Try not to burn the shithole down while I'm out, idiot.">>
<<else>>
<<say "Kira" "Back by evening. Don't wait up, and don't fucking follow me.">>
<</if>>
<<if setup.kiraRunWatcherOpen()>>
<p>On the threshold she stops and looks up at the slope above the door for a long moment. Then she goes.</p>
<</if>>
<p>The door grinds shut behind her. The vault is very quiet.</p>
<div class="choice-container">
<<vchoice "Get on with your day" _scBack "move" "return">>
</div>
<<elseif _scCan.ok>>
<<showCharacter "kira" "center" "neutral">>
<p>You ask if she'd go out on her own for a day. Scrap, food, anything worth carrying home.</p>
<<if _scTrust gte 50>>
<<say "Kira" "About fucking time. I knew these ruins before I knew you, vault boy. Where?">>
<<elseif _scTrust gte 35>>
<<say "Kira" "A whole day without you breathing down my neck? Hell yes. Where?">>
<<else>>
<<say "Kira" "...Fine. Not for you. For the damn vault. Where?">>
<</if>>
<<set _scSites to setup.kiraRunSites()>>
<<if _scSites.length === 1>>
<p>You haven't found much out there yet, so it's <<= setup.kiraRunSiteName(_scSites[0].id)>> or nothing. She'd be back by evening.</p>
<<else>>
<p>She'd go to any place you've found out there and be back by evening. You pick.</p>
<</if>>
<<if setup.kiraRunWatcherOpen()>>
<<say "Kira" "Wherever it is, I'm coming home over the hill. Whoever's been lying up there, I want a fucking look at them.">>
<</if>>
<div class="choice-container">
<<for _scSite range _scSites>>
<<capture _scSite>>
<<link `'<span class="choice-button action"><span class="gi gi-map gi-large"></span><span class="label">' + _scSite.name + ': ' + _scSite.danger + ' danger (' + setup.ECONOMY.kiraRun.sites[_scSite.id].join(", ") + ')</span></span>'`>><<run setup.kiraRunStart(_scSite.id)>><<run setup.historyCheckpointNext()>><<goto "Kira_Scav_Ask">><</link>>
<</capture>>
<</for>>
<<vchoice "Never mind" _scFrom "move" "back">>
</div>
<<else>>
<<showCharacter "kira" "center" "neutral">>
<p>You ask if she'd go out on her own for a day.</p>
<<switch _scCan.why>>
<<case "trust">>
<<say "Kira" "I'm not your fucking errand girl. When I go out there, I go for me. Not yet.">>
<<case "cooldown">>
<<if $time.day - (Number($companions[0].scav.last) || 0) === 1>>
<<say "Kira" "I was out there yesterday, idiot. My feet are still bleeding. Ask me in two days.">>
<<else>>
<<say "Kira" "I was out there two days ago, idiot. Give my feet one more damn day.">>
<</if>>
<<case "hurt">>
<<say "Kira" "With this arm? Patch me the fuck up first. Properly.">>
<<case "health">>
<<say "Kira" "Look at me, idiot. I walk the Reclaimed like this, I don't walk back.">>
<<case "night">>
<<say "Kira" "It's the middle of the fucking night, idiot. Nobody walks the Reclaimed in the dark and comes back. Ask me at first light.">>
<<case "late">>
<<say "Kira" "Half the day's gone. I'm not walking home in the fucking dark. Ask me in the morning.">>
<<default>>
<<say "Kira" "Not fucking now.">>
<</switch>>
<<if _scPressed>>
<p>You pushed. She didn't move an inch.</p>
<<say "Kira" "I said no. Say it again and I stop fucking listening.">>
<</if>>
<div class="choice-container">
<<if _scCan.why === "cooldown" && !_scPressed>>
<<link `'<span class="choice-button talk"><span class="gi gi-talk gi-large"></span><span class="label">Press her</span></span>'`>><<set _scT to setup.kiraRunPress()>><<if _scT>><<relationChange "kira" "trust" _scT>><</if>><<goto "Kira_Scav_Ask">><</link>>
<</if>>
<<vchoice "Let it go" _scFrom "move" "back">>
</div>
<</if>><<abandonJourney>>
<<settleExposure "home">>
<<if setup.kiraRunDue()>><<run setup.kiraRunResolve()>><</if>>
<<updateCompanionLocations>>
<<set $currentLocation to "commons">>
<<run VaultUI.setBackground("commons")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<<run VaultUI.hideAllCharacters()>>
<<set _scR to ($companions[0].scav || {}).report>>
<<set _scThanked to !!($companions[0].scav && $companions[0].scav.thanked)>>
<<set _scTrust to Number($companions[0].trust) || 0>>
<<set _kwW to setup.kiraRunWatcher()>>
<h2>Kira's Back</h2>
<<if !_scR>>
<p>Nothing to tell.</p>
<div class="choice-container">
<<vchoice "Back to the Commons" "Vault_Hub" "move" "return">>
</div>
<<else>>
<<set _scWhere to setup.kiraRunSiteName(_scR.site)>>
<<set _scDays to $time.day - _scR.day>>
<<if _scDays lte 0>>
<p>The vault door groans open. Kira comes in from <<= _scWhere>> with the evening at her back and the dust of the road on her boots.</p>
<<elseif _scDays === 1>>
<p>Kira got back from <<= _scWhere>> last night. She's at the long table in the Commons, her pack at her feet, waiting for you.</p>
<<else>>
<p>Kira got back from <<= _scWhere>> <<= ["", "", "two", "three", "four", "five", "six", "seven"][_scDays] || _scDays>> days ago. She's at the long table in the Commons, her pack at her feet, and she has been waiting to tell you.</p>
<</if>>
<<if _scR.outcome === "hurt">>
<<showCharacter "kira" "center" "vulnerable">>
<<storyVideo "story/kira_scav/return_hurt">>
<p><<if _storyClip is "14b78435c413">>She's limping. Blood has dried dark down her arm, and the gun hangs from her hand like she's forgotten it's there.<<else>>She's limping. Blood has dried dark down one sleeve, and she holds her arm like it belongs to someone else.<</if>></p>
<<say "Kira" "Don't. I'm fine. Mostly. Bastards jumped me on the way back and I dropped half the shit running.">>
<<else>>
<<showCharacter "kira" "center" "neutral">>
<<storyVideo "story/kira_scav/return_haul">>
<<if _scR.event === "cache">>
<p><<if _storyClip is "3abe261a32e7">>She swings in with the bag still on her shoulder, drops something on the table and grins at you over her sunglasses.<<else>>She drops her pack on the table and pulls something out of it with a grin she can't quite hide.<</if>></p>
<<say "Kira" "Some poor bastard hid this under a floor plate and never came back for it. His loss.">>
<<elseif _scR.event === "contact">>
<p>She drops her pack on the table and sits down heavier than usual.</p>
<<say "Kira" "Ran into a woman working the same ground. Neither of us shot, which was fucking nice. Says she sells cheap if we ever need shit. I didn't tell her where we live.">>
<<elseif _scR.event === "fight">>
<p>There's blood on her knuckles and none of it is hers. She drops her pack on the table and doesn't sit down.</p>
<<say "Kira" "Two of them thought I'd be easy. They were fucking wrong. Had some scrap on them, so.">>
<<elseif _scTrust gte 50>>
<p>She drops her pack on the table and leans on it, pleased with herself.</p>
<<say "Kira" "Told you I know these ruins. Go on, look. Then tell me I'm fucking brilliant.">>
<<else>>
<p>She drops her pack on the table.</p>
<<say "Kira" "There. Don't ever say I never do shit around here.">>
<</if>>
<</if>>
<<if _kwW.stage === "plant">>
<<if _kwW.fresh>><<journalAdd "Kira found a cold fire on the slope above the vault door, where two people lay watching it. She'll come home that way from her next run to see who." "story">><</if>>
<p>Then she glances up at the ceiling, at the hill the vault is dug into, and drops her voice as if the walls could carry it.</p>
<<say "Kira" "Came home over the hill. Fire ring on the slope right above our door. Cold. Two sets of boots, and the grass pressed flat where somebody lay on their belly for fucking hours.">>
<p>You know that slope: ferns and broken concrete over the door. Lie up there and you'd see the wheel turn every time it opens, and whoever walks out.</p>
<<say "Kira" "Somebody's been watching our fucking door, idiot. Next run I come home that way again. I want a look at them.">>
<</if>>
<<if _kwW.stage === "payoff">>
<<if _kwW.fresh>><<journalAdd "Kira brought back a notebook from the slope above the vault door: every time we went out and came back, counted and drawn. Somebody wants to know when the vault is empty." "story">><</if>>
<<if _scR.outcome === "hurt">>
<p>With her good arm she digs a little notebook out of the pack and drops it on the table.</p>
<<say "Kira" "Over the hill, like I said. They were home this time, two of them. I got this off them, they got my arm. Fair fucking trade.">>
<<elseif _scR.event === "fight">>
<p>She digs a little notebook out of the pack and drops it on the table.</p>
<<say "Kira" "Those two bastards? That was their fire on the hill. They had this on them.">>
<<else>>
<p>Then she digs a little notebook out of the pack and drops it on the table.</p>
<<say "Kira" "Came home over the hill, like I said. Fire was cold, nobody fucking home. This was under a rock by the ring. Like they'd left it for somebody.">>
<</if>>
<p>It's swollen with damp, the cover torn away, the pages gone soft as cloth. You thumb it open. Page after page in pencil, a line to a day, and every line a row of tiny drawings: the door wheel, a stick man with a pack, a smaller one with a long blade, each with an arrow, in or out.</p>
<p>Every time you went out and every time you came back, and every time she did. The last line on the last page is the little one with the blade, and an arrow pointing away from the door.</p>
<<say "Kira" "That's me. This run. Somebody's keeping our fucking diary, vault boy.">>
<<say "Kira" "Nobody lies in wet grass for days for the fun of it. Somebody wants to know when this place is empty.">>
<</if>>
<<if setup.kiraRunWoundUp()>>
<<showCharacter "kira" "center" "aroused">>
<p>She hasn't come down from it. Her eyes are too bright, her breathing's too quick, and she's looking at you the way she looked at the second one before she hit him.</p>
<<say "Kira" "Still buzzing. Get over here.">>
<</if>>
<<if _scR.kept gt 0>>
<p>She counts it out fast, and the pack looks lighter than it did when she walked in. You don't ask.</p>
<</if>>
<p class="system-info"><<icon "scrap">> Scrap +<<= _scR.scrap>><<if _scR.items.length gt 0>>. Into your pack: <<= _scR.items.join(", ")>><</if>><<if _scR.lost gt 0>>. Kira's health -<<= _scR.lost>><</if>></p>
<<if _scThanked>>
<p>You tell her she did well.</p>
<<say "Kira" "Yeah, well. Somebody has to keep your sorry ass fed.">>
<p>But she's smiling when she says it.</p>
<</if>>
<div class="choice-container">
<<if _scR.outcome === "hurt">>
<<vchoice "Take her to the medical bay" "Medical_Hub" "action" "potion">>
<<elseif !_scThanked>>
<<link `'<span class="choice-button talk"><span class="gi gi-talk gi-large"></span><span class="label">Thank her</span></span>'`>><<set _scT to setup.kiraRunThank()>><<if _scT>><<relationChange "kira" "trust" _scT>><</if>><<goto "Kira_Scav_Return">><</link>>
<</if>>
<<if setup.kiraRunWoundUp()>>
<<vchoice "Go with her" "Kira_Scav_WoundUp" "intimate" "lust">>
<</if>>
<<vchoice "Let her rest" "Vault_Hub" "move" "return">>
</div>
<</if>><<run VaultUI.setBackground("kira_room")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<<run VaultUI.hideAllCharacters()>>
<<showCharacter "kira" "center" "aroused">>
<h2>Still Buzzing</h2>
<<storyVideo "story/kira_scav/wound_up">>
<p><<if _storyClip is "5c54c654bc88">>She doesn't let go of your hand all the way down the corridor.<<else>>She doesn't let go of your wrist all the way down the corridor.<</if>> <<if _storyClip is "2cfc88fb8cce">>Her door bangs shut behind you. She slides down against it, chest heaving, rips her fly open and shoves her own hand down the front of her trousers, eyes on you, before she drags yours in after it.<<elseif _storyClip is "6f411768c64b">>Her door bangs shut behind you, and she drags you against her by the neck and kisses you hard, chest heaving, her back to the door, and shoves your hand down the front of her trousers.<<else>>Her door bangs shut behind you, she leans back against it, chest heaving, and shoves your hand down the front of her trousers.<</if>> She's soaked through.</p>
<<say "Kira" "Put both of them in the dirt, and I've been wet since the second one stopped moving.">>
<p>She grinds once against your fingers and doesn't look away.</p>
<<say "Kira" "You fucking me, vault boy, or do I sort it myself?">>
<div class="choice-container">
<<vchoice "Fuck her against the wall" "Kira_Event_AdrenalineSex" "intimate" "lust">>
<<vchoice "Not tonight" "Vault_Hub" "move" "return">>
</div><<run VaultUI.setBackground("medical")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<<run VaultUI.hideAllCharacters()>>
<<showCharacter "kira" "center" "vulnerable">>
<<set _scT to setup.kiraRunTendThanks()>>
<<if _scT>><<relationChange "kira" "trust" _scT>><</if>>
<h2>Patched Up</h2>
<p>You cut the stiff, blood-dark sleeve off her, wash the gash out and stitch what needs stitching. She hisses through her teeth the whole time and doesn't pull away once.</p>
<<say "Kira" "Fuck, that stings. ...Thanks. Don't make a thing of it.">>
<p>She flexes the arm, tests the knot on the bandage, and lets your hand stay on her shoulder a moment longer than it needs to.</p>
<div class="choice-container">
<<vchoice "Continue" "Medical_Hub" "action" "forward">>
</div><<goto "Den_Door">><<set $currentLocation to "market">>
<<run VaultUI.setBackgroundDirect("media/backgrounds/vault/exterior/market_day.webp")>>
<<set _qmSwing to setup.surplusSwing()>>
<<set _qmKinds to ["water", "food"]>>
<<set _qmList to setup.traderSellable()>>
<<set _qmFirst to setup.traderFirstMeet()>>
<<set _qmSpare to _qmList.length gt 0 or (Number($vault.water) || 0) - setup.surplusReserve("water") gte 1 or (Number($vault.food) || 0) - setup.surplusReserve("food") gte 1>>
<<set _qmSold to setup.traderJustSold()>>
<<set _qmLook to !_qmFirst and (_qmSold gte setup.ECONOMY.surplus.goodLot or _qmList.some(function (it) { return it.item === "trophy fish"; })) ? "pleased" : "neutral">>
<<run VaultUI.speakerLook("quartermaster", _qmLook)>>
<h2>The Quartermaster</h2>
<<if _qmFirst>>
<p>She doesn't look up when you reach her crate. She finishes the line she's writing, blows on the page, and only then turns the ledger round so it faces you.</p>
<p>Your vault is on it. Not a name: the door itself, drawn small and neat in pencil, with the path down to it and a cross where the steps begin. Beside the drawing, a column of numbers in a careful hand, headed <em>Water</em> and <em>Food</em>, and they're closer to what's on your shelves than you'd like.</p>
<<say "Quartermaster" "Vault. My porters followed your tracks home the day you turned this market over. Don't look at me like that. Everybody out here knows where somebody sleeps. I know how much they've got.">>
<p>Behind her, one of the porters grins at you and cracks her knuckles, one finger at a time.</p>
<<say "Quartermaster" "So. You don't carry anything. I buy, my porters walk to your door and take what I bought, and nobody else learns the way. That's the service. Now sell, or stop standing in my light.">>
<<if setup.kiraWithYou()>>
<<say "Kira" "She followed us home. Drew our fucking door. ...And you want to sell her our water.">>
<</if>>
<<else>>
<p>She keeps her ledger open on a crate and doesn't close it when you come up. <<if _qmLook is "pleased">>For once she's smiling, wide, like a woman whose sums have come out in her favour.<<else>>She looks you over with narrowed eyes and no smile at all.<</if>> Her porters lounge against the wall behind her, ready to carry whatever she buys.</p>
<<if _qmSwing.water gte 1.2>>
<<say "Quartermaster" "Vault. Dry week. Water's dear. Sell now, before somebody finds a well.">>
<<elseif _qmSwing.water lte 0.8>>
<<say "Quartermaster" "Vault. Everybody's carrying water this week. I'll take yours, cheap, or you can drink it.">>
<<elseif _qmSwing.food gt 0.8 and _qmSwing.food lt 1.2>>
<<say "Quartermaster" "Vault. Usual rates. Don't haggle. I've heard it.">>
<</if>>
<<set _qmVault to _qmSwing.water gt 0.8 and _qmSwing.water lt 1.2 ? "Vault. " : "">>
<<if _qmSwing.food gte 1.2>>
<<say "Quartermaster" `_qmVault + "Lean week. Food's dear. Sell now, before somebody remembers how to hunt."`>>
<<elseif _qmSwing.food lte 0.8>>
<<say "Quartermaster" `_qmVault + "Fat week. Every pot on the post is full. Food's cheap. Sell it to me or eat it."`>>
<</if>>
<<if !_qmSpare>>
<<say "Quartermaster" "Nothing to sell? Then you're browsing. I don't buy men. Too many going spare.">>
<<elseif _qmList.some(function (it) { return it.item === "trophy fish"; })>>
<<say "Quartermaster" "A trophy fish. Somebody will hang that on a wall and tell people they caught it. I know who. They pay.">>
<</if>>
<<if _qmSpare and setup.kiraWithYou()>>
<<if _qmSwing.water gte 1.2>>
<<say "Kira" "Sell the water. Then let's go, before she counts us again.">>
<<else>>
<<say "Kira" "Don't let her see how much we've got.">>
<</if>>
<</if>>
<</if>>
<<for _qmK range _qmKinds>>
<p class="narrator"><<= _qmK is "water" ? "Water" : "Food">> in the vault: <<= $vault[_qmK]>>. You keep <<= setup.surplusReserve(_qmK)>>. She takes <<= setup.surplusSellable(_qmK)>> more today.</p>
<</for>>
<<scrapBalance>>
<div class="choice-container">
<<for _qmK range _qmKinds>>
<<capture _qmK>>
<<set _qmCan to setup.surplusSellable(_qmK)>>
<<set _qmP to setup.surplusPrice(_qmK)>>
<<if _qmCan gte 1>>
<<link `'<span class="choice-button action"><span class="gi gi-scrap gi-large"></span><span class="label">Sell 1 ' + _qmK + ' (' + _qmP + ' scrap)</span></span>'`>><<run setup.traderLot(setup.sellSurplus(_qmK, 1))>><<goto "TradersRest_Quartermaster">><</link>>
<<if _qmCan gt 1>>
<<link `'<span class="choice-button action"><span class="gi gi-scrap gi-large"></span><span class="label">Sell all the ' + _qmK + ' she takes (' + _qmCan + ' for ' + (_qmCan * _qmP) + ' scrap)</span></span>'`>><<run setup.traderLot(setup.sellSurplus(_qmK, "all"))>><<goto "TradersRest_Quartermaster">><</link>>
<</if>>
<<elseif (Number($vault[_qmK]) || 0) - setup.surplusReserve(_qmK) lt 1>>
<<vchoiceDisabled `"Sell " + _qmK + " (you keep " + setup.ECONOMY.surplus.reserveNights + " nights' worth)"` "action" "scrap">>
<<else>>
<<vchoiceDisabled `"Sell " + _qmK + " (she's bought her " + setup.ECONOMY.surplus.dailyCap + " for today)"` "action" "scrap">>
<</if>>
<</capture>>
<</for>>
<<for _qmI to 0; _qmI lt _qmList.length; _qmI++>>
<<set _qmIt to _qmList[_qmI]>>
<<set _qmPic to '<img class="shop-item-thumb" src="' + setup.itemImage(_qmIt.item) + '" alt="" onerror="this.style.display=\'none\'">'>>
<<capture _qmIt>>
<<link `'<span class="choice-button action">' + _qmPic + '<span class="label">Sell one ' + _qmIt.name + ' (' + _qmIt.price + ' scrap)</span></span>'`>><<run setup.traderLot(setup.traderSell(_qmIt.item, 1))>><<goto "TradersRest_Quartermaster">><</link>>
<<if _qmIt.have > 1>>
<<link `'<span class="choice-button action">' + _qmPic + '<span class="label">Sell all ' + _qmIt.have + ' ' + _qmIt.name + ' (' + (_qmIt.have * _qmIt.price) + ' scrap)</span></span>'`>><<run setup.traderLot(setup.traderSell(_qmIt.item, "all"))>><<goto "TradersRest_Quartermaster">><</link>>
<</if>>
<</capture>>
<</for>>
<<vchoice "Back" "Location_Market" "move" "back">>
</div><<set $currentLocation to "market">>
<<run VaultUI.setBackgroundDirect("media/backgrounds/vault/exterior/market_day.webp")>>
<<set _tsGoods to setup.TRADERS_REST.stall.goods>>
<<set _tsBought to setup.stallJustBought()>>
<<set _tsFirst to setup.stallFirstMeet()>>
<h2>The Trader's Blanket</h2>
<<if _tsBought>>
<p>She drops your scrap into the tin by her knee and waits, in no hurry, to see what else you need.</p>
<<elseif _tsFirst>>
<p>By the fire barrel a woman sits cross-legged on a striped wool blanket, her goods laid out in rows in front of her knees: water in scratched bottles, rations in waxed paper, rolled bandages, a tin of coffee, folded squares of cloth. At the back, under her hand, sits a padded box of medkits and stimpaks. There is grey in her braid and flour on her sleeve, and she smiles at you as if you were expected.</p>
<<say "Blanket trader" "Sit down before you fall down. You've got the look of somebody who sleeps in a hole in the ground.">>
<<say "Blanket trader" "Everyday things, fair prices, and no haggling. Whatever you'd run out of first, I've got. Boxes for that medical bay of yours go down with the quartermaster's porters. They know your door. Everybody does.">>
<<if setup.kiraWithYou()>>
<<say "Kira" "Everybody keeps saying that.">>
<</if>>
<<else>>
<p>The woman on the striped blanket looks up from her mending and moves her knees to make room for you.</p>
<<switch (Number($time.day) || 0) % 3>>
<<case 0>>
<<say "Blanket trader" "Back again. Good. It means you're still alive to buy things.">>
<<case 1>>
<<say "Blanket trader" "Water came up from the spring this morning. Fresh enough. Sit, have a look.">>
<<default>>
<<say "Blanket trader" "The box at the back, you want to be quick about. I only get a couple a day.">>
<</switch>>
<<if setup.kiraWithYou()>>
<p>Kira crouches at the edge of the blanket and turns a roll of bandage over in her fingers, checking the weave like somebody who has been cheated before.</p>
<</if>>
<</if>>
<<scrapBalance>>
<div class="choice-container">
<<for _tsI to 0; _tsI lt _tsGoods.length; _tsI++>>
<<set _tsG to _tsGoods[_tsI]>>
<<set _tsCan to setup.stallCanBuy(_tsI)>>
<<set _tsLabel to "Buy " + _tsG.name + " (" + _tsG.price + " scrap)">>
<<set _tsPic to '<img class="shop-item-thumb" src="' + setup.itemImage(_tsG.id) + '" alt="" onerror="this.style.display=\'none\'">'>>
<<if _tsCan.ok>>
<<capture _tsI>>
<<link `'<span class="choice-button action">' + _tsPic + '<span class="label">' + _tsLabel + '</span></span>'`>><<run setup.stallBuy(_tsI)>><<goto "TradersRest_Stall">><</link>>
<</capture>>
<<else>>
<<set _tsWhy to ({ scrap: "you have too little", full: "your backpack is full", sold: "none left today" })[_tsCan.why] || "not today">>
<<print '<span class="choice-button disabled action">' + _tsPic + '<span class="label">' + _tsLabel + ' (' + _tsWhy + ')</span></span>'>>
<</if>>
<</for>>
<<vchoice "Back" "Location_Market" "move" "back">>
</div><<set $currentLocation to "market">>
<<run VaultUI.setBackgroundDirect("media/backgrounds/vault/exterior/market_day.webp")>>
<<set _dtE to setup.ECONOMY.dice>>
<<set _dtD to setup.diceState()>>
<<set _dtR to _dtD.round>>
<<set _dtLook to _dtR and _dtR.result is "lose" and !_dtR.sceneDone ? "pleased" : "neutral">>
<<run VaultUI.speakerLook("dealer", _dtLook)>>
<<set _dtMark to (Number(_dtD.had) || 0) gt 0 ? "my stake" : "mark">>
<<set _dtEvent to _dtR and !_dtR.self and _dtR.ev ? _dtR.ev : "">>
<<set _dtMyMark to (Number(_dtD.had) || 0) gt 0 ? "my stake" : "my mark">>
<<set _dtCloth to "The crate is wearing a skirt today. Somebody settled a debt with the dealer in red oilcloth, and she has thrown it over the crate and the plank she plays on, so it hangs to the floorboards all the way round.">>
<<set _dtFootOn to _dtEvent is "foot" and !_dtR.result and _dtR.evStep isnot "stopped" and !setup.diceEventSeen("footRoz")>>
<<set _dtSideOn to _dtEvent is "side" and !_dtR.result and !!_dtR.side and !_dtR.side.taken>>
<<set _dtTwoOn to _dtEvent is "two" and _dtR.result is "win" and !setup.diceEventSeen("two")>>
<<set _dtF to ["", "⚀", "⚁", "⚂", "⚃", "⚄", "⚅"]>>
<<set _dtRaises to _dtE.stakes.map(function (s) { return "+" + setup.diceRaiseCost(s); }).join(" / ")>>
<<set _dtPending to setup.diceOpen() or !!(_dtR and _dtR.self and !_dtR.sceneDone and (_dtR.result is "lose" or _dtR.pay is "better"))>>
<h2>The Dice Table</h2>
<p>An upturned crate under a strip of tarp, a tin cup, two pairs of yellowed bone dice. The dealer sits with her back to the wall and her boots up on a second crate, a black-haired woman in no hurry at all, and she watches you walk over the way a cat watches a bird hop closer.</p>
<div class="shop-display">
<ul>
<li class="shop-item-line"><span class="shop-item-text"><strong>Bones.</strong> Stake <<= _dtE.stakes.join(", ")>> scrap. Your two dice against her two: the higher total takes the stake.</span></li>
<li class="shop-item-line"><span class="shop-item-text">After your first die you may raise once: <<= _dtRaises>> on a stake of <<= _dtE.stakes.join(" / ")>>.</span></li>
<li class="shop-item-line"><span class="shop-item-text">Ties go to the house.</span></li>
<li class="shop-item-line"><span class="shop-item-text"><<= _dtE.roundsPerDay>> rounds a day. Left today: <<= setup.diceRoundsLeft()>>.</span></li>
<<if setup.diceBroke()>>
<li class="shop-item-line"><span class="shop-item-text">Under <<= _dtE.brokeBelow>> scrap you can stake yourself. Win and she pays <<= _dtE.selfWin>> scrap, or something better: her choice.</span></li>
<</if>>
</ul>
</div>
<<if !_dtR>>
<<set _dtG to setup.diceGreeting()>>
<<if _dtG is "first">>
<p>She looks you over once, slowly: your boots, your hands, your face, and last the pocket where you keep your scrap, the way a trader prices a mule.</p>
<<say "Dealer" "Sit down, mark. The bones don't bite. I do.">>
<<elseif _dtG is "done">>
<<say "Dealer" `"That's your lot for today, " + _dtMark + ". The bones sleep till tomorrow."`>>
<<elseif _dtG is "brokeAgain">>
<<say "Dealer" "Short again, my stake? Good. I was hoping.">>
<<elseif _dtG is "broke">>
<<say "Dealer" "Short, mark? Then stake what you've got. You've got a face.">>
<<elseif _dtG is "had">>
<<say "Dealer" "Back, my stake? Scrap this time, or yourself again?">>
<<elseif _dtG is "paid">>
<<say "Dealer" "You again. Win first. Then we'll talk about who pays who.">>
<<else>>
<<say "Dealer" "Scrap on the crate, mark. The bones decide the rest.">>
<</if>>
<</if>>
<<if _dtR and _dtR.self and _dtR.sceneDone>>
<<if _dtR.result is "lose" and setup.diceRoundsLeft() gt 0>>
<<say "Dealer" "On your feet already? Then you can afford another round. Or can't you.">>
<<elseif _dtR.result is "lose">>
<<say "Dealer" "On your feet already? That's your lot today, my stake. Come back tomorrow and lose to me again.">>
<<else>>
<<say "Dealer" `"We're square, " + _dtMark + ". Don't get attached."`>>
<</if>>
<</if>>
<<if _dtR and !(_dtR.self and _dtR.sceneDone)>>
<p class="dice-throw"><strong>You:</strong> <<= _dtF[_dtR.p[0]] + " " + _dtR.p[0]>><<if _dtR.p.length gt 1>>, <<= _dtF[_dtR.p[1]] + " " + _dtR.p[1]>> = <strong><<= _dtR.p[0] + _dtR.p[1]>></strong><</if>><<if _dtR.raise gt 0>> (raised <<= _dtR.raise>>)<</if>></p>
<<if _dtR.h.length gt 1>>
<p class="dice-throw"><strong>Her:</strong> <<= _dtF[_dtR.h[0]] + " " + _dtR.h[0]>>, <<= _dtF[_dtR.h[1]] + " " + _dtR.h[1]>> = <strong><<= _dtR.h[0] + _dtR.h[1]>></strong></p>
<</if>>
<<if !_dtR.result>>
<<say "Dealer" `"One bone down, " + _dtMark + ". Push your luck, or roll it out?"`>>
<<elseif _dtR.self>>
<<if _dtR.result is "win" and _dtR.pay is "scrap">>
<p>Your bones beat hers. She counts the scrap out onto the crate one piece at a time, slowly, looking at you and not at the scrap.</p>
<<say "Dealer" "Take it. Next time I keep you.">>
<<elseif _dtR.result is "win">>
<p>Your bones beat hers. She doesn't reach for her scrap tin. She takes her boots off the crate instead.</p>
<<say "Dealer" "Scrap's boring. Come round behind the tarp. I pay my debts in something better.">>
<<else>>
<p><<if _dtR.p[0] + _dtR.p[1] is _dtR.h[0] + _dtR.h[1]>>A tie, and ties go to the house. <</if>>She sweeps the bones back into the cup and smiles for the first time.</p>
<<say "Dealer" "Mine. Stay right where you are, my stake.">>
<</if>>
<<elseif _dtR.result is "win">>
<p>You take <<= _dtR.stake + _dtR.raise>> scrap off the crate.</p>
<<if setup.diceRoundsLeft() gt 0>>
<<say "Dealer" "The bones like you today. They're fickle. Go again?">>
<<else>>
<<say "Dealer" "The bones like you today. Don't get used to it. That's your lot till tomorrow.">>
<</if>>
<<else>>
<p><<if _dtR.p[0] + _dtR.p[1] is _dtR.h[0] + _dtR.h[1]>>A tie, and ties go to the house. <</if>>She rakes in <<= _dtR.stake + _dtR.raise>> scrap.</p>
<<if _dtR.raise gt 0>>
<<say "Dealer" "Raised and lost. That's my favourite part.">>
<<else>>
<<say "Dealer" "The bones like me. They always do.">>
<</if>>
<</if>>
<</if>>
<<if _dtEvent is "foot">>
<<if _dtFootOn>>
<p><<= _dtCloth>></p>
<<if setup.diceEventAgain("foot")>>
<p>Ines is back on her keg at the crate's corner, lenses and all, and her scrap is beside yours before the dealer has opened her mouth.</p>
<<say "Dealer" `"Ines is on your bones again, " + _dtMark + "."`>>
<<else>>
<p>While you were counting out your stake, a woman sat down on the keg at the crate's corner: wire-framed lenses, a great dark cloud of curls, a blue dress with a piece cut out of its middle. She puts a small stack of scrap beside yours without asking anybody.</p>
<<say "Dealer" `"Ines has scrap on your bones, " + _dtMark + ". Lose it for her and that's between you two."`>>
<</if>>
<<say "Ines" "I count for a living, long odds. I counted you. Throw.">>
<p>She folds her arms on the oilcloth and studies your one die as if it were a column that won't come out right. Under the crate, something warm and bare slides up the inside of your shin, over your knee, and settles in your lap.</p>
<<elseif !_dtR.result and _dtR.evStep is "stopped">>
<p>You close your hand round her ankle and set her foot back on the floorboards. She lets you.</p>
<<say "Ines" "Suit yourself. It adds up the same.">>
<<elseif _dtR.result is "win">>
<p>Ines takes her stack back off the dealer with as much again on top, counts it twice, and stands up into her boots.</p>
<<say "Ines" "I counted you right, long odds. I'll back you again.">>
<<elseif _dtR.result is "lose">>
<p>Ines watches the dealer rake her stack in with yours and pushes her lenses up her nose.</p>
<<say "Ines" "Carry the one. You owe me for that, long odds. I'll take it out of you another day.">>
<</if>>
<<elseif _dtEvent is "side">>
<<if _dtSideOn>>
<p><<= _dtCloth>></p>
<<if setup.diceEventAgain("side")>>
<p>Roz is leaning on the tarp pole again with her tray at her feet, and she has your one die priced before you've looked up.</p>
<<say "Roz" "Same terms, lucky. The smallest stake against my mouth. I've been practising losing.">>
<<else>>
<p>A woman is leaning on the tarp pole at your elbow, close enough that you can smell dye and woodsmoke on her: dark brown hair in loose waves, a strapless pink dress that shines like fish scales and stops high on the thigh, the loudest thing at Trader's Rest by some way. Her pedlar's tray of dyed ribbon sits forgotten at her feet. She looks at your one die and then, for longer, at you.</p>
<<say "Dealer" `"That's Roz. She bets on faces. Mind yours, " + _dtMark + "."`>>
<<say "Roz" "I'll make it simple, lucky. The smallest stake on this table says her bones beat yours. If they do, I've sold nothing all day and still eaten. If yours win, I don't pay in scrap. I go under that cloth and suck your cock till there's nothing left in it. Can't say fairer.">>
<<say "Dealer" "Side money rides on the same bones. I don't hold it and I don't wait for it. Bet or don't.">>
<</if>>
<<elseif !_dtR.result and _dtR.side and _dtR.side.taken>>
<p>You set the scrap on the corner of the crate. Roz wets her thumb and presses it to the top piece, the way pedlars seal a sale.</p>
<<say "Roz" "Sold. Now throw badly.">>
<<elseif _dtR.result is "lose" and _dtR.side and _dtR.side.taken>>
<p>Roz has your scrap off the corner before the dealer's hand has finished raking.</p>
<<say "Roz" "A face like that and no luck at all. Come back when you've more to lose, lucky.">>
<<elseif setup.diceSideOwed()>>
<p>Roz looks at the bones, blows out her cheeks, and laughs.</p>
<<say "Roz" "Well, fuck. A sale's a sale.">>
<p>She hands her tray to the nearest trader to mind and gets down on her knees at the edge of the oilcloth.</p>
<</if>>
<<elseif _dtEvent is "two" and _dtTwoOn>>
<p><<= _dtCloth>></p>
<<if setup.diceEventAgain("two")>>
<p>You have the scrap in your fist and one leg over the keg when a hand you know closes on your arm. Roz.</p>
<<else>>
<p>You have the scrap in your fist and one leg over the keg when a hand closes on your arm above the elbow. Long nails, painted pale. It belongs to a woman in a pink dress that shines like fish scales, dark brown hair in waves down her bare shoulders, and she isn't looking at your face. She is looking at your fist.</p>
<</if>>
<<say "Dealer" `"Let go of " + _dtMyMark + ", Roz. Thank him under the cloth or not at all. Ines, you lost. Lose quietly."`>>
<<say "Roz" "Sit back down, lucky. You pushed it and it held, and I had scrap on that with half this post. I thank a man properly when he makes my week.">>
<<if setup.diceEventAgain("two")>>
<p>Across the crate Ines has already stopped counting.</p>
<<else>>
<p>Across the crate, a woman with wire lenses and a cloud of dark curls is counting what she has left. It doesn't take her long.</p>
<</if>>
<<say "Ines" "I had it at five to four against him. It was five to four against him. He still won.">>
<<say "Roz" "Ines counted you out. I bet on your face. Guess which of us eats tonight.">>
<</if>>
<<if setup.kiraWithYou() and !_dtPending>>
<<if setup.diceKiraOffer()>>
<<say "Kira" "You're down to nothing, aren't you. Here. Don't make me regret it.">>
<<elseif _dtD.loan gt 0>>
<<say "Kira" "You still owe me, remember.">>
<</if>>
<</if>>
<<scrapBalance>>
<div class="choice-container">
<<if setup.diceOpen()>>
<<if _dtFootOn>>
<<vchoice "Look under the crate" "Dice_Event_Foot" "action" "dice">>
<</if>>
<<if _dtSideOn>>
<<if setup.diceSideCanTake()>>
<<set _dtTake to "Take Roz's bet (" + _dtR.side.amount + " scrap)">>
<<link `'<span class="choice-button action"><span class="gi gi-dice gi-large"></span><span class="label">' + _dtTake + '</span></span>'`>><<run setup.diceSideTake()>><<goto "Dice_Table">><</link>>
<<else>>
<<vchoiceDisabled `"Take Roz's bet (" + _dtR.side.amount + " scrap: you can't cover it)"` "action" "dice">>
<</if>>
<</if>>
<<set _dtUp to setup.diceRaiseCost(_dtR.stake)>>
<<if setup.diceCanRaise()>>
<<link `'<span class="choice-button action"><span class="gi gi-dice gi-large"></span><span class="label">Raise ' + _dtUp + ' and roll</span></span>'`>><<run setup.diceFinish(true)>><<run setup.historyCheckpointNext()>><<goto "Dice_Table">><</link>>
<<else>>
<<vchoiceDisabled `"Raise " + _dtUp + " (you can't cover it)"` "action" "dice">>
<</if>>
<<link `'<span class="choice-button action"><span class="gi gi-dice gi-large"></span><span class="label">Roll</span></span>'`>><<run setup.diceFinish(false)>><<run setup.historyCheckpointNext()>><<goto "Dice_Table">><</link>>
<<elseif _dtR and _dtR.self and _dtR.result is "lose" and !_dtR.sceneDone>>
<<vchoice "She gets up off her crate" "Dice_Staked_Lost" "action" "dice">>
<<elseif _dtR and _dtR.self and _dtR.pay is "better" and !_dtR.sceneDone>>
<<vchoice "See what she pays" "Dice_Staked_Won_Better" "action" "dice">>
<<else>>
<<if setup.diceSideOwed()>>
<<vchoice "Roz ducks under the crate" "Dice_Event_Side" "action" "dice">>
<</if>>
<<if _dtTwoOn>>
<<vchoice "Sit back down" "Dice_Event_Two" "action" "dice">>
<</if>>
<<if setup.diceRoundsLeft() lt 1>>
<<vchoiceDisabled `"Another round (" + _dtE.roundsPerDay + " a day: come back tomorrow)"` "action" "dice">>
<<else>>
<<for _dtS range _dtE.stakes>>
<<capture _dtS>>
<<set _dtC to setup.diceCanStake(_dtS)>>
<<if _dtC.ok>>
<<link `'<span class="choice-button action"><span class="gi gi-dice gi-large"></span><span class="label">Stake ' + _dtS + ' scrap</span></span>'`>><<run setup.diceStake(_dtS)>><<run setup.historyCheckpointNext()>><<goto "Dice_Table">><</link>>
<<else>>
<<vchoiceDisabled `"Stake " + _dtS + " (you have too little)"` "action" "dice">>
<</if>>
<</capture>>
<</for>>
<<if setup.diceBroke()>>
<<link `'<span class="choice-button action"><span class="gi gi-dice gi-large"></span><span class="label">Stake yourself</span></span>'`>><<run setup.diceSelfStake()>><<run setup.historyCheckpointNext()>><<goto "Dice_Table">><</link>>
<</if>>
<</if>>
<<if setup.kiraWithYou() and setup.diceKiraOffer()>>
<<link `'<span class="choice-button action"><span class="gi gi-scrap gi-large"></span><span class="label">Take Kira’s ' + _dtE.kiraLoan.amount + ' scrap</span></span>'`>><<run setup.diceKiraLoan()>><<goto "Dice_Table">><</link>>
<</if>>
<<if setup.kiraWithYou() and _dtD.loan gt 0>>
<<if setup.diceKiraCanRepay()>>
<<link `'<span class="choice-button action"><span class="gi gi-scrap gi-large"></span><span class="label">Pay Kira back (' + _dtD.loan + ' scrap)</span></span>'`>><<if setup.diceKiraRepay() is "trust">><<addTrust "kira" 1>><</if>><<goto "Dice_Table">><</link>>
<<else>>
<<vchoiceDisabled `"Pay Kira back (" + _dtD.loan + " scrap: you have too little)"` "action" "scrap">>
<</if>>
<</if>>
<<link `'<span class="choice-button move"><span class="gi gi-back gi-large"></span><span class="label">Leave the table</span></span>'`>><<run setup.diceLeave()>><<goto "Location_Market">><</link>>
<</if>>
</div><<set $currentLocation to "market">>
<<run VaultUI.setBackgroundDirect("media/backgrounds/vault/exterior/market_day.webp")>>
<<set _dtEv to setup.ECONOMY.diceEvents>>
<<if setup.diceEventOnce("foot")>>
<<addLust "player" _dtEv.lust.foot>>
<</if>>
<h2>The Dice Table</h2>
<<storyVideo "story/dice_table/event_foot">>
<p>You tip your head and look down past the red hem. She has kicked her boots off under there. Two bare feet, the toenails painted dark, have come up between your knees, and they have made short work of you: your trousers are open and your cock is out in the shade of the crate, hard already, and you couldn't swear which of you undid the buttons.</p>
<p>Her toes close round the head and rub it, both feet at once, dry and warm and far more clever than feet have any right to be. Then she takes you between her soles and holds your cock upright, and strokes, slow, the whole length, the way you would roll a stick between your palms to raise a fire. One foot pushes it flat against your belly and grinds along it, heel to toe. The toes of the other curl in under the head and pick at you there until your thighs jump.</p>
<p>Above the crate nothing of her moves. Her arms stay folded on the oilcloth. Her lenses stay on your die.</p>
<<say "Ines" "One bone showing, one to come. Six ways it can fall. Go on, long odds. Add it up for me.">>
<p>Her toes squeeze the head of your cock and let go, squeeze and let go. You lose the sum.</p>
<<if setup.kiraWithYou()>>
<p>Kira stands at your shoulder with her thumbs in her belt. She can't see under the oilcloth. She can see your face.</p>
<<say "Kira" "You've been staring at one die for a long time, idiot. It's not going to turn into a six.">>
<</if>>
<div class="choice-container">
<<vchoice "Let her go on" "Dice_Event_Foot_Roz" "action" "dice">>
<<link `'<span class="choice-button action"><span class="gi gi-dice gi-large"></span><span class="label">Catch her ankle</span></span>'`>><<run setup.diceFootStop()>><<goto "Dice_Table">><</link>>
</div><<set $currentLocation to "market">>
<<run VaultUI.setBackgroundDirect("media/backgrounds/vault/exterior/market_day.webp")>>
<<set _dtEv to setup.ECONOMY.diceEvents>>
<<if setup.diceEventOnce("footRoz")>>
<<addLust "player" _dtEv.lust.footRoz>>
<</if>>
<h2>The Dice Table</h2>
<<storyVideo "story/dice_table/event_foot_roz">>
<p>You let her. Her soles close round you again and pull, and you are watching her toes spread on the upstroke when the oilcloth lifts at your right knee and another woman comes in under it on her hands and knees: dark brown hair hanging in waves, bare shoulders, a strip of pink dress that shines like fish scales. She looks at the feet. She looks at your cock standing between them. Then she lifts her face to you from down there on the boards, big-eyed, as if she has caught the two of you at something and hasn't decided what it's worth.</p>
<<say "Ines" "That's Roz under there. She can't bear me backing a man before she's had a look at him. Don't let her touch the numbers.">>
<<say "Roz" "Feet, Ines? On a cock like that? No wonder you count for other people.">>
<p>She takes Ines's foot by the toes, pulls a face, and shoves it off you.</p>
<p>Above your head the bones rattle in the cup, long and slow.</p>
<<say "Dealer" "Roz. Out from under my table. Ines, feet on the floor.">>
<<say "Dealer" "He owes me a bone first. After that you can fight over what's left of him.">>
<p>Roz backs out the way she came, laughing. The feet go. Your cock stays where it is, hard and bare under the red hem, with half the post standing round the crate and one die still showing.</p>
<div class="choice-container">
<<vchoice "Back to your throw" "Dice_Table" "move" "back">>
</div><<set $currentLocation to "market">>
<<run VaultUI.setBackgroundDirect("media/backgrounds/vault/exterior/market_day.webp")>>
<<set _dtEv to setup.ECONOMY.diceEvents>>
<<set _dtMark to (Number(setup.diceState().had) || 0) gt 0 ? "my stake" : "mark">>
<<if setup.diceEventOnce("side")>>
<<advanceTime 0 _dtEv.minutes.side>>
<<set $player.lust to Math.min($player.lust, 20)>><<run setup.playerReleased()>>
<</if>>
<h2>The Dice Table</h2>
<<storyVideo "story/dice_table/event_side">>
<p>She goes in under the red hem on hands and knees, and for a moment there is only oilcloth moving. Then her fingers are at your belt, quick as a pedlar's at a purse string, and your cock is out in the shade under the crate, thickening in the open air while the traders standing round find other things to look at, or don't.</p>
<p>Her head comes out from under the cloth at your knee, the red hem lying over her hair like a hood. She has a long look at what she lost her bet to, close, her hair hanging round it. Then she tips her face up to you and grins: wide and white and shameless, the grin of a woman who has just been paid, not of one who is paying.</p>
<<say "Roz" "Oh, I'd have lost this one on purpose.">>
<p>Her hand closes round the root, long nails filed to points and painted the pale shine of a fish's belly, and she holds you still and keeps grinning up at you while she does it. Then she puts her mouth over the head of your cock and sucks.</p>
<p>She doesn't hurry and she doesn't tease. It's a debt and she pays it like one, with her whole mouth: hot, wet, her tongue working the underside on every pull, her fist turning at the root. Her dark eyes come up to yours, go down, come up again, checking how the payment is landing. Over your head the dealer shakes the cup for some other mark. Somewhere a mule coughs. Your hands have found the edge of the crate and they stay there.</p>
<p>You come with your boots braced on the floorboards and your knuckles white, in thick pulses, into the heat of her mouth. She keeps her lips shut round the head and takes all of it and doesn't spill a drop on the dealer's oilcloth. When you have stopped twitching she lets you slide out, puts out her tongue and licks the head of your cock clean, slowly, with her eyes on you.</p>
<<say "Roz" "Paid in full, lucky. Tell your friends I settle.">>
<<say "Dealer" `"Settled? Then put it away, " + _dtMark + ". Bones or boots. You're sitting on my table's time."`>>
<<if setup.kiraWithYou()>>
<p>Kira has turned her back on the crate and is pricing a knife on the next blanket with great attention.</p>
<<say "Kira" "The smallest stake, for that. I've watched you haggle harder over beans.">>
<</if>>
<div class="choice-container">
<<vchoice "Back to the table" "Dice_Table" "move" "back">>
</div><<set $currentLocation to "market">>
<<run VaultUI.setBackgroundDirect("media/backgrounds/vault/exterior/market_day.webp")>>
<<set _dtEv to setup.ECONOMY.diceEvents>>
<<if setup.diceEventOnce("two")>>
<<advanceTime 0 _dtEv.minutes.two>>
<<addLust "player" _dtEv.lust.two>>
<</if>>
<h2>The Dice Table</h2>
<<storyVideo "story/dice_table/event_two_take">>
<p>Roz goes under the oilcloth on her knees and has your trousers open before you have sat straight. She makes no show of it. She wraps her pale-nailed hand round the root of your cock and takes the head into her mouth, soft and hot and very wet, in the red shade under the dealer's crate, with Trader's Rest walking past an arm's length away.</p>
<p>She has found her pace, slow, her lips dragging over the ridge, when the cloth lifts on your other side. Ines has folded her lenses away. Without them her eyes are bigger and darker. She comes in under the hem with one hand holding it up and her curls dragging on the boards, her mouth already open, and stops with her face a hand's width from your cock and Roz's lips, and watches them work.</p>
<<say "Ines" "I lost my stake on him. I'm owed a look at what beat me. Move over.">>
<p>Roz lets you slip out of her mouth to tell her where to go, and that is all the opening Ines needs. Her hand closes where Roz's was: black nails, a blue cuff. She takes you in with her eyes shut, like a woman tasting something to settle an argument. She sucks differently. Shorter strokes, tighter, her tongue flat and busy underneath, to a count you can almost hear.</p>
<p>Beside her Roz sits back on her heels under the cloth with her mouth wet and her face like weather coming in. She picks at a nail. She looks away at the strip of daylight under the hem. She looks back. Then she starts in, low and fast, one hand up, the way she would argue a price.</p>
<<say "Roz" "That's mine. I won that. You bet against him, you sour bitch. You don't get to suck the winnings.">>
<p>Ines doesn't come up to answer. She hums round your cock, and it might be a number.</p>
<div class="choice-container">
<<vchoice "Roz reaches across" "Dice_Event_Two_Back" "action" "dice">>
</div><<set $currentLocation to "market">>
<<run VaultUI.setBackgroundDirect("media/backgrounds/vault/exterior/market_day.webp")>>
<h2>The Dice Table</h2>
<<storyVideo "story/dice_table/event_two_back">>
<p>Roz gets her hand in between Ines's mouth and your cock and takes it back, like a pedlar taking her goods off a customer who won't pay. She holds it up in her fist and looks it over, shining with the pair of them. Ines lays her cheek against your hip and looks up at you instead, sulky and pleased with herself both at once.</p>
<p>Then Roz's mouth comes down over you again, and this time her eyes come up to yours as she does it. Ines watches from an inch away with two fingers pressed to her own lips, the way she would wet them to turn a page.</p>
<p>After that they pass you back and forth, and neither of them gives anything away. Roz lifts off to say something sharp across the head of your cock.</p>
<<say "Roz" "Count this, then. Go on. You're so good at it.">>
<p>Ines has you in her fist before the sentence is out.</p>
<<say "Ines" "Eleven strokes you've had, and four of those you spent talking. Mine.">>
<p>Then you are in her mouth again, and Roz claps a hand over her own as if she has never seen such thieving, and argues the case over the top of Ines's bobbing curls with her fingers going.</p>
<<say "Roz" "Thief! You're my witness, lucky. She's a thief.">>
<p>Ines comes up for air to answer her.</p>
<<say "Ines" "He jumps on every fourth one. You'd know that if you ever shut up.">>
<p>That is Roz's opening. She snatches you back with a laugh and swallows you down, and looks up to see whether you noticed who won that one. Under the red cloth, Ines has started to smile.</p>
<p>You are close. Your thighs have started to shake and your balls have drawn up tight, and both of them can feel it, and neither will let the other have it. That is when the cup comes down on the oilcloth over your head, twice, flat and unhurried.</p>
<<say "Dealer" "Time. Out from under, both of you.">>
<<say "Dealer" "Nobody comes at my table unless I'm the one collecting.">>
<p>Roz backs out on her side, wiping her chin on the back of her wrist and laughing. Ines comes out on hers, finds her lenses in the neck of her dress and hooks them back over her ears. She looks at your cock, standing wet and dark and unfinished in your lap in front of half of Trader's Rest, with the mild interest of a woman checking a sum.</p>
<<say "Ines" "Nine more strokes. I had it to the stroke.">>
<<say "Roz" "Next time, lucky. Somewhere she can't count and the house can't hear.">>
<p>You put yourself away. It takes some doing.</p>
<<if setup.kiraWithYou()>>
<p>Kira hasn't moved from the tarp pole. Her arms are folded, her jaw is set, and she is looking at the dealer, not at you.</p>
<<say "Kira" "You won the throw and still got robbed. Put it away, idiot.">>
<</if>>
<div class="choice-container">
<<vchoice "Back to the table" "Dice_Table" "move" "back">>
</div><<set $currentLocation to "market">>
<<run VaultUI.setBackgroundDirect("media/backgrounds/vault/exterior/market_day.webp")>>
<<set _dtR to setup.diceState().round>>
<<set _dtRide to !!(_dtR and _dtR.scene is "ride")>>
<<run VaultUI.speakerLook("dealer", "pleased")>>
<<if setup.diceSceneOnce()>>
<<advanceTime 0 20>>
<<if _dtRide>><<set $player.lust to Math.min($player.lust, 20)>><<run setup.playerReleased()>><<else>><<addLust "player" 15>><</if>>
<</if>>
<h2>The Dice Table</h2>
<<if _dtRide>>
<<storyVideo "story/dice_table/lost_ride">>
<p>She kicks the second crate over beside the first and slaps the planks. "On your back. You're the table now." She doesn't wait to see if you'll do it. Two of the women watching take an arm each and lay you down across the crates, and she drags your trousers to your knees in one pull, with the whole post looking on: a porter grinning, a trader stopping with his sack still on his shoulder. Your cock is half hard already, from the losing and the looking, and she laughs at it, spits in her palm and works it until it stands. Then she hikes her skirt up and sinks down onto you without a word of warning, all the way, hot and wet and tight, and sits there a moment so everybody can see where you've gone.</p>
<p>She rides you like she's collecting a debt: slow at first, so everybody gets a good look, her hand flat on your chest to keep you down. Then she turns her head to the crowd without missing a stroke.</p>
<<say "Dealer" "Two scrap says he doesn't last to fifty. Who's taking it?">>
<p>Somebody takes it. Somebody always does. The crowd starts counting her strokes out loud, and she rides you harder on every number, grinding down on the count, squeezing her cunt round your cock on purpose every time it climbs. You try to hold out. She feels you trying and laughs in your face, and slams down, and somewhere in the thirties you come inside her, bucking up off the crates while half of Trader's Rest groans and the other half cheers.</p>
<p>She holds her hand out for her winnings without getting off you.</p>
<<say "Dealer" "Paid in full. Get up, my stake. You're blocking my table.">>
<<else>>
<<storyVideo "story/dice_table/lost_facesit">>
<p>She doesn't tell you what's coming. She puts a boot in the middle of your chest and pushes, and you go down on your back in the dust beside her crate. The traders drift closer; nobody pretends not to look. She steps over your head, a boot either side of your ears, hikes her skirt to her hips, and she's bare under it and already wet when she lowers her pussy onto your face and settles her whole weight there.</p>
<p>"Use your tongue, my stake. I put good scrap against that face." She rocks on your mouth, slow and greedy, her cunt hot and slick over your lips and nose until all you can smell is her and every breath you get is one she lets you have. When you reach for her thighs she slaps your hand away without looking down. She talks over your head to the onlookers, about the road and the price of salt, like you're a crate she happens to be sitting on.</p>
<p>Then a woman with a mule's lead over her shoulder stops at the table and asks if the game's open. "Always," the dealer says. She doesn't get up. She shakes the cup and throws the bones across your chest, and you feel them bounce off your ribs while she grinds down on your tongue. The stranger throws hers onto your belly. The dealer wins. She sweeps the woman's scrap off your stomach with the side of her hand, and a minute later she comes on your face, thighs clamped round your ears, fingers knotted in your hair, laughing at nothing.</p>
<p>She gets up, wipes herself on your shirt and sits back down at her crate. Your cock is straining in your trousers, untouched, and she looks at it and smiles.</p>
<<say "Dealer" "Not bad. I'd play you again.">>
<</if>>
<<if setup.kiraWithYou()>>
<p>Kira stands at the edge of the crowd with her arms folded, and she doesn't look away once.</p>
<<if _dtRide>>
<<say "Kira" "Next time, ask me before you bet yourself.">>
<<else>>
<<say "Kira" "Next time, ask me before you bet your face.">>
<</if>>
<</if>>
<div class="choice-container">
<<vchoice "Back to the table" "Dice_Table" "move" "back">>
</div><<set $currentLocation to "market">>
<<run VaultUI.setBackgroundDirect("media/backgrounds/vault/exterior/market_day.webp")>>
<<if setup.diceSceneOnce()>>
<<advanceTime 0 20>>
<<set $player.lust to Math.min($player.lust, 20)>><<run setup.playerReleased()>>
<</if>>
<h2>The Dice Table</h2>
<<storyVideo "story/dice_table/won_better">>
<p>She takes you by the belt and pulls you behind the tarp, out of the traders' sight, where a stack of crates makes a wall. "I always pay my debts," she says, and drops to her knees in the dust.</p>
<p>She sucks your cock like she means to win it back: deep and wet and in no hurry at all, spit running down to her fist, her eyes on yours the whole time as if she's reading your hand. Every time you start to shake she stops, holds you at her lips and waits until you've stopped. Then she stands, turns, bends over the crates and pulls you into her pussy by the cock, and she sets the pace, slower than you want, her ass pushed back against you, telling you over her shoulder exactly when you're allowed. You come inside her when she says so, with her hand reaching back to hold you deep.</p>
<<say "Dealer" "Better than scrap? Don't answer. I know it was.">>
<<if setup.kiraWithYou()>>
<p>Kira is waiting by the table when you come back, eyebrows up.</p>
<<say "Kira" "So that's what she pays with. Good to know.">>
<</if>>
<div class="choice-container">
<<vchoice "Back to the table" "Dice_Table" "move" "back">>
</div><<run VaultUI.setBackground("training_yard")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<h2>Training Yard</h2>
A cleared area just outside the vault entrance. High walls of rubble provide some privacy and protection from the Reclaimed. Packed dirt, a few makeshift targets, and a worn sparring circle.
The open sky is a luxury after the vault's enclosed spaces.
<<if $time.phase === "morning">>
Morning sun warms the packed dirt. Good training weather.
<<elseif $time.phase === "afternoon">>
The Reclaimed heat beats down. Training now will be exhausting.
<<elseif $time.phase === "evening">>
The sun is setting. Shadows lengthen across the yard.
<</if>>
<<if $companions[0] && $companions[0].currentLocation === "training_yard">>
<<showCharacter "kira" "right" "combat">>
Kira is here, running through drills with her machete. Focused. Deadly.
<</if>>
<div class="choice-container">
<<vchoice "Practice solo" "Training_Solo" "action" "attack">>
<<if $companions[0] && $companions[0].currentLocation !== "medical" && ($companions[0].currentLocation === "training_yard" || $companions[0].available)>>
<<vchoice "Spar with Kira" "Training_Spar_Kira" "action" "attack">>
<</if>>
<<vchoice "Work the targets" "Training_Targets" "action" "attack">>
<<if $player.lust >= 40>>
<<if !setup.sceneHidden("reliefNonSexual")>><<vchoice "Train HARD (burn off tension)" "Training_BurnItOff" "action" "strength">><</if>>
<</if>>
<<vchoice "Head back inside" "Vault_Hub" "move" "return">>
</div><<run VaultUI.setBackground("training_yard")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
You run through combat drills alone. Footwork. Strikes. Defense.
Moving through forms. Muscle memory building. Sweat dripping.
<<advanceTime 1 0>>
<<clampStat "player.energy" -10 0 $player.maxEnergy>>
<<if random(1, 100) <= 15>>
<p class="stat-gain">Your movements feel sharper. Faster. (+1 Agility)</p>
<<set $player.agility += 1>>
<</if>>
The Reclaimed wind cools your sweat. The open air clears your head.
<div class="choice-container">
<<vchoice "Continue" "Training_Yard_Hub" "move" "return">>
</div><<run VaultUI.setBackground("training_yard")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
Makeshift targets — old cans, painted marks on rubble, a battered dummy.
You practice your aim and timing. Strike. Block. Counter.
<<advanceTime 1 0>>
<<clampStat "player.energy" -10 0 $player.maxEnergy>>
<<if random(1, 100) <= 15>>
<p class="stat-gain">Your accuracy improves. Hits feel cleaner. (+1 Strength)</p>
<<set $player.strength += 1>>
<</if>>
Satisfying. Productive.
<div class="choice-container">
<<vchoice "Done" "Training_Yard_Hub" "move" "return">>
</div><<run VaultUI.setBackground("training_yard")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<<showCharacter "kira" "center" "combat">>
<<say "Kira" "Want to go a few rounds?">>
She rolls her shoulders, machete in hand. Battle-ready.
<<say "Kira" "I'll go easy on you.">>
A slight smirk. Playful. Competitive.
<<say $player.name "You'd better not.">>
She grins. Actually grins.
<div class="choice-container">
<<vchoice "Let's do it" "Training_Spar_Start" "action" "attack">>
</div><<run VaultUI.setBackground("training_yard")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<<showCharacter "kira" "center" "combat">>
You circle each other. The packed dirt crunches underfoot.
<<storyVideo "story/training_spar_heat/spar_start">>
<<if _storyClip is "66f7676e586a">>Kira isn't trading yet — she snaps fast, controlled combinations at the air while you circle, watching her form. Then she waves you in. You block, counter, looking for openings.<<else>>Kira moves first — fast, controlled. You block, counter, looking for openings.<</if>>
She's GOOD. Better than you. But she's teaching, not dominating.
Blade work. Footwork. She corrects your form with touches — repositioning your stance, adjusting your grip.
<<advanceTime 1 0>>
<<clampStat "player.energy" -15 0 $player.maxEnergy>>
<<addTension "kira" 5>>
<<set _sparHeat to false>>
<<if $companions[0] && $companions[0].tension >= 50>>
<<if random(1, 100) <= 50>>
<<set _sparHeat to true>>
<</if>>
<</if>>
<<if _sparHeat>>
<div class="choice-container">
<<vchoice "Continue" "Event_Training_SparHeat" "action" "forward">>
</div>
<<else>>
After several exchanges, you're both breathing hard. Sweat-slicked.
<<say "Kira" "Not bad. You're getting better.">>
<<if random(1, 100) <= 20>>
<p class="stat-gain">Sparring with Kira sharpens your skills. (+1 Agility)</p>
<<set $player.agility += 1>>
<</if>>
<div class="choice-container">
<<vchoice "Again?" "Training_Spar_Kira" "action" "cycle">>
<<vchoice "That's enough" "Training_Yard_Hub" "move" "return">>
</div>
<</if>><<run VaultUI.setBackground("training_yard")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<<showCharacter "kira" "center" "combat">>
<<advanceTime 0 15>>
<<storyVideo "story/training_spar_heat/event_training_spar_heat">>
<<if _storyClip is "d79ce5b2f338">>Sparring with Kira under the yard's lean-to. Trading blows. Bodies moving in practiced violence.<<else>>Sparring with Kira under the open sky. Trading blows. Bodies moving in practiced violence.<</if>>
She's good. Fast. But today she's distracted.
You see an opening. Catch her wrist mid-strike. Spin her around.
<<if _storyClip is "d79ce5b2f338">>Back her up against the heavy bag hanging under the lean-to.<<else>>Press her against the rubble wall.<</if>>
<<say "Kira" "Good move.">>
She's panting. Not just from the exercise.
<<if _storyClip is "d79ce5b2f338">>You're pressed together, her back against the heavy bag, the leather giving behind her every time she breathes in. Her sweat is on your forearms, her pulse knocking against your chest, and neither of you steps back.<<else>>You're pressed together. Her back against rough stone. Your body against hers. Sweat and heat and PROXIMITY.<</if>>
The Reclaimed wind cools the sweat on your skin but does nothing for the heat BETWEEN you.
<<addTension "kira" 10>>
<<clampStat "player.lust" 15>>
<<say "Kira" "You can... let go now.">>
But she's not pushing you away. Her breathing has changed.
<div class="choice-container">
<<vchoice "Kiss her" "Training_Kiss" "intimate" "lips">>
<<vchoice "\"Do you want me to?\"" "Training_Tease" "intimate" "lips">>
<<vchoice "Let go, resume training" "Training_Resume" "action" "attack">>
</div><<showCharacter "kira" "center" "flustered">>
You step back. Give her space. Professional.
<<say "Kira" "Right. Good. Let's... keep going.">>
But her movements are off now. Distracted. You disarmed her twice in the next minute.
<<addTension "kira" 5>>
She's frustrated. But not at you.
<div class="choice-container">
<<vchoice "Continue sparring" "Training_Yard_Hub" "move" "return">>
</div><<showCharacter "kira" "center" "flustered">>
<<say $player.name "Do you want me to let go?">>
Your voice is low. Intimate. Your body still pressed against hers.
Her breath catches.
<<say "Kira" "I...">>
<<storyVideo "story/training_spar_heat/tease">>
<<if _storyClip is "a1b3bc202279">>You press closer, mouth at her neck, pinning her to the bag. She can feel your hardness against her. Obvious. Undeniable.<<else>>You press closer. She can feel your hardness against her. Obvious. Undeniable.<</if>>
<<say "Kira" "No.">>
Barely a whisper.
<<addTension "kira" 15>>
<<if $companions[0] && $companions[0].tension >= 70>>
She grabs your collar and pulls you into a kiss.
<div class="choice-container">
<<vchoice "Continue" "Training_Kiss" "action" "forward">>
</div>
<<else>>
A long moment. Tension crackling like electricity.
Then a sound from the vault entrance. Someone coming.
You both step apart quickly. The Groundskeeper emerges, doesn't seem to notice anything.
<<say "Kira" "...fuck.">>
The moment is broken. But the heat remains.
<div class="choice-container">
<<vchoice "Resume training (awkwardly)" "Training_Yard_Hub" "move" "return">>
</div>
<</if>><<showCharacter "kira" "center" "passionate">>
<<advanceTime 0 15>>
<<storyVideo "story/training_spar_heat/kiss">>
<<if _storyFamily is "sf_cg_training_spar_heat_04">>Nose to nose, neither of you giving an inch. You jab a finger at her; she snarls something back that's mostly swearing. Then she lays her palm flat against your cheek, and you kiss her. Hard.<<else>>You kiss her. Hard. Against the rough wall.<</if>>
<<if _storyFamily is "sf_cg_training_spar_heat_04">>She MELTS into it, her hands sliding down to your chest as she pulls you closer.<<else>>She freezes for a moment — then MELTS into it. Her back scrapes against the rubble as she pulls you closer.<</if>>
<<if _storyFamily is "sf_cg_training_spar_heat_04">>The lean-to's roof over you, the vault entrance fifty feet away. Anyone could walk in. Neither of you cares.<<else>>Open sky above. Anyone could see from the vault. Neither of you cares.<</if>>
<<performSexAct "kiss_deep">>
Her tongue meets yours. Desperate. All that tension releasing into this kiss.
<<set $flags.kissedKira to true>>
<<addTension "kira" 20>>
<<relationChange "kira" "affection" 1>>
When you break apart, you're both breathing hard. Sweaty. Aroused.
<<say "Kira" "That's... not part of training.">>
<<say $player.name "New technique.">>
She laughs. Breathless.
<<if $companions[0] && $companions[0].tension >= 75>>
<<say "Kira" "Inside. Now. Before I fuck you right here.">>
<div class="choice-container">
<<vchoice "Her room" "Kira_Room_Urgent" "intimate" "door-handle">>
<<vchoice "Your room" "Vault_Hub" "intimate" "house">>
<<vchoice "Right here. Do it." "Training_Sex_Outside" "intimate" "rapid-strikes">>
</div>
<<else>>
She pushes you back gently.
<<say "Kira" "We should... not here. Someone could see.">>
But she's smiling. Flushed. Her nipples visible through her sweat-soaked shirt.
<div class="choice-container">
<<vchoice "Continue training" "Training_Yard_Hub" "move" "return">>
</div>
<</if>><<run VaultUI.setBackground("kira_room")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
You barely make it to her room. Door slamming. Locked.
<div class="choice-container">
<<vchoice "..." "Kira_Event_AdrenalineSex" "intimate" "lust">>
</div><<showCharacter "kira" "center" "desperate">>
<<say $player.name "Right here. Right now.">>
Her eyes widen. Then darken with want and fear and NEED.
<<say "Kira" "Anyone could see—">>
<<say $player.name "I know. That's part of it.">>
She bites her lip. Looks toward the vault entrance. No one visible.
<<say "Kira" "Fuck it. Yes.">>
<<sexScene "kira" "risky" "desperate" "training-yard-outside">>
<div class="choice-container">
<<vchoice "Take her" "Training_Sex_Outside_Scene" "intimate" "lust">>
</div><<showCharacter "kira" "center" "passionate">>
<<run document.body.classList.add("scene-mode-intimate")>>
<<advanceTime 0 45>>
<<storyVideo "story/training_spar_heat/sex_outside_scene">>
<<if _storyClip is "e3f17113ccb9">>Against the old heavy bag chained to the scaffold under the yard's lean-to. With the Reclaimed wind gusting through the gaps and the vault entrance fifty feet away.<<else>>Against the rubble wall. Under the open sky. With the Reclaimed wind on your skin and the vault entrance fifty feet away.<</if>>
The RISK makes it unbearably hot.
<<sexPhase "action">>
<<performSexAct "kiss_deep">>
You kiss her violently. She responds with equal hunger.
Clothes are yanked aside. Just enough. No time to undress fully.
<<performSexAct "undress_partial">>
Her pants down to her knees. Your cock freed. Urgent. Desperate.
<<if _storyClip is "e3f17113ccb9">><<performSexAct "position_standing_doggy">><<else>><<performSexAct "position_against_wall">><</if>>
<<if _storyClip is "e3f17113ccb9">>She turns and hugs the bag, cheek pressed to the leather, ass pushed back at you.<<else>>She wraps a leg around you, bracing against the rough stone.<</if>>
<<say "Kira" "Hurry. Before someone—">>
<<performSexAct "penetrate">>
You slam into her. No gentleness. She's wet enough. Ready.
<<say "Kira" "Oh FUCK—">>
She has to bite her arm to muffle the sound.
<div class="narrative-video intimate">
<<if $preferences.showVideos>>
<<if !_storyClip>><<showEventMedia "intimate/outdoor_public_sex">><</if>>
<</if>>
</div>
<<performSexAct "thrust_fast">>
You fuck her hard and fast. Every sound from the vault making you both freeze mid-thrust — then continue with more urgency.
<<if _storyClip is "e3f17113ccb9">>The bag rocks with every thrust. She reaches back and spreads herself open for you, matching your desperate pace.<<else>>The rubble scrapes her back. She doesn't care. Matching your desperate pace.<</if>>
<<say "Kira" "Yes— fuck— someone's gonna see—">>
The thrill of being caught drives you both higher.
A door opens at the vault entrance. Voices. The Groundskeeper and someone else.
<<say "Kira" "Oh god— don't stop— please don't stop—">>
<<if _storyClip is "e3f17113ccb9">>You press your hand over her mouth. She bites it gently, grinning against your palm. Both of you trying to stay silent.<<else>>You press your hand over her mouth. She bites it gently. Eyes locked on yours. Both of you trying to stay silent.<</if>>
<<sexPhase "climax">>
The voices fade. They went back inside. You're safe. For now.
<<say $player.name "Come for me. Quietly.">>
<<performSexAct "climax_together">>
She EXPLODES around you, muffled scream against your palm. You finish deep inside her, buried to the hilt, trying not to groan.
<<if _storyClip is "e3f17113ccb9">>Both of you frozen. Connected. Coming silently under the lean-to while people are fifty feet away.<<else>>Both of you frozen. Connected. Coming silently under the open sky while people are fifty feet away.<</if>>
<<endSexScene>>
You almost collapse. She holds you up. Both panting. Both grinning wildly.
<<set $player.lust to 0>><<run setup.playerReleased()>>
<<if $companions[0]>>
<<set $companions[0].tension to Math.max(15, $companions[0].tension - 45)>>
<</if>>
<<relationChange "kira" "affection" 3>>
<<relationChange "kira" "trust" 1>>
<<set $flags.outdoorSex to true>>
<<set $flags.publicRisk to true>>
<<set $flags.sleptWithKira to true>>
<<say "Kira" "That was INSANE. Someone could have...">>
She's grinning. Actually grinning. Exhilarated.
<<say "Kira" "We should train more often.">>
<<run document.body.classList.remove("scene-mode-intimate")>>
<div class="choice-container">
<<vchoice "Head inside" "Vault_Hub" "move" "house">>
<<vchoice "Again?" "Training_Sex_Outside" "intimate" "rapid-strikes">>
</div><<abandonJourney>>
<<set $flags.groupCNCBoth to false>>
<<settleExposure "home">>
<<checkVaultDebt>>
<<set $currentLocation to "commons">>
<<run VaultUI.setBackground("commons")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<<run VaultUI.hideAllCharacters()>>
<<updateCompanionLocations>>
<<autoStoreVaultSupplies>>
<<if $time.day >= 2 && $companions.length > 0 && !$flags.kiraIsUnconscious>>
<<getCompanion "kira">>
<<if $tempCompanion && ($tempCompanion.currentLocation === "commons" || setup.kiraInCommons())>>
<<run VaultUI.showCharacter("kira", "right", $tempCompanion.mood || "neutral")>>
<</if>>
<</if>>
<<if $flags.groundskeeperPresent>>
<<run VaultUI.showCharacter("groundskeeper", "left", "neutral")>>
<</if>>
<<if $clothing && $clothing.player && ($clothing.player.dickExposed || $clothing.player.assExposed)>>
<<if $flags.groundskeeperPresent>>
<<groundskeeperReactsToExposure "commons">>
<</if>>
<<if $companions && $companions[0] && $companions[0].currentLocation === "commons">>
<<kiraReactsToClothingDamage>>
<</if>>
<</if>>
<<if $companions && $companions[0] && $companions[0].currentLocation === "commons">>
<<if $flags.lastKiraStyleReactionDay !== $time.day>>
<<set $flags.lastKiraStyleReactionDay to $time.day>>
<<kiraReactsToClothingStyle>>
<</if>>
<</if>>
<h2>The Commons</h2>
The heart of the vault. Soft amber light hums from fixtures overhead. A long table dominates the center, surrounded by mismatched chairs. The air recyclers whisper steadily.
<<if $time.phase === "morning">>
The lights have brightened to simulate dawn. Another day in the vault.
<<elseif $time.phase === "afternoon">>
The steady thrum of the power core vibrates faintly through the floor.
<<elseif $time.phase === "evening">>
The lights have dimmed to a warm amber. The vault feels almost cozy.
<<else>>
The lights are at their lowest. Most of the vault sleeps.
<</if>>
<h3>Day <<print $time.day>> - <<print $time.phase.charAt(0).toUpperCase() + $time.phase.slice(1)>></h3>
<<include "Hub_Characters_Present">>
<div class="hub-navigation">
<h3>Where do you want to go?</h3>
<div class="location-grid">
<div class="location-category">
<h4>Living Wing</h4>
<<hubLocation "Your Quarters" "Quarters_Hub" "quarters" "bed">>
<<if $time.day >= 2 && $companions.length > 0>>
<<if $companions[0].currentLocation === "medical">>
<div class="location-locked">
<span class="gi gi-door-handle gi-small"></span>
<span class="name">Kira's Room</span>
<span class="reason">Kira is in Medical Bay</span>
</div>
<<elseif $companions[0].currentLocation === "scavenging">>
<<hubLocation "Kira's Room" "Kira_Room_Away_Run" "kira_quarters" "door-handle" "Kira is out scavenging">>
<<elseif $companions[0].currentLocation !== "quarters" && $companions[0].currentLocation !== "kira_quarters">>
<div class="location-locked">
<span class="gi gi-door-handle gi-small"></span>
<span class="name">Kira's Room</span>
<span class="reason">Kira is away</span>
</div>
<<elseif setup.kiraInCommons()>>
<div class="location-locked">
<span class="gi gi-door-handle gi-small"></span>
<span class="name">Kira's Room</span>
<span class="reason">Kira is in the commons</span>
</div>
<<else>>
<<hubLocation "Kira's Room" `setup.kiraFirstComa() ? "Kira_Room_Coma_Visit" : "Kira_Room"` "kira_quarters" "door-handle">>
<</if>>
<</if>>
<<hubLocation "Bathroom" "Bathroom_Hub" "bathroom" "shower">>
<<hubLocation "Kitchen" "Kitchen_Hub" "kitchen" "eating">>
<<hubLocation "Medical Bay" "Medical_Hub" "medical" "medical">>
<div class="location-locked">
<span class="gi gi-door-handle gi-small"></span>
<span class="name">Old Room</span>
<span class="reason">Work in Progress</span>
</div>
</div>
<div class="location-category">
<h4>Utility Wing</h4>
<<hubLocation "Power Core" "PowerCore_Hub" "power_core" "rapid-strikes">>
<<hubLocation "Storage" "Storage_Hub" "storage" "chest">>
<<hubLocation "Archives" "Archives_Hub" "archives" "book">>
<div class="location-locked">
<span class="gi gi-locked gi-small"></span>
<span class="name">Sealed Door</span>
<span class="reason">Work in Progress</span>
</div>
</div>
<div class="location-category">
<h4>Surface</h4>
<<if $time.day >= 3>>
<<hubLocation "Vault Entrance" "Entrance_Hub" "entrance" "sunrise">>
<<if $flags.trainingLead>>
<<hubLocation "Training Yard" "Yard_Door" "yard_door" "attack">>
<<else>>
<div class="location-locked">
<span class="gi gi-attack gi-small"></span>
<span class="name">Training Yard</span>
<span class="reason">Work in Progress</span>
</div>
<</if>>
<div class="location-locked">
<span class="gi gi-convoy gi-small"></span>
<span class="name">Garage</span>
<span class="reason">Work in Progress</span>
</div>
<<else>>
<div class="location-locked">
<span class="icon"></span>
<span class="name">Vault Entrance</span>
<span class="reason">Not ready to venture out yet</span>
</div>
<</if>>
</div>
</div>
</div>
<div class="hub-actions">
<<if $time.phase !== "night" && $time.phase !== "late_night">>
<div class="choice-container">
<<vchoice "Pass time" "Hub_PassTime" "action" "clock">>
</div>
<</if>>
<<if $time.phase === "night" || $time.phase === "late_night">>
<div class="choice-container">
<<vchoice "Go to sleep" "Quarters_Sleep" "action" "night">>
</div>
<</if>>
</div><<set _inCommons to []>>
<<for _comp range $companions>>
<<if _comp.currentLocation === "commons" && !($flags.kiraIsUnconscious && _comp.id === "kira")>>
<<run _inCommons.push(_comp)>>
<<elseif _comp.id === "kira" && setup.kiraInCommons()>>
<<run _inCommons.push(_comp)>>
<</if>>
<</for>>
<<if _inCommons.length gt 0 || $flags.groundskeeperPresent>>
<div class="people-present">
<h4>Present:</h4>
<ul>
<<if $flags.groundskeeperPresent>>
<li>
<<link "Groundskeeper" "Groundskeeper_Talk">>
<<set $talkTarget to "groundskeeper">>
<</link>>
<span class="mood">— standing by the wall</span>
</li>
<</if>>
<<for _comp range _inCommons>>
<li>
<<link _comp.name "Kira_FreeRoam">>
<<set $talkTarget to _comp.id>>
<</link>>
<span class="mood">— <<print _comp.id === "kira" && setup.kiraInCommons() ? setup.KIRA_COMMONS.activity : (_comp.currentActivity || "here")>></span>
</li>
<</for>>
</ul>
</div>
<</if>><<if $time.phase === "morning">>
<<setTime 14 0>>
<<elseif $time.phase === "afternoon">>
<<setTime 19 0>>
<<elseif $time.phase === "evening">>
<<setTime 22 0>>
<</if>>
<<set $player.hunger to Math.max(0, $player.hunger - 5)>>
<<clampStat "player.energy" -5 0 $player.maxEnergy>>
<<updateCompanionLocations>>
<<toast `"Time passes. Now " + $time.phase + "."` "info">>
<<goto "Vault_Hub">><<set $currentLocation to "quarters">>
<<run VaultUI.setBackground("quarters")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<<run VaultUI.hideAllCharacters()>>
<h2>Your Quarters</h2>
A small but functional room. A narrow bed with surprisingly clean sheets. Your backpack sits in the corner. A cracked mirror on one wall. A window — fake, you realize, just a screen showing a simulated sky.
<<if $time.phase === "night" || $time.phase === "late_night">>
The simulated window shows stars. Fake, but somehow comforting.
<</if>>
<div class="choice-container">
<<if $time.phase === "night" || $time.phase === "late_night">>
<<vchoice "Sleep" "Quarters_Sleep" "action" "night">>
<<else>>
<<vchoice "Rest for a while" "Quarters_Rest" "action" "night">>
<</if>>
<<vchoice "Look in the mirror" "Quarters_Mirror" "examine" "search">>
<<vchoice "Return to Commons" "Vault_Hub" "move" "door-handle">>
</div><<set _qsForcedRelease to setup.forcedReleaseDue()>>
<<set _qsStoryNight to setup.hubStoryNight()>>
<<if _qsStoryNight>>
<<if _qsForcedRelease>><<run setup.storeForcedRelease()>><</if>>
<<if $companions && $companions[0]>>
<<set $companions[0].health to Math.min($companions[0].maxHealth, $companions[0].health + 30)>>
<</if>>
<<set $flags.vaultFoodAtBedtime to setup.vaultFoodOnHand()>>
<<dailyUpdate>>
<<if $flags.vaultStarvationDeath>>
<<goto "Vault_Starvation_Death">>
<<else>>
<<goto _qsStoryNight>>
<</if>>
<<else>>
<<set $time.day += 1>>
<<setTime 7 0>>
<<if setup.hungerStateOf(Math.max(0, $player.hunger - setup.nightHunger)) !== "starving">>
<<set $player.health to Math.min($player.maxHealth, $player.health + 30)>>
<</if>>
<<set $player.energy to $player.maxEnergy>>
<<if $companions && $companions[0]>>
<<set $companions[0].health to Math.min($companions[0].maxHealth, $companions[0].health + 30)>>
<</if>>
<<set $flags.vaultFoodAtBedtime to setup.vaultFoodOnHand()>>
<<dailyUpdate>>
<<set $flags.groundskeeperPresent to setup.groundskeeperInCommons()>>
<<if $time.day >= 5>>
<<morningDecay>>
<<updateExhibitionism>>
<</if>>
<<if $flags.vaultStarvationDeath>>
<<set _vddScene to null>>
<<if _qsForcedRelease>><<run setup.storeForcedRelease()>><</if>>
<<elseif _qsForcedRelease>><<set _vddScene to null>><<else>><<velithDreamDrainRoll>><</if>>
<<if $flags.vaultStarvationDeath>>
<<goto "Vault_Starvation_Death">>
<<elseif _qsForcedRelease>>
<<goto "Event_Forced_Release">>
<<elseif _vddScene>>
<<goto _vddScene>>
<<elseif $flags.vaultCrisisActive && !$vault.crisis.expeditionForced>>
<<goto "Vault_Resource_Crisis">>
<<elseif $flags.vaultResourceWarning && !$vault.crisis.warningAcknowledged>>
<<goto "Vault_Resource_Warning">>
<<elseif setup.hungerStateOf($player.hunger) === "starving" && $vault.food > 0 && $companions && $companions[0] && !setup.kiraStaysInMedical() && !setup.kiraAway() && !$flags.kiraMissing && $flags.kiraFoodPushDay !== $time.day>>
<<set $flags.kiraFoodPushDay to $time.day>>
<<goto "Vault_Starving_KiraFood">>
<<elseif $time.day >= 5 && $flags.mutualSnapPending && !setup.kiraStaysInMedical() && !setup.kiraAway()>>
<<set $flags.mutualSnapPending to false>>
<<goto "Mutual_Snap_Scene">>
<<elseif $time.day >= 5 && $flags.kiraSnapPending && !setup.kiraStaysInMedical() && !setup.kiraAway()>>
<<set $flags.kiraSnapPending to false>>
<<if $arousal.kira.snapAttempts gte 1>>
<<goto "Kira_Tension_Snap_Repeat">>
<<else>>
<<goto "Kira_Tension_Snap">>
<</if>>
<<elseif $time.day >= 5 && $flags.playerTierUpPending>>
<<set $flags.playerTierUpPending to false>>
<<goto "Event_Exhib_Tier_Up_Player">>
<<elseif $time.day >= 5 && $flags.kiraTierUpPending && !setup.kiraStaysInMedical() && !setup.kiraAway()>>
<<set $flags.kiraTierUpPending to false>>
<<goto "Event_Exhib_Tier_Up_Kira">>
<<elseif setup.groveMorningEvent()>>
<<set _qsGrove to setup.groveMorningEvent()>>
<<goto _qsGrove>>
<<else>>
<<set _qsWake to setup.kiraNightWake() || setup.hubWakeTarget()>>
<<goto _qsWake>>
<</if>>
<</if>><<advanceTime 1 0>>
<<set $player.energy to Math.min($player.maxEnergy, Math.round($player.energy + $player.maxEnergy * 0.25))>>
<<set $player.health to Math.min($player.maxHealth, $player.health + 10)>>
<<if $companions && $companions[0]>>
<<clampStat "companions[0].tension" -3>>
<</if>>
<<run VaultUI.setBackground("quarters")>>
<h2>A Short Rest</h2>
You lie down on the narrow bed and close your eyes for an hour. You don't quite sleep, but your body stops aching for a while.
<p class="system-info"><<icon "health">> You rest for a while. Health +10, Energy +25%</p>
<div class="choice-container">
<<if $time.phase === "night" || $time.phase === "late_night">>
<<vchoice "Sleep" "Quarters_Sleep" "action" "night">>
<<else>>
<<vchoice "Rest another hour" "Quarters_Rest" "action" "night">>
<</if>>
<<vchoice "Get up" "Quarters_Hub" "action" "forward">>
<<vchoice "Return to Commons" "Vault_Hub" "move" "door-handle">>
</div>Your backpack contains your personal items.
<<set _items to UInv.GetItemsArray("player")>>
<<if _items.length gt 0>>
You have:
<ul>
<<for _itemName range _items>>
<<set _count to UInv.BagHasItem("player", _itemName) ? UInv.GetItemPropertyValue("player", _itemName, "UInvQuantity") : 0>>
<li><<print _itemName>> <<if _count gt 1>>(x<<print _count>>)<</if>></li>
<</for>>
</ul>
<<else>>
Nothing yet.
<</if>>
<div class="choice-container">
<<vchoice "Return" "Quarters_Hub" "move" "back">>
</div><<if $player.transformationStage gt 0>><<storyVideo "story/quarters_mirror/changing">><<elseif $player.corruption gt 50>><<storyVideo "story/quarters_mirror/hungry">><<elseif $player.corruption gt 20>><<storyVideo "story/quarters_mirror/changed">><<else>><<storyVideo "story/quarters_mirror/tired">><</if>>
You study your reflection.
<<if $player.corruption gt 50>>
Your eyes seem... different. Darker. Hungrier.
<<elseif $player.corruption gt 20>>
You look the same, but something in your expression has changed.
<<else>>
Gaunt. Tired. But alive.
<</if>>
<<if $player.transformationStage gt 0>>
Something is definitely changing. You can see it now.
<</if>>
<div class="choice-container">
<<vchoice "Return" "Quarters_Hub" "move" "back">>
</div><<set $currentLocation to "medical">>
<<run VaultUI.setBackground("medical")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<<run VaultUI.hideAllCharacters()>>
<<set _mhKiraInRoom to setup.kiraFirstComa()>>
<<if $flags.kiraIsUnconscious && !_mhKiraInRoom>>
<<run VaultUI.showCharacter("kira", "center", "unconscious")>>
<<else>>
<<for _comp range $companions>>
<<if _comp.currentLocation === "medical">>
<<run VaultUI.showCharacter(_comp.id, "center", _comp.mood || "neutral")>>
<</if>>
<</for>>
<</if>>
<h2>Medical Bay</h2>
<<if $flags.kiraIsUnconscious && !_mhKiraInRoom>>
<p class="scene-description">Kira lies motionless on the treatment bed. Her breathing is shallow but steady. The monitoring equipment shows stable vitals, but she won't wake.</p>
<<if $flags.hasResurgenceElixir>>
<p class="info-text">The Resurgence Elixir is warm in your pocket. It will wake her.</p>
<<elseif $flags.kiraResurgenceUsed>>
<p class="info-text">Normal medicine won't help her. Only another Resurgence Elixir will, and only Lysara makes them.</p>
<<else>>
<p class="info-text">The Groundskeeper said normal medicine won't help her. She needs something from the old alchemy lab in the Archives.</p>
<</if>>
<<else>>
Clean white tiles. A treatment bed with leather restraints (you try not to think about why). Cabinets of medical supplies line the walls. The air smells of antiseptic.
<<if $flags.kiraIsUnconscious>>
<<if $flags.hasResurgenceElixir>>
<p class="info-text">The Resurgence Elixir is warm in your pocket. It will wake her.</p>
<<else>>
<p class="info-text">The Groundskeeper said normal medicine won't help her. She needs something from the old alchemy lab in the Archives.</p>
<</if>>
<</if>>
<</if>>
<div class="resource-display">
Medical Supplies: <<print $vault.medical>> units
</div>
<div class="choice-container">
<<if $player.health lt $player.maxHealth>>
<<vchoice "Treat your wounds" "Medical_Heal_Self" "action" "medical">>
<</if>>
<<if $flags.kiraIsUnconscious>>
<<vchoice "Check on Kira" `_mhKiraInRoom ? "Kira_Room_Coma_Visit" : "Medical_Kira_Unconscious"` "examine" "health">>
<<if $flags.hasResurgenceElixir>>
<<vchoice "Use the Resurgence Elixir" `$flags.kiraResurgenceUsed ? "Kira_Second_Resurgence" : "Kira_Room_With_Potion"` "action" "potion">>
<<elseif $flags.kiraResurgenceUsed && (setup.lysaraArcDone() || $flags.lysaraVisitReset)>>
<<vchoice "Go to Lysara for another elixir" "Alchemy_Lab_Entrance" "move" "potion">>
<<elseif $flags.archivesSearchUnlocked || setup.lysaraArcDone()>>
<<vchoice "Search the Archives for a cure" "Archives_Search_Start" "action" "book">>
<</if>>
<<if $flags.extremeContentEnabled && !_mhKiraInRoom>>
<<vchoice "She's completely helpless..." "Medical_Kira_CNC_Start" "intimate" "corruption">>
<</if>>
<<else>>
<<for _comp range $companions>>
<<if _comp.health lt _comp.maxHealth && !(_comp.id === "kira" && setup.kiraAway())>>
<<vchoice `"Treat " + _comp.name` "Medical_Heal_Companion" "action" "potion">>
<<break>>
<</if>>
<</for>>
<</if>>
<<vchoice "Check medical supplies" "Medical_Supplies" "examine" "search">>
<<vchoice "Return to Commons" "Vault_Hub" "move" "door-handle">>
</div><<if $vault.medical >= 1>>
<<advanceTime 0 30>>
<<set $vault.medical -= 1>>
<<set $player.health to Math.min($player.maxHealth, $player.health + 30)>>
<<toast "You treat your wounds. Health +30" "success">>
<<else>>
<<toast "Not enough medical supplies!" "danger">>
<</if>>
<<goto "Medical_Hub">><<getCompanion "kira">>
<<if $tempCompanion && $vault.medical >= 1>>
<<advanceTime 0 30>>
<<set $vault.medical -= 1>>
<<set $tempCompanion.health to Math.min($tempCompanion.maxHealth, $tempCompanion.health + 30)>>
<<toast `"You treat " + $tempCompanion.name + "'s wounds. Health +30"` "success">>
<<relationChange "kira" "affection" 1>>
<<set _scTend to setup.kiraRunTend()>>
<<if $tempCompanion.health > 50 && $tempCompanion.currentLocation === "medical" && !$flags.kiraIsUnconscious>>
<<set $tempCompanion.currentLocation to "kira_quarters">>
<<toast `$tempCompanion.name + " is well enough to return to her room."` "info">>
<</if>>
<<else>>
<<toast "Not enough medical supplies!" "danger">>
<</if>>
<<if _scTend>><<goto "Kira_Scav_Tend">><<else>><<goto "Medical_Hub">><</if>><<run VaultUI.showCharacter("kira", "center", "unconscious")>>
You stand over Kira's unconscious form.
Her face is peaceful in sleep—more peaceful than you've ever seen her awake. The constant tension she carries is gone.
<<if $clothing && $clothing.kira>>
<<if $clothing.kira.top <= 50 || $clothing.kira.bottom <= 50>>
Her clothes are still torn from the fight. No one thought to change her.
<</if>>
<</if>>
<<if $flags.hasResurgenceElixir>>
<p>The Resurgence Elixir pulses warmly in your pocket. You can feel it responding to her presence.</p>
<<say $player.name "I have it. The elixir. I can wake her.">>
<<else>>
<<say $player.name "I'll find a way to wake you. I promise.">>
<<if $flags.kiraResurgenceUsed>>
<p class="internal-thought">Lysara's elixir worked before. Maybe she has another...</p>
<</if>>
<</if>>
<div class="choice-container">
<<vchoice "Return to Medical Bay" "Medical_Hub" "move" "back">>
<<if $flags.hasResurgenceElixir>>
<<if $flags.kiraResurgenceUsed>>
<<vchoice "Use the Resurgence Elixir" "Kira_Second_Resurgence" "action" "health">>
<<else>>
<<vchoice "Use the Resurgence Elixir" "Kira_Room_With_Potion" "action" "health">>
<</if>>
<</if>>
</div><<run VaultUI.showCharacter("kira", "center", "unconscious")>>
<h3>Temptation</h3>
<<run setup.storyFamilyRotate("cg_medical_kira_unconscious_cnc", ["sf_cg_medical_kira_unconscious_cnc_04", "sf_cg_medical_kira_unconscious_cnc_05"])>>
<<set $flags.medbayStrapBed to false>>
<<set _mkcS to setup.storyFamilySingles("story/medical_kira_unconscious_cnc/medical_kira_cnc_start", setup.storyFamilyGap("story/medical_kira_unconscious_cnc/medical_kira_cnc_start"))>>
<<storyVideo "story/medical_kira_unconscious_cnc/medical_kira_cnc_start">>
<<if _mkcS>><<run setup.mediaAvoidEnd("story/medical_kira_unconscious_cnc/medical_kira_cnc_start")>><</if>>
You look at Kira lying there. Completely helpless. Completely unaware.
<<if _storyClip is "166adbba7711">>Her clothes are gone. She lies naked on her back on top of the white sheet, arms loose at her sides, legs long and slack.<<elseif _storyClip is "70b2120107a3">>The sheet has slipped off her chest. One bare tit rises and falls an inch from your hand, the nipple soft.<<elseif _storyClip is "38b699dcf120">>The sheet has slid down to her waist. Her bare tits rise and fall with each slow breath. Her lashes flicker, half open on nothing, and close again.<<elseif _storyClip is "60c678df6319">>Her cheek is pressed into the pillow, her lashes still, her lips parted on each slow breath.<</if>>
The leather restraints on the bed suddenly seem... purposeful.
Two of her fingers twitch against the sheet and lie still.
<<say $player.name "She'll never know...">>
The thought is dark. Wrong. But she's right there, breathing softly, unable to stop you...
<div class="choice-container">
<<vchoice "Touch her face gently" "Medical_CNC_Touch" "intimate" "hand">>
<<vchoice "Check her... injuries" "Medical_CNC_Examine" "intimate" "health">>
<<vchoice "Use the restraints" "Medical_CNC_Restrain" "intimate" "domination">>
<<vchoice "No. Walk away." "Medical_Hub" "move" "back">>
</div><<run VaultUI.showCharacter("kira", "center", "unconscious")>>
<<storyVideo "story/medical_kira_unconscious_cnc/touch">>
<<if _storyClip is "815846be645a">>Her hand lies open on the sheet beside her hip. You lay yours over it. So warm.
Her fingers curl once against yours, slow, and go slack. She doesn't wake.<<elseif _storyClip is "bc767d9d7370">>You brush a strand of hair from her face and cup her cheek.
Under your palm her face changes. She's dreaming. Wherever she is, it isn't this bed: there's sun on her skin and grass under her back, and someone leaning over her, close enough to touch. Her eyes come open in there, wide and bright, and she laughs, loud and free, the way you've never once heard her laugh awake.
Out here her lips barely move. A breath, a twitch at the corner of her mouth. Her eyes stay shut. She's somewhere warm, and she's not coming back for you.<<else>>You brush a strand of hair from her face. So soft.
Your fingers trace down her cheek, along her jaw. She doesn't react.
Then her lips part against your thumb.<</if>>
<<clampStat "player.lust" 10>>
<div class="choice-container">
<<vchoice "Just her face. Stop here." "Medical_Hub" "move" "back">>
<<vchoice "Keep going..." "Medical_CNC_Examine" "intimate" "corruption">>
</div><<run VaultUI.showCharacter("kira", "center", "unconscious")>>
<<storyVideo "story/medical_kira_unconscious_cnc/examine__examine">>
<p class="explicit">Your hands move lower. "Checking for injuries," you tell yourself.</p>
<p class="explicit"><<if _storyClip is "6c421f5e6b3e">>You peel her dress down to her waist and strip the bra off her completely. Her body lies there, vulnerable. Beautiful.<<elseif _storyClip is "bf69613d9fd4">>You pull the sheet off her. She lies curled on her side, naked, her pussy pushed out bare and soft between her closed thighs. You crouch and look as long as you like.<<else>>You pull the blanket back. Her body lies there, vulnerable. Beautiful.<</if>></p>
<p class="explicit">Her nipples are already hard before you touch them.</p>
<<clampStat "player.lust" 20>>
<<set $flags.touchedUnconsciousKira to true>>
<p class="explicit">Your hands slide over her body. She's warm. Soft. Completely unresisting.</p>
<div class="choice-container">
<<vchoice "That's enough." "Medical_Hub" "move" "back">>
<<vchoice "Go further..." "Medical_CNC_Grope" "intimate" "corruption">>
</div><<run VaultUI.showCharacter("kira", "center", "unconscious")>>
<<set _mkrS to setup.storyFamilySingles("story/medical_kira_unconscious_cnc/examine__restrain", setup.storyFamilyGap("story/medical_kira_unconscious_cnc/examine__restrain") || (setup.storyFamilyOf("cg_medical_kira_unconscious_cnc") === "sf_cg_medical_kira_unconscious_cnc_05" && random(1) === 1))>>
<<storyVideo "story/medical_kira_unconscious_cnc/examine__restrain">>
<<if _mkrS>><<run setup.mediaAvoidEnd("story/medical_kira_unconscious_cnc/examine__restrain")>><</if>>
<p class="explicit"><<if _storyClip is "444295f1cd76">>You strip her bare, leave the leather straps hanging and bind her wrists above her head with white gauze from the supply shelf, knotted to the frame. Then her ankles.<<elseif _storyClip is "c136a00fea27">>You find the leather cuffs at the foot of the bed. Her bare feet lie crossed on the white sheet, slack and warm. You uncross her ankles, pull her legs apart and buckle the first cuff, then the second. Then her wrists, one and then the other.<<elseif _storyClip is "ad7e33efea7f">>You buckle the leather restraints round her wrists, then her ankles, and watch her face the whole time. She doesn't stir. Her lips stay parted, her breath slow, a flush high on her cheek.<<elseif _storyClip is "3993cf28d08c" or _storyClip is "ef78dbe40374" or _storyClip is "66d27d775fa3">>The treatment bed is already rigged with the clinic's white padded straps. You lay her out flat and close them one by one: the belt across her hips, each thigh, each wrist, then her ankles. Last, because the manual says so for a patient who might wake fighting, the leather bite-guard harness round her head.<<else>>You secure her wrists in the leather restraints. Then her ankles.<</if>></p>
<p class="explicit"><<if _storyClip is "444295f1cd76">>She lies there naked on the white sheets, arms stretched over her head, legs spread. Completely helpless. Completely yours.<<elseif _storyClip is "c136a00fea27">>She lies there naked on the white sheets, strapped down at wrist and ankle, her legs held open. Completely helpless. Completely yours.<<elseif _storyClip is "ad7e33efea7f">>Her cheek lies sunk in the pillow, her eyes shut, her naked body strapped open below it. Completely helpless. Completely yours.<<elseif _storyClip is "3993cf28d08c">>She lies there naked on the green sheet, strapped flat at wrist, hip, thigh and ankle, the rails up on both sides. Completely helpless. Completely yours.<<elseif _storyClip is "ef78dbe40374">>She lies there naked behind the raised rails, strapped flat at wrist, hip, thigh and ankle. Completely helpless. Completely yours.<<elseif _storyClip is "66d27d775fa3">>She lies there naked on the green sheet, strapped flat at wrist, hip, thigh and ankle. Completely helpless. Completely yours.<<else>>She lies there, spread-eagle on the medical bed. Completely helpless. Completely yours.<</if>></p>
<p class="explicit"><<if _storyClip is "ef78dbe40374">>Her head lifts once off the mattress against the harness, then sinks back and stays down.<<elseif _storyClip is "3993cf28d08c" or _storyClip is "66d27d775fa3">>She doesn't stir. Not a twitch against the straps.<<else>>Her wrist turns once against the binding and goes still.<</if>></p>
<<clampStat "player.lust" 30>>
<<set $flags.restrainedUnconsciousKira to true>>
<<set $flags.medbayStrapBed to (_storyClip is "3993cf28d08c" or _storyClip is "ef78dbe40374" or _storyClip is "66d27d775fa3")>>
<<say $player.name "Just in case she wakes up...">>
<p class="guilt">You both know that's not why.</p>
<div class="choice-container">
<<vchoice "Examine her restrained body" "Medical_CNC_Grope" "intimate" "corruption">>
<<vchoice "Release her. This is wrong." "Medical_Hub" "move" "back">>
</div><<run VaultUI.showCharacter("kira", "center", "unconscious")>>
<<set $flags.gropedUnconsciousKira to true>>
<<storyVideo "story/medical_kira_unconscious_cnc/grope">>
<p class="explicit ultra">Your hands explore her body freely. Her breasts. Her thighs. Between her legs.</p>
<p class="explicit ultra">She doesn't react. Doesn't resist. Just lies there, breathing softly, while you violate her unconscious form.</p>
<p class="explicit ultra">Her hips lift into your hand, barely, and sink back.</p>
<<clampStat "player.lust" 30>>
<<if $player.lust >= 80>>
<p class="explicit ultra">You're painfully hard. The urge to go further is overwhelming...</p>
<</if>>
<div class="choice-container">
<<vchoice "Stop. You've gone too far already." "Medical_Hub" "move" "back">>
<<if $player.lust >= 70>>
<<vchoice "Use her completely" "Medical_CNC_Used" "intimate" "corruption">>
<</if>>
</div><<run VaultUI.showCharacter("kira", "center", "unconscious")>>
<<set $flags.usedUnconsciousKira to true>>
<<if $flags.medbayCNCCorruptionDay !== $time.day>>
<<set $flags.medbayCNCCorruptionDay to $time.day>>
<<addCorruption 5>>
<</if>>
<<set _mkuS to setup.storyFamilySingles("story/medical_kira_unconscious_cnc/used", setup.storyFamilyGap("story/medical_kira_unconscious_cnc/used"))>>
<<storyVideo "story/medical_kira_unconscious_cnc/used">>
<<if _mkuS>><<run setup.mediaAvoidEnd("story/medical_kira_unconscious_cnc/used")>><</if>>
<<if $flags.medbayStrapBed>><p class="explicit ultra">First the straps. You unbuckle the belt across her hips and lift the bite-guard harness off her head, then let out the padded straps at her wrists, thighs and ankles until you can move her how you want her.</p><</if>>
<p class="explicit ultra"><<if _storyClip is "d892bf43a9fa">>You roll her onto her side and bury your tongue in her pussy first. Then you line your cock up behind her.<<elseif _storyClip is "626437791739">>You roll her onto her side, lift her top leg and line your cock up behind her.<<else>>You position yourself between her legs.<</if>> She doesn't stir as you push inside her.</p>
<p class="explicit ultra">Her body is warm, tight. Wet—some reflexive response to stimulation, not consent. Never consent.</p>
<p class="explicit ultra">Her cunt squeezes down on you twice while her face stays slack against the pillow.</p>
<p class="explicit ultra">You fuck her unconscious body. She moans softly—an involuntary sound, nothing more.</p>
<p class="explicit ultra">When you finish inside her, you feel empty. Satisfied and hollow at once.</p>
<<set $player.lust to 0>><<run setup.playerReleased()>>
<p class="guilt">What have you become?</p>
<<say $player.name "She'll never know. No one will know.">>
<p class="narrator-thought">But you'll know. Forever.</p>
As you pull away, the corner of her mouth lifts. Then it's gone.
<div class="choice-container">
<<vchoice "Clean up and leave" "Medical_Hub" "move" "door-handle">>
</div>The cabinets hold:
- Bandages
- Antiseptic
- Pain medication
- Some unfamiliar medical devices
Total medical units: <<print $vault.medical>>
<div class="choice-container">
<<vchoice "Return" "Medical_Hub" "move" "back">>
</div><<set $currentLocation to "kitchen">>
<<run VaultUI.setBackground("kitchen")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<<run VaultUI.hideAllCharacters()>>
<<for _comp range $companions>>
<<if _comp.currentLocation === "kitchen">>
<<run VaultUI.showCharacter(_comp.id, "right", _comp.mood || "neutral")>>
<</if>>
<</for>>
<h2>Kitchen</h2>
A functional kitchen area off the commons. Pre-Cataclysm appliances still work - a refrigeration unit, a cooking surface, running water from the vault's purification system. Shelves hold preserved foods and cooking supplies.
<<if $time.phase === "morning">>
The smell of something cooking - the Groundskeeper must have prepared breakfast.
<<elseif $time.phase === "evening">>
A good time for a meal. The vault feels more like home when you're eating.
<</if>>
<div class="resource-display">
<h4>Available Supplies:</h4>
<div class="kitchen-supplies">
<div class="supply-item">
<span class="icon"></span>
<span class="label">Food Rations</span>
<span class="value"><<print $vault.food>> units</span>
<<supplyDaysLeft "food">>
</div>
<div class="supply-item">
<span class="icon"></span>
<span class="label">Purified Water</span>
<span class="value"><<print $vault.water>> units</span>
<<supplyDaysLeft "water">>
</div>
<<if setup.vaultFishCount() gt 0>>
<div class="supply-item">
<span class="icon"></span>
<span class="label">Fish in Storage</span>
<span class="value"><<print setup.vaultFishCount()>></span>
</div>
<</if>>
</div>
<<set _khNeed to setup.vaultNightlyNeed()>>
<p class="info-text">Each night the vault uses <<print _khNeed.water>> water (you<<if _khNeed.food gt 0>> and your companions<</if>>)<<if _khNeed.food gt 0>> and <<print _khNeed.food>> food (your companions)<</if>>. Your own meals are the ones you eat here.</p>
<<if $vault.lastUpkeep>>
<p class="info-text upkeep-last">Your last night here: <<print setup.vaultUpkeepText($vault.lastUpkeep, "")>></p>
<</if>>
</div>
<div class="choice-container">
<<if $vault.food gt 0 && $player.hunger lt $player.maxHunger>>
<<vchoice "Eat a meal" "Kitchen_Eat" "action" "eating">>
<</if>>
<<if $vault.water gt 0 && $player.energy lt $player.maxEnergy>>
<<vchoice "Drink water" "Kitchen_Drink" "action" "shower">>
<</if>>
<<if $companions.length gt 0 && !setup.kiraAway()>>
<<vchoice "Prepare meal for everyone" "Kitchen_Meal_Together" "action" "house">>
<</if>>
<<if typeof UInv !== 'undefined' && UInv.BagExists("vault") && UInv.BagHasItem("vault", "dirty water")>>
<<set _vaultDirtyWater to UInv.GetItemPropertyValue("vault", "dirty water", "UInvQuantity")>>
<<if _vaultDirtyWater gt 0>>
<<vchoice `"Purify dirty water (" + _vaultDirtyWater + ")"` "Kitchen_Purify_Water" "action" "water">>
<</if>>
<</if>>
<<set _khStock to setup.kitchenStock()>>
<<if _khStock.length gt 0>>
<<vchoice `"Stored food and fish (" + _khStock.reduce(function (t, x) { return t + x.have; }, 0) + ")"` "Kitchen_Stores" "action" "fish">>
<</if>>
<<vchoice "Return to Commons" "Vault_Hub" "move" "door-handle">>
</div><<set $currentLocation to "kitchen">>
<<run VaultUI.setBackground("kitchen")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<<set _ksList to setup.kitchenStock()>>
<h2>Kitchen Stores</h2>
<p>The cold shelves at the back of the kitchen hold what you've brought home. Fish keeps here until someone guts and cleans it.</p>
<<if _ksList.length gt 0>>
<div class="shop-display">
<ul>
<<for _ksI to 0; _ksI lt _ksList.length; _ksI++>>
<<set _ksIt to _ksList[_ksI]>>
<li class="shop-item-line"><img class="shop-item-thumb" @src="setup.itemImage(_ksIt.item)" alt="" onerror="this.style.display='none'"><span class="shop-item-text"><strong><<= _ksIt.name>></strong> x<<= _ksIt.have>> in storage<<if setup.packCount(_ksIt.item) gt 0>>, <<= setup.packCount(_ksIt.item)>> in your pack<</if>><<if _ksIt.prep gt 0>>. Preps into <<= _ksIt.prep>> food each<</if>></span></li>
<</for>>
</ul>
</div>
<<else>>
<p class="info-text">No food or fish left in storage.</p>
<</if>>
<p class="info-text">Vault food: <<print $vault.food>> units.</p>
<div class="choice-container">
<<for _ksI to 0; _ksI lt _ksList.length; _ksI++>>
<<set _ksIt to _ksList[_ksI]>>
<<capture _ksIt>>
<<if _ksIt.prep gt 0>>
<<link `'<span class="choice-button action"><span class="gi gi-fish gi-large"></span><span class="label">Prep 1 ' + _ksIt.name + ' (+' + _ksIt.prep + ' food, ' + setup.prepMinutes(1) + ' min)</span></span>'`>><<run setup.prepFish(_ksIt.item, 1)>><<advanceTime 0 `setup.prepMinutes(1)`>><<goto "Kitchen_Stores">><</link>>
<<if _ksIt.have gt 1>>
<<link `'<span class="choice-button action"><span class="gi gi-fish gi-large"></span><span class="label">Prep all ' + _ksIt.have + ' ' + _ksIt.name + ' (+' + (_ksIt.have * _ksIt.prep) + ' food, ' + setup.prepMinutes(_ksIt.have) + ' min)</span></span>'`>><<run setup.prepFish(_ksIt.item, "all")>><<advanceTime 0 `setup.prepMinutes(_ksIt.have)`>><<goto "Kitchen_Stores">><</link>>
<</if>>
<</if>>
<<if setup.bagFits("player", _ksIt.item, 1) gt 0>>
<<link `'<span class="choice-button action"><span class="gi gi-backpack gi-large"></span><span class="label">Take 1 ' + _ksIt.name + '</span></span>'`>><<uinvRetrieveFromVault `_ksIt.item` 1>><<run setup.noteHandedOut(_ksIt.item)>><<goto "Kitchen_Stores">><</link>>
<<if _ksIt.have gt 1>>
<<link `'<span class="choice-button action"><span class="gi gi-backpack gi-large"></span><span class="label">Take all ' + _ksIt.have + ' ' + _ksIt.name + '</span></span>'`>><<uinvRetrieveFromVault `_ksIt.item` `_ksIt.have`>><<run setup.noteHandedOut(_ksIt.item)>><<goto "Kitchen_Stores">><</link>>
<</if>>
<<else>>
<<vchoiceDisabled `"Take " + _ksIt.name + " (your backpack is full)"` "action" "backpack">>
<</if>>
<</capture>>
<</for>>
<<vchoice "Back" "Kitchen_Hub" "move" "back">>
</div><<set $currentLocation to "kitchen">>
<<run VaultUI.setBackground("kitchen")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<<if typeof UInv !== 'undefined' && UInv.BagExists("vault") && UInv.BagHasItem("vault", "dirty water")>>
<<set _dirtyWater to UInv.GetItemPropertyValue("vault", "dirty water", "UInvQuantity")>>
<<else>>
<<set _dirtyWater to 0>>
<</if>>
<h2>Water Purification</h2>
<<storyVideo "story/mv_vault/water_purifier">>
The vault's purification system hums quietly. A series of filters and UV sterilizers can convert contaminated water into something drinkable.
<div class="resource-display">
<div class="supply-item">
<span class="icon"><<icon "water">></span>
<span class="label">Dirty Water Available</span>
<span class="value"><<print _dirtyWater>> units</span>
</div>
<div class="supply-item">
<span class="icon"><<icon "water">></span>
<span class="label">Current Vault Water</span>
<span class="value"><<print $vault.water>> units</span>
<<supplyDaysLeft "water">>
</div>
</div>
<p class="info-text">The purifier converts dirty water to clean water at a 1:1 ratio.</p>
<div class="choice-container">
<<if _dirtyWater gte 1>>
<<vchoice "Purify 1 unit" "Kitchen_Purify_1" "action" "water">>
<</if>>
<<if _dirtyWater gte 5>>
<<vchoice "Purify 5 units" "Kitchen_Purify_5" "action" "water">>
<</if>>
<<if _dirtyWater gt 1>>
<<vchoice `"Purify all (" + _dirtyWater + ")"` "Kitchen_Purify_All" "action" "water">>
<</if>>
<<vchoice "Back" "Kitchen_Hub" "move" "back">>
</div><<advanceTime 0 5>>
<<run UInv.DeleteItem("vault", "dirty water", 1)>>
<<set $vault.water += 1>>
<<toast "Purified 1 dirty water → 1 clean water added to vault" "success">>
<<goto "Kitchen_Purify_Water">><<advanceTime 0 15>>
<<run UInv.DeleteItem("vault", "dirty water", 5)>>
<<set $vault.water += 5>>
<<toast "Purified 5 dirty water → 5 clean water added to vault" "success">>
<<goto "Kitchen_Purify_Water">><<if UInv.BagHasItem("vault", "dirty water")>>
<<set _amount to UInv.GetItemPropertyValue("vault", "dirty water", "UInvQuantity")>>
<<else>>
<<set _amount to 0>>
<</if>>
<<advanceTime 0 `Math.ceil(_amount * 3)`>>
<<run UInv.DeleteItem("vault", "dirty water", _amount)>>
<<set $vault.water += _amount>>
<<toast `"Purified " + _amount + " dirty water → " + _amount + " clean water added to vault"` "success">>
<<goto "Kitchen_Purify_Water">><<if $vault.food gt 0>>
<<advanceTime 0 15>>
<<set $vault.food -= 1>>
<<set $player.hunger to Math.min($player.maxHunger, $player.hunger + 40)>>
<<set $player.energy to Math.min($player.maxEnergy, $player.energy + 10)>>
<<toast "You eat a meal. Hunger +40, Energy +10" "success">>
<<else>>
<<toast "No food available!" "danger">>
<</if>>
<<set _keBack to ($survival && $survival.eatReturn) || "Kitchen_Hub">>
<<if $survival>><<set $survival.eatReturn to null>><</if>>
<<goto _keBack>><<if $vault.water gt 0>>
<<advanceTime 0 5>>
<<set $vault.water -= 1>>
<<set $player.energy to Math.min($player.maxEnergy, $player.energy + 20)>>
<<toast "You drink clean water. Energy +20" "success">>
<<else>>
<<toast "No water available!" "danger">>
<</if>>
<<goto "Kitchen_Hub">><<if $vault.food gte (1 + $companions.length)>>
<<advanceTime 0 30>>
<<set $vault.food -= (1 + $companions.length)>>
<<set $player.hunger to Math.min($player.maxHunger, $player.hunger + 50)>>
<<set $player.energy to Math.min($player.maxEnergy, $player.energy + 15)>>
<<run VaultUI.showCharacter("kira", "center", "smile")>>
You prepare a meal for everyone. It's simple - rehydrated protein, preserved vegetables - but it's warm and filling.
<<if $companions.length gt 0>>
<<set $companions[0].energy to Math.min(100, ($companions[0].energy || 100) + 15)>>
<<getCompanion "kira">>
<<if $tempCompanion>>
<<say "Kira" "This is... nice. Haven't had a real meal in weeks.">>
<<relationChange "kira" "affection" 1>>
<<relationChange "kira" "trust" 1>>
<<clampStat "companions[0].tension" -2>>
<</if>>
<</if>>
<<notify "success">>Everyone ate well. Hunger +50, Energy +15<</notify>>
<<else>>
<<notify "error">>Not enough food for everyone! Need <<print 1 + $companions.length>> units.<</notify>>
<</if>>
<div class="choice-container">
<<vchoice "Continue" "Kitchen_Hub" "move" "back">>
</div><<set $currentLocation to "power_core">>
<<run VaultUI.setBackground("power_core")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<<run VaultUI.hideAllCharacters()>>
<h2>Power Core</h2>
<<storyVideo "story/mv_power_core/hub">>
The thrumming heart of the vault. A massive cylindrical generator dominates the room, wrapped in cables and conduits. Gauges and readouts flicker with data. The air is warm here, vibrating with contained energy.
<div @class="'power-status' + (setup.vaultPowerLive ? '' : ' offline')">
<span class="label">Power Level:</span>
<<statbar $vault.power $vault.maxPower "#f1c40f">>
<span class="value"><<print $vault.power>> / <<print $vault.maxPower>></span>
</div>
<<if !setup.vaultPowerLive>>
<div class="wip-notice">⚠ Work in Progress — the power system is not in use yet. Power does not drain.</div>
<<elseif $vault.power lt 20>>
<p class="warning" style="color: #ff4444;">⚠ CRITICAL: Power failure imminent. The lights flicker ominously. Something in the darkness stirs...</p>
<<elseif $vault.power lt 30>>
<p class="warning">Power levels critical. Some systems may fail.</p>
<</if>>
<div class="choice-container">
<<vchoice "Check generator status" "PowerCore_Status" "examine" "lightning">>
<<vchoice "Attempt to restore power" "PowerCore_Restore" "action" "repair">>
<<vchoice "Return to Commons" "Vault_Hub" "move" "door-handle">>
</div><<set _powerPercent to Math.floor(($vault.power / $vault.maxPower) * 100)>>
<<if _powerPercent gt 80>>
<<set _status to "OPTIMAL">>
<<set _statusClass to "ok">>
<<set _statusMsg to "All systems optimal. Generator operating at peak efficiency.">>
<<elseif _powerPercent gt 50>>
<<set _status to "NORMAL">>
<<set _statusClass to "ok">>
<<set _statusMsg to "Systems running normally. Occasional fluctuations detected.">>
<<elseif _powerPercent gt 30>>
<<set _status to "LOW">>
<<set _statusClass to "warning">>
<<set _statusMsg to "Power levels low. Conservation recommended.">>
<<else>>
<<set _status to "CRITICAL">>
<<set _statusClass to "critical">>
<<set _statusMsg to "Critical power shortage. Non-essential systems shutting down.">>
<</if>>
<<set _currentDraw to $vault.power + " / " + $vault.maxPower>>
<div class="wip-notice">⚠ Work in Progress — Power effects not yet implemented</div>
<<terminal "Power Core Status" _status>>
<<terminalSection "Generator Output">>
<<terminalRow "Current Draw" _currentDraw _statusClass>>
<<terminalDivider>>
<<terminalSection "Diagnostics">>
<<terminalRow "Status" _statusMsg _statusClass>>
<<terminalRow "Core Type" "Pre-Cataclysm / Unknown">>
<<terminalRow "Energy Signature" "Anomalous" "warning">>
<<terminalPrompt "MONITORING">>
<</terminal>>
<div class="choice-container">
<<vchoice "Return" "PowerCore_Hub" "move" "back">>
</div><<run VaultUI.setBackground("power_core")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<h2>Restoring Power</h2>
<<storyVideo "story/mv_power_core/restore">>
The massive crystal—Duvarnach's heart—pulses before you. Blue light ripples through its facets, but dimmer than it should be. Hungry.
<<say "Groundskeeper" "Originally: concentrated magical energy. Currently: salvage. Determination.">>
The Groundskeeper's words from your tour echo in your mind. The crystal was designed to run on magic. Pure, concentrated magical energy.
<p>You have <<print $vault.magicCrystals>> magic crystals in vault storage.</p>
<<if $vault.magicCrystals gt 0>>
<p>The smaller crystals you've gathered could feed the core. Raw magical energy, absorbed directly.</p>
<</if>>
<div class="wip-notice-detailed">
<strong>⚠ WORK IN PROGRESS</strong><br><br>
Power restoration mechanics are under development.<br><br>
• Feed magic crystals to the core (+power per crystal)<br>
<<if $flags.lysaraIntroduced>>• Refined crystals from Lysara (more efficient)<br><</if>><br>
<em>Check back in a future update.</em>
</div>
<<if $vault.magicCrystals gt 0 && $vault.power lt $vault.maxPower>>
<div class="choice-container">
<<button "Feed 1 Crystal to the Core (+10 Power)">>
<<set $vault.magicCrystals -= 1>>
<<set $vault.power to Math.min($vault.maxPower, $vault.power + 10)>>
<<notify "success">>The crystal dissolves into the core. +10 Power<</notify>>
<<goto "PowerCore_Restore">>
<</button>>
<<if $vault.magicCrystals gte 5>>
<<button "Feed 5 Crystals (+50 Power)">>
<<set $vault.magicCrystals -= 5>>
<<set $vault.power to Math.min($vault.maxPower, $vault.power + 50)>>
<<notify "success">>Five crystals flare and merge with the core. +50 Power<</notify>>
<<goto "PowerCore_Restore">>
<</button>>
<</if>>
</div>
<<elseif $vault.power gte $vault.maxPower>>
<p class="success">The core pulses steadily. Power is at maximum capacity.</p>
<</if>>
<div class="wip-controls" style="text-align: center; padding: 1em; border: 1px dashed #666; margin: 1em 0; background: rgba(100,100,100,0.2);">
<p style="font-size: 0.85em; color: #888; margin-bottom: 0.5em;">⚠ WIP: Crystal collection not yet implemented</p>
<<button "Add 5 Magic Crystals (WIP)">>
<<set $vault.magicCrystals += 5>>
<<notify "success">>+5 Magic Crystals (WIP)<</notify>>
<<goto "PowerCore_Restore">>
<</button>>
</div>
<div class="choice-container">
<<vchoice "Return to Power Core" "PowerCore_Hub" "move" "back">>
</div><<set $currentLocation to "storage">>
<<run VaultUI.setBackground("storage")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<<run VaultUI.hideAllCharacters()>>
<<for _comp range $companions>>
<<if _comp.currentLocation === "storage">>
<<run VaultUI.showCharacter(_comp.id, "right", _comp.mood || "neutral")>>
<</if>>
<</for>>
<h2>Storage Room</h2>
<<storyVideo "story/mv_vault/storage">>
Shelves and crates fill this room. Some organized, some haphazard — the remnants of whoever was here before. Food, water, scrap, tools... the lifeblood of survival.
<<if !$vaultStorage>>
<<set $vaultStorage to []>>
<</if>>
<div class="choice-container">
<<vchoice "Manage Stored Items (Transfer In/Out)" "Storage_Store" "action" "crystal">>
<<vchoice "Clothing & Wardrobe Management" "Vault_Storage" "action" "armor">>
<<if $vault.food gt 0 && $player.hunger lt $player.maxHunger>>
<<vchoice "Eat from food reserves" "Storage_Take" "action" "food">>
<</if>>
<<vchoice "Search for hidden items" "Storage_Search" "examine" "search">>
<<vchoice "Return to Commons" "Vault_Hub" "move" "door-handle">>
</div><<if $vault.food gt 0 && $player.hunger lt $player.maxHunger>>
<<set $vault.food -= 1>>
<<set $player.hunger to Math.min($player.maxHunger, $player.hunger + 30)>>
<<toast "You eat some food. Hunger +30" "success">>
<<else>>
<<toast "No food available or not hungry!" "danger">>
<</if>>
<<goto "Storage_Hub">><<advanceTime 0 30>>
You search through the shelves and crates.
<<if random(1, 100) lte 30>>
<<set _foundItem to either("scrap metal", "bandage", "dirty water")>>
<<set _itemName to _foundItem.replace(/_/g, " ").replace(/\b\w/g, function(l){ return l.toUpperCase() })>>
<<run setup.fightLootStart()>>
<<run setup.postBattleTakeLoot(_foundItem, _itemName, 1, "", "fightLoot")>>
<<notify "success">>Found: <<print _itemName>>!<</notify>>
<<lootLeftList "fightLoot">>
<<else>>
Nothing new today. Just the usual supplies.
<</if>>
<div class="choice-container">
<<vchoice "Return" "Storage_Hub" "move" "back">>
</div><<set _playerItems to UInv.GetItemsArray("player")>>
<<set _vaultItems to UInv.GetItemsArray("vault")>>
<h2>Manage Vault Storage</h2>
<div class="storage-summary">
<div class="summary-stat">
<span class="label">Personal Inventory:</span>
<span class="value"><<print _playerItems.length>> item<<if _playerItems.length !== 1>>s<</if>></span>
</div>
<div class="summary-stat">
<span class="label">Vault Storage:</span>
<span class="value"><<print _vaultItems.length>> item<<if _vaultItems.length !== 1>>s<</if>></span>
</div>
</div>
<div class="storage-management-container">
<!-- Personal Inventory -->
<div class="inventory-column">
<h3>Personal Inventory</h3>
<<if _playerItems.length === 0>>
<p class="empty-message">Empty</p>
<<else>>
<div class="storage-transfer-grid">
<<for _itemName range _playerItems>>
<<set _count to UInv.BagHasItem("player", _itemName) ? UInv.GetItemPropertyValue("player", _itemName, "UInvQuantity") : 0>>
<div class="transfer-item">
<div class="item-image-small">
<<set _itemImg to setup.itemImage(_itemName, "player")>>
<img @src="_itemImg" @alt="_itemName" onerror="this.style.display='none'">
</div>
<div class="item-info">
<span class="item-name"><<print _itemName>></span>
<span class="item-quantity">x<<print _count>></span>
</div>
<div class="item-actions">
<<capture _itemName, _count>>
<<link "Store 1">>
<<uinvStoreInVault _itemName 1>>
<<goto "Storage_Store">>
<</link>>
<<if _count gt 1>>
| <<link "Store All">>
<<uinvStoreInVault _itemName _count>>
<<goto "Storage_Store">>
<</link>>
<</if>>
<</capture>>
</div>
</div>
<</for>>
</div>
<</if>>
</div>
<!-- Arrow -->
<div class="transfer-arrow">⇄</div>
<!-- Vault Storage -->
<div class="inventory-column">
<h3>Vault Storage</h3>
<<if _vaultItems.length === 0>>
<p class="empty-message">Empty</p>
<<else>>
<div class="storage-transfer-grid">
<<for _itemName range _vaultItems>>
<<set _count to UInv.BagHasItem("vault", _itemName) ? UInv.GetItemPropertyValue("vault", _itemName, "UInvQuantity") : 0>>
<div class="transfer-item">
<div class="item-image-small">
<<set _itemImg to setup.itemImage(_itemName, "vault")>>
<img @src="_itemImg" @alt="_itemName" onerror="this.style.display='none'">
</div>
<div class="item-info">
<span class="item-name"><<print _itemName>></span>
<span class="item-quantity">x<<print _count>></span>
</div>
<div class="item-actions">
<<capture _itemName, _count>>
<<link "Take 1">>
<<uinvRetrieveFromVault _itemName 1>>
<<goto "Storage_Store">>
<</link>>
<<if _count gt 1>>
| <<link "Take All">>
<<uinvRetrieveFromVault _itemName _count>>
<<goto "Storage_Store">>
<</link>>
<</if>>
<</capture>>
</div>
</div>
<</for>>
</div>
<</if>>
</div>
</div>
<div class="choice-container">
<<vchoice "Return to Storage" "Storage_Hub" "move" "back">>
</div><<set $currentLocation to "archives">>
<<run VaultUI.setBackground("archives")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<<run VaultUI.hideAllCharacters()>>
<h2>Archives</h2>
<<storyVideo "story/mv_archives/hub_stacks">>
Rows of bookshelves stretch into shadow. Data terminals flicker with amber text. This was a place of learning once — you can feel it. Dust motes drift in the recycled air.
<<if !$vault.sealedSectionOpen>>
At the far end, a heavy door is marked with strange purple symbols. It remains sealed.
<<else>>
The sealed door stands open now, purple light flickering from within.
<</if>>
<div class="choice-container">
<<vchoice "Browse books" "Archives_Books" "examine" "library">>
<<vchoice "Use data terminal" "Archives_Terminal" "action" "scroll">>
<<if $flags.archivesSearchUnlocked && !$flags.alchemyLabUnlocked>>
<<vchoice "Search the archives" "Archives_Search_Start" "action" "search">>
<</if>>
<<if $flags.alchemyLabUnlocked>>
<<vchoice "Alchemy Lab" "Alchemy_Lab_Visit" "move" "potion">>
<</if>>
<<if !$vault.sealedSectionOpen>>
<<vchoice "Examine sealed door" "Archives_Sealed_Door" "examine" "marked">>
<</if>>
<<vchoice "Return to Commons" "Vault_Hub" "move" "door-handle">>
</div><<advanceTime 0 30>>
You browse the shelves. Most books are damaged, but some are readable:
- Pre-Cataclysm history
- Vault construction manuals
- Personal journals from previous dwellers
- Strange texts about "dimensional apertures"
<<if random(1, 100) lte 20>>
<<set $flags.foundLoreBook to true>>
<<notify "info">>You found an interesting journal entry about the vault's true purpose...<</notify>>
<</if>>
<div class="choice-container">
<<vchoice "Return" "Archives_Hub" "move" "back">>
</div><<terminal "Vault-0047 Archives" "ONLINE">>
<<terminalRow "Status" "Limited Access" "warning">>
<<terminalRow "User" "Unregistered">>
<<terminalRow "Access Level" "Guest">>
<<terminalDivider>>
<<terminalSection "Available Records">>
<<terminalRow "› Vault Construction Logs">>
<<terminalRow "› Previous Dweller Registry">>
<<terminalRow "› Resource Consumption Data">>
<<terminalRow "› Supernatural Research" "[LOCKED]" "critical">>
<<terminalRow "› Transformation Protocols" "[LOCKED]" "critical">>
<<terminalPrompt "SELECT RECORD">>
<</terminal>>
<div class="choice-container">
<<vchoice "View previous dwellers" "Archives_Terminal_Dwellers" "examine" "house">>
<<vchoice "View resource data" "Archives_Terminal_Resources" "examine" "scroll">>
<<vchoice "Return" "Archives_Hub" "move" "back">>
</div><<terminal "Dweller Registry" "3 RECORDS">>
<<terminalEntry "ENTRY 001">>
<<terminalRow "Name" "Dr. Sarah Chen">>
<<terminalRow "Status" "[REDACTED]" "redacted">>
<<terminalRow "Duration" "247 days">>
<<terminalRow "Notes" "Successful adaptation. Relocated to [REDACTED]">>
<</terminalEntry>>
<<terminalEntry "ENTRY 002">>
<<terminalRow "Name" "Marcus Webb">>
<<terminalRow "Status" "Deceased" "critical">>
<<terminalRow "Duration" "89 days">>
<<terminalRow "Notes" "Incompatible. Rejected supernatural integration.">>
<</terminalEntry>>
<<terminalEntry "ENTRY 003">>
<<terminalRow "Name" "[DATA CORRUPTED]" "warning">>
<<terminalRow "Status" "Unknown">>
<<terminalRow "Duration" "12 days">>
<<terminalRow "Notes" "[FILE ENCRYPTED]" "warning">>
<</terminalEntry>>
<<terminalDivider>>
<<terminalEntry "CURRENT DWELLER">>
<<terminalRow "Name" $player.name>>
<<terminalRow "Status" "Adaptation in progress" "ok">>
<<terminalRow "Duration" `$time.day + " days"`>>
<</terminalEntry>>
<<terminalPrompt "END OF REGISTRY">>
<</terminal>>
<div class="choice-container">
<<vchoice "Return" "Archives_Terminal" "move" "back">>
</div><<terminal "Resource Status" "LIVE DATA">>
<<terminalSection "Current Reserves">>
<<terminalRow "Power" `setup.vaultPowerLive ? $vault.power + " / " + $vault.maxPower : "offline (not in use yet)"`>>
<<terminalRow "Food" `$vault.food + " units"`>>
<<terminalRow "Water" `$vault.water + " units"`>>
<<terminalRow "Medical" `$vault.medical + " units"`>>
<<terminalRow "Scrap" `$vault.scrap + " units"`>>
<<terminalDivider>>
<<terminalSection "Analysis">>
<<set _foodDays to setup.vaultDaysLeft("food")>>
<<set _waterDays to setup.vaultDaysLeft("water")>>
<<set _rateDays to _foodDays === null ? _waterDays : Math.min(_foodDays, _waterDays)>>
<<if _rateDays >= 14>>
<<set _rateLabel to "Sustainable">>
<<set _rateStatus to "ok">>
<<elseif _rateDays >= 7>>
<<set _rateLabel to "Moderate">>
<<set _rateStatus to "warning">>
<<else>>
<<set _rateLabel to "Critical">>
<<set _rateStatus to "critical">>
<</if>>
<<terminalRow "Consumption Rate" _rateLabel _rateStatus>>
<<terminalRow "Food Duration" `_foodDays === null ? "no nightly use" : _foodDays + " days"`>>
<<terminalRow "Water Duration" `_waterDays + " days"`>>
<<terminalPrompt "DATA REFRESH: REAL-TIME">>
<</terminal>>
<div class="choice-container">
<<vchoice "Return" "Archives_Terminal" "move" "back">>
</div><<run VaultUI.setBackground("archives_sealed_door")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<<storyVideo "story/mv_archives/sealed_door">>
You approach the sealed door. The symbols carved into its surface glow faintly purple.
<<if $player.corruption gt 30 || $flags.foundPurpleCrystal>>
The symbols seem to pulse as you get closer. Almost... responding to you.
<</if>>
<<if $flags.foundPurpleCrystal && $player.corruption gt 50>>
The crystal in your inventory grows warm.
<<notify "warning">>The door recognizes you. But you're not ready to open it yet.<</notify>>
<</if>>
The door remains sealed. For now.
<div class="choice-container">
<<vchoice "Return" "Archives_Hub" "move" "back">>
</div><<set $currentLocation to "vault">>
<<run VaultUI.setBackground("vault-entrance-interior")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<<run VaultUI.hideAllCharacters()>>
<<run setup.compat.apply("entrance-wasteland-vars")>>
<<if $flags.groundskeeperAtEntrance>>
<<run VaultUI.showCharacter("groundskeeper", "left", "concerned")>>
<</if>>
<h2>Vault Entrance</h2>
The massive door that separates the vault from the Reclaimed. Heavy, reinforced, built to keep the world out — or perhaps to keep something in. A control panel glows beside it.
Through a small viewport, you can see the desolate landscape beyond.
<<if $time.day lt 3>>
<p class="locked-message">You're not ready to venture out yet. Rest. Recover. Prepare.</p>
<div class="choice-container">
<<vchoice "Return to Commons" "Vault_Hub" "move" "door-handle">>
</div>
<<elseif $time.hour >= 21>>
<p class="locked-message">It's too late to venture out. The Reclaimed is dangerous enough in daylight — at night, it's suicide.</p>
<p class="note"><em>Travel is blocked after 9 PM. Rest and set out in the morning.</em></p>
<div class="choice-container">
<<vchoice "Return to Commons" "Vault_Hub" "move" "door-handle">>
</div>
<<else>>
The Reclaimed awaits.
<div class="choice-container">
<<vchoice "Venture into the Reclaimed" "Travel_Prepare" "action" "sunrise">>
<<if setup.kiraRunAskable()>>
<<link `'<span class="choice-button talk"><span class="gi gi-talk gi-large"></span><span class="label">Ask Kira to go out scavenging</span></span>'`>><<run setup.kiraRunState().from = "Entrance_Hub">><<goto "Kira_Scav_Ask">><</link>>
<</if>>
<<vchoice "Check door status" "Entrance_Status" "examine" "search">>
<<vchoice "Return to Commons" "Vault_Hub" "move" "door-handle">>
</div>
<</if>><<terminal "Entrance Control" "MONITORING">>
<<terminalSection "System Status">>
<<terminalRow "Door Status" "Sealed" "ok">>
<<terminalRow "Lock Integrity" "100%" "ok">>
<<terminalDivider>>
<<terminalSection "External Conditions">>
<<terminalRow "Environment" "Hostile" "warning">>
<<terminalRow "Radiation Levels" "Low" "ok">>
<<terminalRow "Hostile Activity" "Detected (raiders)" "critical">>
<<terminalDivider>>
<<terminalSection "Recommendations">>
<<terminalRow "›" "Daytime expeditions only">>
<<terminalRow "›" "Companion support advised">>
<<terminalRow "›" "Adequate supplies before departure">>
<<terminalPrompt "SENSORS: ACTIVE">>
<</terminal>>
<div class="choice-container">
<<vchoice "Return" "Entrance_Hub" "move" "back">>
</div><<run VaultUI.setBackground("vault-entrance-interior")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<h2><<icon "backpack">> Expedition Preparation</h2>
<p>Before venturing into the Reclaimed, you should prepare carefully.</p>
<<set $expeditionCompanion to "">>
<<set $companions[0].present to false>>
<<set $player.carriedFood to 0>>
<<set $player.carriedWater to 0>>
<div class="expedition-settings">
<div class="expedition-section">
<h3><<icon "users">> Companion</h3>
<<set _kiraClothingRefusal to setup.kiraHidesOverClothes()>>
<<if setup.kiraCanTravel()>>
<div class="companion-option">
<div class="companion-info">
<strong>Kira</strong> - Health: <<print $companions[0].health>>/<<print $companions[0].maxHealth>>
<p class="companion-note">Combat support, survival assistance, companionship.</p>
</div>
<div class="companion-toggle">
<<if $expeditionCompanion === "kira">>
<span class="selected"><<icon "check">> Selected</span>
<<link "Leave behind">>
<<set $expeditionCompanion to "">>
<<set $companions[0].present to false>>
<<set $combat.companionInCombat to null>>
<<goto "Expedition_Prepare">>
<</link>>
<<else>>
<<link "Bring Kira">>
<<set $expeditionCompanion to "kira">>
<<set $companions[0].present to true>>
<<set $combat.companionInCombat to "kira">>
<<goto "Expedition_Prepare">>
<</link>>
<</if>>
</div>
</div>
<<elseif setup.kiraAtCenter()>>
<p class="warning">Kira is held at the Covenant's Center in the Grove (<<print setup.groveKiraDaysLeft()>> more day<<if setup.groveKiraDaysLeft() !== 1>>s<</if>>).</p>
<<elseif setup.kiraOnRun()>>
<p class="warning">Kira is out scavenging at <<= setup.kiraRunSiteName($companions[0].away.site)>>. She'll be back by evening.</p>
<<elseif _kiraClothingRefusal>>
<p class="warning">Kira refuses to leave her room — her clothes are too damaged. Repair or replace them at the storage room.</p>
<<elseif $companions[0] && $companions[0].health <= 30>>
<p class="warning">Kira is too injured to travel. (Health: <<print $companions[0].health>>)</p>
<<elseif $flags.kiraIsUnconscious || $flags.kiraInComa || ($companions[0] && $companions[0].status === "unconscious")>>
<p class="warning">Kira is unconscious and cannot travel.</p>
<<else>>
<p class="note">No companions available.</p>
<</if>>
</div>
<div class="expedition-section">
<h3><<icon "supplies">> Supplies</h3>
<p class="note">Taking supplies from the vault for the journey.</p>
<div class="supply-row">
<span class="supply-label"><<icon "food">> Food (Vault: <<print $vault.food>>)</span>
<span class="supply-controls">
<<if $player.carriedFood > 0>>
<<link "−">><<set $player.carriedFood -= 1>><<set $vault.food += 1>><<goto "Expedition_Prepare">><</link>>
<</if>>
<span class="supply-amount"><<print $player.carriedFood>></span>
<<if $vault.food > 0 && $player.carriedFood < 5>>
<<link "+">><<set $player.carriedFood += 1>><<set $vault.food -= 1>><<goto "Expedition_Prepare">><</link>>
<</if>>
</span>
</div>
<div class="supply-row">
<span class="supply-label"><<icon "water">> Water (Vault: <<print $vault.water>>)</span>
<span class="supply-controls">
<<if $player.carriedWater > 0>>
<<link "−">><<set $player.carriedWater -= 1>><<set $vault.water += 1>><<goto "Expedition_Prepare">><</link>>
<</if>>
<span class="supply-amount"><<print $player.carriedWater>></span>
<<if $vault.water > 0 && $player.carriedWater < 5>>
<<link "+">><<set $player.carriedWater += 1>><<set $vault.water -= 1>><<goto "Expedition_Prepare">><</link>>
<</if>>
</span>
</div>
</div>
<div class="expedition-section expedition-summary">
<h3><<icon "scroll">> Summary</h3>
<ul>
<li><strong>Companion:</strong> <<if $expeditionCompanion === "kira">>Kira<<else>>None (solo)<</if>></li>
<li><strong>Food:</strong> <<print $player.carriedFood>> rations</li>
<li><strong>Water:</strong> <<print $player.carriedWater>> units</li>
</ul>
<<if $expeditionCompanion !== "kira" && $companions[0] && $companions[0].health > 30 && !$flags.kiraIsUnconscious>>
<p class="warning"><<icon "alert">> Traveling alone is more dangerous.</p>
<</if>>
<<if $player.carriedFood === 0 && $player.carriedWater === 0>>
<p class="warning"><<icon "alert">> No supplies. Long journeys may be risky.</p>
<</if>>
</div>
</div>
<div class="choice-container">
<<vchoice "View Map & Depart" "WorldMap_View" "action" "map">>
<<vchoice "Cancel" "Entrance_Hub" "move" "back">>
</div><<set $currentLocation to "quarters">>
<<run VaultUI.setBackground("quarters")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<h2>Your Quarters</h2>
Your room in the vault. Sparse but functional. A bed, a locker, a small desk.
<<if $time.phase === "night" || $time.phase === "late_night">>
The room is dark and quiet. Time for rest.
<<else>>
Dim lighting filters through the old fixtures.
<</if>>
<div class="choice-container">
<<vchoice "Back to Commons" "Vault_Hub" "move" "return">>
</div><<set _mhwHers to setup.kiraNightMorning()>>
<<set $currentLocation to _mhwHers ? "vault" : "quarters">>
<<run VaultUI.setBackground(_mhwHers ? "kira_room" : "quarters")>>
<<run VaultUI.setTimeOfDay("morning")>>
<h2>Morning</h2>
<<if !_mhwHers>>You wake in your quarters.<</if>>
<<set _morningNext to setup.kiraNightWake() || setup.hubWakeTarget()>>
<div class="choice-container">
<<vchoice "Continue" _morningNext "action" "forward">>
</div><<set $vault.crisis.warningAcknowledged to true>>
You wake with a gnawing unease.
<<if setup.kiraUp() && !$flags.kiraMissing>>
Kira is already up, standing by the storage cabinets with a worried expression.
<<dialogue "Kira" "companion">>We need to talk. I did an inventory check this morning.<</dialogue>>
She gestures to the nearly bare shelves.
<<dialogue "Kira" "companion">><<if $vault.crisis.type === "water" || $vault.water <= 5>>Water's running low. Maybe two, three days at most.<<else>>Food stores are getting dangerously low. We might have enough for a few more days, but...<</if>><</dialogue>>
She meets your eyes.
<<dialogue "Kira" "companion">>We need to go out there. Find supplies. Or...<</dialogue>>
She doesn't finish the sentence. She doesn't need to.
<<else>>
The storage room tells the story plainly enough. Nearly empty shelves. A few scattered rations. Not enough.
You're running out of time.
<</if>>
<div class="notification notification-warning">
<<if $vault.water <= 5>>
<strong>Water Critical:</strong> <<print $vault.water>> units remaining (~<<print Math.floor($vault.water / (1 + ($companions ? $companions.length : 0)))>> days)
<<else>>
<strong>Food Critical:</strong> <<print $vault.food>> units remaining (~<<print Math.floor($vault.food / (1 + ($companions ? $companions.length : 0)))>> days)
<</if>>
</div>
<div class="choice-container">
<<vchoice "We'll find supplies" "Vault_Hub" "action" "journey">>
<<vchoice "We'll figure something out" "Vault_Hub" "action" "think">>
</div><<set $vault.crisis.expeditionForced to true>>
<<if setup.kiraUp() && !$flags.kiraMissing>>
<<storyVideo "story/mv_vault/resource_crisis">>
You wake to Kira shaking you.
<<dialogue "Kira" "companion">>Wake up. We have a problem.<</dialogue>>
Her voice is tight. Controlled. The voice she uses when she's trying not to panic.
<<dialogue "Kira" "companion">><<if $vault.crisis.type === "water">>The water's gone. What's left won't last the day.<<else>>There's no food left. Nothing. I checked everywhere.<</if>><</dialogue>>
She pulls you to your feet.
<<dialogue "Kira" "companion">>We leave today. Now. Or we die in here.<</dialogue>>
<<else>>
The vault is silent. Too silent.
You check the storage room, already knowing what you'll find.
Empty.
<<if $vault.crisis.type === "water">>The water purifier sits dormant, nothing left to process. Your throat is already dry.<<else>>The food stores are bare. Your stomach cramps with hunger.<</if>>
Stay here, and you die. It's that simple.
<</if>>
<div class="notification notification-error">
<<if $vault.crisis.type === "water">>
<strong>NO WATER REMAINING</strong> - You must find supplies or die of dehydration.
<<else>>
<strong>NO FOOD REMAINING</strong> - You must find supplies or starve.
<</if>>
</div>
<div class="choice-container">
<<if setup.vaultCrisisFishersOnly()>>
<<vchoice "Head to Fisher's Rest" "Vault_Crisis_Expedition" "action" "journey">>
<<elseif setup.vaultCrisisEatFirst()>>
<p class="system-info warning"><<= setup.starvingTravelLockText("vault")>></p>
<<vchoice "Eat first" "Vault_Hub" "move" "return">>
<<else>>
<<vchoice "Head to the Outpost" "Vault_Crisis_Expedition" "action" "journey">>
<</if>>
<<vchoice "Search the nearby ruins first" "Vault_Crisis_Scavenge" "action" "search">>
</div><<set $currentLocation to "vault">>
<<if setup.vaultCrisisFishersOnly()>>
<<if setup.kiraUp() && !$flags.kiraMissing>>
<<dialogue "Kira" "companion">>Fisher's Rest. It's close, and the lake has fish. We'd never make the Outpost like this.<</dialogue>>
She grabs her gear, movements quick and efficient.
<<else>>
Fisher's Rest. It's close, and the lake has fish. In this state you'd never make the Outpost.
You just need to get there.
<</if>>
<<elseif setup.kiraUp() && !$flags.kiraMissing>>
<<dialogue "Kira" "companion">>The Outpost. Good thinking. They'll have supplies we can trade for... or take, if we have to.<</dialogue>>
She grabs her gear, movements quick and efficient.
<<dialogue "Kira" "companion">>Let's move. Every hour we waste here is an hour closer to...<</dialogue>>
She doesn't finish. She doesn't need to.
<<else>>
The Outpost. It's your best chance. They have water, food, medicine. Everything you need to survive.
You just need to get there alive.
<</if>>
<<set $flags.expeditionDesperate to true>>
<div class="choice-container">
<<vchoice "Set out immediately" "Travel_Setup" "action" "journey">>
</div><<set $currentLocation to "vault">>
<<if setup.kiraUp()>>
<<dialogue "Kira" "companion">>The ruins... risky. But closer. If we can find even a little...<</dialogue>>
She nods, grabbing her knife.
<<dialogue "Kira" "companion">>Quick in, quick out. We find what we can and reassess.<</dialogue>>
<<else>>
The nearby ruins might have something. <<if setup.vaultCrisisFishersOnly()>>It's closer than Fisher's Rest. Riskier, but you might not have the strength even for the walk to the lake.<<else>>It's closer than the Outpost. Riskier, but you might not have the strength for a longer journey.<</if>>
<</if>>
<<set $flags.expeditionDesperate to true>>
<<set _scavengeRoll to random(1, 100)>>
<<if _scavengeRoll >= 70>>
<<set _foundFood to random(3, 6)>>
<<set _foundWater to random(2, 4)>>
<<set $vault.food += _foundFood>>
<<set $vault.water += _foundWater>>
<<set $vault.crisis.active to false>>
<<set $flags.vaultCrisisActive to false>>
Hours of searching through collapsed buildings pay off. In the basement of what might have been a restaurant, you find sealed containers.
<<notify "success">>Found <<print _foundFood>> food and <<print _foundWater>> water!<</notify>>
<<if setup.kiraUp()>>
<<dialogue "Kira" "companion">>Oh thank god. This buys us time. Not much, but... time.<</dialogue>>
<</if>>
It's not a solution. But it's a reprieve.
<div class="choice-container">
<<vchoice "Return to the Vault" "Vault_Hub" "move" "return">>
</div>
<<elseif _scavengeRoll >= 30>>
<<set _found to random(1, 2)>>
<<if $vault.crisis.type === "water">>
<<set $vault.water += _found>>
<<else>>
<<set $vault.food += _found>>
<</if>>
You search for hours, desperation lending you focus. You find scraps. Not enough. But something.
<<notify "warning">>Found <<print _found>> <<print $vault.crisis.type === "water" ? "water" : "food">>. Not enough.<</notify>>
<<if setup.kiraUp()>>
<<dialogue "Kira" "companion">>It's something. But we still need more. <<if setup.vaultCrisisFishersOnly()>>Fisher's Rest, then. The lake has fish.<<elseif setup.vaultCrisisEatFirst()>>Eat first. We won't make it anywhere like this.<<else>>The Outpost is our only real option now.<</if>><</dialogue>>
<</if>>
<<if setup.vaultCrisisEatFirst()>>
<p class="system-info warning"><<= setup.starvingTravelLockText("vault")>></p>
<</if>>
<div class="choice-container">
<<if setup.vaultCrisisFishersOnly()>>
<<vchoice "Head to Fisher's Rest" "Vault_Crisis_Expedition" "action" "journey">>
<<elseif !setup.vaultCrisisEatFirst()>>
<<vchoice "Head to the Outpost" "Vault_Crisis_Expedition" "action" "journey">>
<</if>>
<<vchoice "Return to the Vault" "Vault_Hub" "move" "return">>
</div>
<<else>>
The ruins are picked clean. Worse, you're not alone.
<<if setup.kiraUp()>>
<<dialogue "Kira" "companion">>Company. And they don't look friendly.<</dialogue>>
<</if>>
A group of scavengers emerges from the rubble, weapons drawn.
<<set $combat to {
active: true,
companionInCombat: (setup.kiraUp() ? "kira" : null),
enemies: [],
turn: 0,
phase: "player",
playerDazed: false,
kiraIncapacitated: false,
kiraInRefractory: false
}>>
<<set $combat.enemies.push({
id: "scavenger_1",
name: "Desperate Scavenger",
visualGroup: "grunt",
gender: "male",
health: 40,
maxHealth: 40,
damage: 8,
lust: 0,
maxLust: 60,
stunned: false,
clothingState: "full"
})>>
<<set $combat.enemies.push({
id: "scavenger_2",
name: "Hungry Scavenger",
visualGroup: "feral",
gender: "female",
health: 35,
maxHealth: 35,
damage: 6,
lust: 0,
maxLust: 70,
stunned: false,
clothingState: "full"
})>>
<div class="choice-container">
<<vchoice "Fight!" "Combat_Start" "combat" "attack">>
</div>
<</if>><<set $flags.vaultStarvationDeath to false>>
<<set $flags.starvationRescueStocked to ((($flags.vaultFoodAtBedtime !== undefined) ? $flags.vaultFoodAtBedtime : setup.vaultFoodOnHand()) > 0 && $vault.crisis.daysWithoutWater < 3)>>
<<set $flags.starvationRescueKira to ((setup.kiraUp() && !$flags.kiraMissing) ? ($companions[0].daysWithoutFood === 0 ? "fed" : "down") : "")>>
Everything goes dark.
<<if $vault.crisis.daysWithoutWater >= 3>>
The thirst was the worst part. Your lips cracked. Your tongue swelled. Every breath felt like swallowing broken glass.
You remember crawling toward the water purifier, hoping for just a drop. Finding nothing.
Then darkness.
<<else>>
The hunger gnawed at you for days. First uncomfortable. Then painful. Then... nothing. Just weakness.
<<if $flags.starvationRescueStocked>>There was food on the shelves the whole time. You kept meaning to get up for it.
<</if>>You remember lying down. Just for a moment. Just to rest.
You didn't get back up.
<</if>>
<<silently>>
<<set $player.health to 1>>
<<set $player.hunger to Math.max($player.hunger, 20)>>
<<set $player.energy to 20>>
<<set $vault.crisis.active to false>>
<<set $vault.crisis.daysWithoutFood to 0>>
<<set $vault.crisis.daysWithoutWater to 0>>
<<set $flags.vaultCrisisActive to false>>
<<if !$flags.groundskeeperStarvationRescues>>
<<set $flags.groundskeeperStarvationRescues to 0>>
<</if>>
<<set $flags.groundskeeperStarvationRescues += 1>>
<</silently>>
...
You wake to water on your lips. Cool. Clean. Life itself. Then a spoon of thin, salty broth, and another.
Your eyes flutter open.
The Groundskeeper's weathered face hovers above you, metal canteen pressed to your mouth.
<<dialogue "Groundskeeper" "npc">>Drink slowly. You've been out for... a while.<</dialogue>>
<<if $flags.starvationRescueKira === "fed">>
Kira sits nearby, pale, arms wrapped around her knees. She ate. You didn't.
<<dialogue "Groundskeeper" "npc">>Your companion came for me. She's fed. You're the one who forgot how to eat.<</dialogue>>
<<set $companions[0].daysWithoutFood to 0>>
<<elseif $flags.starvationRescueKira === "down">>
Kira lies nearby, unconscious but breathing. The Groundskeeper must have found her too.
<<dialogue "Groundskeeper" "npc">>Your companion is alive. Barely. I found her collapsed near the storage room.<</dialogue>>
<<set $companions[0].health to setup.kiraFloorHealth(1)>>
<<set $companions[0].daysWithoutFood to 0>>
<</if>>
<<if $flags.groundskeeperStarvationRescues >= 2>>
<<dialogue "Groundskeeper" "npc">>This is becoming a habit. A bad one.<</dialogue>>
His voice is hard. Disappointed.
<<dialogue "Groundskeeper" "npc">>I won't always be here to pick up the pieces. You need to learn to survive, or the Reclaimed will claim you. Permanently.<</dialogue>>
<<elseif $flags.starvationRescueStocked>>
<<dialogue "Groundskeeper" "npc">>There's food on your shelves. Food does nothing for a man who won't eat it.<</dialogue>>
He sets down supplies beside you anyway.
<<set $vault.food += 5>>
<<set $vault.water += 5>>
<<notify "info">>Groundskeeper provided 5 food and 5 water.<</notify>>
<<dialogue "Groundskeeper" "npc">>Eat. Then venture out and find more. Or next time...<</dialogue>>
He doesn't finish the sentence.
<<else>>
<<dialogue "Groundskeeper" "npc">>The vault was never meant to sustain life indefinitely. It needs... tending. Supplies must come from outside.<</dialogue>>
He sets down supplies beside you.
<<set $vault.food += 5>>
<<set $vault.water += 5>>
<<notify "info">>Groundskeeper provided 5 food and 5 water.<</notify>>
<<dialogue "Groundskeeper" "npc">>This will keep you alive. For now. But you must venture out. Find your own provisions. Or next time...<</dialogue>>
He doesn't finish the sentence.
<</if>>
<div class="choice-container">
<<vchoice "Thank him" "Vault_Starvation_Thanks" "action" "talk">>
<<vchoice "Ask how he found you" "Vault_Starvation_Question" "action" "examine">>
</div><<run VaultUI.showCharacter("kira", "center", "worried")>>
You wake to a bowl banging down on the crate beside your bed.
<<dialogue "Kira" "companion">>Your body is eating itself. Please... eat something.<</dialogue>>
She shoves the bowl at you. Rehydrated protein, still warm, a spoon stuck upright in it.
<<dialogue "Kira" "companion">>I took it off the shelf myself. Here. Don't make a thing of it.<</dialogue>>
<div class="choice-container">
<<vchoice "Eat" "Vault_Starving_KiraFood_Eat" "action" "food">>
<<vchoice "Push it away" "Vault_Starving_KiraFood_Refuse" "action" "return">>
</div><<if $vault.food gt 0>><<set $vault.food -= 1>><</if>>
<<set $player.hunger to Math.min($player.maxHunger, $player.hunger + 40)>>
<<addTrust "kira" 1>>
<<run VaultUI.showCharacter("kira", "center", "smile")>>
You eat. Slowly at first, then like an animal. She watches every spoonful go down, arms crossed, until the bowl is scraped clean.
<<dialogue "Kira" "companion">>Good. Now don't make me do that again.<</dialogue>>
<p class="system-info"><<icon "food">> Hunger +40 (vault food −1)</p>
<<set _vskWake to setup.groveMorningEvent() || setup.hubWakeTarget()>>
<div class="choice-container">
<<vchoice "Get up" _vskWake "action" "sun">>
</div><<run VaultUI.showCharacter("kira", "center", "angry")>>
You push the bowl back at her. Her jaw tightens.
<<dialogue "Kira" "companion">>Fine. Starve, then. I'm not watching you do it.<</dialogue>>
She leaves the bowl on the crate anyway.
<<set _vskWake to setup.groveMorningEvent() || setup.hubWakeTarget()>>
<div class="choice-container">
<<vchoice "Get up" _vskWake "action" "sun">>
</div><<dialogue "Groundskeeper" "npc">>Don't thank me. Survive. That's thanks enough.<</dialogue>>
He stands, joints creaking.
<<dialogue "Groundskeeper" "npc">>The Outpost to the east trades supplies. Raiders sometimes cache goods in the old ruins. And the Nomads... they know where water flows beneath the sand.<</dialogue>>
He moves toward the door.
<<dialogue "Groundskeeper" "npc">>Rest today. But tomorrow, you must act. The vault's stores won't replenish themselves.<</dialogue>>
<div class="choice-container">
<<vchoice "Continue" "Vault_Starvation_End" "action" "forward">>
</div><<dialogue "Groundskeeper" "npc">>I have my ways. The vault speaks to me, in its fashion.<</dialogue>>
He taps the wall with a gnarled finger.
<<dialogue "Groundskeeper" "npc">>These old stones have eyes. Ears. They remember their purpose, even if the world has forgotten.<</dialogue>>
His gaze grows distant.
<<dialogue "Groundskeeper" "npc">>I felt your life fading. The vault... called to me.<</dialogue>>
<<if $player.corruption >= 30>>
For a moment, something flickers in his eyes. Recognition? Suspicion?
<<dialogue "Groundskeeper" "npc">>You carry something inside you. Something the vault recognizes. Be careful with that power. It has a cost.<</dialogue>>
<</if>>
<div class="choice-container">
<<vchoice "Continue" "Vault_Starvation_End" "action" "forward">>
</div><<if $flags.starvationRescueKira === "fed">>
Kira doesn't move from your side.
<<dialogue "Groundskeeper" "npc">>Rest. Both of you. But remember what I said.<</dialogue>>
As he leaves, Kira looks at you with hollow eyes.
<<dialogue "Kira" "companion">><<if $flags.starvationRescueStocked>>You almost died in here. With food on the shelves.<<else>>We almost died in here, didn't we?<</if>><</dialogue>>
She doesn't wait for an answer.
<<if $flags.kiraFoodPushDay !== undefined && $time.day - $flags.kiraFoodPushDay <= 3>>
<<dialogue "Kira" "companion">>That doesn't happen again. When I put a bowl in front of you, you eat it.<</dialogue>>
<<else>>
<<dialogue "Kira" "companion">>That doesn't happen again. You eat when I eat. Every day.<</dialogue>>
<</if>>
<<dialogue "Kira" "companion">>Tomorrow. Tomorrow we figure this out.<</dialogue>>
<<elseif $flags.starvationRescueKira === "down">>
Kira stirs, groaning.
<<dialogue "Kira" "companion">>What... what happened?<</dialogue>>
<<dialogue "Groundskeeper" "npc">>Rest. Both of you. But remember what I said.<</dialogue>>
As he leaves, Kira looks at you with hollow eyes.
<<dialogue "Kira" "companion">>We almost died in here, didn't we?<</dialogue>>
She doesn't wait for an answer. She knows.
<<dialogue "Kira" "companion">>We can't let that happen again. We need to be smarter. Plan better. Scavenge more.<</dialogue>>
She forces herself to sit up, wincing.
<<dialogue "Kira" "companion">>Tomorrow. Tomorrow we figure this out.<</dialogue>>
<</if>>
<div class="choice-container">
<<vchoice "Rest and recover" "Vault_Hub" "move" "return">>
</div><<set $currentLocation to "crossroads_central">>
<<run VaultUI.setBackgroundDirect("media/backgrounds/vault/reclaimed-crossroads/crossroads_central.webp")>>
<<setTimeOfDay $time.phase>>
<<if setup.caravanDue(null, "crossroads_central")>>
<<include "Caravan_OldTown">>
<<elseif setup.groveErrandDue()>>
<<include "Grove_Errand_Barricade">>
<<elseif setup.placeEntryLock("crossroads_central")>>
<<if setup.kiraWithYou()>>
<<showCharacter $expeditionCompanion "left" "neutral">>
<</if>>
<h2>The Barricade</h2>
<p>The street into Old Town ends in a wall of burnt-out cars, parked nose to tail and packed with sandbags and scrap. Rifle barrels lie along the roofs. Nobody shows a face. You're still twenty paces off when a voice comes from behind the cars.</p>
<<set _otLine to $time.day % 3>>
<<if _otLine === 0>>
<<say "Voice from the barricade" "That's close enough. Nothing in here for you. Turn around.">>
<<elseif _otLine === 1>>
<<say "Voice from the barricade" "No wagons, no toll, no business. Walk back the way you came, slowly.">>
<<else>>
<<say "Voice from the barricade" "We can see you fine from here. Turn around and keep your hands where we can see them too.">>
<</if>>
<p>A rifle bolt slides home somewhere behind the sandbags, just loud enough to hear.</p>
<<if setup.kiraWithYou()>>
<<say "Kira" "Five rifles at least, and not one face. I'm not getting shot to look at a square. Let's go.">>
<</if>>
<div class="choice-container">
<<vchoice "Return to map" "WorldMap_View" "move" "map">>
<<vchoice "Return to vault" "Journey_ReturnToVault" "action" "house">>
</div>
<<else>>
<h2>Old Town</h2>
<<storyVideo "story/mv_locations/old_town">>
The old town square stretches before you, cracked pavement meeting overgrown paths at every turn. Rusted lampposts stand like silent sentinels, their lights long dead. The shells of storefronts line the edges, their windows dark and empty.
This place was once the heart of the settlement. Now it serves as a waypoint for travelers brave enough to venture into the Reclaimed.
<<if setup.kiraWithYou()>>
<p>Kira looks around, taking in the abandoned square.</p>
<</if>>
<div class="choice-container">
<<vchoice "Open map" "WorldMap_View" "move" "map">>
<<vchoice "Return to vault" "Journey_ReturnToVault" "action" "house">>
</div>
<</if>><<set $currentLocation to "outpost">>
<<run VaultUI.setBackgroundDirect("media/backgrounds/wasteland/generic/reclaimed_day.webp")>>
<<setTimeOfDay $time.phase>>
<<if setup.kiraWithYou()>>
<<showCharacter $expeditionCompanion "left" "neutral">>
<</if>>
<h2>Abandoned Outpost</h2>
A cluster of half-collapsed buildings. Whatever this place was, it's been picked clean by scavengers long ago. But there might still be something worth finding in the rubble.
<<if !$locations.outpost.searched>>
<div class="location-options">
<h3>What do you want to do?</h3>
<div class="choice-container">
<<vchoice "Search thoroughly" "Outpost_Search_Full" "action" "search">>
<<vchoice "Quick loot and leave" "Outpost_Search_Quick" "action" "dodge">>
<<if setup.kiraWithYou()>>
<<vchoice "Split up to cover more ground" "Outpost_Split" "action" "run">>
<</if>>
</div>
</div>
<<else>>
You've already searched this place thoroughly. Nothing left but dust.
<div class="choice-container">
<<vchoice "Move on" "WorldMap_View" "move" "map">>
</div>
<</if>>
<hr>
<div class="choice-container">
<<vchoice "Open map" "WorldMap_View" "move" "map">>
<<vchoice "Return to vault" "Journey_ReturnToVault" "action" "house">>
</div><<set _lootStored to []>>
<<set $locations.outpost.searched to true>>
<<set _travelMinutes to random(30, 45)>>
<<advanceTime 0 _travelMinutes>>
You spend time carefully going through the ruins.
<!-- Loot generation -->
<<set _lootRoll to random(1, 100)>>
<<set _found to []>>
<<if _lootRoll >= 70>>
<!-- Good find -->
<<set _scrap to {id: "scrap metal", name: "Scrap Metal", type: "resource", description: "Useful metal scraps."}>>
<<addItem _scrap 3>>
<<set _water to {id: "dirty water", name: "Dirty Water", type: "consumable", description: "Water that needs purification."}>>
<<set _got to setup.giveItem(_water.id, 2)>><<if _got.stored > 0>><<run _lootStored.push(_water.name + " x" + _got.stored)>><</if>>
<<set _food to {id: "canned food", name: "Canned Food", type: "consumable", description: "Pre-war canned food."}>>
<<set _got to setup.giveItem(_food.id, 1)>><<if _got.stored > 0>><<run _lootStored.push(_food.name + " x" + _got.stored)>><</if>>
<p>In a collapsed storage closet, you find a small cache of supplies.</p>
<div class="loot-display">
<h4>Found:</h4>
<ul>
<li>Scrap Metal x3</li>
<li>Dirty Water x2</li>
<li>Canned Food x1</li>
</ul>
<<if _lootStored.length > 0>><p class="loot-stored">Your backpack is full. Sent to the vault storage: <<print _lootStored.join(", ")>>.</p><</if>>
</div>
<<elseif _lootRoll >= 40>>
<!-- Okay find -->
<<set _scrap to {id: "scrap metal", name: "Scrap Metal", type: "resource", description: "Useful metal scraps."}>>
<<addItem _scrap 2>>
<<set _water to {id: "dirty water", name: "Dirty Water", type: "consumable", description: "Water that needs purification."}>>
<<set _got to setup.giveItem(_water.id, 1)>><<if _got.stored > 0>><<run _lootStored.push(_water.name + " x" + _got.stored)>><</if>>
<p>Digging through debris, you salvage some useful materials.</p>
<div class="loot-display">
<h4>Found:</h4>
<ul>
<li>Scrap Metal x2</li>
<li>Dirty Water x1</li>
</ul>
<<if _lootStored.length > 0>><p class="loot-stored">Your backpack is full. Sent to the vault storage: <<print _lootStored.join(", ")>>.</p><</if>>
</div>
<<else>>
<!-- Poor find -->
<<set _scrap to {id: "scrap metal", name: "Scrap Metal", type: "resource", description: "Useful metal scraps."}>>
<<addItem _scrap 1>>
<p>The place has been thoroughly looted. You find only scraps.</p>
<div class="loot-display">
<h4>Found:</h4>
<ul>
<li>Scrap Metal x1</li>
</ul>
</div>
<</if>>
<!-- Companion reaction -->
<<if setup.kiraWithYou()>>
<<if _lootRoll >= 70>>
<<say "Kira" "Nice find. That'll keep us going.">>
<<relationChange "kira" "affection" 1>>
<<else>>
<<say "Kira" "Slim pickings. Let's keep moving.">>
<</if>>
<</if>>
<!-- Random discovery chance -->
<<if random(1, 100) <= 20 && !$discoveries.collapsedMarket>>
While searching, you notice tracks leading east. Fresh ones.
<<set $discoveries.collapsedMarket to true>>
<div class="discovery">
<<icon "map">> <strong>New location discovered:</strong> Collapsed Market
</div>
<</if>>
<div class="choice-container">
<<vchoice "Continue exploring" "WorldMap_View" "move" "map">>
<<vchoice "Return to vault" "Journey_ReturnToVault" "move" "house">>
</div><<set $locations.outpost.searched to true>>
<<set _travelMinutes to random(30, 45)>>
<<advanceTime 0 _travelMinutes>>
You do a quick sweep, grabbing what's obvious.
<<set _scrap to {id: "scrap metal", name: "Scrap Metal", type: "resource", description: "Useful metal scraps."}>>
<<addItem _scrap 1>>
<div class="loot-display">
<h4>Found:</h4>
<ul>
<li>Scrap Metal x1</li>
</ul>
</div>
<<if setup.kiraWithYou()>>
<<say "Kira" "Fast, but we probably missed something. Your call.">>
<</if>>
<div class="choice-container">
<<vchoice "Continue exploring" "WorldMap_View" "move" "map">>
<<vchoice "Return to vault" "Journey_ReturnToVault" "move" "house">>
</div><<set _lootStored to []>>
<<set $locations.outpost.searched to true>>
<<set _travelMinutes to random(30, 45)>>
<<advanceTime 0 _travelMinutes>>
<<say "Kira" "I'll check the north buildings. You take the south.">>
You split up to cover more ground efficiently.
<!-- Better loot with companion -->
<<set _lootRoll to random(1, 100) + 20>>
<<if _lootRoll >= 70>>
<<set _scrap to {id: "scrap metal", name: "Scrap Metal", type: "resource", description: "Useful metal scraps."}>>
<<addItem _scrap 4>>
<<set _water to {id: "dirty water", name: "Dirty Water", type: "consumable", description: "Water that needs purification."}>>
<<set _got to setup.giveItem(_water.id, 2)>><<if _got.stored > 0>><<run _lootStored.push(_water.name + " x" + _got.stored)>><</if>>
<p>Between the two of you, you find quite a bit!</p>
<div class="loot-display">
<h4>Found:</h4>
<ul>
<li>Scrap Metal x4</li>
<li>Dirty Water x2</li>
</ul>
<<if _lootStored.length > 0>><p class="loot-stored">Your backpack is full. Sent to the vault storage: <<print _lootStored.join(", ")>>.</p><</if>>
</div>
<<say "Kira" "Good haul. Teamwork pays off.">>
<<relationChange "kira" "affection" 1>>
<<else>>
<<set _scrap to {id: "scrap metal", name: "Scrap Metal", type: "resource", description: "Useful metal scraps."}>>
<<addItem _scrap 2>>
<p>You find some scrap between the two of you.</p>
<div class="loot-display">
<h4>Found:</h4>
<ul>
<li>Scrap Metal x2</li>
</ul>
</div>
<<say "Kira" "Not much, but at least we covered ground quickly.">>
<</if>>
<div class="choice-container">
<<vchoice "Continue exploring" "WorldMap_View" "move" "map">>
<<vchoice "Return to vault" "Journey_ReturnToVault" "move" "house">>
</div><<set $currentLocation to "convoy">>
<<run VaultUI.setBackgroundDirect("media/backgrounds/wasteland/convoy/convoy_day.webp")>>
<<if setup.kiraWithYou()>>
<<showCharacter $expeditionCompanion "left" "neutral">>
<</if>>
<h2>Rusted Convoy</h2>
A line of military vehicles rusts under moss and ferns. Decades-old convoy, caught by something during the collapse.
<<if !$locations.convoy.searched>>
<div class="choice-container">
<<vchoice "Search vehicles" "Convoy_Search" "action" "search">>
<<vchoice "Return to map" "WorldMap_View" "move" "map">>
</div>
<<else>>
Already looted. Nothing left.
<div class="choice-container">
<<if setup.hollowMapFindable()>>
<<vchoice "Check the cab you missed" "Convoy_CabMissed" "action" "search">>
<</if>>
<<vchoice "Return to map" "WorldMap_View" "move" "map">>
</div>
<</if>><<set _lootStored to []>>
<<set $locations.convoy.searched to true>>
<<set _travelMinutes to random(30, 45)>>
<<advanceTime 0 _travelMinutes>>
You search through the convoy vehicles.
<<set _lootRoll to random(1, 100)>>
<<if _lootRoll >= 60>>
<<set _scrap to {id: "scrap metal", name: "Scrap Metal", type: "resource", description: "Useful metal scraps."}>>
<<addItem _scrap 5>>
<<set _parts to {id: "vehicle parts", name: "Vehicle Parts", type: "resource", description: "Salvaged vehicle components."}>>
<<set _got to setup.giveItem(_parts.id, 2)>><<if _got.stored > 0>><<run _lootStored.push(_parts.name + " x" + _got.stored)>><</if>>
<p>Good find! Vehicle parts and scrap metal.</p>
<div class="loot-display">
<h4>Found:</h4>
<ul>
<li>Scrap Metal x5</li>
<li>Vehicle Parts x2</li>
</ul>
<<if _lootStored.length > 0>><p class="loot-stored">Your backpack is full. Sent to the vault storage: <<print _lootStored.join(", ")>>.</p><</if>>
</div>
<<else>>
<<set _scrap to {id: "scrap metal", name: "Scrap Metal", type: "resource", description: "Useful metal scraps."}>>
<<addItem _scrap 3>>
<p>You find some scrap metal.</p>
<div class="loot-display">
<h4>Found:</h4>
<ul>
<li>Scrap Metal x3</li>
</ul>
</div>
<</if>>
<<if setup.hollowMapFindable()>>
<<hollowMapFind>>
<</if>>
<div class="choice-container">
<<vchoice "Continue exploring" "WorldMap_View" "move" "map">>
<<vchoice "Return to vault" "Journey_ReturnToVault" "move" "house">>
</div><<set $currentLocation to "market">>
<<run VaultUI.setBackgroundDirect("media/backgrounds/vault/exterior/market_day.webp")>>
<<if setup.kiraWithYou()>>
<<showCharacter $expeditionCompanion "left" "neutral">>
<</if>>
<<if !$locations.market.searched>>
<h2>Collapsed Market</h2>
The skeleton of an old marketplace. Stalls and shops have long since been picked over, but sometimes people miss things.
<div class="choice-container">
<<vchoice "Search market" "Market_Search" "action" "search">>
<<vchoice "Return to map" "WorldMap_View" "move" "map">>
</div>
<<else>>
<h2>Trader's Rest</h2>
<div class="choice-container">
<<vchoice "The quartermaster" "TradersRest_Quartermaster" "action" "scrap">>
<<if setup.stallOpen()>><<vchoice "The trader's blanket" "TradersRest_Stall" "action" "backpack">><</if>>
<<vchoice "The dice table" "Dice_Table" "action" "dice">>
<<if setup.caravanUnlocked()>><<vchoice "Talk to the caravan master" "Caravan_Offer" "talk" "talk">><</if>>
<<vchoice "Return to map" "WorldMap_View" "move" "map">>
</div>
<</if>><<set _lootStored to []>>
<<set $locations.market.searched to true>>
<<set _travelMinutes to random(30, 45)>>
<<advanceTime 0 _travelMinutes>>
You search through the collapsed market stalls.
<<set _lootRoll to random(1, 100)>>
<<if _lootRoll >= 70>>
<<set _food to {id: "canned food", name: "Canned Food", type: "consumable", description: "Pre-war canned food."}>>
<<set _got to setup.giveItem(_food.id, 3)>><<if _got.stored > 0>><<run _lootStored.push(_food.name + " x" + _got.stored)>><</if>>
<<set _cloth to {id: "cloth", name: "Cloth", type: "resource", description: "Usable cloth material."}>>
<<set _got to setup.giveItem(_cloth.id, 2)>><<if _got.stored > 0>><<run _lootStored.push(_cloth.name + " x" + _got.stored)>><</if>>
<<set _medical to {id: "bandage", name: "Bandage", type: "consumable", description: "Basic medical supplies."}>>
<<set _got to setup.giveItem(_medical.id, 2)>><<if _got.stored > 0>><<run _lootStored.push(_medical.name + " x" + _got.stored)>><</if>>
<p>Excellent haul from the market!</p>
<div class="loot-display">
<h4>Found:</h4>
<ul>
<li>Canned Food x3</li>
<li>Cloth x2</li>
<li>Bandages x2</li>
</ul>
<<if _lootStored.length > 0>><p class="loot-stored">Your backpack is full. Sent to the vault storage: <<print _lootStored.join(", ")>>.</p><</if>>
</div>
<<if setup.kiraWithYou()>>
<<say "Kira" "Nice. Good stuff for trading.">>
<</if>>
<<else>>
<<set _food to {id: "canned food", name: "Canned Food", type: "consumable", description: "Pre-war canned food."}>>
<<set _got to setup.giveItem(_food.id, 1)>><<if _got.stored > 0>><<run _lootStored.push(_food.name + " x" + _got.stored)>><</if>>
<<set _scrap to {id: "scrap metal", name: "Scrap Metal", type: "resource", description: "Useful metal scraps."}>>
<<addItem _scrap 2>>
<p>You find some supplies.</p>
<div class="loot-display">
<h4>Found:</h4>
<ul>
<li>Canned Food x1</li>
<li>Scrap Metal x2</li>
</ul>
<<if _lootStored.length > 0>><p class="loot-stored">Your backpack is full. Sent to the vault storage: <<print _lootStored.join(", ")>>.</p><</if>>
</div>
<</if>>
<div class="choice-container">
<<vchoice "Into Trader's Rest" "Location_Market" "move" "forward">>
<<vchoice "Continue exploring" "WorldMap_View" "move" "map">>
<<vchoice "Return to vault" "Journey_ReturnToVault" "move" "house">>
</div><<set $currentLocation to "overgrown_ruins">>
<<setBackground "reclaimed-ruins">>
<<setTimeOfDay $time.phase>>
<<if setup.standingStones>>
<<if !$locations.overgrown_ruins.stones>>
<<set $locations.overgrown_ruins.stones to {
warmStone: { examineCount: 0, lastFaintDay: 0 },
hummingStone: { examineCount: 0, lastFaintDay: 0 },
rootedStone: { examineCount: 0, lastFaintDay: 0 },
wetStone: { examineCount: 0, lastFaintDay: 0 }
}>>
<</if>>
<<if $locations.overgrown_ruins.stonesVisitCount is undefined>>
<<set $locations.overgrown_ruins.stonesVisitCount to 0>>
<</if>>
<<set _visibleStones to setup.standingStones.getVisibleStones()>>
<<else>>
<<set _visibleStones to []>>
<</if>>
<h2>Overgrown Ruins</h2>
The ruins stand as they did before — crumbling walls consumed by decades of unchecked growth. But the air is different now. Charged. Whatever Velith summoned here left a residue that hasn't faded.
<<if setup.kiraWithYou()>>
<<set _kira to $companions[0]>>
<<if _kira.trust gte 30>>
<<say "Kira" "Still gives me the creeps. But... there's something else here now. You feel it?">>
<<else>>
Kira keeps her distance from the foundation stones, hand resting on her weapon.
<</if>>
<</if>>
<div class="choice-container">
<<if _visibleStones.length gt 0>>
<<if !$flags.standingStonesFirstVisit>>
<<vchoice "Investigate the stone circle" "StandingStones_Arrive" "action" "ritual">>
<<else>>
<<vchoice "Enter the stone circle" "StandingStones_Hub" "action" "ritual">>
<</if>>
<<else>>
<<vchoice "Search deeper into the ruins" "Ruins_Deeper_Teaser" "action" "search">>
<</if>>
<<vchoice "Open map" "WorldMap_View" "move" "map">>
<<vchoice "Return to vault" "Journey_ReturnToVault" "move" "house">>
</div><<set $currentLocation to "raider_camp">>
<<setBackground "location:raider_camp">>
<<setTimeOfDay $time.phase>>
<<if setup.kiraWithYou()>>
<<showCharacter $expeditionCompanion "left" "alert">>
<</if>>
<<set _rcNewGroup to setup.raiderCampRepopulate()>>
<h2>Raider Camp</h2>
A fortified camp surrounded by makeshift walls of scrap metal and rusted vehicles. Smoke rises from a fire pit in the center.
<<if !$locations.raider_camp.cleared>>
<<if _rcNewGroup>>
The bodies you left by the fire pit are gone. There are new tarps strung between the wrecks, fresh tracks in the dust, a different flag hanging off the gate. Someone else has moved in.
<<if setup.kiraWithYou()>>
<<say "Kira" "That didn't take long. New crew, same walls.">>
<</if>>
<</if>>
You can hear voices — raiders, at least three or four.
This is dangerous territory. The raiders won't take kindly to intruders.
<<if setup.kiraWithYou()>>
<<say "Kira" "Raider camp. We could try to sneak in for supplies, or fight our way through. Either way, this won't be easy.">>
<</if>>
<div class="choice-container">
<<vchoice "Attack the camp" "RaiderCamp_Attack" "action" "attack">>
<<vchoice "Try to sneak in" "RaiderCamp_Sneak" "action" "gagged">>
<<vchoice "Leave quietly" "WorldMap_View" "move" "walk">>
</div>
<<else>>
The camp is empty now, bodies scattered around the fire pit. You've already cleared this place out.
<div class="choice-container">
<<vchoice "Search for remaining loot" "RaiderCamp_Search" "action" "search">>
<<vchoice "Return to map" "WorldMap_View" "move" "map">>
</div>
<</if>><<set _travelMinutes to random(30, 45)>>
<<advanceTime 0 _travelMinutes>>
You decide to hit them hard and fast.
<<if setup.kiraWithYou()>>
<<say "Kira" "Alright. Let's do this.">>
<</if>>
You charge into the camp. Raiders scramble for weapons!
<div class="choice-container">
<<vchoice "Fight!" "RaiderCamp_Attack_Start" "action" "attack">>
</div><<set _campEnemies to []>>
<<set _maleRaiders to ["raider_grunt", "raider_scout", "raider_brute", "raider_machete", "raider_blade"]>>
<<set _femaleRaiders to ["raider_huntress", "raider_vixen", "raider_whip", "raider_amazon", "raider_temptress"]>>
<<if random(1, 100) <= 70>>
<<set _enemy1 to _femaleRaiders.random()>>
<<else>>
<<set _enemy1 to _maleRaiders.random()>>
<</if>>
<<createEnemy _enemy1 "standard">>
<<run _campEnemies.push(clone(_returnEnemy))>>
<<if random(1, 100) <= 70>>
<<set _enemy2 to _femaleRaiders.random()>>
<<else>>
<<set _enemy2 to _maleRaiders.random()>>
<</if>>
<<createEnemy _enemy2 "minion">>
<<run _campEnemies.push(clone(_returnEnemy))>>
<<startCombat _campEnemies `setup.roadCombatCompanion()` true>>
<<set $combat.returnPassage to "RaiderCamp_Aftermath">>
<<set $combat.victoryPassage to "RaiderCamp_Victory">>
<<goto "Combat_Start">><<set _travelMinutes to random(30, 45)>>
<<advanceTime 0 _travelMinutes>>
<<set _sneakRoll to random(1, 100) + $player.agility>>
<<if _sneakRoll >= 70>>
<h2>Success</h2>
You move quietly through the shadows, avoiding patrols and slipping past the sentries.
<<if setup.kiraWithYou()>>
Kira moves like a ghost beside you, perfectly silent.
<</if>>
You find a supply tent and quickly loot it before slipping away undetected.
<<set _scrap to {id: "scrap metal", name: "Scrap Metal", type: "resource", description: "Useful metal scraps."}>>
<<addItem _scrap 5>>
<<run setup.fightLootStart()>>
<div class="loot-display">
<h4>Stolen:</h4>
<ul>
<li>Scrap Metal x5</li>
<li><<print setup.postBattleTakeLoot("ammo", "Ammunition", 3, "", "fightLoot")>></li>
<li><<print setup.postBattleTakeLoot("canned food", "Canned Food", 2, "", "fightLoot")>></li>
</ul>
</div>
<<lootLeftList "fightLoot">>
<<if setup.kiraWithYou()>>
<<say "Kira" "Clean getaway. Nice work.">>
<<relationChange "kira" "trust" 1>>
<</if>>
<div class="choice-container">
<<vchoice "Leave before they notice" "WorldMap_View" "move" "run">>
</div>
<<else>>
<h2>Spotted!</h2>
A raider spots you halfway to the supply tent!
<<say "Raider" "Intruders! Get them!">>
<<if setup.kiraWithYou()>>
<<say "Kira" "Shit! So much for stealth!">>
<</if>>
<div class="choice-container">
<<vchoice "Fight!" "RaiderCamp_Attack_Start" "action" "attack">>
<<vchoice "Run away!" "WorldMap_View" "action" "run">>
</div>
<</if>><<include "RaiderCamp_Aftermath">><<run VaultUI.setBackground("reclaimed-day")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<<if $combat.result === "defeat">>
<h2>Driven Off</h2>
<<if setup.kiraWithYou()>>Kira half-carries you out past the scrap walls and doesn't stop until the smoke of the fire pit is a smudge behind you.<<else>>You drag yourself out past the scrap walls and don't stop until the smoke of the fire pit is a smudge behind you.<</if>> Back at the camp the raiders are laughing, already dragging their wrecks back across the gap you broke. The camp is still theirs.
<<if setup.kiraWithYou()>>
<<run VaultUI.showCharacter("kira", "center", "worried")>>
<<say "Kira" "We're not done with them. Just not today. Not like this.">>
<</if>>
<div class="choice-container">
<<vchoice "Continue exploring" "WorldMap_View" "move" "map">>
<<vchoice "Return to vault" "Journey_ReturnToVault" "move" "house">>
</div>
<<elseif $combat.result === "fled" || $combat.result === "fled_with_kira">>
<h2>Escaped</h2>
You managed to escape the raider camp, but the raiders still hold their territory.
<<if setup.kiraWithYou()>>
<<run VaultUI.showCharacter("kira", "center", "neutral")>>
<<say "Kira" "We'll have to try again when we're better prepared.">>
<</if>>
<div class="choice-container">
<<vchoice "Continue exploring" "WorldMap_View" "move" "map">>
<<vchoice "Return to vault" "Journey_ReturnToVault" "move" "house">>
</div>
<<elseif ($combat.result === "victory" && !$combat.seductionWin) || $locations.raider_camp.cleared>>
<<set _rcNew to setup.raiderCampClear()>>
<h2>Victory</h2>
The last raider falls. The camp is yours.
<<if setup.kiraWithYou()>>
<<run VaultUI.showCharacter("kira", "center", "amused")>>
<<say "Kira" "Good fight. Let's see what they were hoarding.">>
<</if>>
You search the camp thoroughly, finding significant supplies.
<<set _campStored to []>>
<<if _rcNew>>
<<set _scrap to {id: "scrap metal", name: "Scrap Metal", type: "resource", description: "Useful metal scraps."}>>
<<addItem _scrap 8>>
<<set _got to setup.giveItem("ammo", 5)>><<if _got.stored > 0>><<run _campStored.push("Ammunition x" + _got.stored)>><</if>>
<<set _got to setup.giveItem("canned food", 4)>><<if _got.stored > 0>><<run _campStored.push("Canned Food x" + _got.stored)>><</if>>
<<set _got to setup.giveItem("water", 3)>><<if _got.stored > 0>><<run _campStored.push("Clean Water x" + _got.stored)>><</if>>
<<set _got to setup.giveItem("stimpack", 2)>><<if _got.stored > 0>><<run _campStored.push("Stimpack x" + _got.stored)>><</if>>
<<set $flags.raiderCampStimsInBag to true>>
<<set $vault.scrap += 3>>
<</if>>
<div class="loot-display">
<h4>Found:</h4>
<ul>
<li>Scrap Metal x8</li>
<li>Ammunition x5</li>
<li>Canned Food x4</li>
<li>Clean Water x3</li>
<li>Stimpack x2</li>
</ul>
<<if _campStored.length > 0>><p class="loot-stored">Your backpack is full. Sent to the vault storage: <<print _campStored.join(", ")>>.</p><</if>>
</div>
<div class="choice-container">
<<vchoice "Continue exploring" "WorldMap_View" "move" "map">>
<<vchoice "Return to vault" "Journey_ReturnToVault" "move" "house">>
</div>
<<elseif $combat.result === "seduced" || $combat.seductionWin>>
<<set _rcStanding to ($combat.seducedOthers !== 0)>>
<<set _rcHer to ($combat.seducedGender === "female")>>
<h2>Slipped Out</h2>
You walk out the way you came in.
<<if _rcHer>>The raider you seduced is in no state to stop you.<<else>>The raider you faced has dropped his weapon and wants no more of this.<</if>>
<<if _rcStanding>><<if _rcHer>>The other one still has a weapon up, but after what they just watched you do to their friend they back off a step, then another, and let you go.<<else>>The other one still has a weapon up, but with their friend out of it they back off a step, then another, and let you go.<</if>><<else>>The other one is down in the dirt where you left them.<</if>>
Nobody follows you past the gate. The camp, the fire and everything stacked behind the wrecks are still theirs.
<<if setup.kiraWithYou()>>
<<if _rcHer>>
<<run VaultUI.showCharacter("kira", "center", "amused")>>
<<say "Kira" "One of them's still drooling. Cute. Next time we take the whole damn camp.">>
<<else>>
<<run VaultUI.showCharacter("kira", "center", "neutral")>>
<<say "Kira" "We walk out with nothing. Next time we take the whole damn camp.">>
<</if>>
<</if>>
<div class="choice-container">
<<vchoice "Continue exploring" "WorldMap_View" "move" "map">>
<<vchoice "Return to vault" "Journey_ReturnToVault" "move" "house">>
</div>
<<else>>
<h2>Terms</h2>
You back out through the gate with every raider in the camp watching you go. Nobody follows. They let you walk, and that is all they let you take: the camp, the fire and everything stacked behind the wrecks are still theirs.
<<if setup.kiraWithYou()>>
<<run VaultUI.showCharacter("kira", "center", "neutral")>>
<<say "Kira" "We walked out alive. Don't get used to it.">>
<</if>>
<div class="choice-container">
<<vchoice "Continue exploring" "WorldMap_View" "move" "map">>
<<vchoice "Return to vault" "Journey_ReturnToVault" "move" "house">>
</div>
<</if>><<set _travelMinutes to random(30, 45)>>
<<advanceTime 0 _travelMinutes>>
You search through the abandoned camp one more time.
<<set _lootRoll to random(1, 100)>>
<<if _lootRoll >= 50>>
You find a few overlooked items in the debris.
<<set _scrap to {id: "scrap metal", name: "Scrap Metal", type: "resource", description: "Useful metal scraps."}>>
<<addItem _scrap 2>>
<div class="loot-display">
<h4>Found:</h4>
<ul>
<li>Scrap Metal x2</li>
</ul>
</div>
<<else>>
Nothing left. The place is picked clean.
<</if>>
<div class="choice-container">
<<vchoice "Return to map" "WorldMap_View" "move" "map">>
</div><<set $currentLocation to "the_crossway">>
<<run VaultUI.setBackgroundDirect("media/backgrounds/vault/exterior/the_crossway.webp")>>
<<setTimeOfDay $time.phase>>
<h2>The Crossway</h2>
<<storyVideo "story/mv_locations/crossway">>
Four roads converge at this ancient junction. Weathered signposts point in directions that no longer matter — the places they named are ruins now, or worse. A crumbling stone marker stands at the center, its inscription worn illegible by time and acid rain.
<<if setup.kiraWithYou()>>
<p>Kira scans the treeline, hand resting on her weapon. "Lot of sight lines here. Good and bad."</p>
<</if>>
<<if setup.caravanCrosswayWagons(previous())>>
<<if !setup.caravanState().met>>
<p>Three wagons stand nose to tail on the verge where the roads meet, shafts down, mules still in the traces. One canvas top is slashed open along its length, and an arrow sticks out of the lead wagon's tailboard. Somebody under the middle wagon is swearing at an axle loud enough to carry across the whole junction.</p>
<<else>>
<p>The caravan master's wagons are still on the verge where the roads meet, and so is she, shouting at a mule.</p>
<</if>>
<div class="choice-container">
<<vchoice "Go over to the wagons" "Caravan_Crossway" "action" "forward">>
</div>
<<else>>
<<set _eventRoll to previous() === "Crossway_Trader_Leave" ? 100 : random(1, 100)>>
<<if previous() === "Caravan_Crossway">><<set _eventRoll to 100>><</if>>
<<if _eventRoll <= 20 && $locations.the_crossway.traderDay === $time.day>><<set _eventRoll to 100>><</if>>
<<if _eventRoll <= 20>>
<div class="choice-container">
<<vchoice "Continue" "Crossway_Trader" "action" "forward">>
</div>
<<elseif _eventRoll <= 35 && !$locations.the_crossway.foughtToday>>
<div class="choice-container">
<<vchoice "Continue" "Crossway_Ambush" "action" "forward">>
</div>
<<else>>
<p class="narrator">The junction is quiet. For now.</p>
<<if setup.caravanFirstRunDue()>>
<p>The caravan master's wagons stand on the verge, waiting for somebody to walk them to Old Town.</p>
<</if>>
<div class="location-options">
<h3>What do you want to do?</h3>
<div class="choice-container">
<<if setup.caravanFirstRunDue()>>
<<vchoice "Talk to the caravan master" "Caravan_Crossway" "action" "forward">>
<</if>>
<<if !$locations.the_crossway.searchedToday>>
<<vchoice "Search the area" "Crossway_Search" "action" "search">>
<</if>>
<<vchoice "Rest briefly" "Crossway_Rest" "action" "fire">>
<<vchoice "Continue on" "WorldMap_View" "move" "map">>
</div>
</div>
<hr>
<div class="choice-container">
<<vchoice "Return to vault" "Journey_ReturnToVault" "action" "house">>
</div>
<</if>>
<</if>><<set $locations.the_crossway.traderDay to $time.day>>
<<setBackground "reclaimed-travel">>
<h2>The Crossway - Trader</h2>
<<if $flags.marloMet>>
Marlo steps out from behind the stone marker, the same heavy pack at their feet, bulging with goods.
<<say "Trader" "Back again? Marlo's open for business.">>
<<else>>
A weathered figure emerges from behind the stone marker, hands raised in the universal "I'm not a threat" gesture. A heavy pack sits at their feet, bulging with goods.
<<say "Trader" "Easy now. Just passing through, same as you. Name's Marlo. Got supplies if you're buying.">>
<<if setup.kiraWithYou()>>
<<say "Kira" "What's your angle?">>
<<else>>
You keep your hand near your weapon. "What's your angle?"
<</if>>
<<say "Trader" "Angle? I trade. You need something, I probably have it. Clean water, food, medical supplies. Even got some... recreational items, if that's your thing.">>
<<set $flags.marloMet to true>>
<</if>>
<div class="choice-container">
<<vchoice "See what they have" "Crossway_Trader_Shop" "action" "backpack">>
<<vchoice "Not interested" "Crossway_Trader_Leave" "move" "back">>
</div><<setBackground "reclaimed-travel">>
<h2>Trading with Marlo</h2>
Marlo spreads out their wares on a tattered blanket.
<<scrapBalance>>
<<if setup.bagFree("player") < 1>><p class="narrator crossway-bag-full">Your backpack is full. The trader won't take your scrap for something you can't carry: make room first, or buy more of what you already carry.</p><</if>>
<<set _ctGoods to [
{ id: "water", name: "Clean Water", price: 5, to: "Crossway_Buy_Water" },
{ id: "ration", name: "Ration", price: 8, to: "Crossway_Buy_Ration" },
{ id: "bandage", name: "Bandage", price: 10, to: "Crossway_Buy_Bandage" },
{ id: "energy_drink", name: "Energy Drink", price: 12, to: "Crossway_Buy_Energy" },
{ id: "coffee", name: "Coffee", price: 3, to: "Crossway_Buy_Coffee" }
]>>
<div class="choice-container">
<<for _ctG range _ctGoods>>
<<set _ctPic to '<img class="shop-item-thumb" src="' + setup.itemImage(_ctG.id) + '" alt="" onerror="this.style.display=\'none\'">'>>
<<set _ctLabel to "Buy " + _ctG.name + " (" + _ctG.price + " scrap)">>
<<if $vault.scrap >= _ctG.price>>
<<link `'<span class="choice-button action">' + _ctPic + '<span class="label">' + _ctLabel + '</span></span>'` _ctG.to>><</link>>
<<else>>
<<print '<span class="choice-button disabled action">' + _ctPic + '<span class="label">' + _ctLabel + ' (you have too little)</span></span>'>>
<</if>>
<</for>>
<<vchoice "Done trading" "Crossway_Trader_Leave" "move" "back">>
</div><<if setup.bagFits("player", "water", 1) < 1>>
<<toast "Your backpack is full. Make room before you buy anything." "warning">>
<<else>>
<<set $vault.scrap -= 5>>
<<set _addItemNotice to null>>
<<addItem "water" 1>>
<<toastItemNotice>>
<<toast "Bought Clean Water. Scrap -5" "success">>
<</if>>
<<goto "Crossway_Trader_Shop">><<if setup.bagFits("player", "ration", 1) < 1>>
<<toast "Your backpack is full. Make room before you buy anything." "warning">>
<<else>>
<<set $vault.scrap -= 8>>
<<set _addItemNotice to null>>
<<addItem "ration" 1>>
<<toastItemNotice>>
<<toast "Bought Ration. Scrap -8" "success">>
<</if>>
<<goto "Crossway_Trader_Shop">><<if setup.bagFits("player", "bandage", 1) < 1>>
<<toast "Your backpack is full. Make room before you buy anything." "warning">>
<<else>>
<<set $vault.scrap -= 10>>
<<set _addItemNotice to null>>
<<addItem "bandage" 1>>
<<toastItemNotice>>
<<toast "Bought Bandage. Scrap -10" "success">>
<</if>>
<<goto "Crossway_Trader_Shop">><<if setup.bagFits("player", "energy_drink", 1) < 1>>
<<toast "Your backpack is full. Make room before you buy anything." "warning">>
<<else>>
<<set $vault.scrap -= 12>>
<<set _addItemNotice to null>>
<<addItem "energy_drink" 1>>
<<toastItemNotice>>
<<toast "Bought Energy Drink. Scrap -12" "success">>
<</if>>
<<goto "Crossway_Trader_Shop">><<if setup.bagFits("player", "coffee", 1) < 1>>
<<toast "Your backpack is full. Make room before you buy anything." "warning">>
<<else>>
<<set $vault.scrap -= 3>>
<<set _addItemNotice to null>>
<<addItem "coffee" 1>>
<<toastItemNotice>>
<<toast "Bought Coffee. Scrap -3" "success">>
<</if>>
<<goto "Crossway_Trader_Shop">><<setBackground "reclaimed-travel">>
<<say "Trader" "Safe travels. I'll be around.">>
The trader gathers their goods and disappears down one of the roads, vanishing into the wasteland as quickly as they appeared.
<div class="choice-container">
<<vchoice "Continue" "Location_Crossway" "move" "forward">>
</div><<set $locations.the_crossway.foughtToday to true>>
<<setBackground "reclaimed-travel">>
<h2>The Crossway - Ambush!</h2>
Movement in the treeline. Too late — they've seen you.
<<set _enemyCount to random(1, 2)>>
<<set $crosswayAmbush to { count: _enemyCount, type: (_enemyCount === 1 ? "scavenger" : "raider") }>>
<<if _enemyCount === 1>>
A lone scavenger emerges, crude weapon raised. Desperate eyes. This one's hungry.
<<say "Scavenger" "Drop your pack. Walk away. Nobody has to die.">>
<<else>>
Two figures step onto the road, blocking your path. Raiders. They're grinning.
<<storyVideo "story/mv_locations/crossway_ambush">>
<<say "Raider" "Well, well. Fresh meat.">>
<</if>>
<<if setup.kiraWithYou()>>
<<say "Kira" "Shit. Here we go.">>
<</if>>
<div class="choice-container">
<<vchoice "Fight" "Crossway_Fight" "action" "attack">>
<<if $player.charm >= 5>>
<<vchoice "Try to talk them down" "Crossway_Negotiate" "action" "talk">>
<</if>>
<<vchoice "Run" "Crossway_Flee" "action" "run">>
</div><<setBackground "reclaimed-travel">>
<<set _enemies to []>>
<<if $crosswayAmbush && $crosswayAmbush.type === "scavenger">>
<<createEnemy "scout">>
<<run _enemies.push(clone(_returnEnemy))>>
<<else>>
<<createEnemy "grunt">>
<<run _enemies.push(clone(_returnEnemy))>>
<<createEnemy "scout">>
<<run _enemies.push(clone(_returnEnemy))>>
<</if>>
<<unset $crosswayAmbush>>
<<startCombat _enemies `setup.roadCombatCompanion()` true>>
<<goto "Combat_Start">><<setBackground "reclaimed-travel">>
<<set _persuadeRoll to random(1, 100) + $player.charm * 5>>
<<set _cwRaiders to !!($crosswayAmbush && $crosswayAmbush.type === "raider")>>
<<set _cwSpeaker to _cwRaiders ? "Raider" : "Scavenger">>
<<if _persuadeRoll >= 60>>
You raise your hands slowly. "Nobody needs to bleed today. <<if setup.kiraWithYou()>>We're<<else>>I'm<</if>> just passing through."
<<if _cwRaiders>>The raiders hesitate.<<else>>The attacker hesitates.<</if>> Something in your voice, your posture — it makes them reconsider.
<<say _cwSpeaker "...Fine. Get out of here. Don't come back this way.">>
They melt back into the treeline. You breathe.
<<if setup.kiraWithYou()>>
<<say "Kira" "Smooth. I thought we were fighting for sure.">>
<<relationChange "kira" "trust" 1>>
<</if>>
<div class="choice-container">
<<vchoice "Continue" "Location_Crossway" "move" "forward">>
</div>
<<else>>
You try to reason with them, but they're not listening. Their eyes are wild. Desperate.
<<say _cwSpeaker "Talking's done.">>
<div class="choice-container">
<<vchoice "Continue" "Crossway_Fight" "action" "forward">>
</div>
<</if>><<setBackground "reclaimed-travel">>
You bolt. Behind you, shouts and the sound of pursuit — but you know this terrain better. Or maybe you're just faster.
<<set _escapeRoll to random(1, 100) + $player.agility * 5>>
<<if _escapeRoll >= 50>>
You lose them in the overgrowth, circling back to familiar ground. Heart pounding. Safe.
<<if setup.kiraWithYou()>>
<<say "Kira" "That was close. Smart call though — no point fighting if you don't have to.">>
<</if>>
<div class="choice-container">
<<vchoice "Continue" "WorldMap_View" "move" "map">>
</div>
<<else>>
They catch up. No choice now.
<div class="choice-container">
<<vchoice "Continue" "Crossway_Fight" "action" "forward">>
</div>
<</if>><<set $locations.the_crossway.searchedToday to true>>
<<set _travelMinutes to random(15, 30)>>
<<advanceTime 0 _travelMinutes>>
<<setBackground "reclaimed-travel">>
<h2>Searching The Crossway</h2>
You poke through the debris around the junction — old vehicles, collapsed structures, the stone marker itself.
<<set _lootRoll to random(1, 100)>>
<<if _lootRoll >= 70>>
In a rusted mailbox, you find a small stash someone left behind. Lucky.
<<addItem "scrap metal" 2>>
<<run setup.fightLootStart()>>
<div class="loot-display">
<h4>Found:</h4>
<ul>
<li>Scrap Metal x2</li>
<li><<print setup.postBattleTakeLoot("dirty water", "Dirty Water", 1, "", "fightLoot")>></li>
</ul>
</div>
<<lootLeftList "fightLoot">>
<<elseif _lootRoll >= 40>>
Slim pickings, but you find something useful.
<<addItem "scrap metal" 1>>
<div class="loot-display">
<h4>Found:</h4>
<ul>
<li>Scrap Metal x1</li>
</ul>
</div>
<<else>>
Nothing. The place has been picked clean by previous travelers.
<p class="narrator">Sometimes you find nothing. That's the wasteland.</p>
<</if>>
<<if setup.kiraWithYou()>>
<<if _lootRoll >= 70>>
<<say "Kira" "Nice. Every bit helps.">>
<<else>>
<<say "Kira" "Worth a shot.">>
<</if>>
<</if>>
<div class="choice-container">
<<vchoice "Continue" "Location_Crossway" "move" "back">>
</div><<setBackground "reclaimed-travel">>
<<advanceTime 0 30>>
<h2>Resting at The Crossway</h2>
You find a sheltered spot behind the stone marker and take a breather. Not safe enough for real sleep, but enough to catch your breath.
<<set $player.energy to Math.min($player.maxEnergy, $player.energy + 15)>>
<<set $player.health to Math.min($player.maxHealth, $player.health + 5)>>
<<if setup.kiraWithYou()>><<set $companions[0].health to Math.min($companions[0].maxHealth, $companions[0].health + 5)>><</if>>
<p class="narrator">Health +5, Energy +15</p>
<<if setup.kiraWithYou()>>
<<if $flags.sleptWithKira>><<storyVideo "story/mv_locations/crossway_rest">><</if>>
<<if _storyClip is "c83f8bdf77bf">>
Kira doesn't sit for long. She strips, pushes you down onto your back against the rocks behind the marker and sinks onto your cock facing you, riding you hard and fast, glancing past your shoulder at the road. Neither of you fully relaxes.
<<elseif _storyClip is "bbf877c89fd1">>
Kira doesn't sit for long. She braces both hands against the nearest tree, tugs her bottoms aside and looks back at you over her shoulder. You take her standing, fast and rough, both of you glancing at the road between thrusts. Neither of you fully relaxes.
<<else>>
Kira sits nearby, keeping watch. Neither of you fully relaxes.
<</if>>
<<say "Kira" "Quick rest, then we move. Don't like being exposed like this.">>
<</if>>
<div class="choice-container">
<<vchoice "Continue" "Location_Crossway" "move" "forward">>
</div><<set $currentLocation to "vault">>
<<run VaultUI.setBackgroundDirect("media/backgrounds/vault/exterior/combat_ruins_overgrown.webp")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<<run VaultUI.hideAllCharacters()>>
<h2>The Training Yard</h2>
<<storyVideo "story/yard_door/mess">>
<<if !$flags.yardDoorSeen>>
<p>The door is a slab of rusted plate on a rail that hasn't moved in years. You put your shoulder to it. It gives a hand's width, shrieks, and then gives the rest all at once.</p>
<p>So this is the yard.</p>
<p>Poured concrete pillars under a roof that has half come down, open to the sky where it fell, and everything the vault ever threw out. Rubble where a stretch of wall came down. Weeds up to your hip, growing straight through a heap of rusted junk: bed frames, pipe, a generator housing with a young tree coming out of it. Somewhere under all of that there is supposed to be a floor.</p>
<p>You stand in the doorway and try to see it cleared. A ring marked out. A post to hit. Room to throw someone, and to be thrown.</p>
<p>It's weeks of work. Months, more likely. You look for the place to begin and your eyes go from the rubble to the weeds to the rust and back again. You don't know where to start.</p>
<p>"Not until you're stronger." Fine. It starts here. Just not today.</p>
<p class="note"><em>Work in progress. Stay tuned.</em></p>
<<else>>
<p>The yard is as you left it: rubble, weeds, rust. It isn't going to clear itself, and you still don't know where to start.</p>
<p class="note"><em>Work in progress. Stay tuned.</em></p>
<</if>>
<div class="choice-container">
<<link `'<span class="choice-button move"><span class="gi gi-door-handle gi-large"></span><span class="label">Back inside</span></span>'` "Vault_Hub">><<set $flags.yardDoorSeen to true>><</link>>
</div><<run VaultUI.setBackground("archives")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<<run setup.compat.apply("archives-temp-object")>>
<h2>The Archives</h2>
<<if setup.lysaraArcDone() || $flags.lysaraVisitReset>>
The Archives stretch before you—endless rows of bookshelves reaching into darkness. Familiar now.
You know the way. The lever-book waits in its alcove, the hidden passage beyond already revealed.
<div class="choice-container">
<<vchoice "Descend to Lysara's Laboratory" "Alchemy_Lab_Entrance" "action" "door-handle">>
<<vchoice "Browse the shelves" "Archives_Browse" "action" "book">>
<<vchoice "Return to Commons" "Vault_Hub" "move" "back">>
</div>
<<else>>
The Archives stretch before you—endless rows of bookshelves reaching into darkness. Dust motes drift in the dim light.
Somewhere in here is a hidden passage to an alchemy laboratory. According to your dream, you need to "look for what doesn't belong."
<<set $temp.archivesSearchCount to $temp.archivesSearchCount || 0>>
<<set $temp.archivesCluesFound to $temp.archivesCluesFound || 0>>
<<set $temp.foundPornStash to $temp.foundPornStash || false>>
<<set $temp.foundOldDiary to $temp.foundOldDiary || false>>
<<set $temp.foundAlchemyNotes to $temp.foundAlchemyNotes || false>>
<<set $temp.foundWeirdBook to $temp.foundWeirdBook || false>>
<<set $temp.foundLever to $temp.foundLever || false>>
<div class="archive-status">
Searches conducted: <<print $temp.archivesSearchCount>><br>
Clues found: <<print $temp.archivesCluesFound>> / 4
</div>
<<if $temp.archivesCluesFound gte 4 && !$temp.foundLever>>
<p class="hint">You've found enough clues. There must be something you're missing. Look more carefully at what you've discovered...</p>
<</if>>
<div class="choice-container">
<<vchoice "Search the shelves" "Archives_Search_Random" "action" "search">>
<<if $temp.archivesCluesFound gte 4>>
<<vchoice "Examine the strange book more closely" "Archives_Find_Lever" "action" "book">>
<</if>>
<<vchoice "Return to Commons" "Vault_Hub" "move" "door-handle">>
</div>
<</if>><<run VaultUI.setBackground("archives")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<<advanceTime 0 15>>
<<run setup.compat.apply("archives-temp-object")>>
<<set $temp.archivesSearchCount to ($temp.archivesSearchCount || 0) + 1>>
<<set _roll to random(1, 100)>>
<<set _foundSomething to false>>
<<if $temp.archivesSearchCount is 1 && !$temp.foundPornStash>>
<<set _roll to 15>>
<<elseif $temp.archivesSearchCount is 2 && !$temp.foundOldDiary>>
<<set _roll to 35>>
<<elseif $temp.archivesSearchCount is 3 && !$temp.foundAlchemyNotes>>
<<set _roll to 55>>
<<elseif $temp.archivesSearchCount is 4 && !$temp.foundWeirdBook>>
<<set _roll to 75>>
<</if>>
<<if _roll lte 20 && !$temp.foundPornStash>>
<<set $temp.foundPornStash to true>>
<<set $temp.archivesCluesFound += 1>>
<<set _foundSomething to true>>
<h3>Discovery: Hidden Stash</h3>
Behind a row of dusty technical manuals, you find a hidden compartment.
Inside: a collection of pre-war pornographic magazines. Incredibly well-preserved.
<<say $player.name "Well. Someone had priorities.">>
You flip through them. The women are beautiful in that old-world way. Posed. Airbrushed. Nothing like the raw, desperate sexuality of the Reclaimed.
<<set $player.lust to Math.min(100, $player.lust + 15)>>
One magazine catches your eye—"ALCHEMY OF DESIRE: The Science of Aphrodisiacs."
Wait. That's not just porn. You flip to an article. It's a surprisingly detailed piece about historical aphrodisiacs and their chemical compositions.
<p class="discovery">The article mentions a "laboratory of pleasures" hidden beneath a vault. Could be coincidence. Could be a clue.</p>
<<set $flags.foundPornMagazines to true>>
<<elseif _roll lte 40 && !$temp.foundOldDiary>>
<<set $temp.foundOldDiary to true>>
<<set $temp.archivesCluesFound += 1>>
<<set _foundSomething to true>>
<h3>Discovery: Personal Diary</h3>
A leather-bound journal tucked between encyclopedias. The handwriting is elegant but faded.
You read:
<div class="journal-entry">
"Day 47 in the vault. The others don't know about her. The woman in the lower levels. She's been here since before the war. Maybe since before the vault itself."
"She trades potions for... favors. I shouldn't have agreed. But the things she can make you feel..."
"The entrance is through the Archives. Look for the book that doesn't open. Pull, don't push."
</div>
<p class="discovery">A woman in the lower levels. Potions. The Archives. This is definitely a clue.</p>
<<set $flags.foundAlchemistDiary to true>>
<<elseif _roll lte 60 && !$temp.foundAlchemyNotes>>
<<set $temp.foundAlchemyNotes to true>>
<<set $temp.archivesCluesFound += 1>>
<<set _foundSomething to true>>
<h3>Discovery: Alchemy Research Notes</h3>
Scattered papers that look like they were hidden in a hurry. Scientific notes mixed with something more... esoteric.
<div class="research-notes">
"The Resurgence Elixir successfully tested. Subject awakened from death-like sleep within hours."
"Ingredient list: Moonpetal extract, distilled vault-water, essence of arousal (see notes on extraction), crystallized dream-matter."
"WARNING: The extraction process for essence of arousal requires intimate contact with a willing—or unwilling—subject. The purer the arousal, the more potent the elixir."
</div>
<p class="discovery">A potion that can wake someone from a death-like sleep. This is what you need for Kira!</p>
<<set $flags.foundResurgenceNotes to true>>
<<elseif _roll lte 80 && !$temp.foundWeirdBook>>
<<set $temp.foundWeirdBook to true>>
<<set $temp.archivesCluesFound += 1>>
<<set _foundSomething to true>>
<h3>Discovery: A Book That Doesn't Belong</h3>
You notice it immediately. Among rows of faded, dusty spines, one book stands out.
It's too clean. Too new-looking. And when you try to pull it from the shelf—
It doesn't move.
You pull harder. Still nothing. The book is firmly attached to something.
<<say $player.name "Wait... 'the book that doesn't open. Pull, don't push.'">>
This must be it. But pulling doesn't seem to work. Maybe you need to examine it more closely?
<p class="discovery">This has to be the hidden entrance! But something's not quite right. You need to figure out how to activate it.</p>
<<set $flags.foundStrangeBook to true>>
<<elseif _roll lte 85>>
<h3>Found: Erotic Novel</h3>
You pull out a book titled "The Vault Dweller's Wife."
Curious, you flip it open. It's... graphic. Very graphic.
<div class="book-excerpt">
"She pressed her heaving bosom against the cold metal of the vault door, her fingers finding the warm, pulsing flesh of—"
</div>
You close the book. Then open it again. Read a few more pages.
<<set $player.lust to Math.min(100, $player.lust + 10)>>
<p class="internal-thought">This is surprisingly well-written...</p>
<<elseif _roll lte 92>>
<h3>Found: Faded Photograph</h3>
Between the pages of a medical textbook, you find a photograph.
A woman. Nude. The image is faded but you can make out curves, a coy smile, writing on the back:
"For my darling, from L. Come find me in the depths. -xoxo"
The woman is stunning. Impossibly so. And there's something about her eyes...
<<set $player.lust to Math.min(100, $player.lust + 8)>>
<p class="internal-thought">"L"... Could this be the woman from the diary?</p>
<<else>>
<h3>Empty Handed</h3>
You search through shelf after shelf of mundane books. Technical manuals. Pre-war fiction. Nothing useful.
The dust makes you sneeze.
<<say $player.name "There has to be something here...">>
<</if>>
<div class="choice-container">
<<vchoice "Keep searching" "Archives_Search_Random" "action" "search">>
<<if $temp.archivesCluesFound gte 4>>
<<vchoice "Examine the strange book more closely" "Archives_Find_Lever" "action" "book">>
<</if>>
<<vchoice "Return to search hub" "Archives_Search_Start" "move" "book">>
</div><<run VaultUI.setBackground("archives")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<<run setup.compat.apply("archives-temp-object")>>
<h3>The Strange Book</h3>
You return to the book that wouldn't move.
It's bound in dark leather, with no title on the spine. When you look closely, you can see it's not actually resting on the shelf—it's built INTO the shelf.
<<say $player.name "Pull, don't push...">>
You've been pulling straight out. But what if...
<<storyVideo "story/mv_archives/find_lever">>
You grip the top of the book and pull it TOWARD you, tilting it like a lever.
<p class="sound-effect">//CLICK//</p>
The book tilts forward about 45 degrees and stops. You hear machinery groaning behind the walls.
Then—
<p class="sound-effect">//RUMBLE//</p>
The entire bookshelf slides sideways, revealing a dark passage behind it.
Cold air wafts from the opening. And something else. A faint... chemical smell?
<<set $temp.foundLever to true>>
<<set $flags.secretPassageOpened to true>>
<div class="choice-container">
<<vchoice "Enter the passage" "Alchemy_Lab_Entrance" "action" "door-handle">>
<<vchoice "Wait—prepare first" "Archives_Search_Start" "action" "alert">>
</div><<run VaultUI.setBackground("archives")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<<advanceTime 0 15>>
<h2>Browsing the Archives</h2>
You wander the endless stacks, running your fingers along dusty spines.
<<set _roll to random(1, 100)>>
<<if _roll <= 30>>
<p>You find an old pre-war romance novel. The cover shows a muscular man embracing a woman in a torn dress.</p>
<p class="internal-thought">Some things never change.</p>
<<set $player.lust to Math.min(100, $player.lust + 5)>>
<<elseif _roll <= 50>>
<p>A technical manual on vault maintenance. Dry, but potentially useful.</p>
<p>You skim a few pages about water filtration before your eyes glaze over.</p>
<<elseif _roll <= 70>>
<p>More of those pre-war magazines. Someone in this vault had quite the collection.</p>
<<set $player.lust to Math.min(100, $player.lust + 8)>>
<<elseif _roll <= 85>>
<p>A journal from a vault dweller. Mundane entries about ration schedules and arguments over shower time.</p>
<p>The last entry is incomplete. You try not to think about why.</p>
<<else>>
<p>Nothing catches your eye this time. Just dust and forgotten knowledge.</p>
<</if>>
<p>The lever-book catches your eye as you pass. The hidden passage beyond waits patiently.</p>
<div class="choice-container">
<<vchoice "Keep browsing" "Archives_Browse" "action" "book">>
<<vchoice "Return to the main area" "Archives_Search_Start" "move" "back">>
</div><<run VaultUI.setBackground("cell")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<<set $player.will += 5>>
<<say $player.name "No. I'll endure it.">>
Lysara's eyebrows rise.
<<say "Lysara" "Interesting. Very few choose that path.">>
She tucks the antidote back into her cleavage.
<<say "Lysara" "Five days then. Try not to go insane.">>
She turns to leave.
<<say $player.name "Wait— can you at least... give me something for the pain?">>
<<say "Lysara" "Pain is the point. The gas transforms more than your body. The agony will burn away... impurities.">>
She pauses at the edge of the shadows.
<<say "Lysara" "Or drive you mad. Either way, interesting.">>
She's gone.
<<storyVideo "characters/lysara/amb_cell_alone">>
<<set $temp.cellDays to 0>>
<<set $temp.cellStayDays to setup.cellStayDays>>
<<set $temp.cellPath to "agony">>
<<set $temp.lysaraInterest to 0>>
<<set $temp.lysaraEncounters to 0>>
<<set $temp.meditationSuccesses to 0>>
<div class="choice-container">
<<vchoice "Begin your ordeal" "Cell_Agony_Day1" "action" "night">>
</div><<run VaultUI.setBackground("cell")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<<set $temp.cellDays to 1>>
<<set $flags.feralLevel to 0>>
<<set $temp.cageOrgasmToday to false>>
<<advanceToHour 8>>
<h2>Day 1 of Agony</h2>
The first day is hell.
Your cock strains against the cage constantly. Every heartbeat sends a pulse of need through your body. Thinking is almost impossible—every thought curves back toward sex, release, RELIEF.
<<storyVideo "characters/lysara/cell_caged_agony_day1">>
<<clampStat "player.health" -5 0 100>>
<<set $player.lust to 100>>
<<if _storyClip is "dca0d7210f01">>A string of precum leaks out through the cage and stretches all the way to the stone. The cell has a thin mattress. A bucket. Nothing else.<<else>>The cell has a thin mattress. A bucket. Nothing else.<</if>>
You try to sleep. Can't. Every position puts pressure on the cage.
You try to meditate. Your mind fills with images of Lysara's tits, her hips, her lips—
The cage BITES.
<<say $player.name "FUCK!">>
<<set $temp.dayActions to 0>>
<div class="choice-container">
<<vchoice "Try to meditate" "Cell_Meditate" "action" "meditation">>
<<vchoice "Try to escape" "Cell_Escape_Attempt" "action" "strength">>
<<vchoice "Spy on Lysara through the bars" "Cell_Spy_Lysara" "action" "search">>
<<vchoice "Just suffer" "Cell_Suffer" "action" "health">>
</div><<run VaultUI.setBackground("cell")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<<set $temp.dayActions += 1>>
<<set $temp.meditationAttempts to ($temp.meditationAttempts || 0) + 1>>
<<advanceTime 2 0>>
<<set _roll to random(1, 100)>>
<<set _dc to 50 + ($temp.alchemyGasLevel / 2)>>
<<set _variation to random(1, 5)>>
<<if _roll gte _dc>>
<<set $temp.meditationSuccesses to ($temp.meditationSuccesses || 0) + 1>>
<<set $flags.lysaraCellMeditated to true>>
<<if $temp.meditationSuccesses lte 5>><<set _variation to $temp.meditationSuccesses>><</if>>
<<if $temp.meditationSuccesses is 1>>
<<journalAdd "Found a way to breathe through it. Sat on that mattress and counted until the need was just a throb. Doesn't fix anything. But for a few minutes the cage wasn't the whole world." "reflection">>
<<elseif $temp.meditationSuccesses is 5>>
<<journalAdd "Got there today. The middle of it, where it's quiet. The gas is still screaming all around me, but I can stand in the middle and listen to it. Never thought I'd find calm in a cage." "reflection">>
<</if>>
<<if _variation is 1>>
<<storyVideo "story/lysara_cell_events/meditate_ok_1_stillness" "" "characters/lysara/amb_meditate">>
<h3>Finding Stillness</h3>
<<if _storyClip is "96c6b351febe" or _storyClip is "7a39ffb18465" or _storyClip is "916bd0ab8a8f">>You sit hunched on the edge of the thin mattress, elbows on your knees, and stare into the flickering torchlight until it is the only thing you see. Focus on your breathing.<<else>>You sit cross-legged on the thin mattress. Close your eyes. Focus on your breathing.<</if>>
In. Out. In. Out.
Slowly, the roaring need quiets to a dull throb. Your cock still strains against the cage, but the desperation fades to something almost bearable.
<p class="internal-thought">Pain is temporary. This will pass.</p>
<<elseif _variation is 2>>
<<storyVideo "story/lysara_cell_events/meditate_ok_2_breaths" "" "characters/lysara/amb_meditate">>
<h3>Counting Breaths</h3>
One breath. Two. Three.
You count each inhale, each exhale. The numbers become a mantra, drowning out the screaming need in your balls.
By the time you reach one hundred, something has shifted. The fire hasn't gone out—but you're no longer burning alive.
<<elseif _variation is 3>>
<<storyVideo "story/lysara_cell_events/meditate_ok_3_embrace_pain" "" "characters/lysara/amb_meditate">>
<h3>Embracing the Pain</h3>
You stop fighting. Let the pain wash over you like a wave.
It's strange—the moment you accept it, it becomes... less. Not gone. Never gone. But transformed into something you can carry.
<<set $player.will += 1>>
<p class="success">You feel stronger for having endured.</p>
<<elseif _variation is 4>>
<<storyVideo "story/lysara_cell_events/meditate_ok_4_memory_palace" "" "characters/lysara/amb_meditate">>
<h3>Memory Palace</h3>
You retreat into your mind. Build walls around the need. Room by room, you construct a place where the gas can't reach.
It takes every ounce of concentration, but for a few precious minutes, you find peace.
<<else>>
<<storyVideo "story/lysara_cell_events/meditate_ok_5_eye_of_storm" "" "characters/lysara/amb_meditate">>
<h3>The Eye of the Storm</h3>
There's a moment—between heartbeats, between breaths—where the lust pauses. A fraction of a second of pure clarity.
You cling to that moment. Stretch it. Make it last.
When it finally breaks, the need returns—but you've proven you can find that stillness again.
<</if>>
<<set $player.lust to Math.max(50, $player.lust - 20)>>
<<set $temp.alchemyGasLevel to Math.max(20, $temp.alchemyGasLevel - 5)>>
<<set $player.health to Math.min($player.maxHealth, $player.health + 5)>>
<<set $player.will += 1>>
<<set $flags.feralLevel to Math.max(0, ($flags.feralLevel || 0) - 2)>>
<<else>>
<<set _fantasyType to random(1, 6)>>
<<if _fantasyType is 1>>
<h3>Kira's Body</h3>
You try to clear your mind, but images flood in unbidden.
Kira. Her lips parted. Her tits heaving as she breathes. The curve of her hips, the softness of her thighs...
<<if $flags.abusedUnconsciousKira>>
You remember her unconscious. Helpless. How easy it was to touch her. How good it felt.
<<addCorruption 1>>
<</if>>
Your cock SURGES against the cage.
<<say $player.name "AHHH— FUCK—">>
<<set $player.lust to Math.min(100, $player.lust + 10)>>
<<storyVideo "story/lysara_cell_events/meditate_fail_1_kira" "" `["story/lysara_agony_days/agony_day2", "characters/lysara/cell_caged_agony_day2"]`>>
<<elseif _fantasyType is 2>>
<h3>Lysara's Curves</h3>
You try to focus, but all you can see is HER.
Those impossible tits. That ass that defies gravity. The way she moves, like every step is designed to drive you insane.
You imagine her on top of you. Riding you. Those tits bouncing as she—
The cage reminds you why that's a TERRIBLE train of thought.
<<say $player.name "NO NO NO—">>
<<set $player.lust to Math.min(100, $player.lust + 15)>>
<<storyVideo "story/lysara_cell_events/meditate_fail_2_lysara" "" `["story/lysara_agony_days/agony_day2", "characters/lysara/cell_caged_agony_day2"]`>>
<<elseif _fantasyType is 3>>
<h3>The Gas Takes Hold</h3>
You close your eyes and immediately you're drowning in arousal.
Every woman you've ever wanted. Every fantasy you've ever had. They blur together into a kaleidoscope of flesh and moaning and desperate need.
Your hips buck involuntarily, fucking nothing. The cage bites and you don't care.
<<say $player.name "Please... please...">>
<<set $player.lust to 100>>
<<storyVideo "story/lysara_cell_events/meditate_fail_3_gas" "" `["story/lysara_agony_days/agony_day2", "characters/lysara/cell_caged_agony_day2"]`>>
<<elseif _fantasyType is 4>>
<h3>Phantom Sensations</h3>
The meditation backfires spectacularly.
Without external stimulation, your mind creates its own. You can FEEL hands on your cock—phantom fingers stroking, phantom lips wrapping around the tip.
It's not real. You KNOW it's not real.
Your cock doesn't care. It strains against the cage, leaking pre-cum through the metal.
<<set $player.lust to Math.min(100, $player.lust + 12)>>
<<storyVideo "story/lysara_cell_events/meditate_fail_4_phantom" "" `["story/lysara_agony_days/agony_day2", "characters/lysara/cell_caged_agony_day2"]`>>
<<elseif _fantasyType is 5>>
<h3>Velith's Whispers</h3>
A voice slides into your meditation. Familiar. Seductive.
<<say "Velith" "Poor thing. All that need and nowhere to put it.">>
You try to push her out, but she's everywhere. In your thoughts. In your blood.
<<say "Velith" "I could help, you know. Just say yes. Just give in.">>
<<set $player.lust to Math.min(100, $player.lust + 10)>>
<<addCorruption 2>>
<<storyVideo "story/lysara_cell_events/meditate_fail_5_velith" "" `["story/lysara_agony_days/agony_day2", "characters/lysara/cell_caged_agony_day2"]`>>
<<else>>
<h3>Body Betrayal</h3>
You're doing so well. Finding calm. Finding peace.
Then your cock twitches.
Just once. Just a little.
But it's enough. The twitch becomes a throb. The throb becomes a PULSE. And suddenly you're right back where you started—harder than steel and desperate for release.
<<say $player.name "DAMN IT!">>
<<set $player.lust to Math.min(100, $player.lust + 8)>>
<<storyVideo "story/lysara_cell_events/meditate_fail_6_body" "" `["story/lysara_agony_days/agony_day2", "characters/lysara/cell_caged_agony_day2"]`>>
<</if>>
<<if _storyClip is "e0311a66e24f">>You look down. The cage juts out of the open fly of your ruined trousers, leaking pre-cum through its bars.<</if>>
<p class="failure">Meditation fails. The need is too strong.</p>
<<set $flags.feralLevel to ($flags.feralLevel || 0) + 1>>
<</if>>
<<set _cellNext to setup.cellFeralNext()>>
<<if _cellNext>>
<<elseif $player.lust gte 100 && !$temp.cageOrgasmToday && random(1, 100) lte 25>>
<<set _cellNext to "Cell_Cage_Orgasm">>
<<elseif $temp.dayActions gte 4>>
<<set _cellNext to "Cell_Day_End">>
<</if>>
<<if _cellNext>>
<div class="choice-container">
<<vchoice "Continue" _cellNext "action" "forward">>
</div>
<<else>>
<div class="choice-container">
<<vchoice "Try to meditate again" "Cell_Meditate" "action" "meditation">>
<<vchoice "Try to escape" "Cell_Escape_Attempt" "action" "strength">>
<<vchoice "Spy on Lysara" "Cell_Spy_Lysara" "action" "search">>
<<vchoice "Just suffer" "Cell_Suffer" "action" "health">>
</div>
<</if>><<run VaultUI.setBackground("cell")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<<run document.body.classList.add("scene-mode-intimate")>>
<<set $temp.cageOrgasmToday to true>>
<h3>Caged Release</h3>
It happens without warning.
One moment you're fighting the arousal, the next your entire body is SEIZING.
<<say $player.name "OH GOD— OH FUCK— NO NO NO—">>
Your cock spasms inside the cage. There's nowhere for it to go, no room to swell, but your balls don't care. They're EMPTYING.
<<storyVideo "characters/lysara/cell_caged_agony_cage_orgasm">>
Cum spurts through the gaps in the cage—pathetic, dribbling, nothing like a real orgasm should be. But your body doesn't know that. Every muscle contracts. Your back arches off the mattress.
<<say $player.name "AHHHHHHH—">>
The pleasure is mixed with AGONY. The cage bites into your flesh as your cock tries desperately to grow. You're cumming and screaming and crying all at once.
It goes on forever. And when it finally stops...
<<set $player.lust to 50>><<run setup.playerReleased()>>
<<clampStat "player.health" -5 0 100>>
You lie there, gasping. Covered in your own cum. The cage is a mess of fluids.
<p class="failure">That wasn't relief. That was torture with a different flavor.</p>
Your cock is already starting to harden again. The gas is still in your system. The need isn't gone—just temporarily muted.
<<say $player.name "...fuck...">>
<<if $temp.lysaraEncounters gte 2>>
You hear slow, deliberate clapping from across the room.
<<say "Lysara" "Impressive. Most men don't cum in the cage until day two.">>
<<say $player.name "Shut... up...">>
<<say "Lysara" "The good news? Each release weakens the gas's hold. A few more of those and you might actually recover.">>
<<say $player.name "A few MORE?!">>
She just smiles.
<</if>>
<<run document.body.classList.remove("scene-mode-intimate")>>
<<if $temp.dayActions lt 4>>
<div class="choice-container">
<<vchoice "Try to rest" "Cell_Suffer" "action" "health">>
<<vchoice "Spy on Lysara" "Cell_Spy_Lysara" "action" "search">>
</div>
<<else>>
<div class="choice-container">
<<vchoice "Continue" "Cell_Day_End" "action" "forward">>
</div>
<</if>><<run VaultUI.setBackground("cell")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<<set $temp.dayActions += 1>>
<<advanceTime 1 0>>
<h3>Escape Attempt</h3>
You grab the bars and PULL. Then PUSH. Then try to find a weak point.
<<say $player.name "Come ON!">>
The bars don't budge. They're ancient—but solid.
<<storyVideo "characters/lysara/amb_escape">>
You try the lock. It's a complex mechanism, far beyond your ability to pick.
You try digging at the floor. Solid stone.
<<say $player.name "FUCK!">>
The exertion makes blood rush to your cock. The cage reminds you why that's a problem.
<<storyVideo "story/lysara_agony_days/escape_attempt">>
<<if _storyClip is "5031488f940f">>You look down. Your cock strains inside the cage, padlock rattling, and a slow string of precum drips from the tip to the stone.<</if>>
<<say $player.name "OW OW OW—">>
You slump against the wall.
<p class="humor">At least the escape attempt distracted you from the agony. For about thirty seconds.</p>
<<if $temp.dayActions lt 4>>
<div class="choice-container">
<<vchoice "Try to meditate" "Cell_Meditate" "action" "meditation">>
<<vchoice "Try to escape again" "Cell_Escape_Attempt_2" "action" "strength">>
<<vchoice "Spy on Lysara" "Cell_Spy_Lysara" "action" "search">>
<<vchoice "Just suffer" "Cell_Suffer" "action" "health">>
</div>
<<else>>
<div class="choice-container">
<<vchoice "Continue" "Cell_Day_End" "action" "forward">>
</div>
<</if>><<run VaultUI.setBackground("cell")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<<set $temp.dayActions += 1>>
<<advanceTime 1 0>>
<h3>Another Escape Attempt</h3>
You throw yourself at the bars like a man possessed.
Which, in a sense, you are.
<<say $player.name "LET ME OUT! LET ME OUT!">>
You hear Lysara's voice from somewhere in the lab.
<<say "Lysara" "That's not going to work, you know.">>
<<say $player.name "I DON'T CARE!">>
You punch the bars. Hurt your hand. Kick the bars. Hurt your foot.
Finally you collapse, panting.
<<say "Lysara" "Feel better?">>
<<say $player.name "No.">>
<<say "Lysara" "The futility is part of the process. Accept what you cannot change.">>
<<say $player.name "Fuck you.">>
<<say "Lysara" "Not in your current state, I'm afraid.">>
<p class="humor">You hate that she's funny.</p>
<<storyVideo "story/lysara_agony_days/escape_attempt_2">>
<<if _storyClip is "eff600fc5eda">>Lysara drags a chair to the bars and sits, bare feet stretched through them, toes flexing, just short of your crotch. You grab her ankles and drag her soles onto you, grinding the cage against them through your trousers. She lets you, smiling. Measuring the swelling, she would call it.<</if>>
<<if $temp.dayActions lt 4>>
<div class="choice-container">
<<vchoice "Try to meditate" "Cell_Meditate" "action" "meditation">>
<<vchoice "Spy on Lysara" "Cell_Spy_Lysara" "action" "search">>
<<vchoice "Just suffer" "Cell_Suffer" "action" "health">>
</div>
<<else>>
<div class="choice-container">
<<vchoice "Continue" "Cell_Day_End" "action" "forward">>
</div>
<</if>><<run VaultUI.setBackground("cell")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<<set $temp.dayActions += 1>>
<<advanceTime 2 0>>
<h3>Suffering</h3>
You curl up on the mattress and just... exist in the pain.
Every pulse of your heart is agony. Every breath is fire.
<<storyVideo "story/lysara_agony_days/suffer" "" "characters/lysara/cell_caged_agony_day1">>
<<if _storyClip is "7acccf05c3ae">>The swollen head of your cock is crushed flat against the cage, leaking a slow white drip onto the floor.<</if>>
<<clampStat "player.health" -3 0 100>>
<<set $flags.feralLevel to ($flags.feralLevel || 0) + 1>>
<<set _roll to random(1, 100)>>
<<if _roll lte 30>>
At some point, you drift into a fevered sleep.
You dream of Kira. Of Lysara. Of Velith. Bodies intertwined. Mouths and hands everywhere.
You wake up SCREAMING as the cage bites into your straining cock.
<<say $player.name "NO NO NO—">>
<<set $player.lust to 100>>
<<set $flags.feralLevel += 2>>
<<storyVideo "story/lysara_cell_events/suffer_1_wet_dream">>
<<elseif _roll lte 50>>
Your mind wanders to dark places.
You think about Lysara. About overpowering her when she gets close. Taking what you need.
<<if $flags.rapedUnconsciousKira>>
You've done it before. You could do it again.
<</if>>
<<addCorruption 2>>
<<set $flags.feralLevel += 2>>
The cage reminds you that you CAN'T. Not like this.
<p class="internal-thought">...yet.</p>
<<storyVideo "story/lysara_cell_events/suffer_2_dark_thoughts">>
<<else>>
Time passes. Measured in throbs of pain.
You've never wanted something so badly in your life. Any relief. Any release.
But there is none.
<<storyVideo "story/lysara_cell_events/suffer_3_simple">>
<</if>>
<<set _cellFeral to setup.cellFeralNext()>>
<<if _cellFeral>>
<div class="choice-container">
<<vchoice "Continue" _cellFeral "action" "forward">>
</div>
<<elseif $temp.dayActions lt 4>>
<div class="choice-container">
<<vchoice "Try to meditate" "Cell_Meditate" "action" "meditation">>
<<vchoice "Try to escape" "Cell_Escape_Attempt" "action" "strength">>
<<vchoice "Spy on Lysara" "Cell_Spy_Lysara" "action" "search">>
<<vchoice "Keep suffering" "Cell_Suffer" "action" "health">>
</div>
<<else>>
<div class="choice-container">
<<vchoice "Continue" "Cell_Day_End" "action" "forward">>
</div>
<</if>><<run VaultUI.setBackground("cell")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
You sink back onto the thin mattress. The cage throbs in time with your pulse, and the day isn't over yet.
<<if $temp.dayActions gte 4>>
<div class="choice-container">
<<vchoice "Continue" "Cell_Day_End" "action" "forward">>
</div>
<<elseif ($temp.cellDays || 1) lte 1>>
<div class="choice-container">
<<vchoice "Try to meditate" "Cell_Meditate" "action" "meditation">>
<<vchoice "Try to escape" "Cell_Escape_Attempt" "action" "strength">>
<<vchoice "Spy on Lysara through the bars" "Cell_Spy_Lysara" "action" "search">>
<<vchoice "Just suffer" "Cell_Suffer" "action" "health">>
</div>
<<else>>
<div class="choice-container">
<<vchoice "Try to meditate" "Cell_Meditate" "action" "meditation">>
<<vchoice "Spy on Lysara" "Cell_Spy_Lysara" "action" "search">>
<<if $flags.lysaraDeviceRefusedOnce && !$flags.lysaraDeviceUsed && !$flags.lysaraDeviceRefusedTwice>>
<<vchoice "Ask about the device..." "Cell_Lysara_Device_Beg" "intimate" "key">>
<</if>>
<<if setup.cellIsLastDay()>>
<<vchoice "Try to sleep through the final hours" "Cell_Day3_Sleep" "action" "rest">>
<<else>>
<<vchoice "Try to sleep through it" `setup.cellSitOutPassage()` "action" "rest">>
<</if>>
<<vchoice "Just suffer through it" "Cell_Suffer" "action" "health">>
</div>
<</if>><<run VaultUI.setBackground("cell")>>
<<run VaultUI.setTimeOfDay("night")>>
<<if $time.hour lt 20>><<setTime 20 0>><</if>>
<h3>Night Falls</h3>
<<storyVideo "characters/lysara/amb_night">>
<<set _cellLeft to setup.cellDaysLeft()>>
<<if _cellLeft gt 0>>
<<storyVideo "story/lysara_cell_events/day_end_2_at_bars">>
Lysara approaches the cell.
<<if _storyClip is "15a9d249aea5">>She comes through from her quarters with a heavy book hugged to her chest, pushes the door shut with her heel, and only then looks over at the cell.<</if>>
<<say "Lysara" "Surviving?">>
<<say $player.name "Barely.">>
She studies you through the bars.
<<if $temp.cellStayDays is undefined>>
<<set $temp.cellStayDays to setup.cellStayDays>>
She tilts her head, the way she does over a sample that refuses to behave.
<<say "Lysara" "I told you three days. I was wrong. The gas has dug deeper into you than I measured. Five. Not three.">>
<<say $player.name "FIVE?!">>
<<say "Lysara" "Five. Consider it a compliment. Your body is holding on to it.">>
<</if>>
<<if _cellLeft is 1>>
<<say "Lysara" "One more day. You're doing well.">>
<<else>>
<<say "Lysara" "<<print _cellLeft>> more days. You're doing well.">>
<</if>>
She isn't empty-handed. A blue bowl in one hand, a spoon in the other, and a glass bottle of milk tucked into the crook of her arm, beaded with cold. The smell of it reaches you before she does, sweet, and your stomach clenches so hard it hurts. You haven't thought about food all day. The gas left no room.
<<if $flags.tastedLysara || $flags.rimmedLysara>>
<<say "Lysara" "And you've earned a small reward.">>
<</if>>
<<if $temp.cellDays is 1>>
<<say "Lysara" "Supper. Subjects in the cage don't handle utensils. A hand that holds a spoon finds other things to hold.">>
She taps the spoon once against the bars. The note hangs in the air.
<<say "Lysara" "So I'll hold it. And you'll open.">>
<<elseif $temp.cellDays is 2>>
<<say "Lysara" "Supper. The same arrangement as last night.">>
You're already at the bars. You don't remember getting up.
<<say "Lysara" "Good. That saves us both time.">>
<<elseif $temp.cellDays is 3>>
<<say "Lysara" "Halfway, and still eating. Most of them stop around now. The gas fills them up with the wrong hunger.">>
<<else>>
<<say "Lysara" "You'll want this tonight more than you think. The peak burns through a man. It's been burning through you since dawn.">>
<</if>>
<<set $temp.alchemyGasLevel to Math.max(20, $temp.alchemyGasLevel - 10)>>
<div class="choice-container">
<<vchoice "Open your mouth for her spoon" "Cell_Lysara_Feed" "intimate" "eating">>
<<vchoice "Make her hand you the bowl" "Cell_Lysara_Feed_Alone" "action" "food">>
</div>
<<else>>
The last day is over. The torches burn low, and for once Lysara doesn't come to the bars to count you.
You can hear her at her bench. The scratch of her pen. The clink of a key ring set down on stone, then picked up again.
<<set $temp.alchemyGasLevel to Math.max(20, $temp.alchemyGasLevel - 10)>>
<div class="choice-container">
<<vchoice "The last night" "Cell_Day5_Night_Sleep" "action" "night">>
</div>
<</if>><<set $temp.cellDays += 1>>
<<set $time.day += 1>>
<<set $timeFlags.passedNoon to false>>
<<set $timeFlags.passedEvening to false>>
<<set $timeFlags.passedMidnight to false>>
<<setTime 7 0>>
<<if $temp.cellDays lte setup.cellStayDays>>
<<storyVideo "characters/lysara/amb_fever_dream">>
<<if $temp.cellDays is setup.cellStayDays>>
Sleep doesn't come. The fever does.
Somewhere past midnight the gas peaks. You feel it crest inside you like a wave lifting a boat, every vein lit, your balls drawn up tight and aching against the steel. Your cock swells until the cage creaks and you're sure, absolutely sure, that this time it splits open.
It doesn't. The wave hangs there, at the top, for an hour that lasts a year.
Then, just before dawn, it breaks. You feel it go out of you like a tide, slow and dragging, leaving you soaked in sweat and shaking on the mattress.
<<clampStat "player.health" -5 0 100>>
When you wake, the agony is still there. But it's an ebb now, not a flood.
<<journalAdd "The gas peaked last night. Thought the cage would split. Then just before dawn it broke and went out of me like a tide. One more day. She says she opens the door after that." "story">>
<<else>>
Sleep is fitful. Dreams of sex and violence. The cage bites all night.
<<clampStat "player.health" -5 0 100>>
When you wake, the agony continues.
<</if>>
<div class="choice-container">
<<vchoice "Face another day" `"Cell_Agony_Day" + $temp.cellDays` "action" "time">>
</div>
<<else>>
You made it. <<= setup.cellDaysWord(true, setup.cellStayDays)>> days of agony—over.
<div class="choice-container">
<<vchoice "..." "Cell_Time_Complete" "action" "time">>
</div>
<</if>><<run VaultUI.setBackground("cell")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<<set $temp.dayActions to 0>>
<<set $temp.cageOrgasmToday to false>>
<<set $player.will += 2>>
<h2>Day 2 of Agony</h2>
<<set _day2Var to random(1, 5)>>
<<switch _day2Var>>
<<case 1>>
You wake from a dream of Kira—her body pressed against yours, her moans in your ear—and immediately feel the cage's cruel grip on your engorged flesh.
The second day is different. The constant, screaming need has settled into something deeper. A bone-deep hunger that pulses with every heartbeat.
Your cock has changed overnight. Even soft—which it hasn't been since you entered this cell—you can tell it's... larger. Thicker. The cage feels tighter than yesterday, the metal biting into flesh that wasn't there before.
<<say "Lysara" "The gas is metabolizing. Your body is adapting to contain more... essence.">>
She sits at her desk across the lab, glasses on, reading from a folder. Her voice is clinical. Detached.
<<storyVideo "story/lysara_cell_events/day2_1_lab_lecture" "" "characters/lysara/lab_lecture">>
<<say "Lysara" "The growth will continue for another day or so. Then stabilize.">>
<p class="internal-thought">Growth? How much bigger is this going to get?</p>
<<case 2>>
Consciousness returns slowly, and with it, sensation.
The second day hits different. Your body has stopped fighting the gas and started... accommodating it. Every nerve ending feels raw, exposed, hypersensitive. The rough stone floor. The cool air. Even your own heartbeat sends ripples of pleasure through your trapped cock.
You look down. The cage is straining now, bulging obscenely with flesh that wasn't there yesterday. Your balls feel heavy, swollen, aching with backed-up need.
<<say "Lysara" "Don't touch yourself through the bars. The cage will punish you.">>
You didn't even realize your hand had been drifting downward.
<<storyVideo "story/lysara_cell_events/day2_2_raw_nerves" "" "story/lysara_agony_days/agony_day2_wake">>
<<if _storyClip is "bf29f0f41103">>She reaches through the bars before you can, takes the cage in her fingers and turns it a quarter-inch on its ring, settling it, testing the lock pin with a thumbnail. Brisk. Clinical. Still the most anyone has touched you in two days.
<<say "Lysara" "Seated properly. When it chafes, tell me. I'll want to note where.">><<elseif _storyClip is "a2ccd15520c2">>She reaches through the bars, cups the cage in her palm and lifts it to the lamplight, studying it at eye level the way she'd study a cloudy flask.
<<say "Lysara" "Seated properly. When it chafes, tell me. I'll want to note where.">><</if>>
<<case 3>>
The dreams were worse last night. More vivid. Velith's voice in your ear, promising things. Lysara's body replacing hers. Then Kira. Then all three at once, using you, draining you—
You wake gasping, cock straining against metal that feels two sizes too small.
Day two. You can survive this.
Your body disagrees. The gas has settled into your marrow now, changing you from the inside out. When you shift position, you feel the weight of your enhanced genitals—heavier, more demanding, impossibly sensitive.
The air itself seems to caress you. Every breath brings awareness of your skin, your flesh, your desperate, caged need.
<<storyVideo "story/lysara_cell_events/day2_3_three_dreams" "" "story/lysara_agony_days/agony_day2_wake">>
<<case 4>>
You don't remember sleeping, but you must have, because suddenly it's day two and everything is more.
More sensitive. More swollen. More desperate.
The cage is a prison within a prison now. Your cock has grown overnight—the gas's work, transforming you, enhancing you against your will. The metal groans when you shift, straining against flesh that refuses to stay contained.
Precum leaks constantly now, a steady drip that puddles beneath you. Your balls ache with backed-up seed, heavy and hot, screaming for release that can't come.
<<if $flags.lysaraIntimacyPathUnlocked>>
And through it all, you can smell her. Lysara. That faint musk of arousal she tries to hide when she watches you suffer.
<<else>>
And through it all, there's her—Lysara—watching from across the room with those calculating blue eyes.
<</if>>
<<storyVideo "story/lysara_cell_events/day2_4_more" "" "story/lysara_agony_days/agony_day2_wake">>
<<case 5>>
The stone floor is cold, but your body burns.
Day two. You've entered some middle place between agony and acceptance. The need hasn't diminished—if anything, it's grown—but your mind has found small moments of clarity between the waves.
<<if $flags.tastedLysara>>
Your tongue remembers her taste. Lysara. The memory makes your cock surge against its cage, and you moan despite yourself.
<<else>>
Lysara moves somewhere in the laboratory, her robes swishing. The sound alone makes your cock pulse.
<</if>>
The gas has done its work on your flesh. Looking down, you barely recognize yourself—swollen, massive, straining against metal that was designed for normal men.
You are not normal anymore.
<<storyVideo "story/lysara_cell_events/day2_5_cold_floor" "" "story/lysara_agony_days/agony_day2_wake">>
<</switch>>
<<if $flags.kissedLysara>>
You catch yourself touching your lips. The kiss through the bars yesterday is still there: the heat of her mouth, the way she let you take it. Your cock strains against the cage just thinking about it.
<<say "Lysara" "Still thinking about that kiss? That's normal. The gas makes certain memories... linger. You may find you want another. And another.">>
<</if>>
<<if _storyClip is "e7573b8dc3f8">>You kneel up on the thin mattress and look down between your thighs. Your swollen cock is crammed into the steel, and a long clear string of pre-cum drips from the cage's tip into the wet patch spreading on the sheet.<</if>>
<p class="system-message"><<icon "transform">> The gas continues to transform your body. Your cock has grown noticeably larger overnight.</p>
<<if $player.lust >= 80>>
<p class="warning-text">Your arousal is dangerously high. You can feel yourself teetering on the edge of something—a cage orgasm that will bring pain instead of relief.</p>
<</if>>
<div class="choice-container">
<<vchoice "Try to meditate" "Cell_Meditate" "action" "meditation">>
<<vchoice "Spy on Lysara" "Cell_Spy_Lysara" "action" "search">>
<<if $flags.lysaraDeviceRefusedOnce && !$flags.lysaraDeviceUsed && !$flags.lysaraDeviceRefusedTwice>>
<<vchoice "Ask about the device..." "Cell_Lysara_Device_Beg" "intimate" "key">>
<</if>>
<<vchoice "Try to sleep through it" "Cell_Day2_Sleep" "action" "rest">>
<<vchoice "Just suffer through it" "Cell_Suffer" "action" "health">>
</div><<run VaultUI.setBackground("cell")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<h3>Attempting Rest</h3>
<<set _sleepVar to random(1, 4)>>
<<switch _sleepVar>>
<<case 1>>
You try to sleep. To escape into unconsciousness.
But the dreams that come are worse than waking. Kira beneath you, moaning your name. Velith's gloved hands dragging down your back, leather creaking, her black wings closing over you both. Lysara's mouth—
<<storyVideo "story/lysara_cell_events/day2_sleep_1_dreams" "" `["story/lysara_agony_days/day2_sleep", "characters/lysara/cell_caged_agony_day2"]`>>
<<if _storyClip is "7d96e4ab635a">>You wake gasping, flat on your back, cock straining so hard against the cage that you cry out. Your hands are at the lock before you're awake enough to stop them, yanking at a cage that will not give.<<else>>You wake gasping, cock straining so hard against the cage that you cry out.<</if>>
<p class="internal-thought">No escape. Not even in sleep.</p>
<<clampStat "player.lust" 15>>
<<case 2>>
Sleep comes in fragments. Brief moments of darkness punctuated by visions of flesh.
In one dream, the cage is gone and you're fucking someone—you can't see who—but they're tight and wet and perfect. You're about to come when—
You wake. The cage is still there. Your cock throbs with need.
<<storyVideo "story/lysara_cell_events/day2_sleep_2_fragments" "" "characters/lysara/cell_caged_agony_day2">>
<<say "Lysara" "You were moaning in your sleep.">>
Her voice is carefully neutral.
<<say "Lysara" "Quite... vocally.">>
<<clampStat "player.lust" 10>>
<<case 3>>
You manage to drift off.
The dream starts innocently—walking through the vault—but soon hands are touching you everywhere. Kira's. Lysara's. Strangers'. They strip you, expose you, worship your enhanced cock until—
The cage shocks you awake. You were grinding against the floor, desperate for friction that can't bring release.
<<storyVideo "story/lysara_cell_events/day2_sleep_3_grinding" "" "characters/lysara/cell_caged_agony_day2">>
<p class="failure">The cage punishes unconscious attempts at stimulation.</p>
<<clampStat "player.lust" 20>>
<<clampStat "player.health" -5 0 100>>
<<case 4>>
Somehow, you sleep.
And somehow, you don't dream. For a few precious hours, there's only darkness and peace.
You wake feeling... not better, exactly, but more yourself. The respite has given your mind time to rebuild its walls.
<p class="success">A few hours of dreamless sleep has helped restore your will.</p>
<<set $player.will += 5>>
<<clampStat "player.lust" -10>>
<<set $player.lust to Math.max(50, $player.lust)>>
<<storyVideo "story/lysara_cell_events/day2_sleep_4_dreamless">>
<</switch>>
<div class="choice-container">
<<vchoice "Continue enduring" "Cell_Day_End" "action" "clock">>
</div><<run VaultUI.setBackground("cell")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<<set $temp.dayActions to 0>>
<<set $temp.cageOrgasmToday to false>>
<<set $player.will += 3>>
<<set $player.charm += 2>>
<h2>Day 3 of Agony</h2>
<<set _day3Var to random(1, 4)>>
<<switch _day3Var>>
<<case 1>>
The third day.
You've stopped counting hours. Time has become a blur of need and denial, of waves cresting and falling, of your body screaming for release it cannot have.
But something has changed. You can feel it in your bones, in the new weight between your legs, in the strange clarity that comes between the surges of desperate lust.
You are becoming something new.
The cage—once a torture device—has become almost familiar. A constant reminder of what you cannot have. What you will not surrender to.
<<say "Lysara" "Halfway.">>
Her voice from across the room. You don't look. You know if you see her, smell her, you'll break.
<<say "Lysara" "You've done better than most.">>
<p class="internal-thought">Most? How many men has she watched suffer like this?</p>
<<storyVideo "story/lysara_cell_events/day3_1_last_day">>
<<case 2>>
You wake to silence.
No—not silence. The absence of desperation. For a brief, blessed moment, the fire has banked to embers.
Then it roars back, and you gasp, cock straining against metal that has become a second skin.
Day three. You've made it this far.
Looking down at yourself, you barely recognize the body you've been given. Your cock has stabilized at its new size—massive, thick, heavy with need. Your balls hang lower, swollen with days of denied release.
You are a creature of need now. A vessel of lust. And somehow, that thought brings pride rather than shame.
<<if $flags.lysaraDeviceUsed>>
Lysara's device drained you, but even that relief was temporary. The gas has refilled what was emptied.
<<else>>
<<if $flags.tastedLysara>>
The taste of her lingers on your tongue. A memory that keeps the fire burning.
<</if>>
<</if>>
<<storyVideo "story/lysara_cell_events/day3_2_silence">>
<<case 3>>
The third dawn finds you... different.
Not better. Not worse. Transformed.
The agony has burned away something—fear, perhaps. Shame, definitely. What remains is raw need wrapped in iron will. You want. You burn. But you do not break.
<<say "Lysara" "You're changing.">>
<<storyVideo "story/lysara_cell_events/day3_3_changing" "" `["story/lysara_agony_days/agony_day3", "characters/lysara/at_bars"]`>>
<<if _storyClip is "82bfc0b55a47" or _storyClip is "6b40bf582207" or _storyClip is "021b8100e4e6">>She sits at the bars now, bare feet stretched through them, resting just short of your lap. Close enough to touch. You pull them into your lap and rub them before you can stop yourself. You don't reach any higher.<<else>>She stands at the bars now, close enough to touch if you reached. You don't reach.<</if>>
<<say "Lysara" "Not just physically. I can see it in your eyes. The gas is reshaping more than your flesh.">>
<p class="internal-thought">What am I becoming?</p>
But you don't ask. You're not sure you want to know.
<<case 4>>
Day three. The middle of it.
The transformation feels complete. You can feel it—a settling, a stabilization after days of constant change. Your enhanced cock has reached its new baseline. Your sensitivity has peaked and plateaued.
What remains is manageable. Barely.
<<if $flags.lysaraCellMeditated>>
You've learned to breathe through the worst of it. To find small moments of peace in the eye of the storm. Your mind has built walls around the need, containing it, controlling it.
<<else>>
You never found a way to quiet it. Every time you reached for calm, your cock throbbed against the steel and dragged you back under. Now you don't even try. You just let it burn.
<<say "Lysara" "You've stopped fighting it. Good. Resisting only makes it hurt more. Letting go makes everything... easier, doesn't it?">>
<</if>>
<<if $flags.lysaraIntimacyPathUnlocked>>
Lysara has been watching more closely today. You catch her gaze lingering, her breathing quickening when you shift and your massive, caged cock moves with you.
She wants you. You can smell it on her.
<p class="internal-thought">Two more days. Then we're done playing by her rules.</p>
<<else>>
Lysara has been working at her table all morning, pointedly not looking at you.
But you've seen her glance. Seen the flush on her pale cheeks.
Your suffering is affecting her too.
<</if>>
<<storyVideo "story/lysara_cell_events/day3_4_final_hours">>
<</switch>>
<p class="system-message"><<icon "transform">> The transformation is nearly complete. Your body has stabilized at its enhanced state.</p>
<<if $player.lust >= 80>>
<p class="warning-text">Even now, halfway to freedom, your arousal threatens to overwhelm you. One wrong thought and you'll cum inside this cage.</p>
<</if>>
<div class="choice-container">
<<vchoice "Try to meditate" "Cell_Meditate" "action" "meditation">>
<<vchoice "Watch Lysara work" "Cell_Spy_Lysara" "action" "search">>
<<if $flags.lysaraDeviceRefusedOnce && !$flags.lysaraDeviceUsed && !$flags.lysaraDeviceRefusedTwice>>
<<vchoice "Beg for the device..." "Cell_Lysara_Device_Beg" "intimate" "key">>
<</if>>
<<vchoice "Try to sleep through it" "Cell_Day2_Sleep" "action" "rest">>
<<vchoice "Just suffer through it" "Cell_Suffer" "action" "health">>
</div><<run VaultUI.setBackground("cell")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<h3>Final Rest</h3>
<<set _sleepVar to random(1, 5)>>
<<switch _sleepVar>>
<<case 1>>
On the final day, sleep finds you.
And with sleep comes... peace. No dreams of flesh. No visions of writhing bodies. Just darkness and rest.
When you wake, you feel it immediately—the fire has banked. The transformation is complete. Your body has accepted its new shape.
<<say "Lysara" "You're awake. Good. It's almost time.">>
<p class="success">The final rest has helped your body complete its transformation.</p>
<<set $player.will += 5>>
<<clampStat "player.lust" -15>>
<<set $player.lust to Math.max(40, $player.lust)>>
<<storyVideo "story/lysara_cell_events/day3_sleep_1_peace">>
<<case 2>>
You drift off despite the need, your body finally surrendering to exhaustion.
<<storyVideo "story/lysara_cell_events/day3_sleep_2_vision" "" "characters/lysara/amb_vision">>
<<if _storyClip is "e9dbf4e0157b">>The dream that comes is strange. Not sexual—not exactly. You see yourself from outside, transformed, powerful, a dark shape with a pack on its back, striding alone up a bare ridge of the Reclaimed under an ash-grey sky, toward Kira. Somewhere past the ridge, raiders scatter at the sight of you. Women stare.<<else>>The dream that comes is strange. Not sexual—not exactly. You see yourself from outside, transformed, powerful, striding through the Reclaimed with Kira at your side. Raiders flee before you. Women stare.<</if>>
You are becoming something feared. Something desired.
When you wake, the vision lingers.
<p class="internal-thought">Is that what this changes me into?</p>
<<set $player.will += 3>>
<<set $player.charm += 3>>
<<case 3>>
Sleep takes you, and with it, one final trial.
The dream is intense—Lysara, Kira, Velith, all of them, taking turns with your enhanced body. You cum again and again in the dream, release that your waking body cannot have—
You wake grinding against the floor, cock straining, cage buzzing with warning.
<<say "Lysara" "Stop. Moving.">>
Her voice is sharp. You freeze.
<<say "Lysara" "The cage is at maximum. One more surge and you'll—">>
She doesn't finish. Doesn't need to.
You breathe. Slowly. The moment passes.
<p class="warning">That was close. Too close.</p>
<<clampStat "player.lust" 10>>
<<storyVideo "story/lysara_cell_events/day3_sleep_3_trial">>
<<case 4>>
You close your eyes and let exhaustion take you.
Hours pass. Dreams flicker—fragments of memory and desire, but nothing coherent. When you wake, light streams through high windows. Morning. The last morning.
<<say "Lysara" "The gas has stabilized. I can feel it in the air.">>
<<storyVideo "story/lysara_cell_events/day3_sleep_4_key" "" "story/lysara_agony_days/day3_sleep">>
<<if _storyClip is "b19c63df257d">>She reaches through the bars with both hands, pink nails clicking on the clear plastic of the cage, and tugs the little brass padlock twice to be sure of it.<<else>>She approaches the cell, key in hand.<</if>>
<<say "Lysara" "It's time.">>
<p class="success">You made it. <<= setup.cellDaysWord(true)>> days of agony, and you survived.</p>
<<set $player.will += 10>>
<<case 5>>
You don't sleep the last night. Can't.
The need is too intense, but somehow you ride it like a wave, letting it crash through you without drowning. Hours pass. You meditate. You suffer. You endure.
And slowly, impossibly, dawn comes.
<<say "Lysara" "You made it.">>
Her voice sounds almost... impressed.
You look up at her through exhausted eyes. <<= setup.cellDaysWord(true)>> days of denial. <<= setup.cellDaysWord(true)>> days of watching her move through this space, wanting her, unable to have anything.
<<storyVideo "story/lysara_cell_events/day3_5_you_made_it" "" "characters/lysara/at_bars">>
<<if $flags.tastedLysara>>
Except what she chose to give. The taste of her still burns on your tongue like a brand.
<</if>>
<<say $player.name "When do I get out?">>
<<say "Lysara" "Soon. The gas needs a few more hours to stabilize completely. Then I'll remove the cage.">>
<p class="internal-thought">A few more hours. I can survive a few more hours.</p>
<p class="success">Your body has accepted the changes. You feel... powerful. Different. Ready.</p>
<</switch>>
<div class="choice-container">
<<vchoice "The ordeal ends" "Cell_Time_Complete" "action" "door-handle">>
</div><<run VaultUI.setBackground("cell")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<<set $temp.dayActions to 0>>
<<set $temp.cageOrgasmToday to false>>
<<set $player.will += 3>>
<<set $player.charm += 2>>
<<set $temp.alchemyGasLevel to Math.min(100, ($temp.alchemyGasLevel || 0) + 25)>>
<<if !$flags.lysaraDeviceUsed>><<set $player.lust to 100>><</if>>
<h2>Day 4 of Agony</h2>
<<set _day4Var to random(1, 4)>>
<<switch _day4Var>>
<<case 1>>
You thought it had stopped. Yesterday you felt it settle, the swelling done, your body finished with whatever the gas wanted from it.
You were wrong.
You wake with your cock jammed so hard into the cage that the steel has left a red lattice pressed into the swollen flesh. Your balls are tight and hot and HEAVY, drawn up against you, so full they ache when you breathe.
<<storyVideo "story/lysara_cell_events/day4_1_peak_lecture" "" "characters/lysara/lab_lecture">>
Lysara is already at her desk, glasses on, a page of figures in front of her. She doesn't look up.
<<say "Lysara" "Peak concentration. Right on schedule.">>
<<say $player.name "You said it had stabilized.">>
<<say "Lysara" "I said your body had stopped growing to hold it. Now it's learning to hold MORE. Everything you felt on the first day was the gas arriving. Today is the gas deciding to stay.">>
She makes a note. Underlines it.
<<say "Lysara" "When it breaks, and it will break, you'll know. Until then, try to notice how much you can carry. Most men never find out.">>
<<case 2>>
The air tastes different today. Thicker. Sweet, like rotting fruit and wet sex, and every breath of it goes straight to your cock.
<<storyVideo "story/lysara_cell_events/day4_2_running" "" "characters/lysara/cell_caged_agony_day2">>
You look down and your stomach drops. It's grown again. Overnight. The head is crushed purple against the bars of the cage, the shaft bulging between the rings, and precum doesn't drip anymore. It runs. A steady, shameless thread from the tip to the puddle under you.
<<if _storyClip is "155902b99635">>For a second, through the sweat in your eyes, the cage isn't there at all: just your cock lying swollen and bare against your thigh, one dark ring biting at the root. You blink, and the steel is back.<</if>>
You touch the cage without meaning to. Your whole body jolts like you grabbed a live wire.
<<say $player.name "Fuck— FUCK—">>
<<say "Lysara" "Don't. Today of all days, don't.">>
Her voice comes from across the lab, calm, a little amused.
<<say "Lysara" "The fourth day is always the worst. Your nerves have grown to match the rest of you. You'll find you feel everything twice as much. The good AND the bad.">>
<p class="internal-thought">There is no good.</p>
<<case 3>>
You don't wake up so much as surface, gasping, out of a dream where you were fucking something you couldn't see, over and over, and never coming.
Lysara is at the bars. Close. She's been watching you sleep.
<<say "Lysara" "You were talking. Begging, mostly.">>
<<storyVideo "story/lysara_cell_events/day4_3_crouched_bars" "" "characters/lysara/at_bars">>
<<if _storyClip is "e7ac35c0eb12">>She crouches so her eyes are level with your caged cock. Studies it like a specimen in a jar. Taps the metal once with a fingernail, just to watch you flinch.<<else>>She crouches so her eyes are level with your caged cock. Studies it like a specimen in a jar. Doesn't touch.<</if>>
<<say "Lysara" "Look at you. Thicker at the base. Heavier. The veins have come up. Your balls have dropped another finger's width since yesterday.">>
She tilts her head.
<<say "Lysara" "Do you know what it's building? A reservoir. Your body thinks it's going to have to fill someone, again and again, and it's preparing.">>
<<if $flags.kissedLysara || $flags.rimmedLysara || $flags.tastedLysara>>
She lets that hang. Her tongue touches her upper lip, a quick wet flick.
<<say "Lysara" "Strange, the things a body prepares for.">>
<<else>>
<<say "Lysara" "It doesn't know there's no one coming.">>
<</if>>
<<case 4>>
<<storyVideo "story/lysara_cell_events/day4_4_shaking" "" "characters/lysara/cell_caged_agony_day1">>
<<if _storyClip is "ded83c54c3ed">>Day four, and you can't stop shaking. You wake with your face in the mattress and sweat running into your eyes.<<else>>Day four, and you can't stop shaking.<</if>>
It isn't cold. The fever is back, burning under your skin, and every muscle is wound so tight it trembles. Your cock throbs in the cage with a heartbeat of its own, faster than yours, and every throb drags a moan out of you that you can't swallow.
You can smell yourself. Musk and sweat and precum, heavy in the stale air of the cell.
You can smell HER. Even from across the lab. Flowers and ink and, under it, the sharp sweet scent of her cunt.
<<say $player.name "Lysara... it's worse. It's getting WORSE.">>
<<say "Lysara" "Yes.">>
She doesn't even pretend to soften it.
<<say "Lysara" "It peaks before it breaks. It always peaks before it breaks. When you stop fighting the peak, it passes faster. Breathe into it.">>
<</switch>>
<<if $flags.lysaraDeviceUsed>>
Even the extraction couldn't hold it back. Whatever the crystal drained out of you, the gas has made again overnight, and more.
<<say "Lysara" "Interesting. You refilled faster than I projected.">>
She sounds pleased. Your cock throbs every time she speaks.
<</if>>
<<if $flags.tastedLysara>>
Her taste is still on your tongue, four days in. The gas has burned it into you, salt and musk and sweet, and every swallow brings it back.
<</if>>
<p class="system-message"><<icon "transform">> The gas is at its peak. Your body is changing again, and meditation will be harder today.</p>
<<if $player.lust >= 80>>
<p class="warning-text">You're right at the edge, and the edge has never been this sharp. One wrong thought could make you cum inside the cage.</p>
<</if>>
<div class="choice-container">
<<vchoice "Try to meditate" "Cell_Meditate" "action" "meditation">>
<<vchoice "Spy on Lysara" "Cell_Spy_Lysara" "action" "search">>
<<if $flags.lysaraDeviceRefusedOnce && !$flags.lysaraDeviceUsed && !$flags.lysaraDeviceRefusedTwice>>
<<vchoice "Beg for the device..." "Cell_Lysara_Device_Beg" "intimate" "key">>
<</if>>
<<vchoice "Try to sleep through it" "Cell_Day4_Sleep" "action" "rest">>
<<vchoice "Just suffer through it" "Cell_Suffer" "action" "health">>
</div><<run VaultUI.setBackground("cell")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<h3>No Rest at the Peak</h3>
<<set _sleepVar to random(1, 3)>>
<<switch _sleepVar>>
<<case 1>>
You curl onto your side and try to sleep it off.
<<storyVideo "story/lysara_cell_events/day4_sleep_1_fever_dream" "" "characters/lysara/amb_fever_dream">>
The fever won't let you. You drift, and the gas paints the dark behind your eyes: Lysara bent over her bench with her robes hiked to her waist, Kira on her knees with her mouth open, a dozen faceless women spreading their legs for you while your cock strains and strains and can't reach any of them.
You jerk awake with your hips pumping at nothing. The mattress is soaked under you.
<<say "Lysara" "Again? That's the third time.">>
<<clampStat "player.lust" 15>>
<<case 2>>
You lie flat on the stone where it's coolest, arms out, and will yourself under.
<<storyVideo "story/lysara_cell_events/day4_sleep_2_surge" "" `["story/lysara_agony_days/day2_sleep", "characters/lysara/cell_caged_agony_day2"]`>>
It almost works. For an hour, maybe two, there's nothing. <<if _storyClip is "da6cced3d4e0">>Then your cock surges so hard in its sleep that the cage wrenches you awake. You've rolled onto the thin mattress somehow; you lie on your back with a fist knotted in the blanket, gasping while it throbs and leaks and slowly, slowly gives up.<<else>>Then your cock surges so hard in its sleep that the cage wrenches you awake, and you lie there gasping while it throbs and leaks and slowly, slowly gives up.<</if>>
<p class="failure">The peak doesn't care whether you're awake.</p>
<<clampStat "player.lust" 10>>
<<clampStat "player.health" -5 0 100>>
<<case 3>>
You don't fight it. You let the fever take you down into a heavy, sweating half-sleep.
<<storyVideo "story/lysara_cell_events/day4_sleep_3_ride_peak" "" "characters/lysara/amb_fever_dream">>
And in it, strangely, you find a floor. The gas rises and rises and then, somewhere deep, it stops rising. It just HOLDS. You hang there with it, aching and full, and you don't drown.
When you open your eyes, the light has moved across the lab. Hours.
<<say "Lysara" "You rode the peak instead of fighting it. Good. Not many manage that.">>
<p class="success">You held on through the worst of it. Your will is harder for it.</p>
<<set $player.will += 4>>
<<clampStat "player.lust" -10>>
<<set $player.lust to Math.max(50, $player.lust)>>
<</switch>>
<div class="choice-container">
<<vchoice "Continue enduring" "Cell_Day_End" "action" "clock">>
</div><<run VaultUI.setBackground("cell")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<<set $temp.dayActions to 0>>
<<set $temp.cageOrgasmToday to false>>
<<set $player.will += 3>>
<<set $player.charm += 3>>
<<set $temp.cellLastDayStart to $time.day>>
<<set $temp.alchemyGasLevel to Math.max(20, ($temp.alchemyGasLevel || 0) - 25)>>
<h2>Day 5 - The Last Day</h2>
<<set _day5Var to random(1, 3)>>
<<switch _day5Var>>
<<case 1>>
The last day.
You know it before you open your eyes. Something in the air has changed. The sweet rot of the gas is thinner, and for the first time in five days you can smell plain stone and lamp oil under it.
Your cock is still huge in the cage, still hard, still leaking. But the need has a bottom now. You can feel where it ends.
<<storyVideo "story/lysara_cell_events/day5_1_cup" "" "characters/lysara/at_bars">>
<<if _storyClip is "b307c9b11d5d">>Lysara is at the bars with a cup of something hot. She takes a slow sip first, watching you over the rim. Then she sets it on the floor and slides it through to you.<<elseif _storyClip is "9b658e960261">>Lysara sits just outside the bars with a cup of something hot, sipping it, watching you over the rim. Then she sets it on the floor and slides it through to you.<<else>>Lysara is at the bars with a cup of something hot. She sets it on the floor, slides it through to you.<</if>>
<<say "Lysara" "Drink. You'll want your strength tomorrow.">>
<<say $player.name "Tomorrow?">>
<<say "Lysara" "Tomorrow morning I unlock that door. Then I take the cage off.">>
She lets her eyes drop to it. Stay there.
<<say "Lysara" "And then we'll see what five days have made of you.">>
<<case 2>>
You wake to the sound of keys.
Lysara is at her bench, counting them on their ring. Turning one over in her fingers. An old iron one, long, heavy. She holds it up to the light like she's checking it for flaws.
<<storyVideo "story/lysara_cell_events/day5_2_keys" "" "characters/lysara/lab_lecture">>
<<if _storyClip is "52a0baf866a4">>She sets the keys down and works a ring off her own finger, dark stone in old silver, and drops it into the copper dish on the bench. Bare hands for tomorrow's work.<</if>>
She catches you watching. Doesn't hide it.
<<say "Lysara" "The cell door. And this one—">>
A smaller key. Brass. Tiny.
<<say "Lysara" "—is yours. Tomorrow.">>
Your cock lurches against the steel so hard you grunt.
<<say "Lysara" "One more day. You'll find it's the longest one. Knowing it ends makes every hour heavier. That's not cruelty. That's just how men work.">>
She hangs the ring on a hook by her desk. Where you can see it. All day.
<<case 3>>
Five days.
You've been in this cell five days, and you barely remember the man who walked into the lab. He was smaller. Softer. He didn't know what need was.
You know now.
<<storyVideo "story/lysara_cell_events/day5_3_admiring" "" "characters/lysara/cell_caged_agony_day2">>
You look down at yourself: the heavy cock crammed into the cage, the swollen balls, the thick veins standing out along the shaft, the slick of precum that never dries. Your body. Changed for good. The gas has done its work.
<<say "Lysara" "You're admiring it.">>
She's watching from her stool, chin on her hand.
<<say "Lysara" "Good. You should. Tomorrow it comes out of that cage, and you'll have to learn to live with it. Start now.">>
<</switch>>
<<if $flags.lysaraDeviceUsed>>
<<say "Lysara" "And the extraction will have taken the edge off. The last day should be the easiest.">>
She snaps her fingers, absently, turning a page. Your cock throbs.
<<elseif $flags.tastedLysara>>
You catch her looking at your mouth. Just for a moment. Remembering, maybe, what it did to her.
<<elseif $flags.kissedLysara>>
Your lips still remember hers. One more day of looking at that mouth across the lab.
<</if>>
<p class="system-message"><<icon "transform">> The gas is ebbing. The changes it made to your body are settling for good.</p>
<<if $player.lust >= 80>>
<p class="warning-text">So close to freedom, and your arousal still threatens to overwhelm you. One wrong thought and you'll cum inside this cage.</p>
<</if>>
<div class="choice-container">
<<vchoice "Meditate through the final hours" "Cell_Meditate" "action" "meditation">>
<<vchoice "Watch Lysara work" "Cell_Spy_Lysara" "action" "search">>
<<if $flags.lysaraDeviceRefusedOnce && !$flags.lysaraDeviceUsed && !$flags.lysaraDeviceRefusedTwice>>
<<vchoice "Beg for the device..." "Cell_Lysara_Device_Beg" "intimate" "key">>
<</if>>
<<vchoice "Try to sleep through the final hours" "Cell_Day3_Sleep" "action" "rest">>
<<vchoice "Endure to the end" "Cell_Suffer" "action" "health">>
</div><<run VaultUI.setBackground("cell")>>
<<run VaultUI.setTimeOfDay("night")>>
<h3>The Last Night</h3>
<<if $flags.lysaraCascadeArc is "contaminated_drool" && !$flags.lysaraDroolResolved>>
<<storyVideo "story/lysara_cell_events/day5_night_a_blindfold" "" "characters/lysara/at_bars">>
Late in the night, you hear her coming. Slow steps. A hand trailing along the bench, the shelves, the wall.
<<if _storyClip is "2861ed653336">>Lysara finds the bars by touch, half crawling. The blindfold is still tied over her eyes, and her chin is wet. She leans her forehead against the iron, close enough that you can hear her breathe.<<else>>Lysara finds the bars by touch. The blindfold is still tied over her eyes, and her chin is wet. She leans her forehead against the iron, close enough that you can hear her breathe.<</if>>
<<say "Lysara" "Are you awake? I can't tell. I can't see anything.">>
<<say $player.name "I'm awake.">>
<<say "Lysara" "Tomorrow I let you out. I'll have to find the lock by feel.">>
Her fingers walk down the bars until they brush your chest. Your stomach. They stop just above the cage.
<<say "Lysara" "You'll have to guide my hands. When the time comes.">>
She smiles, slack-lipped, a thread of drool slipping down to her throat, and goes back the way she came.
<<elseif $flags.lysaraDeviceUsed>>
<<storyVideo "story/lysara_cell_events/day5_night_b_lamp" "" "characters/lysara/at_bars">>
<<if _storyClip is "bede7e8f7dfd">>Late in the night, lamplight wakes you. Lysara is at the bars. She holds the lamp up and looks you over, slowly, the way she looked at the crystal full of your cum.<<else>>Late in the night, Lysara comes to the bars with a lamp. She holds it up and looks you over, slowly, the way she looked at the crystal full of your cum.<</if>>
<<say "Lysara" "Last night. How do you feel?">>
<<say $player.name "...Calm. Mostly.">>
<<say "Lysara" "Mostly.">>
She snaps her fingers. Once. Your cock jumps in the cage, swelling so fast it hurts, and you gasp.
<<say "Lysara" "Mostly.">>
She smiles, pleased, and lowers the lamp.
<<say "Lysara" "Sleep. In the morning the cage comes off, and we'll see what you remember about who you belong to.">>
<<elseif $flags.tastedLysara || $flags.rimmedLysara>>
<<storyVideo "story/lysara_cell_events/day5_night_c_robe_hand" "" "characters/lysara/at_bars">>
<<if _storyClip is "4992641f2246">>Late in the night, Lysara comes to the bars. Her robe is loose, open over nothing but thin white lace.<<else>>Late in the night, Lysara comes to the bars. Her robe is loose. She isn't wearing anything under it.<</if>>
<<say "Lysara" "I couldn't sleep either.">>
She leans against the iron, her hip pressed into the gap, close enough that the warmth of her bare thigh reaches you through the bars.
<<say "Lysara" "Tomorrow I take that cage off you. You'll be hard before it touches the floor. You know that, don't you?">>
<<say $player.name "Yes.">>
<<say "Lysara" "And when you're hard, you'll want somewhere to put it. That's not a question. It's chemistry.">>
Her hand slides through the bars and rests, light, on the hot steel of the cage. Her thumb strokes the swollen flesh bulging between the rings. Once. Twice. You groan through your teeth.
<<say "Lysara" "I'm simply preparing you. A good alchemist always prepares her subject.">>
She takes her hand back slowly, as though it costs her something, and leaves you shaking in the dark.
<<elseif $flags.kissedLysara>>
<<storyVideo "story/lysara_cell_events/day5_night_d_kiss" "" "characters/lysara/at_bars">>
Late in the night, Lysara comes to the bars.
<<say "Lysara" "Awake?">>
<<say $player.name "What do you think?">>
She almost laughs. She leans her forehead to the iron, and her eyes go to your mouth and stay there.
<<say "Lysara" "Tomorrow you walk out of here. You'll go back to your vault. To your companion.">>
She says it like a measurement. Then, quieter:
<<say "Lysara" "You'll think about the kiss. When you're with her. You won't be able to help it.">>
She doesn't lean in. She waits, an inch from the bars, and you find you're the one pressing your face to the iron. Her lips brush yours, soft and wet and slow, and then she's gone, leaving you hard and aching against the steel.
<<else>>
<<storyVideo "story/lysara_cell_events/day5_night_e_stool" "" "characters/lysara/at_bars">>
Late in the night, Lysara comes to the bars and sits on the stool outside them. She doesn't speak for a long time.
<<say "Lysara" "Five days. Most men beg for the antidote by the second.">>
<<say $player.name "Is that a compliment?">>
<<say "Lysara" "It's data.">>
She crosses her legs. The robe falls open over one bare thigh, all the way to the hip, and she doesn't fix it. Your cock surges in the cage. She watches it happen.
<<say "Lysara" "Tomorrow I'll know how the gas left you. Every inch of it. I'm looking forward to the measurements.">>
She stands, brushes her robe smooth, and walks back into the dark.
<</if>>
You lie back on the thin mattress. The key ring glints on its hook across the lab.
The last night in the cage is long, and hot, and you spend most of it hard. But it ends.
<div class="choice-container">
<<vchoice "Morning" "Cell_Time_Complete" "action" "door-handle">>
</div><<run VaultUI.setBackground("cell")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<<set $temp.alchemyGasLevel to 0>>
<<set $player.lust to 50>>
<h2>The Ordeal Ends</h2>
<<if $temp.cellPath is "agony">>
<<advanceToHour 7>>
<<if $time.day is $temp.cellLastDayStart>><<advanceTime 24 0>><</if>>
<<storyVideo "characters/lysara/amb_new_day">>
<<= setup.cellDaysWord(true)>> days. You survived.
The fire has faded to embers. Your cock—still massive—has finally softened inside the cage.
<<set $player.will += 10>>
<<set $player.charm += 5>>
<<set $flags.survivedAgonyPath to true>>
<p class="success">You feel... changed. Stronger. The ordeal has burned away something and left something new in its place.</p>
<<else>>
<<set $flags.lysaraAntidotePathComplete to true>>
Three hours. The antidote has done its work.
The desperate need is gone. Your cock has returned to mostly normal size—still larger than before, but manageable.
<</if>>
<<say $player.name "Lysara? I think... I think I'm okay now.">>
<<if $temp.cellPath is "agony">>Footsteps. She appears at the cell door.<<else>>She's still in the cell with you, the door standing open behind her.<</if>>
<<run VaultUI.showCharacter("lysara", "center", "pleased")>>
She studies you. Tests the air. Nods.
<<say "Lysara" "Yes. The gas has run its course.">>
<<if $temp.cellPath is "agony">>
<<storyVideo "characters/lysara/amb_cell_unlock">>
<<if _storyClip is "8b79681e966c">>She takes an old iron key from the open spellbook on her workbench and unlocks the cell.<<else>>She produces a key and unlocks the cell.<</if>>
<</if>>
<<say "Lysara" "Come. Let's remove that cage.">>
<<set $temp.inChastity to false>>
<div class="choice-container">
<<vchoice "Follow her" "Lysara_Remove_Cage" "action" "door-handle">>
</div><<run VaultUI.setBackground("cell")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<<say $player.name "Give me the antidote. Please.">>
Lysara nods, as if she expected this.
<<say "Lysara" "The sensible choice.">>
She reaches through the bars, pressing the vial to your lips.
<<say "Lysara" "Drink it all.">>
You do. It tastes like mint and something bitter.
Almost immediately, the fire in your blood begins to cool. Your cock stops straining against the cage quite so desperately.
<<set $temp.alchemyGasLevel to 50>>
<<set $player.lust to 70>>
<<storyVideo "story/lysara_antidote/take_antidote">>
<<if _storyClip is "153318f4d77f">>She steps back from the bars, all clinic now: white coat hanging open over a low-cut flowered dress, violet gloves. She loops a listening tube round her neck, lifts its cold silver bell between two fingers and smiles at you over it.<</if>>
<<say "Lysara" "The antidote works quickly, but not instantly. You'll need to wait about three hours before it's safe to remove the cage.">>
<<say $player.name "Three hours in this cell?">>
<<say "Lysara" "I have work to do. I'll check on you periodically.">>
She turns to leave.
<<say $player.name "Wait— who ARE you? Why are you down here?">>
She pauses.
<<say "Lysara" "I've been here a very long time. Longer than the vault. Longer than the war.">>
<<say $player.name "That's impossible.">>
<<say "Lysara" "Is it?">>
She disappears into the shadows, leaving you alone with your caged cock and your thoughts.
<<set $temp.cellHours to 0>>
<<set $temp.cellPath to "antidote">>
<<set $temp.antidoteFlirted to 0>>
<div class="choice-container">
<<vchoice "Try to rest" "Cell_Antidote_Hour1" "action" "night">>
</div><<run VaultUI.setBackground("cell")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<<set $temp.cellHours to 1>>
<<advanceTime 1 0>>
<<set $temp.alchemyGasLevel to Math.max(0, $temp.alchemyGasLevel - 15)>>
<<set $player.lust to Math.max(40, $player.lust - 10)>>
<h3>Hour 1 of 3</h3>
Time crawls in the cell.
The antidote is working—you can feel the desperate edge fading. But not fast enough. Your cock still strains against the cage, still aches with every heartbeat.
You hear movement in the laboratory. Glass clinking. Lysara humming something under her breath.
Then—
<p class="sound-effect">//CRASH//</p>
<<say "Lysara" "Oh, damn.">>
You press against the bars to look.
Lysara is down on her hands and knees, gloved hands wiping up the spill around the scattered vials. Every stroke of the cloth sets her tits swinging in the low neckline of her robes. The thin fabric sticks to her hips and the backs of her thighs every time she reaches.
<<storyVideo "story/lysara_antidote/hour1" "" "characters/lysara/presents_ass_peek">>
<<if _storyFamily is "sf_cg_lysara_antidote_04">>Then she climbs up to kneel on the low bench and bends low over it for the last vial, and you see what she's wearing under the robe she's shed: a pink mesh shift that hides nothing. Ass pushed out toward the bars. She glances back over her shoulder.<</if>>
She takes her time. FAR too long to pick up a few vials.
<<say "Lysara" "Clumsy of me.">>
She straightens slowly. Glances over her shoulder.
<<say "Lysara" "Were you watching?">>
<<set $player.lust to Math.min(100, $player.lust + 15)>>
<div class="choice-container">
<<vchoice "\"I wasn't NOT watching.\"" "Cell_Antidote_Hour1_Flirt" "intimate" "lips">>
<<vchoice "Look away quickly" "Cell_Antidote_Hour1_Shy" "action" "back">>
<<vchoice "\"You did that on purpose.\"" "Cell_Antidote_Hour1_Accuse" "talk" "alert">>
<<vchoice "Try to get a better angle..." "Cell_Antidote_Hour1_Peek" "intimate" "eye">>
</div><<run VaultUI.setBackground("cell")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
You shift position. Quietly. Carefully.
If you could just get a better angle—see a little more—
You press against the bars, craning your neck. She's still on her hands and knees, still taking her sweet time collecting those vials.
<<storyVideo "story/lysara_antidote/hour1_peek" "" "characters/lysara/presents_ass_peek">>
<<set _peekRoll to random(1, 20) + Math.floor($player.agility / 5)>>
<<if _peekRoll >= 14>>
And then she turns to reach a vial behind her, and bends just a little lower.
<<if _storyFamily is "sf_cg_lysara_antidote_04">>The mesh rides up further. Past the curve of her ass. And—
There's nothing under it but a thin strip of pink thong between her cheeks.
She sways it at you, slow, and rubs one cheek with her palm. The thong barely covers her pussy, inches from the bars. The perfect curve of her ass framing it like a portrait.<<else>>Her robes ride up further. Past her thighs. Past the curve of her ass. And—
She's not wearing anything underneath.
You see EVERYTHING. The soft pink lips of her pussy, glistening slightly in the dim light. The perfect curve of her ass framing it like a portrait.<</if>>
<<say $player.name "Oh fuck—">>
Your cock SURGES against the cage. The metal bites into flesh that's suddenly, desperately trying to expand.
And then—
You cum.
Right there. In the cage. Your balls clenching, your cock spasming uselessly against unforgiving metal. The orgasm rips through you like lightning—but there's no relief. Just PAIN as your swelling flesh crushes against the cage's confines.
<<say $player.name "NNGH—!">>
Your knees buckle. You stumble backward, trip over your own feet, and crash to the floor of the cell. Face-down. Gasping. Your caged cock throbbing in agony against the cold stone.
<<set $player.lust to 60>>
<<set $player.health to Math.max(1, $player.health - 5)>>
For a long moment, you just lie there. Twitching. Trying to breathe through the aftershocks.
You hear Lysara straighten. Hear her footsteps—calm, unhurried—as she walks back to her workbench.
She doesn't say anything. Doesn't acknowledge what just happened.
<<storyVideo "story/lysara_antidote/hour1_peek_2_smiling">>
<<if _storyClip is "2a2798d48ad7" or _storyClip is "ad5531919d83">>But as you lift your head, she's turned on her stool to face the cell.<<else>>But as you lift your head, you catch a glimpse of her face in profile.<</if>>
She's smiling.
<<if _storyClip is "2a2798d48ad7" or _storyClip is "ad5531919d83">>Straight at you, for exactly one breath, lips moving round something too low to carry. Then her eyes slide away and she bends back over her work as though you aren't there.<<else>>Not looking at you. Not acknowledging. Just... smiling to herself as she returns to her work.<</if>>
She knew. She ABSOLUTELY knew.
<<set $flags.lysaraAntidoteRelationship to "watched">>
<<set $temp.antidoteFlirted += 2>>
<p class="warning"><<icon "lust">> You came in the cage. It hurt. A lot. But somehow... worth it?</p>
<div class="choice-container">
<<vchoice "Crawl back to your corner in shame" "Cell_Antidote_Hour2" "action" "night">>
</div>
<<else>>
You shift too far. Your foot scrapes against the stone floor.
<<set _peekFamily to _storyFamily>><<storyVideo "story/lysara_antidote/hour1_peek_3_caught">><<set _storyFamily to _peekFamily>>
<<if _storyClip is "506b2f62e998">>Lysara doesn't straighten. Not at once. Her fingers stay at the hem of her <<if _storyFamily is "sf_cg_lysara_antidote_04">>mesh<<else>>robes<</if>> and draw it up one more slow inch, giving you the full curve of her bare ass on purpose, before she lets it fall.<<elseif _storyFamily is "sf_cg_lysara_antidote_04">>Lysara straightens immediately, tugging the mesh back down over her ass.<<else>>Lysara straightens immediately, robes falling back into place.<</if>> She turns, one eyebrow raised.
<<say "Lysara" "Trying to get a better view?">>
<<say $player.name "I... no. I was just—">>
<<say "Lysara" "Stretching? In that exact position? With your face pressed against the bars?">>
Busted.
<<say "Lysara" "Points for effort. But you'll have to be more subtle than that.">>
She turns back to her work, but you notice her shoulders shaking slightly.
She's laughing at you.
<<set $player.lust to Math.min(100, $player.lust + 10)>>
<div class="choice-container">
<<vchoice "Wait for the next hour" "Cell_Antidote_Hour2" "action" "night">>
</div>
<</if>><<run VaultUI.setBackground("cell")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<<set $temp.antidoteFlirted += 1>>
<<say $player.name "I wasn't NOT watching. Hard to look anywhere else.">>
Lysara's lips twitch. Almost a smile.
<<say "Lysara" "Flattery. From a man in a cage with his cock locked up.">>
<<storyVideo "story/lysara_antidote/hour3__flirt">>
<<if _storyClip is "e06e77ea8c58">>She has buttoned a white blouse over the pink mesh and pulled on black trousers, and she walks toward the bars like a woman arriving for an appointment, hips swaying, the blouse gaping between its buttons.<<else>>She walks toward you, hips swaying deliberately now.<</if>>
<<say "Lysara" "You're either very brave or very stupid.">>
<<say $player.name "Can't it be both?">>
She laughs. A real laugh, surprised out of her.
<<say "Lysara" "I like you. Most men just whimper and beg.">>
<<say $player.name "Give it time. I might still whimper.">>
<<say "Lysara" "I look forward to it.">>
She turns and walks back to her workbench. But there's something different in her posture now. A looseness. Interest.
<<set $player.charm += 1>>
<div class="choice-container">
<<vchoice "Wait for the next hour" "Cell_Antidote_Hour2" "action" "night">>
</div><<run VaultUI.setBackground("cell")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
You avert your eyes quickly. Too quickly.
<<say "Lysara" "Hmm. Modest. Or just embarrassed about the effect I'm having on you?">>
<<storyVideo "story/lysara_antidote/hour1_shy">>
<<if _storyClip is "d5073bc969af">>When you risk a look back, she's at her desk past the bars, reading glasses on, a sheer black blouse over her bra. She peers down at you over the rims. At the cage. At your cock straining against it.<<else>>She glances at the cage. At your cock straining against it.<</if>>
<<say "Lysara" "The antidote is working. But not THAT fast, apparently.">>
<<say $player.name "Can you blame me?">>
<<say "Lysara" "No. The gas makes everything... intense. And I've been told I'm not hard to look at.">>
She returns to her work, leaving you to stare at the ceiling and try not to think about the curve of her ass.
<div class="choice-container">
<<vchoice "Wait for the next hour" "Cell_Antidote_Hour2" "action" "night">>
</div><<run VaultUI.setBackground("cell")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<<set $temp.antidoteFlirted += 1>>
<<say $player.name "You did that on purpose.">>
Lysara pauses. Turns to face you fully.
<<say "Lysara" "Did what on purpose?">>
<<say $player.name "Dropped those vials. Bent over like that. You wanted me to watch.">>
A slow smile spreads across her face.
<<say "Lysara" "And if I did?">>
<<say $player.name "Then you're not as clinical about all this as you pretend to be.">>
She walks to the cell and leans in, close enough that the bars frame her cleavage. Hooks a finger in her neckline and tugs it open. Stops just out of reach.
<<storyVideo "story/lysara_antidote/hour3_watch__accuse" "" "characters/lysara/approach_accuse">>
<<if _storyClip is "3b143b7cc491">>She grips her neckline in both hands and drags it wide, until her tits all but spill out.<<elseif _storyClip is "6c06edd337d6">>Then she lets everything drop and sits down on the low bench just past the bars, naked, knees hugged to her chest, watching you. She leans back and stretches one bare foot toward the bars, toes flexing, just out of reach.<</if>>
<<say "Lysara" "I've been alone down here for a very long time. Centuries. The gas keeps me young, keeps me... hungry.">>
Her eyes drop to your caged cock.
<<say "Lysara" "Is it so wrong to enjoy a little entertainment?">>
<<say $player.name "Entertainment. Is that what I am?">>
<<say "Lysara" "For now.">>
She turns away, but you catch the faintest flush on her cheeks.
<<set $flags.lysaraRevealed to true>>
<div class="choice-container">
<<vchoice "Wait for the next hour" "Cell_Antidote_Hour2" "action" "night">>
</div><<run VaultUI.setBackground("cell")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<<set $temp.cellHours to 2>>
<<advanceTime 1 0>>
<<set $temp.alchemyGasLevel to Math.max(0, $temp.alchemyGasLevel - 15)>>
<<set $player.lust to Math.max(30, $player.lust - 10)>>
<h3>Hour 2 of 3</h3>
The ache is fading. Slowly. Your thoughts are clearer now, though your cock still throbs in its cage.
Footsteps. Lysara appears at the cell bars.
<<say "Lysara" "I need to check your vitals.">>
<<say $player.name "My vitals?">>
<<say "Lysara" "The antidote can have side effects. Elevated heart rate. Shortness of breath.">>
She produces a small crystal that pulses with soft light.
<<say "Lysara" "Hold still.">>
<<storyVideo "characters/lysara/clinical_exam">>
<<if _storyClip is "dd8c03746118">>She reaches through the bars, cinches a cuff around your arm and squeezes the bulb. Once. Twice. Watching your face, not the needle, like the pressure is the interesting part. Her other hand rests on your arm. Lingers.<<elseif _storyClip is "5229aaf96435">>She sets the crystal aside, hooks a listening tube into her ears and reaches through the bars to press the cold bell to your chest. Her eyes drift shut while she counts, and she smiles at whatever your heart is confessing, her fingertips still resting on your skin long after the count is done.<<else>>She reaches through the bars. The crystal hovers over your chest—but her fingers brush your skin. Linger.<</if>>
<<say "Lysara" "Hmm. Heart rate elevated. But that could be the gas. Or...">>
Her hand drifts lower. Across your stomach.
<<say "Lysara" "...something else.">>
<<set $player.lust to Math.min(100, $player.lust + 20)>>
<div class="choice-container">
<<vchoice "\"Your bedside manner needs work.\"" "Cell_Antidote_Hour2_Tease" "intimate" "lips">>
<<vchoice "\"You don't need an excuse to touch me.\"" "Cell_Antidote_Hour2_Direct" "intimate" "charm">>
<<vchoice "Hold perfectly still" "Cell_Antidote_Hour2_Still" "action" "will">>
</div><<run VaultUI.setBackground("cell")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<<set $temp.antidoteFlirted += 1>>
<<say $player.name "Your bedside manner needs work. Usually doctors don't feel up their patients.">>
<<say "Lysara" "I'm not a doctor. I'm an alchemist. We have different... standards.">>
<<storyVideo "characters/lysara/clinical_exam_tease">>
<<if _storyClip is "dd8c03746118">>She cinches a cuff round your arm through the bars and pumps the bulb, smiling, laughing softly, while your pulse gives you away.<<elseif _storyClip is "7de55c6b077e">>She has her reading glasses on now and a sheer black blouse, and she leans in over the crossbar, red nails walking down your thigh to the cage. Her tongue flicks out and licks the steel once, just to see what your cock does about it.<<else>>Her fingers trace lazy circles on your stomach. Just above the cage.<</if>>
<<say $player.name "Is this standard procedure for all your test subjects?">>
<<say "Lysara" "No.">>
She meets your eyes.
<<say "Lysara" "Most of them aren't interesting enough to bother with.">>
<<say $player.name "And I am?">>
<<say "Lysara" "You haven't screamed. Haven't begged. Haven't tried to bargain or threaten.">>
<<if _storyClip is "dd8c03746118">>She strips the cuff off your arm.<<else>>Her hand withdraws. She tucks the crystal away.<</if>>
<<say "Lysara" "You just... endure. And flirt. It's refreshing.">>
<<say $player.name "Years of practice.">>
<<say "Lysara" "At enduring? Or flirting?">>
<<say $player.name "Both.">>
She laughs softly and walks away. But she glances back over her shoulder before she disappears.
<<set $player.charm += 1>>
<div class="choice-container">
<<vchoice "Wait for the final hour" "Cell_Antidote_Hour3" "action" "night">>
</div><<run VaultUI.setBackground("cell")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<<set $temp.antidoteFlirted += 2>>
<<say $player.name "You don't need an excuse to touch me.">>
Her hand freezes on your stomach.
<<say "Lysara" "What?">>
<<say $player.name "The crystal. The 'vitals check.' You're not fooling anyone.">>
She doesn't pull away. If anything, her fingers press harder against your skin.
<<say "Lysara" "You're very confident for a man in a cage.">>
<<say $player.name "The cage comes off eventually. And when it does...">>
You let the sentence hang.
<<say "Lysara" "When it does... what?">>
<<say $player.name "I guess we'll find out.">>
Her breath catches. Just barely. But you notice.
<<storyVideo "characters/lysara/clinical_exam_direct">>
<<say "Lysara" "One more hour.">>
<<if _storyClip is "6c24724a1e5a">>Her hand withdraws slowly, reluctantly. She scribbles a line on her clipboard, then looks straight back at you over it and smiles, as if she has just written down exactly where you're weakest.<<elseif _storyClip is "924545699274">>Her hand withdraws. She sinks onto the low couch past the bars in a white blouse unbuttoned halfway down her tits and a black pencil skirt, crosses her legs, and laughs into her palm, too loud and too quick.<<else>>Her hand withdraws slowly. Reluctantly.<</if>>
<<say "Lysara" "Try not to do anything... stupid.">>
She walks away. Her stride is different now. Hurried. Flustered.
<<set $player.charm += 2>>
<div class="choice-container">
<<vchoice "Wait for the final hour" "Cell_Antidote_Hour3" "action" "night">>
</div><<run VaultUI.setBackground("cell")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
You hold perfectly still. Don't react to her touch. Don't give her the satisfaction.
Her fingers pause on your stomach.
<<say "Lysara" "No response? The antidote must be working well.">>
<<say $player.name "Or maybe I'm just patient.">>
<<say "Lysara" "Patient.">>
She withdraws her hand. Studies you with new interest.
<<say "Lysara" "Most men would have grabbed me by now. Tried to pull me against the bars. Begged for release.">>
<<say $player.name "Would that have worked?">>
<<say "Lysara" "No. But they always try anyway.">>
She tucks the crystal away and scribbles something on her chart. Holds it up—angled so you can't read it.
<<storyVideo "characters/lysara/clinical_exam_still">>
<<say "Lysara" "You're... different. I'm not sure if that's good or bad yet.">>
<<say $player.name "Give it time.">>
She walks away without another word. But you notice she keeps glancing back at your cell.
<div class="choice-container">
<<vchoice "Wait for the final hour" "Cell_Antidote_Hour3" "action" "night">>
</div><<run VaultUI.setBackground("cell")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<<set $temp.cellHours to 3>>
<<advanceTime 1 0>>
<<set $temp.alchemyGasLevel to 0>>
<<set $player.lust to Math.max(25, $player.lust - 5)>>
<h3>Hour 3 of 3</h3>
Almost there.
The fire in your blood has cooled to warm embers. Your cock has softened slightly—still larger than before the gas, but no longer straining painfully against the cage.
You hear something from the laboratory. Soft. Rhythmic.
Breathing?
No. Something else.
You press against the bars to look.
<<storyVideo "characters/lysara/masturbate">>
<<if _storyClip is "b71bd2442743">>Lysara lies back on the cot in her alcove, robes gone, pink lingerie pulled down off her tits, stockings still on. One hand squeezes her tit. The other...
The other is between her legs. Moving.<<else>>Lysara lies back on the cot in her alcove, robes open. One hand squeezes her tit. The other...
The other is hidden beneath her robes. Moving.<</if>>
<<say "Lysara" "Mmm...">>
She's touching herself. Right there. Thinking you can't see.
<<if $temp.antidoteFlirted >= 2>>
Or maybe she KNOWS you can see. Maybe that's the point.
<</if>>
Her hips rock slightly. Her head tilts back. A soft moan escapes her lips.
<<say "Lysara" "Ah... yes...">>
<<set $player.lust to Math.min(100, $player.lust + 25)>>
<div class="choice-container">
<<vchoice "Watch in silence" "Cell_Antidote_Hour3_Watch" "intimate" "eye">>
<<vchoice "\"Enjoying yourself?\"" "Cell_Antidote_Hour3_Interrupt" "intimate" "lips">>
<<vchoice "Clear your throat loudly" "Cell_Antidote_Hour3_Cough" "talk" "alert">>
</div><<run VaultUI.setBackground("cell")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<<run document.body.classList.add("scene-mode-intimate")>>
<<storyVideo "characters/lysara/masturbate_watch">>
You watch. Silent. Transfixed.
Her movements grow faster. More urgent. Her moans fill the laboratory—soft, breathy sounds that make your cock throb despite the antidote.
<<say "Lysara" "Oh... oh gods...">>
<<if _storyClip is "76cc41b91820" or _storyClip is "aedff292c58f">>She has a black bodysuit on under the open robes, the crotch hooked aside, and she works a thick dark toy into herself with one fist, slow and deep, the shaft coming out glossy on every stroke. Her thighs tremble.<<else>>Her hand squeezes her tit harder. Her thighs tremble.<</if>>
<<say "Lysara" "Yes... yes... ah—!">>
She cums. Shuddering. Gasping. Her whole body tensing and then releasing.
<<if _storyClip is "76cc41b91820" or _storyClip is "aedff292c58f" or _storyClip is "2190be293bf5" or _storyFamily is "sf_cg_lysara_antidote_04">>For a long moment, she just lies there, catching her breath.<<else>>For a long moment, she just stands there, catching her breath.<</if>>
Then she turns.
Her eyes find yours. She doesn't look surprised. Doesn't look embarrassed.
<<say "Lysara" "How long were you watching?">>
<<say $player.name "Long enough.">>
<<say "Lysara" "Did you enjoy it?">>
<<say $player.name "What do you think?">>
You gesture at the cage. At your cock, now fully hard again, straining against the metal.
<<say "Lysara" "Hmm. The antidote should have calmed that by now.">>
<<if _storyClip is "76cc41b91820" or _storyClip is "aedff292c58f">>She walks toward the cell, tugging the black bodysuit back into place.<<elseif _storyClip is "2190be293bf5" or _storyFamily is "sf_cg_lysara_antidote_04">>She walks toward the cell, tugging her pink lingerie back up over her tits.<<else>>She walks toward the cell, straightening her robes.<</if>>
<<say "Lysara" "Unless something ELSE is causing it.">>
<<set $flags.lysaraAntidoteRelationship to "watched">>
<<run document.body.classList.remove("scene-mode-intimate")>>
<div class="choice-container">
<<vchoice "\"Three hours is up.\"" "Cell_Antidote_Complete" "action" "time">>
</div><<run VaultUI.setBackground("cell")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<<set $temp.antidoteFlirted += 1>>
<<say $player.name "Enjoying yourself?">>
Lysara freezes. Her hand yanks out from under her robes.
<<say "Lysara" "I was—I was just—">>
<<say $player.name "I know what you were doing.">>
She turns to face you, then buries her face in her hands. There's color in her cheeks now. Actual embarrassment.
<<storyVideo "characters/lysara/flustered">>
<<say "Lysara" "The gas affects me too. I told you. I need... release. Regularly.">>
<<say $player.name "And you decided to do it right there? Where I could see?">>
<<say "Lysara" "I didn't think you were watching.">>
<<say $player.name "You knew exactly where I was.">>
Silence. She doesn't deny it.
<<say $player.name "You wanted me to watch.">>
<<say "Lysara" "...Maybe.">>
She approaches the cell. Her composure is cracking now—the cool, clinical alchemist replaced by something more human. More hungry.
<<say "Lysara" "It's been a long time since I've had anyone worth... performing for.">>
<<set $flags.lysaraAntidoteRelationship to "embarrassed">>
<div class="choice-container">
<<vchoice "\"Three hours is up.\"" "Cell_Antidote_Complete" "action" "time">>
</div><<run VaultUI.setBackground("cell")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
You clear your throat. Loudly.
Lysara jerks upright on the cot, her hand snapping out from under her robes.
<<say "Lysara" "How much did you—">>
<<say $player.name "Enough.">>
She composes herself quickly. Sits. Snatches up a folder and leafs through it, as if the pages might explain what you just watched her do. Lifts her chin.
<<storyVideo "characters/lysara/flustered_cough">>
<<say "Lysara" "The gas has side effects. I need to... manage them. Regularly.">>
<<say $player.name "I'm not judging.">>
<<say "Lysara" "You wouldn't dare.">>
But there's a crack in her armor now. A vulnerability she's trying to hide.
<<say $player.name "Three hours should be up. Can I get out of this cage now?">>
<<say "Lysara" "...Yes. The antidote has done its work.">>
She produces the key. Her hand trembles slightly.
<<say "Lysara" "Come. Let's get this over with.">>
<<set $flags.lysaraAntidoteRelationship to "distant">>
<div class="choice-container">
<<vchoice "Follow her" "Cell_Antidote_Complete" "action" "time">>
</div><<run VaultUI.setBackground("cell")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
The three hours are up.
<<if $temp.antidoteFlirted >= 3>>
And something has shifted between you. The clinical distance Lysara maintained at the start has eroded. She looks at you differently now—less like a test subject, more like... something else.
<<if !$flags.lysaraAntidoteRelationship || $flags.lysaraAntidoteRelationship is "embarrassed">>
<<set $flags.lysaraAntidoteRelationship to "intrigued">>
<</if>>
<<elseif $temp.antidoteFlirted >= 1>>
The tension in the air is thick enough to cut. Whatever game you've been playing, it's reaching its climax.
<<else>>
Lysara approaches the cell, key in hand. Her face is flushed, her breath slightly uneven.
<<if !$flags.lysaraAntidoteRelationship>>
<<set $flags.lysaraAntidoteRelationship to "distant">>
<</if>>
<</if>>
<<say "Lysara" "The gas should be purged from your system. Mostly.">>
<<storyVideo "characters/lysara/amb_cell_unlock">>
She unlocks the cell door.
<<say "Lysara" "But there's one more thing I need to check before I remove the cage.">>
<<say $player.name "What's that?">>
<<say "Lysara" "Whether you've learned any self-control.">>
She steps into the cell with you. Close. Her perfume mixing with something muskier—her arousal.
<<say "Lysara" "The gas binds to sexual fluids. The fastest way to purge the last traces is...">>
She pauses. Her eyes drop to the cage.
<<say "Lysara" "...extraction.">>
<<if $temp.antidoteFlirted >= 2>>
<<say $player.name "Is that your professional opinion? Or are you just looking for an excuse?">>
<<say "Lysara" "Both.">>
She doesn't even try to hide it anymore.
<<else>>
<<say $player.name "You want to—">>
<<say "Lysara" "I NEED to. For your safety.">>
Her voice is steady. Her eyes are not.
<</if>>
<div class="choice-container">
<<vchoice "\"Then extract away.\"" "Cell_Time_Complete" "intimate" "lips">>
</div><<run VaultUI.setBackground("cell")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<<advanceTime 8 0>>
<h2>Awakening</h2>
<<storyVideo "characters/lysara/amb_cell_wake">>
Consciousness returns slowly. Then pain hits.
Your cock is on FIRE.
You look down and—
<<say $player.name "What— WHAT THE FUCK?!">>
You're in a cell. Iron bars. Stone walls. And around your cock—
A chastity cage. Metal. Tight. Your cock is still massive and it's trying to get erect inside the cage but it CAN'T. The pain is excruciating.
<<storyVideo "characters/lysara/cell_caged_agony">><<set _cagedClip to _storyClip>>
<<set $temp.inChastity to true>>
<<clampStat "player.health" -10 0 100>>
<<say $player.name "HELLO?! SOMEONE?! HELP!">>
Footsteps. The clicking of heels on stone.
A woman walks out of the shadows toward the bars: a tight red skirt, a black corset showing through a sheer black blouse, little round glasses, gold chains at her throat.
<<storyVideo "characters/lysara/approach">>
<<run VaultUI.showCharacter("lysara", "center", "neutral")>>
And she is... breathtaking.
Curves that defy physics. Tits so large they strain against her corset. Hips that sway hypnotically. Long hair like liquid midnight. Blue eyes that miss nothing.
Looking at her makes the cage HURT MORE.
<<say $player.name "Who— who are you? Let me out! Take this thing off!">>
She stops just outside the bars, studying you with amusement.
<<say "Lysara" "Mmm. You're conscious. Good. I was beginning to think I used too much gas.">>
<<say $player.name "You did this?! Why?!">>
<<say "Lysara" "I'm Lysara. This is my laboratory. And you triggered my security system.">>
<<if _cagedClip is "01d28795441d">>She reaches through the bars, cups the cage in her palm and turns it to the light, then taps the steel with one dark-lacquered nail, the way you'd tap a jar to see whether the specimen inside is still alive.<<else>>She gestures at your caged cock.<</if>>
<<say "Lysara" "The cage is for my protection. And yours, frankly.">>
<<say $player.name "My PROTECTION? I'm in AGONY!">>
<<say "Lysara" "Yes. The alternative is worse.">>
She moves closer to the bars, and you can smell her. Flowers and musk and something that makes your caged cock THROB.
<<set $player.lust to Math.min(100, $player.lust + 30)>>
<<say "Lysara" "The gas you inhaled is called Lust's Awakening. It amplifies arousal a hundredfold. Transforms the body to match the need.">>
She glances at your massive, caged cock.
<<say "Lysara" "The last time someone triggered the trap, I felt pity. I removed his cage to ease his suffering.">>
Her expression darkens.
<<say "Lysara" "He used me for four days straight. Couldn't stop. His mind was gone. Just animal need.">>
<<say $player.name "I wouldn't—">>
<<say "Lysara" "You would. You'd have no choice. The gas doesn't ASK.">>
She produces a vial from between her impressive cleavage. The liquid inside is clear with a faint blue shimmer.
<<say "Lysara" "This is the antidote. It will purge the gas from your system in about three hours.">>
<<say $player.name "Give it to me!">>
<<say "Lysara" "There's another option. You can wait. The gas metabolizes naturally in about five days. The cage will keep you... contained... until then.">>
<<say $player.name "FIVE DAYS?!">>
<<say "Lysara" "Your choice. Quick relief with the antidote... or five days of exquisite agony.">>
She smiles, and it's beautiful and terrible.
<<say "Lysara" "Some men have chosen the agony. They say it's... transformative.">>
<<set $flags.lysaraIntroduced to true>>
<<set $flags.givenAntidoteChoice to true>>
<div class="choice-container">
<<vchoice "Take the antidote" "Cell_Take_Antidote" "action" "potion">>
<<vchoice "Refuse. Endure the five days." "Cell_Refuse_Antidote" "action" "will">>
</div><<if setup.lysaraArcDone()>>
<<if setup.lysaraDoorElixirDue()>>
<<goto "Lysara_Return_Locked">>
<<else>>
<<goto "Alchemy_Lab_Visit">>
<</if>>
<<elseif setup.lysaraDoorShut()>>
<<goto "Lysara_Reset_Locked">>
<<elseif $flags.lysaraVisitReset>>
<<set $flags.lysaraVisitReset to false>>
<</if>>
<<run VaultUI.setBackground("alchemy_lab")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<h2>The Hidden Passage</h2>
<<storyVideo "characters/lysara/amb_lab_passage">>
The passage slopes downward, carved from the bedrock beneath the vault. Ancient. Far older than the vault itself.
Dim lights flicker to life as you walk—automated systems still functioning after all this time.
The chemical smell grows stronger. Sweet. Almost pleasant.
<<say $player.name "Hello? Is anyone here?">>
No answer. Just the hum of old machinery.
You round a corner and find yourself in a laboratory. Glass containers line the walls, filled with strange liquids. A workbench covered in alchemical equipment. And in the corner—
Wait. Is that a fleshlight?
Before you can process that oddity, you step on something.
<p class="sound-effect">//CLICK//</p>
<<say $player.name "Shit—">>
<p class="sound-effect">//HISSSSSS//</p>
Pink gas erupts from vents in the floor, engulfing you.
<div class="choice-container">
<<vchoice "Hold your breath! Run!" "Alchemy_Lab_Try_Escape" "action" "run">>
<<vchoice "Cover your face!" "Alchemy_Lab_Try_Cover" "action" "shield">>
</div><<storyVideo "characters/lysara/amb_gas_trap">>
Too late.
You've already inhaled. The gas is inside you.
You make it three steps before your knees buckle.
<div class="choice-container">
<<vchoice "..." "Alchemy_Lab_Gas_Effect" "danger" "alert">>
</div>You pull your shirt over your nose and mouth, but you already breathed some in.
<<storyVideo "characters/lysara/amb_gas_trap">>
The gas continues to pour. You can't hold your breath forever.
Eventually, you have to inhale.
<div class="choice-container">
<<vchoice "..." "Alchemy_Lab_Gas_Effect" "danger" "alert">>
</div><<run VaultUI.setBackground("alchemy_lab")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<<run document.body.classList.add("scene-mode-intimate")>>
<h2>The Gas Takes Hold</h2>
Heat.
Your entire body BURNS with heat. Not painful—pleasurable. Overwhelmingly, impossibly pleasurable.
<<set $player.lust to 100>>
<<set $temp.alchemyGasLevel to 100>>
<<set $flags.exposedToLustGas to true>>
Your cock THROBS. You look down and—
<<say $player.name "What the FUCK—">>
Your pants are straining. Ripping. Your cock is GROWING. Thickening. Lengthening.
When it finally stops, it's... it's HUGE. Four times its normal size. A monster between your legs.
And it NEEDS. It needs so badly it hurts.
Your muscles are swelling too. Bulging. You feel STRONG. Primal. Like an animal in heat.
<<set $temp.transformedBody to true>>
<p class="internal-thought">Can't think. Can't think. Need to cum. NEED TO CUM.</p>
Your hand wraps around your massive cock. You stroke frantically.
<<storyVideo "characters/lysara/gas_transformation_stroke">>
<<say $player.name "Fuck fuck fuck—">>
You cum. But it doesn't help. If anything, it makes the need WORSE.
Through the pink haze, you see it. The fleshlight in the corner. Some rational part of your brain wonders why it's there.
The rest of your brain doesn't care.
<div class="choice-container">
<<vchoice "Stumble toward the fleshlight" "Alchemy_Lab_Fleshlight" "intimate" "high-arousal">>
</div><<run VaultUI.setBackground("alchemy_lab")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<<advanceTime 0 20>>
You fall to your knees in front of the fleshlight. It's mounted on some kind of stand. Sized perfectly for—
You don't think. You THRUST.
Your monster cock slides into the artificial pussy. Tight. Warm. Something inside it VIBRATES.
<<storyVideo "characters/lysara/fleshlight_trap">>
<<if _storyClip is "a2a543852661">>You don't stay on your knees. You're up, the thing wedged on the lip of her workbench, one hand clamping it to the wood while your hips slam into it.<</if>>
<<say $player.name "AHHH—">>
You fuck it like a man possessed. Because you ARE possessed. By lust. By need. By whatever the fuck was in that gas.
You cum. Again. And again. But it's never enough.
At some point, you pass out. Still buried in the fleshlight. Still hard. Still needing.
The last thing you see before darkness takes you is a pair of feet approaching.
Feminine feet.
<<run document.body.classList.remove("scene-mode-intimate")>>
<div class="choice-container">
<<vchoice "..." "Alchemy_Lab_Wake_Cell" "action" "night">>
</div><<run VaultUI.setBackground("alchemy_lab")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<h2>The Hidden Passage</h2>
The passage slopes down into the bedrock, the way you remember it. At the bottom, the door to the laboratory.
<<storyVideo "story/mv_lysara/return_2_locked">>
You try the handle. Locked.
No light under the door. No sound behind it. Not even the hum of the old machines.
<div class="choice-container">
<<vchoice "Return to the Archives" "Archives_Search_Start" "move" "back">>
</div><<run VaultUI.setBackground("alchemy_lab")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<h2>The Hidden Passage</h2>
<<storyVideo "story/mv_lysara/return_passage">>
The passage slopes downward, familiar now. You've walked this path before.
The chemical smell is fainter than you remember. Or perhaps you've simply grown accustomed to it.
<p>You pass the spot where the gas trap triggered—the vents are silent now. Either disabled or... satisfied.</p>
The laboratory comes into view. Glass containers. Workbenches. The fleshlight stand, mercifully empty.
And at the far end—the reinforced door that leads to Lysara's private quarters.
<<storyVideo "story/mv_lysara/return_2_locked">>
<p>You approach. Try the handle.</p>
<p class="sound-effect">//CLICK//</p>
<p>Locked.</p>
<<if $flags.kiraIsUnconscious && $flags.kiraResurgenceUsed && !$flags.hasResurgenceElixir>>
<p>But something is different this time.</p>
<<storyVideo "story/mv_lysara/return_3_note">>
<p>A small metal box sits on the floor beside the door. It wasn't here before.</p>
<p>You crouch down. The box is unlocked. Inside, nestled in velvet padding:</p>
<p>A vial of shimmering liquid. You recognize it immediately—the Resurgence Elixir.</p>
<p>A note accompanies it, in that familiar elegant script:</p>
<div class="journal-entry" style="font-style: italic; border-left: 3px solid var(--accent-purple); padding-left: 1em; margin: 1.5em 0;">
"Subject <<print $player.name>>—
I am aware your companion requires... maintenance. Consider this a professional courtesy.
The price for this elixir will be collected in due time. I have added it to your account.
You will find that debts to me are not so easily escaped. But that is a conversation for another day.
Use it. Save her. Then return to me when I call.
— L.
P.S. — Do try to keep her conscious this time. Replacement elixirs are tedious to prepare, and my patience for charity is... finite."
</div>
<p class="internal-thought">She knows. Of course she knows. She always knows.</p>
<div class="choice-container">
<<vchoice "Take the elixir" "Lysara_Take_Second_Elixir" "action" "pickup">>
<<vchoice "Leave it (for now)" "Archives_Search_Start" "move" "back">>
</div>
<<else>>
<<storyVideo "story/mv_lysara/return_3_note">>
<<if _storyClip is "36779597e691">>A note lies on the little table beside the door, squared neatly to its edge.<<else>>A note is affixed to the door.<</if>> Elegant handwriting you recognize:
<div class="journal-entry" style="font-style: italic; border-left: 3px solid var(--accent-purple); padding-left: 1em; margin: 1.5em 0;">
"Subject <<print $player.name>>—
Your debt is not yet due. Your... contributions have been noted and catalogued.
When I require further samples, you will know. The vault has ways of delivering what I need.
Do not attempt to force entry. The consequences would be... educational.
Until our next session,
— L."
</div>
<p>You try the handle again. It doesn't budge. Something tells you forcing it would be a very bad idea.</p>
<p class="internal-thought">She'll call for me when she's ready. Until then...</p>
<div class="wip-notice-detailed">
<strong>⚠ WORK IN PROGRESS</strong><br><br>
Lysara's return content is under development.<br>
Additional storylines, experiments, and... arrangements coming soon.<br><br>
<em>Check back in a future update.</em>
</div>
<div class="choice-container">
<<vchoice "Return to the Archives" "Archives_Search_Start" "move" "back">>
</div>
<</if>><<run VaultUI.setBackground("alchemy_lab")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<h2>The Elixir</h2>
You take the vial carefully. The liquid inside pulses with a faint inner light—alive, somehow.
<<set $flags.hasResurgenceElixir to true>>
<<if !setup.ownsItem("resurgence elixir")>><<run setup.giveItem("resurgence elixir", 1)>><</if>>
<<set $flags.lysaraDebtIncurred to ($flags.lysaraDebtIncurred || 0) + 1>>
<<journalAdd "Kira's down again. Found another elixir waiting in a box outside Lysara's locked door, with a note. 'Added to your account.' She knew before I did. She always does." "story">>
<p>The moment your fingers close around it, you feel a strange warmth spread through your palm. Recognition. The elixir knows what it's for.</p>
<p class="success">Obtained: Resurgence Elixir</p>
<p>The box is empty now. You wonder if it will refill itself the next time you need it, or if Lysara will demand something more... personal.</p>
<p class="internal-thought">Kira. I need to get back to Kira.</p>
<div class="wip-notice-detailed">
<strong>⚠ WORK IN PROGRESS</strong><br><br>
Full storyline for Lysara's "debt collection" coming in a future update.<br>
For now, use the elixir on Kira to wake her.<br><br>
<em>The price will be paid... eventually.</em>
</div>
<div class="choice-container">
<<vchoice "Return to the Vault" "Vault_Hub" "move" "forward">>
</div><<run VaultUI.setBackground("cell")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<<set $temp.dayActions += 1>>
<<set $temp.lysaraEncounters += 1>>
<<advanceTime 1 0>>
<<set $player.lust to 100>>
<h3>Laboratory Accident</h3>
Lysara is at her workbench. Mixing compounds with practiced precision.
You watch through the bars. The gas makes it impossible not to stare at the curve of her back, the way her hips shift when she reaches for ingredients, the glimpse of ankle when her robes shift.
She's positioned at an angle. There's a small polished mirror on her desk—decorative, or so it seems. The reflection shows...
Her eyes. Looking at you. In the mirror.
She's watching you watch her.
You blink. Look again. But she's adjusted something. The mirror angle changed. Now it just shows her work. Innocent.
<p class="internal-thought">Was that...? No. The gas is making you paranoid. Seeing things.</p>
<<say "Lysara" "Stabilizing agent next. Just a few drops...">>
She's narrating to herself. Completely absorbed.
She tips a blue vial over a beaker. One drop. Two. Three.
Reaches for a green bottle. Measures carefully.
<<say "Lysara" "Equal parts catalyst to base. This should—">>
She pours.
The mixture HISSES.
<<say "Lysara" "Wait— that's not the right—">>
<p class="sound-effect">//FWOOSH//</p>
The compound ERUPTS from the beaker. A geyser of liquid shooting upward.
It hits her full in the face and chest. She stands there, stunned, as thick liquid sheets down over her tits, glossing them, running down her belly in slow ropes.
<<storyVideo "characters/lysara/cascade_drool_t1">>
<<say "Lysara" "AH— MY EYES!">>
She stumbles backward, hands flying to her face. Thick liquid streams down her cheeks, her neck, soaking into her robes between her breasts.
You watch it run in rivulets down her throat. The way it disappears into her cleavage. The gas makes every detail sharp, visceral, impossible to ignore.
<<say "Lysara" "No no no— not in my EYES— I can't—">>
She's pawing at her workbench. Blind. Knocking over vials. Glass tinkles to the floor.
<<say "Lysara" "Cloth— where did I— can't see anything—">>
She's panicking now. Blinking rapidly. Tears streaming, mixing with the compound. The liquid keeps dripping from her hair in slow, thick streams.
You watch it slide down her face. Down her neck. The curve of her throat glistening. One drop reaches her collarbone, pauses, then continues its journey downward.
She finally finds a cloth. Wipes frantically at her eyes. But the compound in her hair keeps dripping down. Fresh streams running down her face, following the same paths. Down her throat. Between her breasts. Lower.
<<say "Lysara" "I can't— everything's so blurry— the chemical burn—">>
She's blinking. Squinting. One hand still pressed to her eyes.
Then she touches her mouth with her other hand. Her expression shifts.
<<say "Lysara" "Why is my mouth... it feels strange...">>
<<storyVideo "story/lysara_drool/t1_3_drool_starts">>
<<if _storyClip is "ed5d09c2ef21">>Saliva. Drool spills from her lips and runs down over her breasts in a slick sheet. Glistening. Thick.<<else>>Saliva. A strand of drool escapes her lips. Glistening. Thick.<</if>>
<<say "Lysara" "What— I don't— why am I—">>
More drool. She tries to swallow but it immediately wells up again. Overflowing.
<<say "Lysara" "My salivary glands— they're— I can't control—">>
The drool runs down her chin. Joins the compound still dripping from her face. Twin streams flowing down her throat.
<<say "Lysara" "The vials I mixed— one must have been— oh gods—">>
She's trying to wipe the drool but more instantly replaces it. Both corners of her mouth now. Constant production.
<<say "Lysara" "Salivation catalyst. It hyperstimulates production. And if it mixed with the aphrodisiac base—">>
She touches the drool on her chin with trembling fingers. Examines it. Even half-blind she can tell.
<<say "Lysara" "The drool. It's contaminated. Anyone who contacts this will— the concentration is—">>
More drool escapes. She can't keep her mouth closed anymore. It pools on her tongue, overflows, runs freely down her chin in thick strands.
You watch it drip. Can't look away. One strand stretches from her lip toward her chest, lengthening, finally breaking and splashing between her breasts. The gas makes you notice every detail. The thickness. The way it glistens. How it soaks into fabric.
She looks toward your cell. Squinting. Barely able to see.
<<say "Lysara" "You're already under gas influence. If my contaminated saliva mixes with your system, the synergy could— you could lose all control—">>
She tries to move away from the cell but stumbles. Half-blind. One hand still pressed to her injured eyes. The other wiping uselessly at the constant drool.
<<say "Lysara" "I need the neutralizer. Top shelf. But I can't see where—">>
She's groping blindly along the shelves. Knocking things over. Moving in the wrong direction. Closer to your cell instead of away.
<<say "Lysara" "Where is it? Everything's just shapes— blurry shadows—">>
Her hand finds the bars of your cell. She uses them to steady herself.
<<say "Lysara" "Oh. Is this— am I at the cell? I can't tell—">>
Drool drips from her chin onto the floor. Some of it splatters onto the bars. Inches from you.
<<say "Lysara" "I need to move away. Find the shelf. But I don't know which direction—">>
She's feeling along the bars. Using them to orient herself. Moving closer. Drool constantly streaming from her mouth.
<<say "Lysara" "I just need to get my bearings. Figure out where I am relative to—">>
<<storyVideo "story/lysara_drool/t1_4_at_bars">>
<<if _storyClip is "b5fc860b2993">>She's right there now. Her face fills the gap between the bars, flushed and slick, lips wet and shining, squinting at you like you're a blur she's trying to bring into focus. Her soaked robe has fallen open and she hasn't noticed. You can smell the compound on her. Sweet. Chemical. The gas in your system ROARS at the proximity.<<else>>She's right there now. Face near the bars. You can smell the compound on her. Sweet. Chemical. The gas in your system ROARS at the proximity.<</if>>
You can see drool pooling on her lower lip. Building. About to drip.
<<say "Lysara" "Can you see the neutralizer from there? Top shelf? I'd be so grateful if you could just tell me where to—">>
She's close enough to grab. Her blind face inches from the bars. Drool on her lips. The gas screams at you to TAKE.
<div class="choice-container">
<<vchoice "Grab her" "Cell_Lysara_Drool_Kiss" "intimate" "grab">>
</div><<run VaultUI.setBackground("cell")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<<run document.body.classList.add("scene-mode-intimate")>>
<<set $temp.dayActions += 1>>
<h3>Through the Bars</h3>
She's RIGHT THERE. Blind. Drooling. Vulnerable. Still asking about the neutralizer.
The gas has you. You don't think. You ACT.
Your hand shoots through the bars. Grabs the back of her head.
<<say "Lysara" "What— what are you—">>
You PULL. Her face slams against the bars. Your lips find hers.
<<storyVideo "story/lysara_drool/kiss" "" "characters/lysara/kiss">>
<<say "Lysara" "NO— I was just asking for— MMPH—">>
Her drool floods your mouth. Warm. Sweet. Thick. Chemical fire that tastes like honey and poison.
You kiss her harder. The bars dig into both your faces but you don't care. You're drinking her drool. Swallowing it. The gas demands you take EVERYTHING.
<<say "Lysara" "Stop— let go— I couldn't see how close— didn't know you could reach—">>
She tries to pull away but your grip is iron. The gas has made you strong. Desperate. You hold her there and drink from her mouth like she's water and you're dying.
The aphrodisiac in her drool hits your system. Instant.
Your cock EXPLODES against the cage. Not growing—just raw sensation spiking beyond tolerance.
<<say $player.name "FUCK—">>
You cum. Still kissing her. Still holding her blind face to the bars. The orgasm rips through you—violent, endless, agonizing in the cage's grip.
Your hips buck. The cage bites. You're cumming and screaming into her mouth.
<<say "Lysara" "Oh god— you're— I can feel you shaking—">>
<<set _dkSpitClip to _storyClip>><<storyVideo "story/lysara_drool/kiss_2_spit">><<set _dkSpitNew to _storyClip>><<set _storyClip to _dkSpitClip>>
She's kissing you back now. Can't help it. Or won't help it. Her tongue meets yours. Shares the drool.
<<if _dkSpitNew is "d790086415b1">>Then she twists in your grip, and your mouth slides off hers and down her jaw to her throat. You lick the drool off her neck while your free hand finds her tit through the soaked shift, and her own hand drops between her thighs and stays there.<<elseif _dkSpitNew is "1e5ebf2959ac">>For a few heartbeats the gas runs ahead of the kiss: her slick fist on your cock, bare, no cage, pumping it slow while her tongue works your mouth. Then the steel bites, and it's only her mouth again.<</if>>
<<if _storyClip is "1ac4bd1fb6dc">>She sags into you. One bare leg hooks up through the bars and locks round the back of your thighs, dragging you closer.<</if>>
The orgasm goes on. And on. The contaminated saliva is prolonging it. Making it MORE.
When you finally release her, you collapse against the back wall of the cell. Gasping. Shaking. The cage is a mess of cum. Your cock is still twitching.
She stumbles backward. One hand on the bars for balance. The other touching her lips.
<<say "Lysara" "You— you just— I couldn't see—">>
Her breathing is ragged. Her lips are swollen. Glistening with shared drool.
<<say "Lysara" "I didn't know I was that close. I was just asking for directions. And you... you grabbed me.">>
<<say "Lysara" "The gas made you lose control. You saw me vulnerable— blind, drooling— and you couldn't help yourself.">>
She touches her mouth again. Drool still escaping. Still flowing.
<<say "Lysara" "I should have been more careful. Kept better distance. But I couldn't see. I didn't know you were... reaching distance.">>
She's building the narrative. Innocent blind woman attacked by gas-crazed prisoner.
<<say "Lysara" "The contaminated drool. You swallowed so much. Did it affect you? Or was that orgasm purely from the gas?">>
<<say $player.name "I don't... I can't tell anymore...">>
<<say "Lysara" "Neither can I. The chemistry is too complex now. Your gas. My contamination. We're both compromised.">>
She produces another cloth. Wraps it around her eyes. A proper blindfold now.
<<say "Lysara" "I need to bandage my eyes. Speed the healing. Which means I'll be truly blind for the next day or so.">>
She ties it securely. Now she can't see at all. "Can't see."
<<say "Lysara" "I'll have to trust you to warn me. If I get too close to the bars again. Since I can't see where you are.">>
A pause. She's testing you.
<<say "Lysara" "I hope the gas doesn't make you... opportunistic. Taking advantage of a disabled woman would be quite cruel.">>
She turns away. Starts feeling her way back to her workbench. The blindfold firmly in place.
The drool keeps flowing. Running down her body in constant streams.
<<say "Lysara" "The contamination hasn't stopped. I'll need to find a cure. But blind, it will take time.">>
She bumps into her desk. Steadies herself.
<<say "Lysara" "Days, perhaps. Blind and drooling. Completely vulnerable.">>
She's not talking to you. Just... narrating her situation. Loudly.
<<say "Lysara" "I certainly hope nothing takes advantage of such a helpless state.">>
<p class="internal-thought">She's lying. She has to be lying. But how can you prove it when she's blindfolded?</p>
<<set $flags.lysaraCascadeArc to "contaminated_drool">>
<<set $flags.lysaraBlindfolded to true>>
<<set $flags.lysaraDroolActive to true>>
<<set $flags.lysaraDroolTier to 1>>
<<set $temp.lysaraOralCount to 1>>
<<set $flags.kissedLysara to true>>
<<set $player.lust to 100>>
<<journalAdd "Lab accident. Lysara got hit in the face with some compound - went blind, started drooling uncontrollably. Said the drool was contaminated with aphrodisiac. I... I grabbed her when she got close. Kissed her through the bars. Couldn't help myself." "story">>
<<journalAdd "The taste of her drool. Sweet. Chemical. Made me cum instantly. And she kissed back - I know she did. But now she's playing blind victim. Wearing a blindfold. 'Trusting' me not to take advantage." "reflection">>
<div class="choice-container">
<<if $temp.dayActions lt 4>>
<<vchoice "Try to meditate" "Cell_Meditate" "action" "meditation">>
<<vchoice "Spy on Lysara more" "Cell_Spy_Lysara" "action" "search">>
<<vchoice "Just suffer" "Cell_Suffer" "action" "health">>
<<else>>
<<vchoice "Rest until nightfall" "Cell_Day_End" "action" "night">>
<</if>>
</div><<run VaultUI.setBackground("cell")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<<run document.body.classList.add("scene-mode-intimate")>>
<h3>The Blind Kiss</h3>
She's still blindfolded. Still drooling. Hours have passed since the accident.
You watch her work—or try to work. She's feeling her way along shelves. Knocking things over. The laboratory is a disaster.
<<say $player.name "Lysara... come here.">>
She pauses. Turns toward your voice.
<<say "Lysara" "Oh. You're... you need something?">>
The gas is destroying you. Watching her stumble around blind and drooling has kept you at maximum arousal for hours.
<<say $player.name "Please. Just... come closer.">>
<<say "Lysara" "I shouldn't. The drool. If I get too close you might—">>
But she's walking toward your voice. Slowly. Carefully. Hand outstretched.
<<say "Lysara" "I don't want to contaminate you further. The last kiss was an accident. I was disoriented.">>
She's getting closer. Drool streaming down her chin, her neck. You can see it soaking into her robes. The fabric clinging to her breasts.
<<say "Lysara" "Can you tell me when I'm near the bars? I don't want to stumble into them again.">>
She's five feet away. Four feet. Three.
<<say $player.name "You're close.">>
<<say "Lysara" "How close?">>
Two feet. One.
<<say $player.name "Very close.">>
<<say "Lysara" "I should stop then. Before I accidentally—">>
She takes another step. Her hand finds the bars.
<<say "Lysara" "Oh. Here they are. Let me just orient myself—">>
She's feeling along the bars. Her face is inches away. Drool drips onto the metal. Slides down.
<<say "Lysara" "Where are you positioned? I can hear your breathing. You sound... close.">>
Right in front of her. Face to face through the bars. The gas makes you shake with need.
<<say "Lysara" "If you're there, you should tell me. So I don't accidentally get too near.">>
You don't tell her.
<<say "Lysara" "Hello? Can you hear me? Are you close to the bars or—">>
Your hand shoots through. Grabs her hair. PULLS.
<<say "Lysara" "WHAT— NO—">>
Her face crashes against the bars. Your mouth finds hers. Her drool floods you immediately.
<<storyVideo "story/lysara_drool/kiss" "" "characters/lysara/kiss">>
<<say "Lysara" "I didn't know— couldn't see— you just GRABBED me—">>
You kiss her deeper. Drinking. The aphrodisiac-laced saliva pours onto your tongue. Sweet. Thick. Endless.
The gas and the contaminated drool hit together. Your cock spasms in the cage.
You cum. Hard. Violent. Hips bucking as you kiss her blind face through the bars.
<<say "Lysara" "You're— I can feel you trembling— you're climaxing— from my drool—">>
<<set _dkiSpitClip to _storyClip>><<storyVideo "story/lysara_drool/kiss_2_spit">><<set _dkiSpitNew to _storyClip>><<set _storyClip to _dkiSpitClip>>
She's not pulling away. She's kissing you back. Her tongue sliding against yours. Sharing the contaminated saliva.
<<if _dkiSpitNew is "d790086415b1">>Then she twists in your grip, and your mouth slides off hers and down her jaw to her throat. You lick the drool off her neck while your free hand finds her tit through the soaked shift, and her own hand drops between her thighs and stays there.<<elseif _dkiSpitNew is "1e5ebf2959ac">>For a few heartbeats the gas runs ahead of the kiss: her slick fist on your cock, bare, no cage, pumping it slow while her tongue works your mouth. Then the steel bites, and it's only her mouth again.<</if>>
<<if _storyClip is "1ac4bd1fb6dc">>She sags into you. One bare leg hooks up through the bars and locks round the back of your thighs, dragging you closer.<</if>>
The orgasm doesn't stop. Wave after wave. The cage biting. Your balls emptying. You're cumming and drinking and kissing all at once.
<<say "Lysara" "So much— you're producing so much— the gas must be— amplifying everything—">>
She sounds fascinated. Clinical. Even while being kissed.
Finally the orgasm ends. You release her hair. She stumbles back.
Her hand flies to her mouth. The drool still flows around her fingers.
<<say "Lysara" "I couldn't see. I asked you to warn me. I didn't know I was that close.">>
She's building the narrative. Blind victim. Grabbed without warning.
<<say "Lysara" "You couldn't control yourself. The gas saw a vulnerable target and made you... aggressive.">>
She touches her lips. They're swollen from the kiss.
<<say "Lysara" "I understand. You're not responsible for what the gas makes you do.">>
Absolution. Making it HIS fault while forgiving him.
<<say "Lysara" "But now you've ingested a significant dose of contaminated saliva. The effects will compound with the gas.">>
She adjusts her blindfold. Makes sure it's secure.
<<say "Lysara" "I should keep my distance. Since I can't see when you're... reaching for me.">>
But she doesn't sound afraid. She sounds... satisfied?
<<say "Lysara" "The contamination continues. The drool won't stop. I'll need to manage it. Somehow.">>
She turns away, feeling her way back to her workspace. The blindfold stays on.
<<say "Lysara" "I'll be working here. Blind. If I stumble near the bars again... I won't know where I am.">>
A warning. Or an invitation.
<<set $flags.lysaraDroolTier to 1>>
<<set $temp.lysaraOralCount to 1>>
<<set $flags.kissedLysara to true>>
<<set $player.lust to 100>>
<<set $flags.feralLevel to Math.max(0, ($flags.feralLevel || 0) - 2)>>
<<run document.body.classList.remove("scene-mode-intimate")>>
<div class="choice-container">
<<vchoice "Return to waiting" "Cell_Agony_Wait" "action" "back">>
</div><<run VaultUI.setBackground("cell")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<<set $temp.dayActions += 1>>
<<set $temp.lysaraEncounters += 1>>
<<advanceTime 1 0>>
<<set $player.lust to 100>>
<h3>Worsening Symptoms</h3>
Hours later. Lysara is still blindfolded. Still drooling.
She's given up trying to contain it. Her robe hangs open, soaked, and she rubs the slick fluid into her breasts.
<<storyVideo "characters/lysara/cascade_drool">>
<<if _storyClip is "c419ad0cdec9">>The gas plays with the blindfold. For a few heartbeats there's no cloth over her eyes at all: she's looking straight at you, smiling, lip caught in her teeth, squeezing her slick tits together and letting them fall. You blink, and the cloth is back, dark with drool.<</if>>
You can see everything—her bare breasts slick and shining, nipples hard, the curve of her waist.
The drool runs in constant streams now. Down her chin, her throat, between her breasts, soaking the fabric. Some of it drips directly onto the floor, creating small puddles that glisten in the dim light.
<<say "Lysara" "The production hasn't stopped. It's spreading to other glands.">>
She's at her workbench, working by feel alone. Her hands find vials, examine them by shape and weight.
<<say "Lysara" "My sweat. It's contaminated now too. Everything I produce is becoming—">>
She touches her forehead. Her fingers come away slick. She examines the moisture. Even blind, she can tell.
<<say "Lysara" "Aphrodisiac properties. Concentrated. Spreading through every secretion.">>
You watch sweat run down her temple. Mix with drool on her jaw. The combined fluids stream down her neck, disappear into her cleavage.
She shifts position and you see more—her robes are soaked under her arms, down her back. Dark patches spreading. The fabric clings to every curve.
<<say "Lysara" "I'm becoming a walking contamination zone. Everything I produce is—">>
<<storyVideo "story/lysara_drool/t2_2_wet_thighs">>
<<if _storyClip is "73509cc61518">>She trails off. Touches between her legs, and keeps touching. For a moment the gas puts you behind her, your mouth on her neck while her fingers work between her thighs. Then she's alone again at the bench, and her hand comes away glistening.<<else>>She trails off. Touches between her legs. Her hand comes away glistening.<</if>>
<<say "Lysara" "It's affecting my... other mucous membranes. I'm producing— I'm secreting from—">>
She can't say it. But you can see. Her thighs are wet. The wetness runs down her legs, soaks into her stockings.
<<say "Lysara" "The concentration is building. If I don't expel the excess, the pressure could cause permanent glandular damage.">>
She's breathing heavily. The drool flows faster when she's agitated.
<<say "Lysara" "I need drainage. But I can't reach the affected areas myself. Especially blind.">>
She turns. Starts feeling her way along the wall. Moving. Searching.
<<say "Lysara" "Where did I put the drainage tools? Self-extraction implements? I can't find anything—">>
She knocks something over. Curses. Stumbles.
Her hand finds the bars of your cell again. She's using them to navigate the space.
<<say "Lysara" "Am I near the cell again? I keep ending up here. I can't judge distance properly.">>
She's feeling along the bars. Getting oriented.
<<say "Lysara" "The contamination is worst in posterior regions. Sweat glands concentrated along the back, the—">>
She gestures vaguely at her own ass. Can't see if you're watching.
<<say "Lysara" "I'd need to access those areas for drainage. But alone and blind, it's impossible.">>
She turns. Her back to the bars now. Using them for support.
<<say "Lysara" "I'm just going to rest here a moment. Catch my breath. The contamination is making me dizzy.">>
She leans back. Her shoulders touch the bars. Then her back. Her ass is getting close.
<<say "Lysara" "I can feel the metal. Cold. Grounding. I'll just stand here until the dizziness passes.">>
She shifts. Her ass brushes the bars.
<<say "Lysara" "Oh. That's— I'm closer than I thought. Should I move forward?">>
She doesn't move forward. She leans back more. Her ass presses against the bars now.
<<say "Lysara" "I can feel the pressure building. The contaminated fluid. It's concentrated right... here...">>
She reaches back with one hand. Touches her own ass through the robes. Traces where the pressure is.
<<say "Lysara" "The drainage point. If only I could reach. But I'd need to see. Or have assistance.">>
Her hand finds the hem of her robes. Lifts slightly.
<<say "Lysara" "I'm just checking the contamination level. Since I can't see, I have to feel.">>
<<storyVideo "story/lysara_drool/t2_3_ass_to_bars">>
<<if _storyClip is "43a625e3d03a">>She bends over the couch by the bars, sweeping the cushions with one hand as if feeling for something she dropped, and the thin hem swings up with every reach. Her ass. Then cloth. Then her ass again. Drool drips from her mouth onto her own chest as she bends further.<<else>>She lifts her robes higher. Exposing her ass. Drool drips from her mouth onto her own chest as she bends forward slightly.<</if>>
<<say "Lysara" "The wetness. It's everywhere back here. The contamination is severe.">>
Her ass is fully exposed now. Pressed against the bars. She's bent forward, holding the position. "Examining herself."
<<say "Lysara" "I need to know how bad it is. But I can't see. Can't angle properly.">>
She spreads her stance slightly. "For balance."
<<say "Lysara" "If someone were positioned behind me, they could assess the contamination level. But I'm alone. And blind.">>
She's not alone. And she knows it.
<<say "Lysara" "I suppose I'll just stand here. Try to feel if the drainage is needed. Hope I don't accidentally back up further into something.">>
The drool keeps flowing. Her ass keeps pressing against bars. She's waiting.
<div class="choice-container">
<<vchoice "Grab her" "Cell_Lysara_Drool_Ass" "intimate" "grab">>
</div><<run VaultUI.setBackground("cell")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<<run document.body.classList.add("scene-mode-intimate")>>
<h3>Opportunistic Drainage</h3>
She's right there. Ass against the bars. Blind. Exposed. The gas makes you FERAL.
You don't ask. You don't wait.
Your hands shoot through the bars. Grab her hips. PULL.
<<say "Lysara" "WHAT— who's— I didn't know anyone was—">>
You pull her harder against the bars. Your face presses between her ass cheeks through the gaps.
<<say "Lysara" "WAIT— I couldn't see— I didn't realize I was positioned—">>
Your tongue finds her asshole. Circles it. The contaminated sweat tastes sweet. Chemical. The gas demands you lick EVERYTHING.
<<storyVideo "story/lysara_drool/ass" "" "characters/lysara/oral_player">>
<<if _storyClip is "9a4d5a32421d">>Her knees give. She folds forward onto the padded bench by the bars and ends up on all fours, ass still jammed back into the gap, bare feet curled against your chest. You pin them there with one hand and keep eating her.<</if>>
<<say "Lysara" "NO— I was just examining myself— I didn't know you could reach—">>
She's not pulling away. Her hips press back. "Involuntary."
You lick deeper. Tasting her. The contamination. The sweat. Everything.
<<say "Lysara" "You're taking advantage— I'm blind— I can't see what you're doing to me—">>
Your tongue pushes inside her asshole. She gasps. <<if _storyClip is "9a4d5a32421d">>Her fingers dig into the bench.<<else>>Her hands grip the bars.<</if>>
<<say "Lysara" "I didn't position myself for this— I was just checking contamination levels—">>
<<set _daGrindClip to _storyClip>><<storyVideo "story/lysara_drool/ass_2_grinds_back">><<set _daGrindNew to _storyClip>><<set _storyClip to _daGrindClip>>
<<if _daGrindNew is "b316c714db16">>For a few heartbeats the gas shows you what her grinding wants. No bars. No cage. You're flat on your back and she's riding your bare cock facing away, that huge oiled ass bouncing on you and slapping down to the root, her hands spread on her cheeks to hold herself open while you watch every inch disappear into her. Then the steel bites, and it's her ass against the bars again, your tongue still buried in it.<<elseif _daGrindNew is "2456e021182d">>The gas runs ahead of her. The cage is gone and you're on your back on something soft, and she's sitting on your cock facing away, rolling that big oiled ass down onto you while your hands knead it and pull her cheeks apart to watch yourself slide into her. Slick. Tight. Real enough to make your hips jerk. Then the steel bites, and you're on your knees in the cell again with your tongue in her ass.<</if>>
But she's grinding back now. Pushing her ass against your face through the bars.
<<say "Lysara" "The gas made you— you saw me vulnerable and you just— took—">>
You're tongue-fucking her ass. She's moaning despite the protests.
<<say "Lysara" "I'm blind— helpless— you're using me— I couldn't stop you even if—">>
The drool pours from her mouth faster. She's aroused. The production increases with arousal.
<<say "Lysara" "The drainage— I can feel it— you're creating a pathway for the contamination to—">>
She's trying to make it clinical. Failing.
<<say "Lysara" "Don't stop— I mean— you SHOULD stop— you're taking advantage— but the drainage is—">>
Your tongue circles. Presses deep. Tastes the contaminated sweat pooling there.
<<say "Lysara" "I'm going to— the pressure is releasing— oh god—">>
She cums. Her ass clenching around your tongue. The contaminated fluid gushing.
<<say "Lysara" "You made me— while I was blind— I couldn't see to defend myself—">>
She's still grinding. Still cumming. The drool flows faster.
<<if _storyClip is "9a4d5a32421d">>When you finally pull back, she crawls forward off your face and sprawls the length of the bench.<<else>>When you finally pull back, she stumbles forward. Catches herself on a table.<</if>>
<<say "Lysara" "I didn't know you were there. Behind me. Reaching distance.">>
She's breathing hard. The blindfold is soaked with sweat and drool.
<<say "Lysara" "You used my blindness. My vulnerability. The gas made you predatory.">>
She adjusts the blindfold. Keeps it on.
<<say "Lysara" "I can't take this off yet. My eyes haven't healed. Which means I'm still blind.">>
A pause.
<<say "Lysara" "Still unable to see when you're... close. When you're reaching.">>
<<storyVideo "story/lysara_drool/ass_3_after">>
<<if _storyClip is "be99581433ae">>She touches her ass. Where your tongue was. Then she keeps touching it: she hitches the hem up, smooths both palms over her bare cheeks, turns one side to the bars and then the other, and at last kneels up on the stool by the workbench with her ass pushed back toward the cell, as if the light there were better for the inspection.<<else>>She touches her ass. Where your tongue was.<</if>>
<<say "Lysara" "The drainage helped. Temporarily. But the contamination is deeper than I thought.">>
She's still drooling. Still wet between the thighs.
<<say "Lysara" "I'll need more drainage. Soon. But I'm blind. Can't position myself properly. Can't see when I'm in... danger.">>
The word 'danger' sounds almost eager.
<<set $flags.lysaraDroolTier to 2>>
<<set $temp.lysaraOralCount to 2>>
<<set $flags.rimmedLysara to true>>
<<set $player.lust to 100>>
<<set $flags.feralLevel to Math.max(0, ($flags.feralLevel || 0) - 3)>>
<<journalAdd "The contamination is spreading through Lysara's body. Her sweat, her... everything. She backed into the bars. Exposed. 'Couldn't see' where she was positioned. I ate her ass like a starving man." "story">>
<<journalAdd "She came on my tongue. Still claiming she was blind. Still acting the victim. But she ground back against my face. She wanted it." "reflection">>
<<run document.body.classList.remove("scene-mode-intimate")>>
<div class="choice-container">
<<vchoice "Return to waiting" "Cell_Agony_Wait" "action" "back">>
</div><<run VaultUI.setBackground("cell")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<<set $temp.dayActions += 1>>
<<set $temp.lysaraEncounters += 1>>
<<advanceTime 1 0>>
<<set $player.lust to 100>>
<h3>Critical Contamination</h3>
Day <<= setup.cellDaysWord(false)>>. Or is it? Time blurs when you're watching a blindfolded woman drool constantly.
<<storyVideo "story/lysara_drool/t3_1_sheer_shift">><<set _t3ShiftNew to _storyClip>>
Lysara has stripped down to minimal clothing—a thin shift that's completely transparent from the constant drool and sweat. You can see everything. Her nipples. The curve of her stomach. The dark triangle between her legs.
<<if _t3ShiftNew is "f6a3ad828ef6">>The gas fills in what the shift doesn't hide. Your own hands behind her, oil slick on her tits through the wet mesh, her face turning back to find your mouth, her hand reaching behind her for your cock. You blink, and she's alone, a body's length beyond the bars.<<elseif _t3ShiftNew is "228fc41ff6ed" or _t3ShiftNew is "8454d76b9542" or _t3ShiftNew is "c824befbfbe2">>The gas fills in what the shift doesn't hide: your own hands behind her, oil slick on her tits through the wet mesh, your mouth on her neck. You blink, and she's alone, a body's length beyond the bars.<</if>>
She's given up pretending to work. She's just... managing the contamination.
<<say "Lysara" "It's everywhere now. Every pore. Every membrane.">>
She touches her face. Drool runs over her fingers. Down her wrists. She can't keep up.
<<say "Lysara" "My eyes still haven't healed. I'm still blind. And the production is increasing.">>
The floor around her is slick. Puddles of contaminated drool, sweat, other fluids you can't identify.
<<say "Lysara" "I'm becoming dehydrated. Despite drinking constantly, every fluid is being converted to contaminated secretions.">>
She picks up a cup of water. Drinks. Within moments, more drool pours from her mouth.
<<say "Lysara" "It's a closed loop. I can't win.">>
She sets down the cup. Sways. Dizzy.
<<say "Lysara" "The concentration is critical now. Especially in... primary regions.">>
She touches between her legs. Even from here you can see she's soaked. Her thighs glisten with fluid running down.
<<say "Lysara" "If this isn't drained soon, the pressure could cause— I don't even know. This is unprecedented.">>
<<set _t3S to setup.storyFamilySingles("story/lysara_drool/cell_spy_drool_t3", random(1, 3) === 1)>><<storyVideo "story/lysara_drool/cell_spy_drool_t3" "" "characters/lysara/cascade_drool_t3">><<if _t3S>><<run setup.mediaAvoidEnd("story/lysara_drool/cell_spy_drool_t3")>><</if>>
<<if _storyClip is "ce7f57ae8a19">>She tries to walk, stumbles, and drops back onto the low couch by the bars with the soaked shift shoved up round her ribs. For a long moment she just lies there, knees hauled up and wide, showing you everything. Then she sits forward, presses her knees together and stretches her bare feet down toward you, toes flexing an inch from your fingers, before she slides off the cushions onto her knees.<<else>>She tries to walk. Stumbles. Falls to her knees.<</if>>
<<if _storyClip is "743e08e2d54a">>She doesn't get up. She sprawls forward onto the stone on her forearms, legs stretched out behind her, the soaked shift rucked up round her waist and her ass and pussy turned to the bars. She looks back over her shoulder toward the cell and rolls her hips, slow, as if she could see you from there. Then she drags her knees up under her.<</if>>
<<say "Lysara" "I can't— I'm too weak— the contamination is—">>
She's on all fours now. Drool pooling beneath her face. Her shift has ridden up. You can see her ass. Her pussy. Both glistening with contaminated fluid.
<<say "Lysara" "Where am I? I lost my orientation when I fell.">>
She's facing away from you. On her hands and knees. "Lost."
<<say "Lysara" "The cell— is the cell near me? I can't tell—">>
<<storyVideo "story/lysara_drool/t3_3_crawls_back">>
<<if _storyClip is "b3c9bc65ed47">>She starts crawling. "Searching" for landmarks. Moving backward. Toward your cell. Every few inches she stops, arches, and rocks her hips back as if she's feeling for the bars with her ass, one hand reaching back between her thighs to check where she is.<<else>>She starts crawling. "Searching" for landmarks. Moving backward. Toward your cell.<</if>>
<<say "Lysara" "I need to find the bars. Use them to stand up. But I don't know which direction—">>
Her ass is getting closer. Backing toward you. "Blind" crawling.
<<say "Lysara" "If I could just feel the bars— where are they—">>
Closer. You can see her pussy now. Soaked. Dripping. Contaminated fluid running down her thighs.
The drool pours from her mouth onto the floor beneath her. Puddles forming. She's a mess of fluids.
<<say "Lysara" "I think I'm getting close. I can hear— is that breathing? Who's there?">>
<<say $player.name "...">>
The gas has you. You can't speak. Can't think. Just watch her ass backing toward you.
<<say "Lysara" "Hello? If someone's there, please tell me where the bars are. I don't want to back into them.">>
She keeps crawling backward. Her pussy is inches from the bars now.
<<say "Lysara" "I'll just go slowly. Feel my way. Hope I don't accidentally—">>
Her ass touches the bars. She freezes.
<<say "Lysara" "Oh! Found them. Thank goodness. Let me just—">>
She doesn't move away. She presses back. Using the bars to "steady herself."
The position puts her pussy directly against the metal. You can see it through the gaps. Pink. Wet. Gushing with contaminated fluid.
<<say "Lysara" "The primary contamination site. I can feel the pressure. It's unbearable.">>
She reaches back with one hand. Still on her knees. Still blind. Touches herself.
<<say "Lysara" "So much fluid. The production is critical. I need drainage. Immediate drainage.">>
Her fingers slide through her wetness. She gasps at her own touch.
<<say "Lysara" "I can't do this myself. Not blind. I can't see what I'm doing. Can't reach properly.">>
She spreads her knees wider. "Trying to access the area."
<<say "Lysara" "If only there was someone who could— but I'm alone. Blind and alone and contaminated.">>
She's still pressed against the bars. Pussy exposed. Drool creating puddles beneath her face.
<<say "Lysara" "I'll just... stay here. Try to manage the pressure. Hope I don't accidentally position myself somewhere vulnerable.">>
She's already there. Positioned perfectly. And she knows it.
<div class="choice-container">
<<vchoice "Grab her" "Cell_Lysara_Drool_Pussy" "intimate" "grab">>
</div><<run VaultUI.setBackground("cell")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<<run document.body.classList.add("scene-mode-intimate")>>
<h3>Critical Drainage</h3>
She's on her knees. Ass to the bars. Pussy pressed against metal. "Blind." "Unaware."
The gas destroys your last thread of control.
Your hands grab her hips through the bars. YANK her back.
<<say "Lysara" "WHAT— WHO'S— I'M BLIND I CAN'T SEE—">>
Your face buries between her legs. Your tongue finds her pussy immediately.
<<storyVideo "story/lysara_drool/pussy" "" "characters/lysara/oral_player">>
<<say "Lysara" "NO— I didn't know anyone was there— I couldn't see—">>
The taste floods you. Contaminated fluid. Sweet. Overwhelming. You drink it like you're dying.
<<say "Lysara" "You're— from behind— I can't see what you're doing—">>
Your tongue slides up her pussy. She's SOAKED. The fluid pours onto your tongue.
<<say "Lysara" "I was just resting against the bars— I didn't know I was positioned where someone could—">>
You find her clit. She cries out. Her whole body shudders.
<<say "Lysara" "You grabbed me— I'm blind— I couldn't defend myself—">>
But her hips are grinding back. Pressing her pussy harder against your mouth. Betraying her words.
<<say "Lysara" "The gas made you aggressive— you saw me vulnerable— on my knees— and you just TOOK—">>
You tongue-fuck her. Deep. Relentless. The contaminated fluid gushes.
<<say "Lysara" "I can't see your face— can't see what you're doing to me— can only FEEL—">>
Her hands find your head through the bars. Pull you harder against her.
<<say "Lysara" "The drainage— it's working— you're creating full system flush— don't stop— DON'T STOP—">>
<<if _storyClip is "c84db793a6e8">>She's abandoned the victim act momentarily. The pale top is rucked up round her shoulders, her cheek mashed into a cushion she dragged down with her, and she grins open-mouthed at nothing.<<else>>She's abandoned the victim act momentarily. Lost to sensation.<</if>>
You suck her clit. Hard. She screams.
<<say "Lysara" "I'M BLIND— YOU'RE USING ME WHILE I'M BLIND— I CAN'T—">>
<<storyVideo "story/lysara_drool/pussy_2_cums">>
<<if _storyClip is "6287335e7954">>For one heartbeat the gas paints it somewhere else: her astride a humming leather saddle in garters and stockings, tits bouncing, someone behind her turning the dial up, her head thrown back. Then it's your mouth again, and she comes on that.<</if>>
She cums. Violently. Her pussy floods your mouth with contaminated fluid. You swallow. Drink. The gas won't let you stop.
The orgasm goes on. She's convulsing. Drool pouring from her mouth. Pussy gushing. Every fluid system purging at once.
<<say "Lysara" "THE DRAINAGE— FULL SYSTEM— I'M FLUSHING— OH GOD—">>
Wave after wave. You keep licking. Keep drinking. She keeps cumming.
Finally she collapses forward. Off your face. Gasping on the floor.
The blindfold is completely soaked. Drool and sweat and tears. But she doesn't remove it.
<<say "Lysara" "You... you attacked me. While I was blind. On my knees. Helpless.">>
She's building the narrative even in her exhaustion.
<<say "Lysara" "I couldn't see you coming. Couldn't defend myself. You just... grabbed me and used me for drainage.">>
She touches her pussy. Still dripping. Still gushing residual fluid.
<<say "Lysara" "The contamination is... reduced. The critical drainage was successful.">>
She slowly gets to her knees. Then her feet. Still blindfolded.
<<say "Lysara" "You drank all of it. Every drop of contaminated fluid. It's in your system now.">>
She turns toward you. Blind eyes aimed perfectly at your face.
<<say "Lysara" "I need to extract what you've absorbed. Before it concentrates in your system.">>
<<storyVideo "story/lysara_drool/pussy_3_device">>
<<if _storyClip is "30d031533152">>She produces something from a pocket. You hear crystal chiming. A long rod of clear glass, a blue spiral sunk in its core. She doesn't hand it over. She lies back on the bench, knees wide, and works the cold glass slowly into her own pussy, breath hitching. Calibrating it, she'd say. If asked.<<else>>She produces something from a pocket. You hear crystal chiming.<</if>>
The device.
<<say "Lysara" "I have an extraction tool. It will remove everything. The gas. The contaminated fluids. All of it.">>
She's still drooling. Still blindfolded. But her voice is steady now. In control.
<<say "Lysara" "You took from me. While I was blind and helpless. Now I'll take from you.">>
She smiles. Small. Knowing.
<<say "Lysara" "It's only fair.">>
<<set $flags.lysaraDroolTier to 3>>
<<set $temp.lysaraOralCount to 3>>
<<set $flags.tastedLysara to true>>
<<set $player.lust to 100>>
<<set $flags.feralLevel to Math.max(0, ($flags.feralLevel || 0) - 3)>>
<<journalAdd "Critical contamination. She crawled toward the bars. 'Blind.' On her knees. I buried my face between her legs and didn't stop until she was screaming. All this 'blind' game, and I've tasted every part of her." "story">>
<<journalAdd "Now she wants to 'extract' what I've absorbed. Has some device. I don't trust her anymore - but I also don't care. The gas has me too deep." "reflection">>
<<journalAdd "The way she talks - clinical, detached, making everything into 'drainage procedures.' But she pulled my face deeper when she came. That wasn't clinical." "relationship">>
<<run document.body.classList.remove("scene-mode-intimate")>>
<div class="choice-container">
<<vchoice "She offers the device" "Cell_Lysara_Drool_Device_Transition" "intimate" "rapid-strikes">>
</div><<run VaultUI.setBackground("cell")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<h3>Extraction Offered</h3>
Lysara feels her way to the cell door. Still blindfolded. Still drooling.
Her fingers find the lock by touch alone. Too practiced. Too precise for someone who "can't see."
<p class="sound-effect">//CLICK//</p>
The door opens.
<<say "Lysara" "Come. Let me remove your cage. Then we'll proceed with extraction.">>
<<say $player.name "You want me to come to YOU? While you're blind?">>
<<say "Lysara" "I've navigated this laboratory blind for days. I know every surface by touch.">>
<<storyVideo "story/lysara_drool/device_transition">>
<<if _storyClip is "ce44953d6a45">>She turns. Walks confidently to her workbench. Doesn't stumble once. And somewhere in the last hour she has dressed: a crisp white blouse, a black skirt, her black robes folded over one arm like she means to put them back on later.<<else>>She turns. Walks confidently to her workbench. Doesn't stumble once.<</if>>
<<say $player.name "You can see, can't you?">>
<<say "Lysara" "What? No. I'm simply familiar with my workspace.">>
She gestures to a table. Perfectly. Exactly where it is.
<<say "Lysara" "Sit there. I'll remove the cage. Then we'll use the device.">>
<<say $player.name "How do you know where 'there' is?">>
<<say "Lysara" "Spatial memory. I've worked here for centuries.">>
But she's still drooling. Still wearing the blindfold. The act continues.
<<say "Lysara" "Now sit. Unless you'd prefer to stay contaminated?">>
<div class="choice-container">
<<if !$flags.lysaraDeviceRefusedTwice>>
<<vchoice "Accept her offer" "Cell_Lysara_Device" "intimate" "rapid-strikes">>
<</if>>
<<vchoice "Refuse (you don't trust her)" "Cell_Lysara_Device_Refuse" "action" "back">>
</div><<run VaultUI.setBackground("cell")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<<set $flags.lysaraDroolResolved to true>>
<<set $flags.lysaraBlindfolded to false>>
<<set $flags.lysaraDroolActive to false>>
<h3>Perfect Vision</h3>
<<if $flags.lysaraDeviceUsed>>After everything—the extraction, the draining, the days in the cell—Lysara reaches up.<<else>>After everything—the device you turned down, the aching days in the cell—Lysara reaches up.<</if>>
Unties her blindfold.
It falls away.
She blinks. Once. Twice. Opens her eyes fully.
<<storyVideo "characters/lysara/at_bars_drool_reveal">>
<<if _storyClip is "83ac8683b99c">>She leans in over you until her face is all you can see, close enough that you smell the compound still sweet in her hair. A thin white shift hangs off one shoulder and she tugs it lower without looking at it. She stares straight down into your eyes. Hers are clear, the whites unmarked, not a trace of damage.<<else>>They're perfect. Clear. No damage whatsoever.<</if>>
<<say "Lysara" "Oh. My vision has returned. Completely.">>
She looks around the laboratory. Seeing it "for the first time in days."
<<say $player.name "Just like that?">>
<<say "Lysara" "The alchemical compounds must have accelerated cellular regeneration. Remarkable.">>
<<if _storyClip is "83ac8683b99c">>She straightens, hitches the shift back onto her shoulder and examines her eyes in a mirror.<<else>>She examines her eyes in a mirror.<</if>> Perfectly clear. No redness. No injury.
The drool has stopped too. Her mouth is normal. Dry, even.
<<say $player.name "And the drooling?">>
<<say "Lysara" "Resolved with the contamination cycle. The body's homeostasis restored.">>
She says it so matter-of-factly. Like the days of constant drooling never happened.
<<say "Lysara" "I appreciate your assistance during my... impairment.">>
<<say $player.name "Impairment.">>
<<say "Lysara" "Yes. Being blind. It must have been quite difficult for me. Stumbling around. Unable to see.">>
She's gaslighting already. Making herself the victim.
<<say "Lysara" "I'm sure I positioned myself poorly several times. Backed into the bars without realizing. Bent over in unfortunate locations.">>
She meets your eyes. Perfect vision. Like she's been able to see all along.
<<say "Lysara" "Thank you for not taking advantage. Well. Not taking MORE advantage than you did.">>
<<say $player.name "You could see the whole time.">>
<<say "Lysara" "What? No. The compound clearly damaged my optical nerves.">>
She says it with such conviction. Such innocent confusion.
<<say "Lysara" "I was genuinely blind. How else would I have ended up in such... compromising positions?">>
She walks to her workbench. No hesitation. No stumbling. Perfect navigation.
<<say "Lysara" "Though I must say, your tongue proved remarkably effective for drainage purposes.">>
<<say "Lysara" "The mucous membrane contact. The direct fluid transfer. Multiple application sites.">>
She's listing your acts like she's cataloging alchemical procedures.
<<say "Lysara" "Oral to oral. Tongue to anal sphincter. Extended cunnilingus with synchronized orgasm for maximum drainage efficiency.">>
<<say $player.name "You're unbelievable.">>
<<say "Lysara" "Am I? I'm simply reviewing the medical interventions that occurred during my disability.">>
<<set _resRevealFamily to _storyFamily>><<storyVideo "story/lysara_drool/resolution_2_dry_lips">><<set _storyFamily to _resRevealFamily>>
<<if _storyClip is "89fc9c187005">>She slides two fingers into her mouth and sucks them, then draws them out across her lips. No drool. Perfectly dry. Your cock is through the bars before you've decided anything, and she lets the tip rest against her lower lip for one breath. Measuring the dryness, she'd say. Then she sits back and licks her lips deliberately.<<elseif _storyFamily is "sf_cg_lysara_drool_04">>She draws one finger across her lips. No drool. Perfectly dry. She slides the finger into her mouth and sucks it, slow, head tipping back, her other hand dragging through her hair.<<else>>She touches her lips. No drool. Perfectly dry. She licks them deliberately.<</if>>
<<say "Lysara" "My mouth feels strange now. After days of excessive production. So... dry.">>
She's emphasizing the word. Making it sound obscene.
<<say "Lysara" "I almost miss the sensation. The constant flow. The way you would drink from me.">>
<<say $player.name "...">>
<<say "Lysara" "But all good things end. The contamination is cleared. You're free of the gas. I'm free of the drool.">>
She walks closer to the cell. Eyes perfectly clear.
<<say "Lysara" "We can both return to normal. Professional distance. No more... intimate drainage sessions.">>
A pause.
<<say "Lysara" "Unless, of course, another accident occurs. Laboratories are dangerous places.">>
She touches a vial on a nearby shelf. Examines it.
<<say "Lysara" "So many reactive compounds. A clumsy alchemist could easily spray themselves in the face again.">>
She sets it down. Looks at you directly.
<<say "Lysara" "But I'm very careful. These things only happen once in a century or so.">>
She's threatening to do it again. Wrapped in innocence.
<<say "Lysara" "Though I must admit, the drainage protocol we established was... effective. If I ever needed similar treatment, I'd know exactly who to call.">>
She smiles. Touches her mouth.
<<say "Lysara" "And if I happened to be blind again... well. I'd just have to trust you not to take advantage.">>
The word 'trust' sounds like an invitation.
<<say "Lysara" "But that's speculation. For now, we should focus on your departure. You have a companion to wake, I believe.">>
<<if setup.ownsItem("resurgence elixir")>>She nods at the vial already in your hand. The Resurgence Elixir. Golden. Shimmering.<<else>>She produces a vial. The Resurgence Elixir. Golden. Shimmering.<</if>>
<<say "Lysara" "For your friend. Free of charge.">>
<<say $player.name "Free?">>
<<say "Lysara" "Consider it payment. For the drainage assistance. You did save my life, after all.">>
<<say "Lysara" "Though I do hope you'll visit again. For check-ups. To ensure the contamination doesn't recur.">>
<<if setup.ownsItem("resurgence elixir")>>She closes your hand around the vial. Her fingers brush yours. Linger.<<else>>She hands you the vial. Her fingers brush yours. Linger.<</if>>
<<say "Lysara" "My vision is perfect now. But memories can be... unreliable. If you told people I was blind for days, I might not remember it the same way.">>
A subtle threat. Wrapped in confusion.
<<say "Lysara" "I might remember being fully aware. Watching you take advantage. Being unable to stop you because I was... studying your responses.">>
<<say $player.name "Which version is true?">>
<<say "Lysara" "Does it matter? Either way, your tongue was buried in me multiple times. We both enjoyed it. Everything else is just... framing.">>
She steps back.
<<say "Lysara" "Now go. Wake your companion. Leave my laboratory.">>
She turns away. Starts cleaning up. Perfect vision. Completely normal.
<<say "Lysara" "And if you ever need more... drainage assistance... you know where to find me.">>
The smile in her voice is unmistakable.
<<set $flags.lysaraDroolResolved to true>>
<<set $flags.hasResurgenceElixir to true>>
<<if !setup.ownsItem("resurgence elixir")>><<run setup.giveItem("resurgence elixir", 1)>><</if>>
<<journalAdd "The blindfold came off. Perfect vision. Not a mark on her eyes. Days of 'blindness' and she can see perfectly. The drool stopped too - just like that. She was faking. Some of it. Maybe all of it." "story">>
<<journalAdd "She gaslighted EVERYTHING. 'I was genuinely blind.' 'Thank you for not taking advantage.' Meanwhile she's describing what I did in clinical detail - 'oral to oral, tongue to anal sphincter, extended cunnilingus.' She remembers. She watched." "reflection">>
<<journalAdd "Lysara gave me the elixir for free. Called it 'payment for drainage assistance.' She's already hinting at another 'accident.' Says labs are dangerous places. I don't know whether to hate her or respect her." "relationship">>
<div class="choice-container">
<<vchoice "Return to Kira" `$flags.kiraResurgenceUsed ? "Kira_Second_Resurgence" : "Kira_Room_With_Potion"` "action" "door-handle">>
</div><<run VaultUI.setBackground("cell")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<<set $flags.lysaraDroolResolved to true>>
<<set $flags.lysaraBlindfolded to false>>
<h3>Sight Restored</h3>
After the feral transformation. After you broke out. After you took her.
She removes her blindfold.
Her eyes are perfect. Unmarked. Like they were never damaged.
<<storyVideo "characters/lysara/at_bars_feral_reveal">>
<<say "Lysara" "My vision has returned. How convenient.">>
<<if _storyClip is "b309ac0e98c7">>She shoves her face right up to yours and wrinkles her nose, lip curling off her teeth, the look she gives a sample that spoiled overnight. No fear in it. Just calculation.<<else>>She looks at you. No fear. No anger. Just... calculation.<</if>>
<<say $player.name "You could see. When I—">>
<<say "Lysara" "When you broke out of your cage, overpowered my barriers, and fucked me through the bars while I was blind and helpless?">>
She says it clinically. Like reading a grocery list.
<<say "Lysara" "Yes. I remember.">>
<<say $player.name "You set that up. The blindness. The positioning.">>
<<say "Lysara" "Did I? I was genuinely contaminated. Genuinely blind. The accident was real.">>
<<if _storyClip is "587e1e557284">>The memory from that night is hazy, maybe the gas: a warm bath, her oiled body slick against your chest, your hands all over her. Real or not, you can't tell. She touches where you grabbed her. Where you held her.<<else>>She touches where you grabbed her. Where you held her.<</if>>
<<say "Lysara" "What happened after... that was the gas. Your transformation. Not something I could have predicted.">>
Lies. But she says them with conviction.
<<say "Lysara" "Though I must admit, the drainage was... thorough. You certainly took everything you needed.">>
She's smiling now. Small. Dangerous.
<<say "Lysara" "Being used while blind. Unable to see what was being done to me. Quite the experience.">>
<<say $player.name "You enjoyed it.">>
<<say "Lysara" "Did I? How would I know? I couldn't see my own face.">>
Perfect deniability.
<<say "Lysara" "What I DO know is that your feral transformation was... impressive. The gas unlocked something in you.">>
She approaches. No fear at all.
<<say "Lysara" "Something I might want to study further. In controlled conditions. Where I can... observe properly.">>
She's already planning the next time.
<<set $flags.lysaraDroolResolved to true>>
<<journalAdd "Her eyes are perfect. The blindfold was a lie - or the 'healing' was convenient. Either way, she SAW everything I did when I went feral. And she's not afraid. She's... intrigued." "story">>
<<journalAdd "She called what happened 'drainage.' Clinical language for me breaking out and fucking her through the bars while she was 'blind.' She's already planning the next experiment." "reflection">>
<div class="choice-container">
<<if setup.ownsItem("resurgence elixir")>>
<<vchoice "Return to Kira" `$flags.kiraResurgenceUsed ? "Kira_Second_Resurgence" : "Kira_Room_With_Potion"` "action" "door-handle">>
<<else>>
<<vchoice "Continue" "Lysara_Feral_Aftermath_Talk" "action" "talk">>
<</if>>
</div><<run document.body.classList.remove("scene-mode-intimate")>>
<<say $player.name "I... no. I don't know what that thing does.">>
Lysara's expression flickers—disappointment? Amusement?
<<say "Lysara" "A shame. The device offers... more than just relief.">>
She tucks the crystal away, her fingers lingering on it.
<<say "Lysara" "Those who submit to it find themselves... changed. More attuned to pleasure. More responsive to command.">>
She meets your eyes.
<<say "Lysara" "But perhaps that's exactly what frightens you.">>
She walks away, leaving you caged and aching—and wondering what you just refused.
<p class="failure">You refused her gift. The suffering continues... but so does your autonomy.</p>
<<set $flags.lysaraDeviceRefusedOnce to true>>
<<set $temp.deviceRefusedToday to true>>
<<if $flags.lysaraCascadeArc is "contaminated_drool" && ($flags.lysaraDroolTier || 0) gte 3>>
<<set $flags.lysaraDroolParked to true>>
<</if>>
<div class="choice-container">
<<vchoice "Endure the night" "Cell_Day_End" "action" "night">>
</div><<run VaultUI.setBackground("cell")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<<run document.body.classList.add("scene-mode-intimate")>>
<h3>Second Thoughts</h3>
<<say $player.name "Lysara... that device you mentioned yesterday...">>
She pauses her work. Turns slowly.
<<say "Lysara" "Changed your mind?">>
There's something in her voice. Satisfaction? Anticipation?
<<say $player.name "The suffering... it's too much. Please.">>
She approaches the bars, the crystalline cylinder appearing in her hand as if by magic.
<<say "Lysara" "I offered you mercy once. You refused.">>
She holds the device up, letting the purple light dance across your face.
<<say "Lysara" "This is your last chance. Accept... or don't ask again.">>
<div class="choice-container">
<<vchoice "Accept her offer" "Cell_Lysara_Device" "intimate" "rapid-strikes">>
<<vchoice "Refuse again" "Cell_Lysara_Device_Refuse_Final" "action" "back">>
</div><<run VaultUI.setBackground("cell")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<<set $flags.lysaraDeviceRefusedTwice to true>>
<h3>Consequences</h3>
<<say $player.name "I... I can't. I don't trust—">>
<<say "Lysara" "Enough.">>
Her voice cuts like a blade. The warmth drains from her expression.
<<say "Lysara" "I offered you relief. Twice. You wasted my time. My patience.">>
She produces a small vial from her robes. The liquid inside is an angry red.
<<say "Lysara" "You want to suffer? Let me help with that.">>
<<say $player.name "Wait— what is—">>
She moves faster than you can react, pressing the vial through the bars and forcing it to your lips. The liquid burns going down.
<<say $player.name "AHHH— FUCK—">>
Fire spreads through your veins. Your cock SURGES against the cage, harder than ever before. Every nerve ending screams with desperate, aching need.
<<say "Lysara" "A little something to make the remaining time more... memorable.">>
<<set $player.lust to 100>>
<<clampStat "player.health" -10 0 100>>
<<set $flags.feralLevel to ($flags.feralLevel || 0) + 3>>
<<journalAdd "Said no to her device twice. She poured something red down my throat for it. Burning, rock hard, worse than the first day. 'Next time someone offers you mercy...' Message received." "reflection">>
She watches you writhe on the floor, a cold smile on her lips.
<<say "Lysara" "Next time someone offers you mercy, perhaps you'll be less foolish.">>
She walks away, leaving you gasping, burning, utterly ruined.
<p class="danger"><<icon "lust">> Lysara has punished your stubbornness. Your arousal is maximized and your feral level has increased significantly.</p>
<div class="choice-container">
<<vchoice "Endure the consequences" "Cell_Day_End" "action" "night">>
</div><<run VaultUI.setBackground("cell")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<<run document.body.classList.add("scene-mode-intimate")>>
<<set $flags.lysaraDeviceUsed to true>>
<h3>The Extraction Device</h3>
<<say "Lysara" "Turn around. Press yourself against the bars.">>
Your hands shake as you comply. She reaches through and trails one fingertip down your bare ass first, smiling like a physician who has found something interesting. Then the key glints in the dim light.
<<storyVideo "characters/lysara/cage_unlock_reveal_device">>
<p class="sound-effect">//CLICK//</p>
The cage falls away.
<<say $player.name "Oh god— oh FUCK—">>
Your cock SURGES to full size immediately. Bigger than you've ever been. The gas has transformed you—thicker, longer, veins pulsing with desperate need.
<<storyVideo "story/lysara_device/surge">>
<<say "Lysara" "Impressive. The gas has done its work well.">>
She doesn't touch you. Instead, she holds up the crystalline cylinder. It's about eight inches long, hollow in the center, glowing with strange purple light. Ancient runes spiral along its surface.
<<say "Lysara" "This is an Essence Extractor. Ancient design. It will drain every drop of gas-tainted seed from your body.">>
She runs a finger along the runes, almost lovingly.
<<say "Lysara" "The extraction process is... intense. You may lose consciousness. That's normal.">>
<<say $player.name "I don't care— just— please—">>
<<say "Lysara" "Push yourself through the bars.">>
<div class="choice-container">
<<vchoice "Push your cock through" "Cell_Lysara_Device_Use" "intimate" "rapid-strikes">>
</div><<run VaultUI.setBackground("cell")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<<storyVideo "story/lysara_device/use_1_through_bars">>
<<if _storyClip is "f563ce1d38ed">>You press against the cold bars, your massive cock jutting through the gap. Vulnerable. Desperate. She leans in and takes the tip between her lips once, just to taste, before she reaches for the device.<<elseif _storyClip is "2d5422920453">>You press against the cold bars, your massive cock jutting through the gap. Vulnerable. Desperate. She kneels on the stone on the other side, close enough to rest her cheek against the bars by your hip, and looks up at you for a long moment before she reaches for the device.<<else>>You press against the cold bars, your massive cock jutting through the gap. Vulnerable. Desperate.<</if>>
<<storyVideo "characters/lysara/device_extraction">>
Lysara positions the crystal cylinder at your tip. The purple glow pulses—once, twice—
<<if _storyClip is "4980c51ee410">>Then she slides a slick finger into your ass, and the crystal's glow runs up your spine.<<elseif _storyClip is "59783f203ab7">>Then she sets the crystal down, strokes you twice and wraps her lips around your tip instead.<<elseif _storyClip is "8109525c8ae5">>Then she sets the crystal down, wraps both hands around your shaft and runs her tongue over your tip instead.<<elseif _storyClip is "c68e5a3a1f34">>Then she sets the crystal down, drizzles oil from a vial over your cock and her own bared tits, and wraps a slick hand around you instead.<<elseif _storyClip is "3fda4823989e">>Then she sets the crystal aside, wraps her hand round your shaft and strokes, slow and smiling, talking you through it in her lecture voice like you're a diagram on her desk.<<elseif _storyClip is "bd737cf3156f">>Then she sets the crystal down, snaps on a pair of purple examination gloves and takes your tip into her mouth instead, eyes on your face the whole time.<<elseif _storyClip is "8d1ab5fb2ec8">>Then she sets the crystal down, lets her robe drop to her waist, pulls on black latex gloves and works your cock with both gloved fists against her oiled tits instead.<<else>>Then she slides it onto you.<</if>>
<<say $player.name "HOLY FUCK—">>
The sensation is INDESCRIBABLE.
<<if _storyClip is "59783f203ab7">>It's her mouth, and it's not like any mouth you've ever felt. The gas has turned every nerve ending raw, and her tongue finds every one of them.<<elseif _storyClip is "8109525c8ae5">>Her hands twist along your shaft, her tongue flicks your tip, and the gas makes every nerve ending scream at once.<<elseif _storyClip is "c68e5a3a1f34">>Her slick fist twists along your shaft, and the gas makes every nerve ending scream at once.<<elseif _storyClip is "3fda4823989e">>Her bare hand twists along your shaft, unhurried, and the gas turns every stroke into a jolt that runs all the way to your teeth.<<elseif _storyClip is "bd737cf3156f">>It's her mouth, hot and wet, with a gloved fist pumping the base, and the rubber smell of the gloves mixes with the smell of your own leaking cock.<<elseif _storyClip is "8d1ab5fb2ec8">>Slick latex and slick skin: her gloved fists squeeze you up through the oiled valley of her tits, and the gas makes every nerve ending scream at once.<<else>>It's not like a hand. Not like a mouth. Not like anything you've ever felt. The crystal interior ripples and pulses around your shaft, waves of magical energy massaging every nerve ending simultaneously.<</if>>
<<if _storyClip is "59783f203ab7" or _storyClip is "8109525c8ae5" or _storyClip is "c68e5a3a1f34" or _storyClip is "3fda4823989e" or _storyClip is "bd737cf3156f" or _storyClip is "8d1ab5fb2ec8">><<say "Lysara" "Calibration. I'm learning your responses before the device does.">><<else>><<say "Lysara" "The device is calibrating. Learning your responses.">><</if>>
You're already at the edge. Days of denial, the gas in your system, and now THIS—
<<say $player.name "I'm gonna— I'm—">>
<<say "Lysara" "Not yet.">>
<<set _useDeviceClip to _storyClip>><<storyVideo "story/lysara_device/use_3_not_yet">><<set _useEdgeNew to _storyClip>><<set _storyClip to _useDeviceClip>>
<<if _storyClip is "59783f203ab7" or _storyClip is "8109525c8ae5" or _storyClip is "c68e5a3a1f34" or _storyClip is "3fda4823989e" or _storyClip is "bd737cf3156f" or _storyClip is "8d1ab5fb2ec8">>She squeezes the base of your cock. The pleasure DOUBLES but the release stays just out of reach.<<elseif _useEdgeNew is "40ba649c9cf1">>She slides the cylinder off you, wet with oil, wraps both hands round your bare shaft and twists them up you, slow, smiling at your face the whole time. Then she squeezes the base hard. The pleasure DOUBLES but the release stays just out of reach. She slides the crystal back on.<<elseif _useEdgeNew is "b0ac031b4cd3">>She slides the cylinder off, leans in and works your bare cock in both fists against the soft weight of her tits, talking to you low and steady, then clamps down at the base. The pleasure DOUBLES but the release stays just out of reach. She slides the crystal back on.<<elseif _useEdgeNew is "d5700e77142d">>She slides the cylinder off and sits back on her heels to lecture you for a moment, one hand drawing in the air. Then both hands on your bare shaft, slow, and her lips resting on your tip while she squeezes the base. The pleasure DOUBLES but the release stays just out of reach. She slides the crystal back on.<<elseif _useEdgeNew is "38a1cc4e57fc">>She slides the cylinder off and pumps your bare cock in her fist, unblinking, holding your eyes, then grips the base and stops dead. The pleasure DOUBLES but the release stays just out of reach. She slides the crystal back on.<<else>>She twists the base of the cylinder. The pleasure DOUBLES but the release stays just out of reach.<</if>>
<<say $player.name "PLEASE—">>
<<if _storyClip is "59783f203ab7" or _storyClip is "8109525c8ae5" or _storyClip is "c68e5a3a1f34" or _storyClip is "3fda4823989e" or _storyClip is "bd737cf3156f" or _storyClip is "8d1ab5fb2ec8">><<say "Lysara" "I control the timing. Not you. I'll know when you're ready.">><<else>><<say "Lysara" "The device controls the timing. Not you. Not me. It knows when you're ready.">><</if>>
Her voice is clinical. Professional. But there's something in her eyes...
<div class="choice-container">
<<vchoice "Surrender to the device" "Cell_Lysara_Device_Edging" "intimate" "lust">>
</div><<run VaultUI.setBackground("cell")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<h3>The Extraction</h3>
Time loses meaning.
<<storyVideo "story/lysara_device/edging" "" "characters/lysara/device_extraction">>
<<if _storyClip is "c68e5a3a1f34">>Her slick hand holds you at the precipice—that excruciating moment just before orgasm—and KEEPS you there.<<elseif _storyClip is "59783f203ab7">>Her mouth holds you at the precipice—that excruciating moment just before orgasm—and KEEPS you there.<<elseif _storyClip is "8109525c8ae5">>Her hands and tongue hold you at the precipice—that excruciating moment just before orgasm—and KEEPS you there.<<elseif _storyClip is "afbd28e55978">>She lets her coat fall open, squeezes her tits around your cock and works you between them, stopping dead each time you swell, laughing into your face while you shake at the edge, and starting again.<<else>>The device holds you at the precipice—that excruciating moment just before orgasm—and KEEPS you there.<</if>> Minutes stretch into what feels like hours.
Your mind starts to fog. The pleasure is so intense that thoughts fragment. Scatter.
<<say "Lysara" "Interesting. Your mental barriers are weakening.">>
<<say $player.name "Wh... what...">>
<<say "Lysara" "Don't worry. It's just the extraction process. The device needs to... synchronize with your nervous system.">>
She's leaning close now, watching your face with clinical fascination. Her lips move, but the words seem to come from very far away.
You can't make them out. Something about... listening? Responding?
The pleasure surges and her voice fades into static.
<<say $player.name "Please... I need...">>
<<say "Lysara" "I know what you need.">>
Her fingers snap.
And something SHIFTS in your mind.
<div class="choice-container">
<<vchoice "..." "Cell_Lysara_Device_Climax" "intimate" "lust">>
</div><<run VaultUI.setBackground("cell")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<h3>Release</h3>
The orgasm hits like a thunderbolt.
<<storyVideo "story/lysara_device/climax" "" "characters/lysara/device_extraction">>
You cum harder than you've ever cum in your life. Harder than you thought POSSIBLE. <<if _storyClip is "59783f203ab7">>Every drop of gas-tainted seed in your body ERUPTS into her mouth as she sucks you relentlessly.<<elseif _storyClip is "8109525c8ae5">>Every drop of gas-tainted seed in your body ERUPTS over her tongue and fingers as she milks you with both hands.<<elseif _storyClip is "c68e5a3a1f34">>Every drop of gas-tainted seed in your body ERUPTS through her slick fist as she milks you relentlessly.<<elseif _storyClip is "b1c3c50da514">>She fits the crystal cylinder's mouth over your tip and every drop of gas-tainted seed in your body ERUPTS into it, rope after rope pooling in the glass.<<else>>Every drop of gas-tainted seed in your body ERUPTS through your cock as the device milks you relentlessly.<</if>>
Your vision whites out. Your legs give way. Distantly, you hear yourself screaming.
<<if _storyClip is "8109525c8ae5">>She tastes the cum off her fingers like a sample. Then her mouth closes on you again.<<elseif _storyClip is "59783f203ab7">>Her mouth doesn't stop.<<elseif _storyClip is "c68e5a3a1f34">>Her hand doesn't stop.<<else>>The device doesn't stop.<</if>> It keeps pulling, extracting, DRAINING until there's nothing left.
Lysara's voice reaches you through the haze—soft words you can't quite make out. They sink into your mind like stones into water, disappearing beneath the surface.
You won't remember them later.
But some part of you will.
<<say "Lysara" "Good. Very good.">>
One final, devastating pulse—
And then darkness.
<<set $flags.lysaraImprinted to true>>
<<set $player.lust to 5>><<run setup.playerReleased()>>
<<set $temp.alchemyGasLevel to 5>>
<div class="choice-container">
<<vchoice "..." "Cell_Lysara_Device_Aftermath" "action" "night">>
</div><<run VaultUI.setBackground("cell")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<<run document.body.classList.remove("scene-mode-intimate")>>
<<set $player.health to Math.max(10, $player.health - 20)>>
<h3>Awakening</h3>
You wake on the floor of the cell.
The cage is back on. Your cock is soft—genuinely, blissfully SOFT for the first time since you breathed that gas.
<<say "Lysara" "Welcome back.">>
<<storyVideo "characters/lysara/lab_lecture_device_aftermath">>
<<if _storyClip is "926f402471d4">>She's sitting at her desk outside the bars, the white coat gone, now in a sheer black blouse and glasses. The crystal cylinder stands by her elbow. It's no longer glowing—it's filled with thick, luminescent fluid.<<elseif _storyClip is "45f0af206e21">>Before she comes into focus, the last scrap of the extraction swims back up: her kneeling at the bars with her tits bare and her tongue flat out under your cock, catching what the crystal missed. Now she's on a stool outside the bars, the cylinder in her hands. It's no longer glowing—it's filled with thick, luminescent fluid.<<else>>She's sitting on a stool outside the bars, the crystal cylinder in her hands. It's no longer glowing—it's filled with thick, luminescent fluid.<</if>>
Your essence. All of it.
<<say $player.name "How... how long was I out?">>
<<say "Lysara" "Three hours. The extraction was thorough.">>
<<if _storyClip is "926f402471d4">>She taps her pen against the cylinder, satisfied, then opens a black folder and starts writing.<<else>>She holds up the cylinder, examining it with satisfaction.<</if>>
<<say "Lysara" "This is quite valuable, you know. Gas-infused essence. I can use this in a dozen different potions.">>
<<say $player.name "You... you milked me for ingredients?">>
<<say "Lysara" "I gave you relief. The ingredients are my payment.">>
She stands, tucking the cylinder away. As she does, her fingers brush together in a peculiar way—almost like a snap.
Something PULSES in your chest. Heat flickers through you, your cock twitching against the cage.
<<say $player.name "What—">>
But the sensation fades as quickly as it came.
<<say "Lysara" "Hmm? Something wrong?">>
<<say $player.name "I... no. Nothing. Just an aftershock, I guess. From the gas.">>
<<say "Lysara" "Yes. The gas.">>
Is that a smile on her lips? You can't tell.
<div class="choice-container">
<<vchoice "..." "Cell_Lysara_Device_Aftermath_2" "action" "alert">>
</div><<run VaultUI.setBackground("cell")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<h3>Recovery</h3>
<<say "Lysara" "The extraction purged most of the gas from your system. <<if setup.cellDaysLeft() lte 1>>The last day<<else>>The days you have left<</if>> should be much easier.">>
She moves to her work table, back turned to you. Her fingers drum on the surface—a rhythmic pattern. Tap. Tap. Snap.
Your cock SURGES against the cage. Hard. Instantly.
<<say $player.name "FUCK—">>
<<say "Lysara" "Problem?">>
<<say $player.name "No, I just— the cage— it's—">>
She turns to look at you, and somehow the arousal fades. Your cock softens.
<<say "Lysara" "The gas has strange aftereffects. Phantom arousal. Random surges. It should settle down in a day or two.">>
<<say $player.name "Right. Right. That makes sense.">>
It does make sense. The gas is still in your system. That's all this is.
So why does Lysara look so... satisfied?
<<say "Lysara" "Rest now. You've earned it.">>
She walks away, humming softly. Her fingers snap once—casually, absently, like she's keeping time with a song only she can hear.
Your cock THROBS.
<<set $player.will += 3>>
<<set $player.charm += 5>>
<<set $flags.lysaraBonded to true>>
<<journalAdd "Let her use the device. Woke up on the cell floor three hours later, soft for the first time since the gas, and she was holding a crystal full of me. Called it payment. And every time she snaps her fingers my cock jumps. Aftereffects, she says. Just the gas." "story">>
<p class="system-message"><<icon "potion">> The gas has been mostly purged from your system. <<if setup.cellDaysLeft() lte 1>>The final day<<else>>The rest of your stay<</if>> should be easier.</p>
<p class="internal-thought">Just the gas. It's just aftereffects from the gas.</p>
<div class="choice-container">
<<vchoice "Try to rest" "Cell_Day_End" "action" "night">>
</div><<run VaultUI.setBackground("cell")>>
<<run VaultUI.setTimeOfDay("night")>>
<<set $player.hunger to Math.min($player.maxHunger, $player.hunger + 15)>>
<<set $player.lust to Math.min(100, $player.lust + 10)>>
<h3>Supper Through the Bars</h3>
She drags her narrow work table across the stone until its edge knocks against the bars, sets the bowl and the bottle on it, and leans one hip into the wood. Close. A spoon's length from your mouth and not an inch more.
<<if $flags.lysaraBlindfolded>>
The blindfold is still knotted over her eyes. She found the table by touch and the bars by touch, and now she pushes the silk up onto her forehead with one finger.
<<say "Lysara" "Only for the spoon. I'd rather not put it in your eye.">>
She blinks at the lamplight. Her eyes find your mouth at once, exactly, and stay there. A thread of drool slides off her lower lip, stretches, and drops into the bowl. She stirs it in.
<<say "Lysara" "Diluted. Mostly.">>
<<set $player.lust to 100>>
<</if>>
<<if $flags.feralWarningShown && !$flags.lysaraDeviceUsed>>
She watches your hands, not your face.
<<say "Lysara" "Hands on your knees. Where I can see them.">>
You put them there. Your knuckles go white on your own legs.
<</if>>
<<storyVideo "story/lysara_cell_events/feed_through_bars">>
<<if _storyClip is "8594652fed6f">>She's changed for the night. Black lace and nothing over it: a bra that lifts her tits from underneath and pushes them together until they swell over the scalloped edge, a scrap of lace between her legs, a black ribbon around her throat. Her nails are painted red. In the bowl, old-world cereal: little rings of sweet grain, dyed colours that haven't existed outside a sealed tin since before the war, drowning in milk.<<else>>In the bowl is something soft and sweet, drowning in milk.<</if>>
She dips the spoon. Lifts it. Holds it out between the bars, level with your lips, a thin white thread running off the edge of it.
<<if $temp.cellDays is 1>>
You don't open. Not at first. You're a grown man, and she's holding a spoon to your mouth like you're an invalid.
The spoon doesn't move. Neither does she.
<<say "Lysara" "Open.">>
You open. The spoon slides in over your tongue, cold and sweet, and she watches it go in the way she watches a drop fall into a beaker. She draws it out slowly, so your lips drag along the metal the whole way.
<<say "Lysara" "Swallow. Good. Again.">>
Spoon after spoon. Every time your mouth closes around the metal your cock jerks in the cage, and every time it jerks the steel bites, and a fresh bead of precum squeezes out through the bars and runs down onto your thigh. She sees it. She dips the spoon.
<<say "Lysara" "Chewing. Swallowing. The tongue pressing up against the palate. It all runs on the same nerves the gas has been sharpening since you woke. Feeding a man in your condition is very... informative.">>
<<elseif $temp.cellDays is 2>>
Your mouth is open before the spoon reaches the bars.
<<say "Lysara" "You opened before I said it.">>
She doesn't write it down. She doesn't need to. She feeds you slower tonight, holding each spoonful just short of your lips, so that you have to press your face into the gap to reach it. The iron bites your cheekbones. The cage bites everything else.
<<say "Lysara" "I keep an account, you know. Bread. Milk. My time with this spoon. Everything that leaves this laboratory is entered somewhere.">>
<<say $player.name "And who pays it?">>
<<say "Lysara" "When it's due, you'll know.">>
She slides the spoon in. Pulls it out. Watches your throat work.
<<elseif $temp.cellDays is 3>>
Tonight she takes the first spoonful herself.
She slides it between her own lips and closes her mouth over it, and draws it out slow and clean, her tongue chasing the last of the milk off the metal. Then she dips the same spoon and holds it out to you.
<<say "Lysara" "I test everything before it goes into a subject. Standard practice.">>
The spoon is warm from her mouth. You taste milk and sugar and, under both, her. Your cock surges so hard against the cage that you groan around the spoon, and she doesn't take it out. She waits for the groan to finish, with the metal resting on your tongue.
<<say "Lysara" "If you catch yourself thinking about whose mouth it was in, that's a symptom. Not a preference.">>
<<else>>
You can't hold still. The peak has you shaking, teeth knocking against the spoon, milk spilling down your chin and onto your chest.
She sets the bowl down, reaches through the bars and takes your jaw in her hand. Red-nailed fingers on your cheek, her thumb under your chin, holding your face still the way she'd hold a specimen still for the needle.
<<say "Lysara" "Still. There. Open.">>
She feeds you like that, one hand on your face and the other on the spoon, and each time you swallow her thumb slides down your throat and feels it go. When milk runs down your chin she catches it with her thumb and pushes it back between your lips. Her thumb stays on your lower lip a beat longer than the milk needs.
<<say "Lysara" "Swallowing reflex intact. Pulse at the jaw very high. You're burning through everything I put into you today.">>
<</if>>
<<if $flags.lysaraDeviceUsed>>
Halfway through the bowl she snaps her fingers, absently, the way she does over her notes. Your mouth falls open on its own. Your cock lurches against the steel so hard you grunt.
<<say "Lysara" "Still there. Good. The imprint holds even at supper.">>
<</if>>
The bowl is half empty when she lays the spoon down and reaches for the bottle.
<<say "Lysara" "You'll want something to drink. The gas dries a man out from the inside.">>
There's a tin cup on the table. She sets it under the neck of the bottle. Then she looks at you, not at the cup.
<div class="choice-container">
<<vchoice "Let her pour you a drink" "Cell_Lysara_Feed_Pour" "intimate" "water">>
</div><<run VaultUI.setBackground("cell")>>
<<run VaultUI.setTimeOfDay("night")>>
<<run document.body.classList.add("scene-mode-intimate")>>
<<set $player.lust to Math.min(100, $player.lust + 15)>>
<<if !$flags.lysaraDeviceUsed>><<set $flags.feralLevel to ($flags.feralLevel || 0) + 1>><</if>>
<h3>A Drink</h3>
<<storyVideo "story/lysara_cell_events/pour_1_spill">>
<<if _storyClip is "fc367f9ae604">>She tips the bottle. The first splash misses the cup by a hand's width and goes down the front of her black lace bra. She doesn't gasp. She looks at you, smiles, and peels the wet cups down off her tits one at a time, as if she's checking the damage. Her nipples are hard from the cold.<<elseif _storyClip is "ca5e44b7d6c6">>She tips the bottle. The first splash misses the cup by a hand's width and goes down the front of her white bra instead. She gasps at the cold, laughs, and looks down at the lace going see-through and clinging, her nipples standing up hard through it.<<else>>She tips the bottle. The first splash misses the cup by a hand's width and goes down the front of her bra instead. She gasps at the cold and looks down at the lace going dark and clinging, her nipples standing up hard through it.<</if>>
<<say "Lysara" "Oh. Clumsy. Lace stains.">>
<<if _storyClip is "ca5e44b7d6c6">>She finds the clasp between her tits, unhooks it, and lays it over the edge of the table like a wet cloth.<<else>>She reaches behind her back, unhooks it, and lays it over the edge of the table like a wet cloth.<</if>> Her tits come free, heavy and pale, swaying as she straightens, the nipples drawn up tight from the cold milk. She steps back from the bars to keep her balance. One step. Exactly far enough that your arm, if you shoved it through to the shoulder, would close on air.
<<storyVideo "story/lysara_cell_events/feed_cup_pour">>
<<if _storyClip is "70f257f4bf15">>She stands there in black garters, black stockings and the ribbon at her throat, the bottle in her hand, explaining something about the cup and waving the bottle as she talks. Then she tilts it. Not toward the cup. Toward herself.
Milk sheets over her tits. It runs down the slope of them in thick white ropes, gathers in the crease underneath, swings from her nipples in long strings and spatters on the stone. It runs down her belly into the lace at her hips and soaks the tops of her stockings. She keeps pouring, slow, and she watches you the whole time, not the milk.
Then she sets the bottle down and spreads it with her palm. Red nails dragging through the white, smoothing it over one breast and then the other, lifting the weight of each in her hand to get underneath, working it in like the salve she tests on her arms. Her nipples slide slick between her fingers.<<else>>She tilts the bottle toward the cup and misses again. Milk sheets down her chest and over her tits, swings from her nipples in long white strings, and she watches you while it runs.<</if>>
Your cock is jammed so hard into the front of the cage that the bars cut lines into it. Precum doesn't drip any more. It strings from the tip to the stone in one unbroken thread.
<<if $temp.cellDays is 1>>
<<say "Lysara" "Milk draws the compound out through the skin. Any alchemist will tell you so. I'm simply rinsing.">>
<<elseif $temp.cellDays is 2>>
<<say "Lysara" "You're staring. The gas fixes the eye on anything wet and moving. It isn't your fault you can't look away.">>
<<elseif $temp.cellDays is 3>>
<<say "Lysara" "Again. Every night, the same bottle. I really should find a steadier one.">>
She doesn't put it down.
<<else>>
<<say "Lysara" "Don't reach. You'll scrape your arm raw on the iron trying, and then I'll have to dress it, and I'll be standing even closer than this.">>
<<storyVideo "story/lysara_cell_events/pour_3_dripping">><<set _pourDripShown to true>>
She lets that sit. She rubs the milk into her nipple with two fingers while it does.
<</if>>
<<set _feedCanLick to setup.cellFeedLick && ($flags.kissedLysara || $flags.rimmedLysara || $flags.tastedLysara) && !$flags.lysaraDeviceUsed>>
<<if _feedCanLick>>
She looks down at herself. At the floor. At the white splashed up the bars of your cell.
<<say "Lysara" "Now I'll have to clean all of this. The floor. The bars.">>
<<if !_pourDripShown>><<storyVideo "story/lysara_cell_events/pour_3_dripping">><</if>>
She steps in again. Takes hold of two bars, one in each hand, and leans in to see how far the milk went. Her tits press into the gap between them, slick and heavy, a hand's width from your face. A drop gathers on her nipple. Hangs there.
<<say "Lysara" "I'll just be a moment.">>
<<else>>
<<if !_pourDripShown>><<storyVideo "story/lysara_cell_events/pour_3_dripping">><</if>>
She stays where she is, out of reach, and lets it drip.
<</if>>
<<if _storyClip is "87ed840c643b">>For a moment the gas shows you the rest of it. Your mouth already on her slick nipple through the gap. Her hand slipping between the bars and finding your cock bare, out of the steel, stroking it slow and wet with milk. Then the cage bites, and you're on your own side of the iron with nothing in your mouth at all.<<elseif _storyClip is "1f15774d5685">>She cups both tits, lifts them, lets them drop and lifts them again, milk-slick and heavy, talking to you the whole time in the same even voice she uses for dosages.<<elseif _storyClip is "5225b4bf130a">>For a moment the gas shows you what she's daring you to want: you on your back on a narrow bed and her leaning over you, dragging her milk-slick tits slow across your chest and belly, watching your face. Then the cage bites, and she's a body's length beyond the bars.<</if>>
<<run document.body.classList.remove("scene-mode-intimate")>>
<div class="choice-container">
<<if _feedCanLick>>
<<vchoice "Lick the milk off her through the bars" "Cell_Lysara_Feed_Lick" "intimate" "lips">>
<</if>>
<<vchoice "Ask for the rest of the bowl" "Cell_Lysara_Feed_Eat" "action" "eating">>
</div><<run VaultUI.setBackground("cell")>>
<<run VaultUI.setTimeOfDay("night")>>
<<run document.body.classList.add("scene-mode-intimate")>>
<<set $player.lust to 100>>
<h3>Residue</h3>
You don't decide to. Your face is in the gap before the drop falls.
<<storyVideo "story/lysara_cell_events/feed_lick">>
You catch it on your tongue, and then her nipple is in your mouth and you're sucking. Milk, cold and sweet and fatty, and under it her skin, warm, faintly salt. She makes a small sound in her throat. Her hands tighten on the bars. She doesn't step back.
<<say "Lysara" "I was only— the bars—">>
You lick her clean. The whole heavy curve of her tit, the underside where the milk pooled, the soft crease beneath it, back up to the nipple, and you suck it again, hard, until it's swollen and dark and slick with spit instead of milk. She pushes the other one through the bars to you before you've finished.
<<say "Lysara" "That one too. Dairy fat holds the compound. You're— removing a contaminant. Orally. That's all this— that's all—">>
Her hips roll into the iron. Once. Again. The lace at her hips grinds against the bar between her thighs, and her breath goes ragged above your head. Your cock is screaming in the cage, the head crushed against the steel, leaking, and you keep your mouth on her because it's the only part of you she's letting have anything.
Then she straightens. Steps back. Your mouth closes on nothing.
She looks down at herself: wet with spit, nipples red, not a drop of milk left on her. She takes a breath and her voice comes back level.
<<say "Lysara" "Oral contact. Mammary tissue, both sides. Prolonged suction. Ingestion of— milk. Mostly milk.">>
<<say "Lysara" "You couldn't help it. A starving man, and something sweet and white right in front of his mouth. The gas doesn't ask. I'll stand further back tomorrow.">>
She won't. You both know she won't.
<<run document.body.classList.remove("scene-mode-intimate")>>
<div class="choice-container">
<<vchoice "Finish the bowl" "Cell_Lysara_Feed_Eat" "action" "eating">>
</div><<run VaultUI.setBackground("cell")>>
<<run VaultUI.setTimeOfDay("night")>>
<<set $player.hunger to Math.min($player.maxHunger, $player.hunger + 25)>>
<<set $player.health to Math.min($player.maxHealth, $player.health + 5)>>
<h3>The Rest of It</h3>
<<if previous() is "Cell_Lysara_Feed_Lick">>
She wipes herself down with a cloth from the table, briskly, without looking at you, the way she'd wipe down a bench.
<<else>>
Milk is still running off her in thin lines, down her belly and into her stockings. She doesn't wipe it.
<</if>>
She pushes the bowl under the bars and leaves the spoon in it.
<<if $flags.tastedLysara || $flags.rimmedLysara>>
<<say "Lysara" "Keep up your strength. You'll need it.">>
<<else>>
<<say "Lysara" "Finish it. All of it. I'll know if you don't.">>
<</if>>
She takes her lace off the table, and the bottle, and walks back toward her bench bare-backed. She doesn't hurry. She disappears into the lab, and the lamp goes with her.
<<storyVideo "story/lysara_cell_events/feed_prisoner_eats">>
You sit against the bars with the bowl in your lap and your head bowed over it, and you eat.
The milk has gone warm. You don't care. You eat like a man who hadn't noticed he was starving until someone put food in his mouth: fast, then faster, scraping the bottom, tipping the bowl up to get the last of it. <<if $temp.cellDays is 3>>The spoon is the one she had in her mouth. You lick it clean anyway. You lick it clean because of that.<<else>>You lick the spoon clean when there's nothing left.<</if>>
Your belly is full for the first time since you woke up in here. It's almost worse. A full stomach leaves room to notice everything else: the ache in your balls, the cage, the smell of milk and her still hanging in the air.
<p class="success">You've eaten. A little of your strength comes back.</p>
<<if $temp.cellDays is 1>>
<<journalAdd "She fed me tonight. Spoon through the bars, like I was a child or an invalid, and I let her. Then she poured milk all over her tits and called it rinsing. I ate every bite. I'm not even sure which part I was hungry for." "reflection">>
<</if>>
<div class="choice-container">
<<vchoice "Try to sleep" "Cell_Night_Sleep" "action" "night">>
</div><<run VaultUI.setBackground("cell")>>
<<run VaultUI.setTimeOfDay("night")>>
<<set $player.hunger to Math.min($player.maxHunger, $player.hunger + 40)>>
<<set $player.health to Math.min($player.maxHealth, $player.health + 5)>>
<<set $player.will += 1>>
<h3>Feeding Yourself</h3>
<<say $player.name "Give me the bowl. I can feed myself.">>
She considers you over the rim of it. Considers your hands, gripping the bars.
<<say "Lysara" "You'd rather do it yourself. Noted.">>
She sets the bowl on the stone and slides it under the bars with the toe of her shoe. The spoon she keeps. She puts it in her mouth, slowly, and sucks it clean, and drops it into the pocket of her robe.
<<say "Lysara" "Utensils stay on my side. Eat. Sleep if you can.">>
<<storyVideo "story/lysara_cell_events/feed_prisoner_eats">>
There's nothing to eat with but your fingers. You sit with the bowl in your lap and your head bowed over it, scooping soaked grain into your mouth by the handful, milk running down your wrists. You lick your fingers. You lick the bowl.
She doesn't go back into the lab. She sits on the edge of her table, one leg crossed over the other, the robe fallen open to the hip, and watches you eat until the bowl is empty.
<<say "Lysara" "Eating is data too.">>
Then she disappears into the lab.
<p class="success">You've eaten. A little of your strength comes back.</p>
<<if $temp.cellDays is 1>>
<<journalAdd "Wouldn't let her spoon-feed me. Ate with my hands instead, on the floor of a cage, while she watched. I'm not sure that was the win I thought it was." "reflection">>
<</if>>
<div class="choice-container">
<<vchoice "Try to sleep" "Cell_Night_Sleep" "action" "night">>
</div><<run VaultUI.setBackground("alchemy_lab")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<<run document.body.classList.add("scene-mode-intimate")>>
<h3>Release (Feral Path)</h3>
She leads you to her work table—the same one she bent over while teasing you.
<<say "Lysara" "Sit.">>
You sit. Your heart pounds. After what you did to her...
<<say $player.name "Lysara, I—">>
<<say "Lysara" "Quiet.">>
Her voice is cold. Clinical. She kneels between your legs, producing a small key.
Your cock is inches from her face. The same cock that—
You try not to think about it.
Her hands work the mechanism. Click. Click. Click.
The cage falls away.
Your cock springs free—returned to its normal, pre-gas size. The monstrous transformation has faded. But something feels... different.
<<storyVideo "characters/lysara/cage_unlock_reveal">>
<<say "Lysara" "The physical changes are temporary. Your body has metabolized the gas.">>
She doesn't touch it. Just examines it clinically.
<<say "Lysara" "However...">>
Her eyes meet yours. Something dangerous glitters in them.
<<say "Lysara" "There may still be trace amounts in your system. I need to... verify.">>
<div class="choice-container">
<<vchoice "Let her check" "Lysara_Feral_Verification" "intimate" "alert">>
</div><<run VaultUI.setBackground("alchemy_lab")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<h3>Verification</h3>
You swallow hard.
<<say $player.name "What kind of verification?">>
<<say "Lysara" "I need to extract any remaining gas. The fastest method is oral.">>
After what you did to her? She wants to put her mouth on you?
<<say $player.name "Are you sure that's... safe? After—">>
<<say "Lysara" "After you broke out of your cage, overpowered my barrier, and fucked my ass through the bars until I couldn't walk straight?">>
Her voice is perfectly level.
<<say "Lysara" "Yes. I remember.">>
<<storyVideo "story/lysara_feral_conclusion/verification">>
<<if _storyClip is "56f3d0b3e77c">><<say "Lysara" "Stand up.">> You stand. She kneels in front of you, takes the head of your cock between her lips and holds it there, tasting, eyes flat and assessing up the length of you. You flinch.<<else>>She wraps her hand around your cock. You flinch.<</if>>
<<say "Lysara" "Relax. This is purely clinical.">>
You don't believe her. Not for a second.
But you're in no position to refuse.
<<say $player.name "...Okay.">>
<div class="choice-container">
<<vchoice "Submit to the extraction" "Lysara_Feral_Blowjob" "intimate" "lips">>
</div><<run VaultUI.setBackground("alchemy_lab")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<h3>Extraction</h3>
Lysara's mouth engulfs your cock.
<<say $player.name "AH—">>
There's nothing gentle about it.
She takes you to the root in one motion, her nose pressing against your pelvis. Then she SUCKS—hard, almost painfully hard.
<<storyVideo "characters/lysara/feral_revenge_bj">>
<<say $player.name "FUCK—">>
She pulls back, her lips dragging along your shaft with agonizing friction. Then plunges down again. And again. And again.
She's not sucking you off.
<<if _storyClip is "1654d521c901">>She drags your hands into her hair and makes you use her throat until it hurts. She's PUNISHING you with it.<<else>>She's PUNISHING you.<</if>>
<<set $player.lust to 90>>
<div class="choice-container">
<<vchoice "Endure it" "Lysara_Feral_Blowjob_2" "intimate" "will">>
</div><<run VaultUI.setBackground("alchemy_lab")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<h3>Payback</h3>
<<storyVideo "story/lysara_feral_conclusion/blowjob_2" "" "characters/lysara/feral_revenge_bj">>
<<if _storyClip is "07222c09f1f7">>Her pace is brutal. She climbs up onto the exam couch on all fours, coat hanging open, tits swinging, and facefucks herself onto your cock with an intensity that borders on violent, your hand tangled in her hair, her throat constricting around you with each thrust.<<else>>Her pace is brutal. She facefucks herself onto your cock with an intensity that borders on violent, her throat constricting around you with each thrust.<</if>>
<<say $player.name "Lysara— wait— I'm going to—">>
She pulls off. Completely. Leaves you twitching in the cold air.
<<say "Lysara" "No.">>
<<say $player.name "What—">>
<<say "Lysara" "You don't get to cum yet.">>
Her hand wraps around your base, squeezing. The orgasm that was building CRASHES back down, denied.
<<say $player.name "FUCK!">>
<<say "Lysara" "You made me cum against my will. Twice.">>
Her voice is ice.
<<say "Lysara" "Now you understand how that feels.">>
<<set $player.lust to 100>>
<div class="choice-container">
<<vchoice "Beg for release" "Lysara_Feral_Blowjob_3" "intimate" "high-arousal">>
</div><<run VaultUI.setBackground("alchemy_lab")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<h3>Edge</h3>
<<storyVideo "story/lysara_feral_conclusion/blowjob_3" "" "characters/lysara/feral_revenge_bj">>
<<if _storyClip is "9248bb993093">>She pushes you down flat on your back on the bench, shrugs the coat off, oils herself from a flask on the shelf and stretches out on her front beside you, naked and slick, your cock in her fist. Then she does it again. And again. And AGAIN.<<else>>She does it again. And again. And AGAIN.<</if>>
Each time you get close, she stops. Squeezes. Denies you.
<<say $player.name "Please— Lysara— I can't—">>
<<say "Lysara" "Can't what? Take it?">>
She licks your tip slowly, watching your face contort.
<<say "Lysara" "You certainly could dish it out.">>
<<say $player.name "I'm sorry— the gas— I couldn't control—">>
<<say "Lysara" "I know.">>
Her tongue swirls around your head.
<<say "Lysara" "But knowing doesn't make my ass hurt any less.">>
She takes you deep again—and this time, she doesn't stop. She bobs her head faster, harder, her throat working around you like a vice.
<<say $player.name "LYSARA—">>
<div class="choice-container">
<<vchoice "CUM" "Lysara_Feral_Blowjob_Climax" "intimate" "high-arousal">>
</div><<run VaultUI.setBackground("alchemy_lab")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<h3>Release</h3>
You EXPLODE.
<<storyVideo "story/lysara_feral_conclusion/blowjob_climax" "" "characters/lysara/feral_revenge_bj">>
<<if _storyClip is "9ffcd9282598">>After all that edging, all that denial, the orgasm rips through you like lightning. She kneels, coat hanging open, and holds her tongue out for it. You fist your cock over her mouth. She takes it—takes everything you have to give.<<else>>After all that edging, all that denial, the orgasm rips through you like lightning. Your hips buck involuntarily, fucking her throat, and she takes it—takes everything you have to give.<</if>>
<<say $player.name "AHHHHH— FUCK— TAKE IT—">>
<<if _storyClip is "9ffcd9282598">>Rope after rope lands on her tongue. She holds it there, mouth open, eyes locked on yours with something between triumph and hunger. Then she swallows.<<else>>Rope after rope floods her mouth. She swallows greedily, her throat working, her eyes locked on yours with something between triumph and hunger.<</if>>
The orgasm goes on forever. Days of tension, transformed violence, guilt—all of it pouring out of you.
When it finally ends, you collapse back on the bench, gasping, trembling.
<<if _storyClip is "9ffcd9282598">>A strand of cum still hangs from her lip to your softening cock.<<else>>Lysara pulls off with a wet pop. A strand of cum connects her lips to your softening cock.<</if>>
She catches it with her tongue.
<<say "Lysara" "Mmm.">>
She stands, wiping her mouth with the back of her hand.
<<say "Lysara" "The gas is purged. You're clean.">>
<<say $player.name "That... that wasn't just about the gas.">>
<<say "Lysara" "Of course it was.">>
Her expression is perfectly neutral.
<<say "Lysara" "I had to verify that all traces were extracted. The edging was necessary to ensure complete drainage.">>
You stare at her.
<<say "Lysara" "What?">>
<<say $player.name "Nothing.">>
She's full of shit and you both know it. But what are you going to do—argue?
<<set $player.lust to 10>><<run setup.playerReleased()>>
<<addCorruption 5>>
<<set $flags.lysaraRevengeBlowjob to true>>
<<run document.body.classList.remove("scene-mode-intimate")>>
<div class="choice-container">
<<vchoice "Continue" "Lysara_Feral_Aftermath_Talk" "action" "talk">>
</div><<run VaultUI.setBackground("alchemy_lab")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<h3>Business</h3>
You pull your clothes back on. Your body feels... different. Lighter. More energized.
<<set $player.maxEnergy += 10>>
<<set $player.energy to $player.maxEnergy>>
<p class="success"><<icon "energy">> The feral transformation has permanently increased your maximum energy by 10!</p>
<<say "Lysara" "You may notice some lasting effects. Enhanced stamina. Increased energy reserves. Consider it... compensation.">>
For what she did to you, or what you did to her? You're not sure anymore.
<<say $player.name "Lysara... about what happened in the cell—">>
<<say "Lysara" "We're not discussing it.">>
Her voice is final.
<<say "Lysara" "What matters now is your companion. The one in the coma.">>
Right. Kira.
<<say $player.name "Can you help her?">>
<<say "Lysara" "I have a Resurgence Elixir prepared. It will wake her.">>
She moves to a shelf and selects a vial. Golden liquid shimmers inside.
<<say $player.name "Thank you. How much—">>
<<say "Lysara" "This one is free.">>
She holds it out.
<<say "Lysara" "Consider it compensation. For the trap. And for...">>
Her eyes flick away.
<<say "Lysara" "Everything else.">>
<div class="choice-container">
<<vchoice "Take the elixir" "Lysara_Feral_Give_Potion" "action" "potion">>
</div><<run VaultUI.setBackground("alchemy_lab")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
You take the vial. It's warm in your hand.
<<say $player.name "How do I use it?">>
<<say "Lysara" "Pour it on her lips. She'll wake within minutes.">>
<<say $player.name "Thank you. Truly.">>
<<say "Lysara" "Don't thank me yet.">>
Her expression hardens.
<<say "Lysara" "This potion requires rare ingredients. Ingredients I can't easily replace.">>
<<say $player.name "What kind of ingredients?">>
<<say "Lysara" "Moonpetal extract. Crystallized dream-matter. Essence of arousal.">>
She steps closer.
<<say "Lysara" "If your companion falls into this state again—and she WILL, the vault's defenses ensure it—you'll need another elixir.">>
<<say $player.name "And you won't give me that one for free.">>
<<say "Lysara" "Clever boy.">>
She almost smiles.
<<say "Lysara" "When that happens, you'll gather the ingredients yourself. And pay my price.">>
<<say $player.name "What price?">>
<<say "Lysara" "We'll discuss that when the time comes.">>
<<set $flags.hasResurgenceElixir to true>>
<<if !setup.ownsItem("resurgence elixir")>><<run setup.giveItem("resurgence elixir", 1)>><</if>>
<<set $flags.lysaraOwesPrice to true>>
<<set $flags.lysaraComplicated to true>>
<div class="choice-container">
<<vchoice "\"How do I find you again?\"" "Lysara_Lab_Access_Feral" "talk" "door-handle">>
</div><<run VaultUI.setBackground("alchemy_lab")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<<say $player.name "How do I find you again? When I need the next elixir?">>
<<say "Lysara" "The same way you found me this time. Follow the path. Avoid the traps.">>
She pauses.
<<say "Lysara" "I'll disable the gas trap. For now. You've... proven you can handle it.">>
Is that respect in her voice? Or wariness?
<<say "Lysara" "But don't come here unless you need something. I value my solitude.">>
<<say $player.name "Understood.">>
She turns away, already absorbed in her work.
<<say "Lysara" "One more thing.">>
You stop.
<<say "Lysara" "What happened between us... it doesn't leave this laboratory. Not to your companion. Not to anyone.">>
<<say $player.name "Agreed.">>
<<if $flags.lysaraAntidoteRelationship is "intrigued" || $flags.lysaraAntidoteRelationship is "watched">>
She glances at you over her shoulder.
<<say "Lysara" "And... if you ever want to explore what you're capable of when you're in control...">>
She lets the sentence hang.
<<say "Lysara" "You know where to find me.">>
<</if>>
<<set $flags.lysaraAccessUnlocked to true>>
<<set $flags.alchemyLabUnlocked to true>>
<<set $flags.canVisitLysara to true>>
<<set $flags.feralPathComplete to true>>
<<journalAdd "Something happened in Lysara's lab. The gas turned me into... something else. A beast. Pure instinct and hunger." "story">>
<<if $flags.feralRapedLysara>>
<<journalAdd "I used her. Through the bars of my cage. Couldn't stop myself - didn't WANT to stop. The sounds she made... I should feel guilty. Part of me doesn't." "reflection">>
<<journalAdd "She got her revenge after. Edged me until I was begging, then milked me dry. Said it was 'necessary.' Maybe it was. Maybe she just wanted payback. Either way, we're even now." "relationship">>
<<else>>
<<journalAdd "Lysara handled it. Handled ME. Even transformed, she wasn't afraid. Just... clinical. Professional. And maybe a little intrigued." "relationship">>
<</if>>
<<journalAdd "Got the potion for Kira. That's what matters. Whatever I had to do, whatever I became - it was worth it." "story">>
<div class="choice-container">
<<vchoice "Return to Kira" "Lysara_Lab_Exit_Feral" "action" "door-handle">>
</div><<run VaultUI.setBackground("alchemy_lab")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<h3>Return</h3>
You dress in the clothes Lysara provides—your old ones were shredded during the transformation.
<<storyVideo "characters/lysara/amb_lab_passage">>
The walk back through the archives is quiet. Your body feels different now. Energized. Changed.
<<if $flags.feralRapedLysara>>
You can still feel everything. The transformation. The violence. Her screams as you took her through the bars.
And then... her revenge. The brutal, edging blowjob that left you just as wrecked as you'd left her.
<<if $flags.lysaraRevengeBlowjob>>
"The edging was necessary to ensure complete drainage."
You almost laugh. She's something else.
<</if>>
<</if>>
Kira is where you left her—unconscious, but breathing steadily.
<<say $player.name "I'm back.">>
No response. Of course not.
You look at the Resurgence Elixir in your hand. Time to wake her up.
<div class="choice-container">
<<vchoice "Wake Kira" `$flags.kiraResurgenceUsed ? "Kira_Second_Resurgence" : "Kira_Awakening"` "action" "health">>
</div><<run VaultUI.setBackground("cell")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<<run document.body.classList.add("scene-mode-intimate")>>
<<set $flags.feralRapedLysara to true>>
<h3>Claimed</h3>
<<say "Lysara" "Ahhhhhh—!">>
Her gasp echoes through the laboratory as you FORCE your way inside.
Her ass is impossibly tight—but you don't care. You PUSH. The monstrous head of your transformed cock SPREADS her open inch by inch.
<<say "Lysara" "Oh— oh GODS—">>
<<say $player.name "MINE.">>
You sink deeper. Her hands grip the bars white-knuckled, but she's not pulling away. If anything, she's pushing BACK.
<<say "Lysara" "It's so... so DEEP—">>
<<say $player.name "Not deep enough.">>
You SLAM your hips forward. Your whole cock buries itself inside her with a wet SLAP.
<<storyVideo "characters/lysara/feral_rough" "" "" "9">>
<<if _storyClip is "1bd826d55444">>Her knees go. She slides down the bent bars and you go down with her, both of you on your sides on the cold stone at the gap, your chest hard against her back, one arm locked across her tits and your mouth at her neck, grinding in to the root.<</if>>
<<say "Lysara" "Nnngghhh...!">>
For a moment, everything is still. Your cock throbbing inside her stretched ass. Her body trembling. Her breath coming fast and shallow.
Was that a moan? Or something else?
Then you start to MOVE.
<<set $player.lust to 100>>
<div class="choice-container">
<<vchoice "FUCK HER" "Cell_Feral_Ravage" "danger" "lust">>
</div><<run VaultUI.setBackground("cell")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<h3>Savage</h3>
You POUND her.
Each thrust SLAMS her body against the bars. The metal groans. The whole cell shakes. And Lysara—
<<storyVideo "characters/lysara/feral_rough" "" "" "10">>
<<say "Lysara" "Ah— ah— AHHH—">>
<<say $player.name "This what you wanted? HUH?">>
You grab her hair and YANK her head back.
<<say $player.name "You wanted to watch me suffer? WANTED TO SEE ME BEG?">>
<<say "Lysara" "The barrier... should have...">>
Her voice is strained, but there's something else in it. Something that sounds almost like... satisfaction?
<<say $player.name "It FAILED.">>
You slam into her HARD.
<<say $player.name "Just. Like. You.">>
You fuck her harder. Faster. The wet sound of flesh slapping flesh echoes through the laboratory.
And Lysara—despite her protests—is pushing back against every thrust. Meeting you. TAKING you.
<<say "Lysara" "Gods— I can feel you so DEEP—">>
<<say $player.name "Feel THIS.">>
You slam deep and HOLD. Grinding. Stretching her.
<<say "Lysara" "Nnnngh...">>
Her ass clenches around you. Rhythmically. Deliberately.
She's not fighting you at all.
<<say $player.name "You're enjoying this.">>
<<say "Lysara" "...">>
She doesn't deny it.
<div class="choice-container">
<<vchoice "MAKE HER ADMIT IT" "Cell_Feral_First_Climax" "danger" "lust">>
</div><<run VaultUI.setBackground("cell")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<h3>Release</h3>
You reach around and find her clit. Swollen. Slick.
<<say "Lysara" "Ahh—">>
<<say $player.name "You're soaking wet.">>
<<say "Lysara" "The gas... affects me too...">>
<<say $player.name "Bullshit.">>
You circle her clit while fucking her harder. Faster.
<<say $player.name "You WANTED this.">>
<<say "Lysara" "I— nnnngh—">>
<<say $player.name "SAY IT.">>
Her ass clenches TIGHT around you. Her whole body shudders.
<<say "Lysara" "I... I wanted...">>
She cums.
Silently. Intensely. Her body convulsing, her pussy gushing, her ass milking your cock with rhythmic spasms.
And that tips you over the edge.
<<say $player.name "FUCK—">>
You EXPLODE inside her.
Days of denial. Days of torment. Days of that fucking cage.
All of it ERUPTS into her ass.
<<storyVideo "characters/lysara/feral_rough" "" "" "11">>
<<if _storyClip is "1c6fdd50ea0f">>Somewhere in it you've ended up flat on the stone at the gap with her on top of you, back to your chest, her heels kicking at the air and her own fingers working her clit while you pump into her ass.<</if>>
<<say "Lysara" "Oh... oh gods... so much...">>
Her voice is dreamy. Satisfied. Like she's exactly where she wants to be.
You keep cumming. Keep PUMPING. The excess leaks out around your shaft, runs down her thighs.
When it finally stops, you're both breathing hard.
But your cock is still hard. Still buried inside her.
<<say "Lysara" "Mmm... is that all?">>
Is she... taunting you?
<<say $player.name "No.">>
You start thrusting again.
<<say "Lysara" "Good.">>
<div class="choice-container">
<<vchoice "USE HER AGAIN" "Cell_Feral_Second_Round" "danger" "lust">>
</div><<run VaultUI.setBackground("cell")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<h3>Relentless</h3>
You fuck her cum-soaked ass with renewed hunger. Each thrust makes obscene squelching sounds. Each thrust draws another soft moan from her.
<<storyVideo "characters/lysara/feral_rough" "" "" "12">>
<<say "Lysara" "The antidote... I should...">>
Her hand moves lazily toward her hip. A small pouch.
You see a flash of blue glass.
<<say $player.name "No.">>
You grab her wrist. Not hard—just firm.
<<say "Lysara" "If I give you this, you'll stop...">>
<<say $player.name "Do you want me to stop?">>
Silence. She doesn't answer.
<<say $player.name "Drop it.">>
The vial slips from her fingers. Almost like she let it go on purpose.
SHATTERS.
<<say "Lysara" "Oh no. That was my only one.">>
Her voice is flat. Unconvincing.
<<say $player.name "You did that on purpose.">>
<<say "Lysara" "Did I?">>
You can hear the smile in her voice.
<<say $player.name "You WANTED this. All of it.">>
<<say "Lysara" "Maybe I just wanted to see how far you'd go.">>
You slam deep. Hold.
<<say $player.name "How far do you want me to go?">>
<<say "Lysara" "...Don't stop.">>
<div class="choice-container">
<<vchoice "DON'T STOP" "Cell_Feral_Desperation" "danger" "lust">>
</div><<run VaultUI.setBackground("cell")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<h3>Endless</h3>
You've lost count of how many times you've cum inside her.
Three? Four? The gas has turned your balls into an endless reservoir of seed, and Lysara's ass is overflowing with it.
<<storyVideo "characters/lysara/feral_rough" "" "" "13">>
<<say "Lysara" "Mmm...">>
She's languid now. Relaxed. Her body moving with yours like she's done this a thousand times.
Which, given her centuries of existence, she probably has.
<<say $player.name "Had enough?">>
<<say "Lysara" "Have you?">>
Another orgasm builds. You're not sure if it's your fourth or your fifth.
<<say "Lysara" "I have to admit... you've exceeded my expectations.">>
<<say $player.name "What?">>
<<say "Lysara" "Most men would have collapsed by now. The gas usually burns them out in an hour.">>
She looks over her shoulder at you. Her eyes are clear. Calculating.
<<say "Lysara" "You're... different.">>
Then her voice changes. Softer. Almost pleading.
<<say "Lysara" "Please... no more... I can't...">>
Is she finally breaking?
<<say "Lysara" "Thara... keth'ris... mah'zuun...">>
Wait. That's not begging. That's—
<div class="choice-container">
<<vchoice "What is she—" "Cell_Feral_Summoning" "danger" "alert">>
</div><<run VaultUI.setBackground("cell")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<h3>The Incantation</h3>
<<storyVideo "characters/lysara/amb_summoning">>
The air turns cold.
<<say "Lysara" "Thara nok'zuun... keth'ris val'mora...">>
Her voice is rhythmic now. Musical. Ancient words that make your skin crawl.
<<say $player.name "What are you—">>
<<say "Lysara" "Shal'keth VEL'THARA!">>
The shadows in the corner of the laboratory MOVE.
<<storyVideo "story/lysara_demon/cell_feral_summoning">>
<<if _storyClip is "74787eef5ac2">>Something gathers out of the darkness. A red haze first, then a face inside it: semi-transparent, feminine, pale hair drifting like smoke, eyes that burn like embers.<<else>>Something steps out of the darkness. Semi-transparent. Feminine. Curves that shift like smoke, eyes that burn like embers.<</if>>
A demon.
<<say "Thara" "You called, little alchemist? I was enjoying my—">>
Her burning eyes find you. Your cock. Still buried in Lysara's ass.
<<say "Thara" "Oh MY.">>
<div class="choice-container">
<<vchoice "What the fuck—" "Cell_Feral_Demon_Appears" "danger" "alert">>
</div><<run VaultUI.setBackground("cell")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<h3>Thara</h3>
<<storyVideo "characters/lysara/amb_thara">>
The demon drifts closer, her smoky form solidifying as she examines you with naked hunger.
<<say "Thara" "What have we here? A male in full transformation... and still CONSCIOUS?">>
<<storyVideo "story/lysara_demon/appears">>
<<if _storyClip is "8e992c0b9a87">>She prowls the length of the bars, a shape of red smoke, circling you like a predator.<<else>>She circles you like a predator.<</if>>
<<say "Thara" "Lysara, you've been holding out on me. This one is MAGNIFICENT.">>
<<say "Lysara" "He's yours. Temporarily.">>
Lysara's hands move in sharp, precise gestures.
<<say "Thara" "Wait— what are you— I didn't agree to—">>
A pulse of energy YANKS the demon toward you.
<<say "Thara" "LYSARA!">>
<div class="choice-container">
<<vchoice "NO—" "Cell_Feral_Possession" "danger" "transform">>
</div><<run VaultUI.setBackground("cell")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<<set $flags.demonPossessed to true>>
<h3>Possessed</h3>
The demon SLAMS into you.
Your body convulses. Your grip on Lysara's hips releases as you're thrown backward against the cell wall.
<<say "Lysara" "Ahh—">>
She stumbles forward, finally free. Cum drips down her thighs as she catches herself on her work table.
But you barely notice.
Because there's something INSIDE you now.
<<say "Thara" "Oh... oh this is... mmmmm...">>
Her voice is in your HEAD. Purring. Delighted.
You try to move. Can't. Your body isn't yours anymore.
<<say "Thara" "Shh, don't fight it. Let me just... explore...">>
Your hand moves on its own. Reaches down. Wraps around your still-hard cock.
<<storyVideo "characters/lysara/demon_possessed_stroke">>
<<say "Thara" "By the seven hells... LOOK at this thing.">>
<<if _storyClip is "b161f1467f31">>Lysara comes back to the gap in the bars and kneels there, bare, mouth open. Thara makes your hand slap your cock against her tongue. Then Lysara takes it in her mouth, just long enough to taste. For the sample, she says, and wipes her lips.<</if>>
<div class="choice-container">
<<vchoice "Get OUT of me—" "Cell_Feral_Demon_Explores" "danger" "transform">>
</div><<run VaultUI.setBackground("cell")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<h3>Exploration</h3>
<<say $player.name "Get out— get OUT—">>
<<say "Thara" "Shh. I'm busy.">>
<<storyVideo "characters/lysara/demon_possessed_stroke_explores">>
<<if _storyClip is "aadf78167be4">>She sits you down on the edge of the thin mattress and drags your torn trousers back up your thighs, just to see how your cock looks standing out of them. Your hand falls away. Your cock jerks and leaks untouched as the thing inside you explores. And you feel EVERYTHING—every twitch, and HER pleasure at controlling you.<<elseif _storyClip is "2df0bca35fd1" or _storyClip is "b453c9303d91">>Your hand strokes your cock, slow and deliberate, but it isn't your hand she wants on it. Through the broken bars Lysara is already watching, rubbing oil into her bare tits. And you feel EVERYTHING—your touch, but also HER pleasure at controlling you.<<else>>Your hand strokes your cock. Slowly. Deliberately. And you feel EVERYTHING—your touch, but also HER pleasure at controlling you.<</if>>
<<say "Thara" "Do you have any idea how long it's been since I've had a body? A MALE body?">>
<<if _storyClip is "2df0bca35fd1" or _storyClip is "b453c9303d91">>Thara walks you to the broken bars. Lysara kneels on the other side, bare and slick with oil, reaches through, pries your hand away and wraps her tits around your cock instead. Arousal response under possession, she says, like she's taking a pulse. Thara makes you thrust up into them.<<elseif _storyClip is "aadf78167be4">>She makes it jerk again. A string of precum spits out of you without a finger on it.<<else>>She makes you squeeze harder.<</if>>
<<say "Thara" "And this cock... gods, what did that gas DO to you? It's like a weapon.">>
<<if _storyClip is "2df0bca35fd1" or _storyClip is "b453c9303d91">>Lysara keeps working you between her tits, slow and even, oil squelching on every stroke.<<else>>Across the room, Lysara is pulling on her robes. Calmly.<</if>> Like nothing unusual is happening.
<<say $player.name "Lysara— help—">>
<<say "Lysara" "You'll be fine. She'll get bored eventually.">>
<<if _storyClip is "2df0bca35fd1" or _storyClip is "b453c9303d91">>She says it up at you over the top of her tits, watching your face the way she'd watch a reaction bubble in a flask.<<else>>She doesn't even look at you.<</if>>
<<say "Thara" "BORED? With this?">>
<<if _storyClip is "aadf78167be4">>Your hand closes round your cock again and pumps. Your hips buck involuntarily—HER doing, not yours.<<else>>Your hand speeds up. Your hips buck involuntarily—HER doing, not yours.<</if>>
<<say "Thara" "Oh, I'm going to have SO much fun.">>
<div class="choice-container">
<<vchoice "Please—" "Cell_Feral_Demon_Plays" "danger" "lust">>
</div><<run VaultUI.setBackground("cell")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<h3>Plaything</h3>
<<say "Thara" "Let's see what this body can do.">>
She makes you stroke faster. Harder. Your cock is raw, oversensitive from hours of fucking, but she doesn't care.
<<storyVideo "characters/lysara/demon_possessed_stroke_plays">>
<<say "Thara" "Can you feel that? I can feel EVERYTHING. Every nerve. Every pulse.">>
She edges you. Brings you close, then stops. Your body shudders with denied release.
<<say "Thara" "Mmm. You want to cum so badly, don't you?">>
<<say $player.name "Stop— please—">>
<<say "Thara" "Say it. Say you want to cum.">>
<<say $player.name "...">>
<<if _storyFamily is "sf_cg_lysara_demon_04">>She wrings the head of your cock in your own fist. Gently. Then not so gently. Precum drips through your fingers.<<else>>She squeezes your balls. Gently. Then not so gently.<</if>>
<<say "Thara" "SAY it.">>
<<say $player.name "I want— fuck— I want to cum—">>
<<say "Thara" "Good boy.">>
She doesn't let you.
<div class="choice-container">
<<vchoice "Endure" "Cell_Feral_Demon_Whispers" "danger" "lust">>
</div><<run VaultUI.setBackground("cell")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<h3>Whispers</h3>
<<storyVideo "characters/lysara/demon_possessed_stroke_whispers">>
<<if _storyClip is "b4d6ece2cca0">>Lysara comes back with an empty vial and kneels at the gap in the bars, vial ready. Thara stands you up and makes you fuck your own fist, hips snapping, cock punching through your grip.<<else>>Lysara comes back with an empty vial, stands it on the stone and kneels at the broken bars. Thara pushes your hips through the gap, and Lysara tucks your cock between her tits and squeezes them round it like a press.<</if>>
She isn't ignoring you anymore. She's harvesting you.
<<say "Thara" "She's cold, isn't she? Using us both.">>
Your hips keep pumping to a beat you didn't pick. She sets it from somewhere behind your eyes, slow when she wants to savour, vicious when she gets bored.
<<say "Thara" "But you and I... we could have such FUN together.">>
Her voice drops lower. More intimate. Like a lover whispering in your ear.
<<say "Thara" "I could visit you in your dreams. Ride this magnificent cock whenever I wanted.">>
Your body shudders. Another denied orgasm.
<<say "Thara" "I could possess you during battle. Make you fuck your enemies into submission.">>
<<say $player.name "That's— insane—">>
<<say "Thara" "Is it? You LIKED what you did to Lysara. I can feel it. The memory of her ass squeezing you...">>
<<if _storyClip is "b4d6ece2cca0">>She makes you thrust into your own fist, faster, harder. Lysara watches from her knees with the vial ready and doesn't lay a finger on you.<<else>>She makes you thrust up into the slick trap of Lysara's tits. Lysara lets her. The vial waits by her knee.<</if>>
<<say "Lysara" "Possessed ejaculate. Do you know how rare that is? This is for the record. Nothing more.">>
<<say "Thara" "You want MORE. You want to take. To claim. To BREED.">>
<<say $player.name "That was the gas—">>
<<say "Thara" "Was it?">>
<div class="choice-container">
<<vchoice "..." "Cell_Feral_Demon_Finale" "danger" "lust">>
</div><<run VaultUI.setBackground("cell")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<h3>Release</h3>
<<say "Thara" "I suppose I should give you a taste. A preview of what we could have.">>
She strokes faster. Your hips buck. Your balls tighten.
<<say "Thara" "When you cum, I want you to think about this. Think about ME inside you. Controlling you. Using you.">>
<<say $player.name "Fuck— fuck—">>
<<say "Thara" "Because I WILL find you again. And next time...">>
She squeezes.
<<say "Thara" "Next time I won't be so gentle.">>
She lets you cum.
<<storyVideo "characters/lysara/demon_possessed_stroke_finale">>
<<if _storyClip is "d05afab9200a">>Thara turns you to the broken bars. Lysara is kneeling in the gap, bare, face tipped up and mouth open, and it tears out of you in thick ropes across her cheeks and tongue, far more than a body should hold. Thara keeps your hand pumping through every aftershock, painting her until your balls ache from the emptying.<<else>>It tears out of you in thick ropes, far more than a body should hold, until your balls ache from the emptying. She keeps your hand pumping through every aftershock, wringing out the last of it just to feel you twitch.<</if>>
<<say "Thara" "Mmmm... delicious.">>
Your vision starts to blur. The exhaustion finally catching up.
<<say "Thara" "Aww. Fading already?">>
She sounds disappointed.
<<say "Thara" "Males are so fragile. But you... you lasted longer than most.">>
Darkness creeps in at the edges.
<<say "Thara" "Sleep now, little mortal. I know where you live.">>
Her presence fades. Slipping out of you like smoke.
<<if _storyClip is "d05afab9200a">>The last thing you see is Lysara scraping your cum off her chin into her vial with two fingers. That same small smile.<<else>>The last thing you see is Lysara glancing at you from across the room. That same small smile.<</if>>
Then nothing.
<<set $player.lust to 10>><<run setup.playerReleased()>>
<<set $flags.feralLevel to 0>>
<<set $temp.feralStage to 0>>
<<set $flags.veltharaMet to true>>
<div class="choice-container">
<<vchoice "..." "Cell_Feral_Aftermath" "action" "sleep">>
</div><<run VaultUI.setBackground("cell")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<<run document.body.classList.remove("scene-mode-intimate")>>
<h3>Awakening</h3>
You wake slowly.
Everything aches. Your muscles feel like they've been through a war. Your cock—
Your cock is back in a cage.
<<say $player.name "...fuck.">>
<<say "Lysara" "Welcome back.">>
She's sitting across the room, watching you, in a fresh black blouse sheer enough to show the bra under it and buttoned to the throat, glasses on, hair scraped back into a tight tail, a pen turning slowly between her red-nailed fingers.
<<storyVideo "characters/lysara/composed_robe_feral_aftermath">>
Like nothing happened.
Except for the slight flush still lingering on her cheeks. And the way she shifts her weight when she moves.
<<say "Lysara" "How do you feel?">>
<<say $player.name "Like I got hit by a cart.">>
<<say "Lysara" "The transformation takes a toll. Your body burned through weeks of energy in a few hours.">>
The pen stills between her fingers. Her other hand drifts to her throat and rests there, fingers over a pulse that still hasn't settled. Clinical. Almost.
<<say "Lysara" "But you exceeded all my projections. Most subjects collapse after the first hour. You lasted nearly four.">>
<<say $player.name "Subjects?">>
<<say "Lysara" "Did you think you were the first person I've exposed to that gas?">>
She smiles. It doesn't quite reach her eyes.
<<say "Lysara" "You're just the first one who's been... interesting.">>
She stands and approaches the cell. Her walk is careful. Deliberate.
<<say "Lysara" "The transformation has passed. Your body has metabolized the worst of the gas.">>
She produces a key.
<<say "Lysara" "Which means it's time to remove the cage. Again.">>
<<say $player.name "You're still going to—?">>
<<say "Lysara" "The deal was <<= setup.cellDaysWord(false, $temp.cellStayDays || 3)>> days. You survived—in your fashion.">>
She unlocks the cell.
<<say "Lysara" "Don't mistake this for forgiveness. Or permission.">>
Her eyes meet yours.
<<say "Lysara" "What happened... won't happen again. I'll be prepared next time.">>
<p class="system-message"><<icon "transform">> The feral transformation has ended. You've returned to mostly normal—but something has changed between you and Lysara.</p>
<<set $flags.survivedAgonyPath to true>>
<<set $flags.feralPathComplete to true>>
<<set $player.strength to Math.max($player.strength - 10, $player.strength - 15 + 5)>>
<<set $player.will += 5>>
<<addCorruption 10>>
<div class="choice-container">
<<vchoice "Follow her" "Lysara_Remove_Cage_Feral" "action" "door-handle">>
</div><<run VaultUI.setBackground("cell")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<<set $flags.feralWarningShown to true>>
<<if ($flags.feralLevel || 0) >= setup.cellFeral.severe>><<set $flags.feralSevereWarningShown to true>><</if>>
<h3>Something's Wrong</h3>
<<set _warningLevel to $flags.feralLevel || 0>>
<<storyVideo "characters/lysara/amb_feral_surge">>
<<if _warningLevel < setup.cellFeral.severe>>
Your thoughts are getting... strange.
The constant arousal isn't just physical anymore. It's seeping into your mind. Coloring everything.
When Lysara walks past the cell, you don't see a woman. You see prey. Warm. Wet. Willing—or soon to be willing.
<<say $player.name "...">>
You catch yourself GROWLING at her.
<<say "Lysara" "...Are you alright?">>
<<say $player.name "Fine. I'm fine.">>
You're not fine. Something is changing.
<p class="warning"><<icon "transform">> The gas is affecting your mind. Your thoughts are becoming... primal.</p>
<<else>>
NEED.
That's all there is now. NEED.
Your cock strains against the cage so hard that the metal groans. Your muscles feel tight, coiled, ready to TAKE.
When Lysara moves in your peripheral vision, your head SNAPS toward her. Tracking. Hunting.
<<say "Lysara" "You're deteriorating faster than I expected.">>
Her voice sounds strange. Distant. Like it's coming through water.
<<say "Lysara" "I can give you the antidote. Right now. Before—">>
<<say $player.name "NO.">>
The word tears out of you. Guttural. Barely human.
<<say $player.name "I want... I NEED...">>
<<say "Lysara" "What do you need?">>
Your eyes fix on her body. On the curves beneath her robes. On the flesh you can SMELL from here.
<<say $player.name "YOU.">>
She takes a step back.
<p class="danger"><<icon "transform">> You're losing yourself. The feral transformation is nearly complete.</p>
<</if>>
<div class="choice-container">
<<if _warningLevel < setup.cellFeral.surrender>>
<<vchoice "Fight it - try to meditate" "Cell_Meditate" "action" "meditation">>
<</if>>
<<if _warningLevel < setup.cellFeral.severe>>
<<vchoice "Endure the urges" "Cell_Agony_Wait" "action" "will">>
<<vchoice "Rest until nightfall" "Cell_Day_End" "action" "night">>
<</if>>
<<if _warningLevel >= setup.cellFeral.severe>>
<<vchoice "Accept the antidote" "Cell_Feral_Accept_Antidote" "action" "potion">>
<<vchoice "..." "Cell_Feral_Surrender" "danger" "transform">>
<</if>>
</div><<run VaultUI.setBackground("cell")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<h3>Last Chance</h3>
<<say $player.name "The... the antidote. Give it to me.">>
The words come out broken. Your jaw feels wrong—too tight, too hungry.
Lysara approaches carefully, the vial in her hand. Her eyes never leave yours.
<<say "Lysara" "Easy. Don't move.">>
<<storyVideo "story/mv_lysara_feral/accept_antidote">>
She reaches through the bars. Her hand trembles slightly.
You can smell her fear. It's... intoxicating.
<<set _willCheck to random(1, 20) + Math.floor($player.will / 10)>>
<<if _willCheck >= 12>>
You close your eyes. Force yourself to breathe. To be HUMAN.
The vial touches your lips. Cool liquid slides down your throat.
<<say "Lysara" "Good. Good. Just relax.">>
The fire starts to fade. Slowly. The red haze at the edges of your vision recedes.
<<say $player.name "I almost...">>
<<say "Lysara" "I know. But you didn't.">>
She pulls her hand back, visibly relieved.
<<say "Lysara" "The antidote will work faster now. Three hours, and you'll be yourself again.">>
<p class="success">You pulled back from the edge. The feral transformation has been stopped.</p>
<<set $temp.cellPath to "antidote">>
<<set $temp.cellHours to 0>>
<<set $temp.antidoteFlirted to 0>>
<<set $flags.feralLevel to 0>>
<<set $player.lust to 60>>
<div class="choice-container">
<<vchoice "Wait for the antidote to work" "Cell_Antidote_Hour1" "action" "night">>
</div>
<<else>>
Your hand SHOOTS through the bars and grabs her wrist.
<<say "Lysara" "What—">>
<<say $player.name "Not. Enough.">>
You pull her toward the bars. She drops the vial—it shatters on the stone floor.
<<say "Lysara" "NO! That was—">>
<<say $player.name "I don't want the antidote.">>
Your other hand reaches through, grabbing her hip.
<<say $player.name "I want YOU.">>
<div class="choice-container">
<<vchoice "TAKE HER" "Cell_Feral_Trigger" "danger" "grab">>
</div>
<</if>><<run VaultUI.setBackground("cell")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<<set $flags.choseFeralPath to true>>
<h3>Surrender</h3>
You're shaking.
Not from cold. Not from fear. From NEED so intense it's eating you alive from the inside out.
Your cock strains against the cage so hard that something inside the mechanism CRACKS. Pain lances through you—but it's distant now. Everything is distant except the HUNGER.
<<say $player.name "No... no no no...">>
You try to focus. Try to breathe. But your lungs won't cooperate. Every inhale brings more of that fucking GAS into your system and every exhale comes out as a growl.
<<say $player.name "Lysara...">>
Your voice sounds wrong. Deeper. Rougher. Like gravel scraped across stone.
She looks up from her work. Her eyes widen.
<<say "Lysara" "Your eyes... they're changing color.">>
<<say $player.name "Help... me...">>
<div class="choice-container">
<<vchoice "Fight for control" "Cell_Feral_Fight_Control" "danger" "will">>
</div><<run VaultUI.setBackground("cell")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<h3>Slipping</h3>
You grip your head with both hands, trying to hold yourself together. Trying to think.
<<say $player.name "The antidote... give me the fucking antidote...">>
Lysara rises slowly, watching you like you're a caged animal. Which, you suppose, you are.
<<say "Lysara" "I don't think that's wise. In your current state, you might—">>
<<say $player.name "NOW!">>
The word comes out as a ROAR. The bars of your cell VIBRATE with the force of it.
Lysara freezes.
<<say "Lysara" "...I see.">>
She moves toward her reagent shelf. Toward the blue vial.
Your eyes track her. Track the sway of her hips. The curve of her ass beneath those robes.
<p class="internal-thought">Bend her over that table. Rip those robes off. Shove your cock so deep she—</p>
<<say $player.name "NO!">>
You SLAM your fist against the bars. The metal groans.
<<say $player.name "Get out of my head! GET OUT!">>
<<set $player.lust to 100>>
<div class="choice-container">
<<vchoice "Hold on" "Cell_Feral_Losing_It" "danger" "will">>
</div><<run VaultUI.setBackground("cell")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<h3>Losing</h3>
Lysara has the antidote now. She's approaching the cell, vial in hand.
<<storyVideo "story/mv_lysara_feral/losing_it">>
<<say "Lysara" "Easy. I'm going to hand this through the bars. Don't—">>
But you're not looking at the vial.
You're looking at her throat. The pulse beating there. You want to bite it. Feel her blood on your tongue while you fuck her from behind.
<<say $player.name "Stay... stay back...">>
<<say "Lysara" "You need to drink this. It will—">>
<<say $player.name "STAY BACK!">>
You lunge at the bars. Not to escape—to get AWAY from her. To put distance between yourself and the thing you're becoming.
Your cock SLAMS against the cage. Something SNAPS.
Not the cage. Something inside YOU.
<<say $player.name "Oh fuck... oh fuck oh fuck...">>
Your hands are shaking. Your vision is pulsing red at the edges.
<<say $player.name "Lysara... I can't... I CAN'T STOP IT...">>
<div class="choice-container">
<<vchoice "Lose yourself" "Cell_Feral_Trigger" "danger" "transform">>
</div><<run VaultUI.setBackground("cell")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<<set $flags.feralPathTriggered to true>>
<<set $temp.feralStage to 1>>
<h3>The Beast</h3>
The last thread of control SNAPS.
Your muscles SWELL. Veins bulge across your arms, your chest, your neck. You claw at the cage, yanking at it like a leash, and your cock—already massive from days of transformation—SURGES against the metal, straining it until something has to give.
<<storyVideo "story/lysara_agony_days/day2_sleep">>
The lock gives. The cage slides off and your cock springs free—monstrous, inhuman, thick as your forearm and dripping with need.
<<storyVideo "characters/lysara/feral_transform">>
<<say $player.name "RRRRAAAGGGHHH!">>
The sound that tears from your throat isn't human. It's primal. Predatory.
<<say "Lysara" "Gods—">>
<<storyVideo "characters/lysara/amb_antidote_vial">>
<<if _storyClip is "72d98ae29892">>The vial trembles in her raised fingers, the liquid catching the candlelight. Then it slips. Glass shatters. The antidote pools on the stone floor.<<elseif _storyClip is "2dfd5e9dd5de">>The antidote slips from her fingers and bursts on the stone. Glass and liquid spray out in a glittering fan, then settle into a dark wet stain between the flagstones.<<else>>The antidote slips from her fingers. Glass shatters. Blue liquid pools on the stone floor.<</if>>
<<say "Lysara" "No— NO!">>
But you don't care about the antidote anymore.
You care about HER.
<<set $player.strength += 15>>
<<set $player.lust to 100>>
<div class="choice-container">
<<vchoice "ATTACK THE BARS" "Cell_Feral_Attack_Bars" "danger" "strength">>
</div><<run VaultUI.setBackground("cell")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<h3>Breaking</h3>
You SLAM into the bars with your full weight.
The entire cell SHUDDERS. Dust rains from the ceiling.
<<say "Lysara" "STOP! The structural integrity—">>
You slam again. And again. Your fists are bleeding but you don't feel it. All you feel is NEED.
<<say $player.name "LET ME OUT!">>
<<say "Lysara" "I CAN'T! The lock is—">>
<<say $player.name "I'LL BREAK IT DOWN!">>
You grab two bars and PULL. Your muscles scream. Your tendons strain. Something in your shoulder pops—and the bars start to BEND.
<<say "Lysara" "That's impossible— those are reinforced steel—">>
One bar SNAPS. Then another.
<<say "Lysara" "THE WARD!">>
She scrambles backward, hands moving in desperate patterns. Purple light ERUPTS from runes carved into the floor.
The barrier SLAMS into you like a wall of force, throwing you back against the far wall of the cell.
<<say $player.name "GAAAHHH!">>
<div class="choice-container">
<<vchoice "GET UP" "Cell_Feral_Ward" "danger" "strength">>
</div><<run VaultUI.setBackground("cell")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<h3>Trapped</h3>
You're on your feet before the pain registers.
The barrier shimmers between you and Lysara—a wall of purple light that crackles when you approach it.
<<say $player.name "NO!">>
<<storyVideo "characters/lysara/amb_ward">>
You SLAM your fists against it. Lightning arcs across your skin. The pain is WHITE-HOT—but the hunger is worse.
<<say "Lysara" "It's no use. The ward responds to hostile intent. The more you fight—">>
<<say $player.name "LET ME OUT LET ME OUT LET ME OUT!">>
You're screaming. Pounding. Tearing at the barrier with your bare hands while lightning burns your skin black and your cock THROBS with desperate, agonizing need.
<<say "Lysara" "Stop! You're going to kill yourself!">>
<<say $player.name "I DON'T CARE!">>
You charge the barrier. It throws you back. You charge again. It throws you back again.
<<say $player.name "I NEED— I NEED TO—">>
<<say "Lysara" "What? What do you need?">>
She's pressed against the far wall now, eyes wide, voice trembling. Finally showing fear.
You stop. Chest heaving. Blood dripping from your burned hands. Cock standing rigid and weeping.
<<say $player.name "You.">>
It comes out as a growl.
<<say $player.name "I need to fuck you. I need to BREED you. I need to pin you down and pump you full until you're DRIPPING with my—">>
<<say "Lysara" "ENOUGH!">>
<div class="choice-container">
<<vchoice "DEMAND HER" "Cell_Feral_Demand" "danger" "lust">>
</div><<run VaultUI.setBackground("cell")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<h3>Demands</h3>
<<say $player.name "Come here.">>
<<say "Lysara" "No.">>
<<say $player.name "COME. HERE.">>
The command rattles the vials on her shelves. Lysara flinches—but doesn't move.
<<say "Lysara" "You're not thinking clearly. The gas has—">>
<<say $player.name "I'm thinking PERFECTLY clearly.">>
You press against the barrier. It burns. You don't care.
<<say $player.name "I'm thinking about bending you over that table. I'm thinking about ripping those robes off your body. I'm thinking about spreading your ass and shoving my cock so deep you feel it in your THROAT.">>
<<say "Lysara" "...">>
<<say $player.name "And I'm thinking about how you're going to SCREAM when I do it.">>
Silence.
Then—impossibly—Lysara LAUGHS.
<<say "Lysara" "Oh my. That IS the gas talking.">>
She pushes off from the wall. Straightens her robes. And walks TOWARD the cell.
<<say $player.name "What are you doing?">>
<<say "Lysara" "You want to fuck me? Fine. Let's see how badly.">>
<div class="choice-container">
<<vchoice "Watch her approach" "Cell_Feral_Lysara_Approach" "danger" "eye">>
</div><<run VaultUI.setBackground("cell")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<h3>Cruel</h3>
She stops just outside the barrier. Close enough that you can smell her perfume mixing with something muskier.
Her arousal.
<<say "Lysara" "Look at you. Transformed into a beast. That magnificent cock—bigger than anything I've seen in centuries.">>
Her eyes drop to your erection. She licks her lips slowly.
<<say "Lysara" "And you can't. Touch. Me.">>
<<say $player.name "Let me OUT—">>
<<say "Lysara" "No.">>
She lets her robes slide open. Slowly.
<<storyVideo "characters/lysara/strip_reveal">>
<<say "Lysara" "But I think I'll watch you suffer a little more first.">>
<<say $player.name "You fucking BITCH—">>
<<say "Lysara" "Yes. I am.">>
<<if _storyClip is "f8ad4dff7f0d">>Her white robe hangs wide, and you realise it was never fastened at all: tits bare, nothing under it, and she smiles like a physician delivering bad news she enjoys.<<else>>Her robes hang open now. Nothing underneath.<</if>>
<div class="choice-container">
<<vchoice "WATCH" "Cell_Feral_Tease_1" "intimate" "eye">>
</div><<run VaultUI.setBackground("cell")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<<run document.body.classList.add("scene-mode-intimate")>>
<h3>Torment</h3>
<<storyVideo "characters/lysara/strip_reveal_tease">>
<<if _storyClip is "0ab768ba52ce">>She drags the thin fabric down under her tits, lets them spill out heavy over it, and squeezes one in her palm while she watches your face.<<else>>Underneath her robes, she wears nothing.<</if>>
No undergarments. No shift. Just pale skin, huge heavy breasts, and a neatly trimmed patch of dark hair between her thighs.
<<say "Lysara" "I've been naked under my robes for days. Did you know that?">>
Your cock THROBS so hard it hurts.
<<say "Lysara" "Every time I walked past your cell, I was one layer away from giving you exactly what you wanted.">>
She cups her breasts. Lifts them. Lets them drop.
<<say "Lysara" "And now here we are.">>
<<say $player.name "I'LL FUCKING KILL YOU—">>
<<say "Lysara" "No you won't.">>
<<if _storyClip is "1257f0172ca8">>She doesn't step closer. She sinks back onto the cot in her alcove, head on the cushions, and kneads her tits in both hands, slow, watching your cock jerk every time she squeezes.<<else>>She steps closer to the barrier.<</if>>
<<say "Lysara" "You'll stand there with that monster cock dripping on the floor while I touch myself and cum watching you LOSE YOUR MIND.">>
<<if _storyClip is "fe902553b20c">>She hikes the hem up over her hips and slides her hand down between her thighs.<<else>>She slides a hand between her thighs.<</if>>
<<say "Lysara" "Doesn't that sound fun?">>
<<set $player.lust to 100>>
<div class="choice-container">
<<vchoice "RAGE" "Cell_Feral_Tease_2" "danger" "lust">>
</div><<run VaultUI.setBackground("cell")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<h3>Breaking You</h3>
You throw yourself at the barrier. Lightning SEARS your skin. You don't stop.
<<say $player.name "I'LL TEAR THROUGH THIS THING— I'LL RIP YOU APART—">>
<<say "Lysara" "Mmm. Keep talking.">>
<<storyVideo "characters/lysara/masturbate_feral">>
<<if _storyClip is "29e439ac59db">>She's dragged a thick glass toy onto the cot in her alcove and she's riding it on all fours, back to you, her ass rising and slapping down as the glass slides in and out of her pussy.<<else>>She's fingering herself now. Two fingers pumping in and out while her other hand works her clit.<</if>>
<<say "Lysara" "Tell me more about what you're going to do to me.">>
<<say $player.name "I'M GOING TO FUCK YOUR ASS SO HARD YOU CAN'T WALK—">>
<<say "Lysara" "Ahhhh... yes...">>
<<say $player.name "I'M GOING TO CHOKE YOU ON MY COCK UNTIL YOU CAN'T BREATHE—">>
<<say "Lysara" "More...">>
She's moaning now. Actually MOANING while you burn yourself on the barrier.
<<say $player.name "I'M GOING TO FILL YOU UP— EVERY HOLE— PUMP YOU FULL OF CUM UNTIL IT'S RUNNING DOWN YOUR LEGS—">>
<<say "Lysara" "Oh fuck— yes— keep going—">>
<<if _storyClip is "29e439ac59db">>She's already facing away. She drops her shoulders to the mattress so her ass fills your whole view—the ass you worshipped through the bars just days ago.<<else>>She turns around. Bends over. Shows you her ass—the ass you worshipped through the bars just days ago.<</if>>
<<say "Lysara" "This what you want? This hole?">>
<<if _storyClip is "29e439ac59db">>She reaches back and spreads one cheek with her hand, still grinding down on the glass.<<else>>She spreads her cheeks with one hand, still fingering herself with the other.<</if>>
<<say "Lysara" "You ate it so nicely. Remember? Tongue buried deep while I came on your face?">>
<div class="choice-container">
<<vchoice "LOSE YOUR MIND" "Cell_Feral_Tease_3" "danger" "lust">>
</div><<run VaultUI.setBackground("cell")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<h3>Her Game</h3>
You can't think anymore.
Every thought that forms dissolves into NEED. Your vision has narrowed to her body—her tits, her ass, her pussy glistening in the dim light.
<<say "Lysara" "Aww. Lost the ability to speak?">>
She approaches the barrier again. This time, she PRESSES HER ASS against it—right in front of you.
<<say "Lysara" "The barrier only stops hostile intent. It doesn't stop... contact.">>
She grinds against the invisible wall. Her ass cheeks spread. Her pussy opens.
<<say "Lysara" "If you were calm—if you could control yourself—you could reach through and touch me.">>
She looks over her shoulder with a cruel smile.
<<say "Lysara" "But you can't, can you? You're too far gone. Too FERAL.">>
She reaches back, sets her palm on one cheek and pulls it wide, slow enough that you watch every inch of it open.
<<storyVideo "characters/lysara/presents_ass">>
<<say "Lysara" "So close. I'm RIGHT HERE. All you'd have to do is be GENTLE and—">>
Something in you SNAPS.
Not anger. Something deeper. Something PRIMAL.
You stop fighting the barrier with rage.
You reach through it with HUNGER.
<div class="choice-container">
<<vchoice "REACH FOR HER" "Cell_Feral_Lunge" "danger" "grab">>
</div><<run VaultUI.setBackground("cell")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<h3>Contact</h3>
Your hand passes through the barrier.
No lightning. No resistance. Just... through.
<<say "Lysara" "What—">>
Your fingers brush her ass. Warm. Soft. REAL.
<<say "Lysara" "That's impossible— the ward should—">>
You grab her hip. Pull her TOWARD you.
<<say "Lysara" "NO!">>
She tries to pull away—but she's pressed against the barrier from the other side. There's nowhere to go.
Your other hand reaches through. Grabs her other hip.
<<say $player.name "Got you.">>
<<say "Lysara" "LET GO! The barrier only allows contact if you're not being AGGRESSIVE—">>
<<say $player.name "I'm not being aggressive.">>
You're being HUNGRY.
You YANK her backward. Her ass SLAMS against the bars—against YOUR cock, which is jutting through the gap you made when you broke them.
<<storyVideo "characters/lysara/feral_rough" "" "" "7">>
<<say "Lysara" "WAIT— WAIT—">>
<<say $player.name "No.">>
<div class="choice-container">
<<vchoice "TAKE HER" "Cell_Feral_Stumble" "danger" "grab">>
</div><<run VaultUI.setBackground("cell")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<h3>Trapped</h3>
She's STUCK.
Her ass pressed against the bars. Her hands gripping the metal. Her body half-in, half-out of the barrier's protection.
<<say "Lysara" "Let me go—">>
Her voice is steady. Too steady for someone in her position.
You don't answer. You're past words.
One hand keeps her hip pinned. The other reaches down and spreads her ass cheeks.
<<say "Lysara" "Not there— you can't—">>
Your cock finds her asshole. The head presses against that tight ring of muscle.
<<say "Lysara" "You're too big— it won't—">>
<<say $player.name "Should have thought of that before you teased me.">>
She doesn't respond. But you notice she's not really struggling anymore.
You THRUST.
<<storyVideo "story/lysara_feral/position" "" "characters/lysara/feral_rough">>
<<if _storyClip is "cd0030c69304">>Her own hands come back and pull her cheeks wide for you, and the swollen head of your cock sinks into her ass.<</if>>
<div class="choice-container">
<<vchoice "TAKE HER" "Cell_Feral_Take" "danger" "lust">>
</div><<run VaultUI.setBackground("cell")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<<run document.body.classList.add("scene-mode-intimate")>>
<<set $temp.dayActions += 1>>
<<set _oralCount to $temp.lysaraOralCount || 0>>
<<if $flags.lysaraCascadeArc is "contaminated_drool" && !$flags.lysaraDroolParked>>
<<set _droolTier to $flags.lysaraDroolTier || 0>>
<<if _droolTier is 0>>
<<goto "Cell_Lysara_Drool_Kiss_Intimacy">>
<<elseif _droolTier is 1>>
<<goto "Cell_Lysara_Drool_Ass">>
<<else>>
<<goto "Cell_Lysara_Drool_Pussy">>
<</if>>
<<else>>
<h3>Through the Bars</h3>
<<set _event to $flags.lysaraIntimacyEvent || 1>>
<<set _alreadyClose to (_event is 1 || _event is 2 || _event is 5 || _event is 6 || _event is 7 || _event is 8 || (_event >= 11 && _event <= 18) || (_event >= 21 && _event <= 28))>>
<<if !_alreadyClose>>
<<say $player.name "Please... come closer. I need...">>
Lysara pauses her work. Studies you through the bars.
<</if>>
<<set _fromTierEvent to ($flags.lysaraIntimacyEvent && $flags.lysaraIntimacyEvent >= 1 && $flags.lysaraIntimacyEvent <= 30)>>
<<set _inMood to _fromTierEvent>>
<<if _inMood>>
<<if !_alreadyClose>>
She sets down her vial. Approaches slowly.
<</if>>
<<if _oralCount is 0>>
<<set _event to $flags.lysaraIntimacyEvent || 1>>
<<if _event is 1>>
Her lips are still there. Inches from the bars. From you.
<<say "Lysara" "I said it would be cruel not to offer relief.">>
A pause. Her breath warm on your face.
<<say "Lysara" "So take it.">>
<<elseif _event is 2>>
Her hand is still on your cheek. She leans in through the bars.
<<say "Lysara" "You're trembling. Poor thing.">>
<<say "Lysara" "Let me give you something to remember.">>
<<elseif _event is 3>>
She's at the bars now. The book forgotten.
<<say "Lysara" "The texts say a kiss can strengthen the bond. Shall we test it?">>
<<elseif _event is 4>>
Still in her thin shift, she approaches the bars.
<<say "Lysara" "You've been watching. Now feel.">>
<<elseif _event is 5>>
She's still pressed against the bars. Face inches from yours. Breath mingling.
<<say $player.name "Lysara... please...">>
Your voice cracks. Desperate.
<<say "Lysara" "Please what? I just dropped a vial. It was an accident.">>
Maintaining the innocent act. But not moving.
<<say $player.name "Kiss me. Please. I need—">>
<<say "Lysara" "Oh. You want to take advantage of my clumsiness?">>
<<say "Lysara" "I suppose... the gas has made you desperate enough to ask. And I did fall into such a... compromising position.">>
<<say "Lysara" "It would be unfair to blame you for wanting what's right in front of you. When I'm the one who got so close.">>
<<say "Lysara" "Very well. Since I caused this situation by being careless.">>
<<elseif _event is 6>>
Her fingers are still on your pulse. Her face still inches from yours. Her lips right there.
The gas screams in your blood. You can't—you can't think—
You surge forward. Your lips find hers through the bars.
For one perfect moment, she kisses you back. Soft. Warm. Her fingers tightening on your neck.
Then she pulls away. Eyes wide. Hand flying to her mouth.
<<say "Lysara" "What— what are you doing?">>
Shock. Innocence. Betrayal.
<<say "Lysara" "I was checking your vitals. I was trying to help you.">>
Her voice trembles. Is she acting? She has to be acting.
<<say $player.name "I— I'm sorry, I couldn't— the gas—">>
<<say "Lysara" "You just... you just kissed me. Without asking. Without permission.">>
She takes a step back. Her hand still covering her lips. Her eyes wounded.
Shame floods through you. Hot and terrible. She was just trying to help. And you—
<<say $player.name "I didn't mean to— I couldn't control—">>
<<say "Lysara" "I suppose that's not your fault. The gas does erode inhibition.">>
A pause. She lowers her hand slowly. Her lips are slightly swollen from the kiss.
<<say "Lysara" "I should have anticipated this. Impulsive behavior is... common at this stage.">>
She's rationalizing. Forgiving you. Making it okay.
<<say "Lysara" "It's my fault, really. I got too close. I should have known you couldn't control yourself.">>
Somehow that makes you feel worse. Like you're an animal. A thing that can't help itself.
<<say "Lysara" "The kiss itself... it wasn't unpleasant. Just... unexpected.">>
She touches her lips again. Something flickers in her eyes.
<<say "Lysara" "I suppose... for the sake of your treatment... we could consider that a form of relief. Unorthodox, but...">>
She approaches the bars again. Slowly. Carefully. Like approaching a wild animal.
<<say "Lysara" "If the gas makes you do that again... I won't blame you. It's a documented response.">>
Her face is close to the bars again. Not quite as close as before. But close.
<<say "Lysara" "I'm a professional. I understand you can't help what you are right now.">>
She's giving you permission. Absolving you in advance. And somehow that makes you feel even more ashamed.
<<elseif _event is 7>>
She's still there. Pressed against the bars. Her lips at your ear. Her breath on your neck.
<<say $player.name "Lysara...">>
Your voice comes out hoarse. Desperate.
<<say "Lysara" "Shh. Someone might hear.">>
Her whisper brushes against your ear. Her body shifts closer.
<<say "Lysara" "I know this is difficult. Having me so close. When you're in this condition.">>
Her hand moves from the bar to your shoulder. Steadying you. Or holding you in place.
<<say "Lysara" "I should move away. I know that. But I needed you to hear everything.">>
<<say $player.name "I heard you. You can—">>
<<say "Lysara" "Are you certain? Perhaps I should repeat the important parts. Just to be safe.">>
Her lips brush your ear again. Then the corner of your jaw.
<<say "Lysara" "The gas will make you want things. Things you can't have. Things you shouldn't ask for.">>
Her voice is barely audible now. More breath than words.
<<say "Lysara" "I'm not the kind of person who would take advantage of someone in your state. You understand that, don't you?">>
<<say $player.name "I— yes—">>
<<say "Lysara" "Good. So if something were to happen... if you were to, say, turn your head right now...">>
A pause. Her breath on your cheek.
<<say "Lysara" "That would be your choice. Your impulse. I'm simply standing here. Delivering important medical information.">>
She's giving you permission without giving you permission. Plausible deniability wrapped in a whisper.
<<say "Lysara" "I won't move. Whatever you decide.">>
Her lips hover at the corner of your mouth. Waiting.
<<else>>
Her finger is still on your lip. Her face inches from yours. The balm glistens.
<<say $player.name "Lysara...">>
Your voice comes out thick. Muffled by her finger still pressing against your mouth.
<<say "Lysara" "Shh. Don't speak. You'll smear the application.">>
Her finger traces your lower lip again. Slower this time. More deliberate.
<<say "Lysara" "The compound needs time to absorb. I should... monitor the process.">>
She doesn't step back. Her face is so close you can count her eyelashes through the bars.
<<say "Lysara" "Your breathing has changed. Elevated. That's a normal response to the treatment.">>
Her thumb brushes the corner of your mouth. Her eyes fixed on your lips.
<<say "Lysara" "The oral fixation I mentioned... you're experiencing it now, aren't you? The urge to...">>
She trails off. Her finger pressing slightly into your lower lip.
<<say $player.name "I can't— I need—">>
<<say "Lysara" "Need what? You have to tell me. For the treatment records.">>
Her voice is soft. Clinical. But her finger is still on your mouth. Still pressing.
<<say "Lysara" "Subjects sometimes request... direct contact. Mouth to mouth application of the compound.">>
She leans closer. Her lips almost touching the bars now.
<<say "Lysara" "I would never suggest such a thing, of course. It would be highly irregular.">>
Her finger withdraws from your lip. But her face stays close. So close.
<<say "Lysara" "However, if you were to request it... for therapeutic purposes... I am a professional.">>
Her breath is warm on your mouth. The balm tingles on your lips.
<<say "Lysara" "The choice is yours. I'm simply offering... options.">>
She waits. Lips parted. Eyes on your mouth.
<</if>>
<div class="choice-container">
<<if $flags.lysaraIntimacyEvent is 6>>
<<vchoice "..." "Cell_Lysara_Kiss" "intimate" "lips">>
<<elseif $flags.lysaraIntimacyEvent is 8>>
<<vchoice "\"Please...\"" "Cell_Lysara_Kiss" "intimate" "lips">>
<<else>>
<<vchoice "Kiss her" "Cell_Lysara_Kiss" "intimate" "lips">>
<</if>>
</div>
<<elseif _oralCount is 1>>
<<set _event to $flags.lysaraIntimacyEvent || 11>>
<<if _event is 11>>
<<say $player.name "Lysara... please... come here.">>
She hesitates. Then slowly straightens up from the workbench.
<<say "Lysara" "The gas is affecting you badly today, isn't it?">>
She walks toward the cell.
<<say "Lysara" "I suppose... if it helps with your symptoms... I should provide more intensive relief.">>
She turns her back to the bars. Presses against them.
<<say "Lysara" "The texts mention that oral contact with sensitive areas... you understand?">>
Her ass is right there. Against the bars.
<<say "Lysara" "This is very generous of me. I hope you appreciate it.">>
<<elseif _event is 12>>
She comes down from the bridge slowly. Her body still flushed from the position.
<<say $player.name "Please... Lysara...">>
<<say "Lysara" "You really are struggling. Poor thing.">>
She approaches the bars. Deliberately slow.
<<say "Lysara" "I've been reading about escalation of contact. When simple kissing proves insufficient.">>
She turns her back to you. Presses against the bars.
<<say "Lysara" "The research suggests... more intimate areas. I suppose I could allow you to... explore.">>
Her ass is pressed against the cold metal now.
<<say "Lysara" "For science, you understand.">>
<<elseif _event is 13>>
<<say $player.name "Lysara... I need... please...">>
She stands slowly from her crouched position.
<<say "Lysara" "Oh my. You're quite desperate, aren't you?">>
She walks to the bars. Turns her back.
<<say "Lysara" "I've been monitoring your symptoms. The kiss I gave you helped, but clearly not enough.">>
She presses her ass against the bars.
<<say "Lysara" "I suppose I'll need to be even more... accommodating. Since you're suffering so much.">>
<<say "Lysara" "You may... taste. For medical purposes.">>
<<elseif _event is 14>>
She sets down her book. Stands.
<<say "Lysara" "The gas has you quite worked up, doesn't it?">>
She approaches the cell slowly.
<<say $player.name "Please— I need—">>
<<say "Lysara" "I know what you need.">>
She turns, backing up to the bars. Her ass presses against the metal.
<<say "Lysara" "I'm being very generous with you. I hope you realize that.">>
Her robes hike up as she positions herself.
<<say "Lysara" "Go on then. Since you asked so nicely.">>
<<elseif _event is 15>>
You're already tongue-deep in her ass. Already licking. Already tasting.
She's still making those broken sounds. Those "I didn't mean for this" protests that don't mean anything.
<<say "Lysara" "You just— went for it— I barely had time to— oops—">>
That word again. 'Oops.' Minimizing. Like accidentally having your tongue in her asshole.
<<say $player.name "Lysara... more... please...">>
Your voice is muffled against her ass. Desperate. Begging.
<<say "Lysara" "I was just trying to work and— oh god— you took advantage of my fall—">>
She grinds harder into your face while accusing you.
<<say "Lysara" "A gentleman would have asked if I was hurt. But the gas made you so— aggressive—">>
<<say "Lysara" "I couldn't have predicted you'd react this way. Though I suppose I should have known—">>
<<say "Lysara" "When I accidentally fall in such a— mmm— compromising position— of course you'd— take what you want—">>
<<say "Lysara" "I can't even blame you at this point. You're so affected. So needy. Poor thing.">>
She moans despite herself. Pushing back against your tongue.
<<say "Lysara" "I suppose since you've already started without permission— it would be cruel to stop you now—">>
<<elseif _event is 16>>
You're already there. Tongue buried in her ass. Mind blank. Body moving on instinct.
<<say "Lysara" "I can't believe you just— without even asking— I was cleaning—">>
Her voice wavers. She's still on her hands and knees. Still hasn't pulled away.
<<say "Lysara" "The gas has completely— you've lost all— oh—">>
Your tongue pushes deeper. She makes a sound that isn't protest.
<<say "Lysara" "This is— for documentation purposes— the subject has exhibited complete loss of inhibition—">>
She's narrating. Like she's taking notes. While you eat her ass.
<<say "Lysara" "The tongue is— ah— applying pressure to the— the perineal region— which contains— significant nerve clusters—">>
You follow her guidance. Press where she described.
<<say "Lysara" "Yes— I mean— as expected— that area produces— involuntary responses—">>
Her hips shift. Pressing back against you.
<<say "Lysara" "The sphincter itself is— remarkably sensitive— subjects who apply— circular motions— tend to report—">>
More instruction disguised as observation. You obey. Circle your tongue.
<<say "Lysara" "Oh god— I mean— fascinating— the compound I spilled must be— affecting my— clinical detachment—">>
She's losing the act. Her body betraying her.
<<say "Lysara" "Deeper— for research— you should know— deeper penetration of the tongue— creates more— intense—">>
She can't even finish the sentence. You push your tongue inside her.
<<say "Lysara" "AH— that's— I wasn't— I was just— stating facts—">>
<<storyVideo "story/lysara_intimacy/event16_rim">>
<<if _storyClip is "d97842b9a1d0">>Her back arches. Her ass grinds against your face, and her feet find your cock.<<else>>Her back arches. Her ass grinds against your face.<</if>>
<<say "Lysara" "I didn't tell you to— you just— the gas made you— I'm simply providing— medical context—">>
<<say "Lysara" "The rhythm— subjects respond well to— consistent rhythm— not that I'm suggesting— I'm just—">>
You find a rhythm. Fucking her ass with your tongue. Following her "observations."
<<say "Lysara" "Perfect— I mean— exactly as documented— the subject is— I'm going to— this is purely—">>
She's close. You can feel it in how she trembles.
<<say "Lysara" "I never asked for— you just started— I was cleaning— and you— and now I'm going to— oh god—">>
<<elseif _event is 17>>
She's still bent over. Still holding herself open. Waiting for you to "assist."
<<say $player.name "Lysara... please... let me help.">>
Your voice is raw. Desperate. Exactly what she wanted.
<<say "Lysara" "Help? Oh. You mean with the examination.">>
She doesn't turn around. Doesn't close herself. Just waits.
<<say "Lysara" "I suppose... an external perspective could be valuable. For the research.">>
She backs toward the bars. Still bent over. Still spread.
<<say "Lysara" "You'll need to examine the area thoroughly. Check for... abnormalities.">>
Her ass presses against the cold metal. Right there. Open. Offered.
<<say "Lysara" "I noticed some... sensitivity. In certain regions. You should verify.">>
You don't need to be told twice. Your tongue finds her.
<<say "Lysara" "Ah— yes— that's— for diagnostic purposes— you should note— the response to stimulus—">>
She's still playing researcher. Even with your tongue on her ass.
You lick deeper. She gasps.
<<say "Lysara" "The nerve density in that area— oh— is particularly high— which explains—">>
Her clinical commentary breaks apart as you find her asshole. Circle it.
<<say "Lysara" "Document— you should document— how the subject— I mean— how I— respond to—">>
She's losing the act. Her body pushing back against your mouth.
<<say "Lysara" "The examination is— yielding interesting— oh god— results—">>
You push your tongue inside. She moans.
<<storyVideo "story/lysara_intimacy/event17_rim">>
<<say "Lysara" "That wasn't— I didn't ask you to— you're supposed to be— observing—">>
But she doesn't pull away. She pushes back. Deeper onto your tongue.
<<say "Lysara" "This is— highly unprofessional— I was conducting— serious research— and you—">>
Her voice breaks. Her legs tremble.
<<say "Lysara" "The gas— it must be affecting— my ability to— maintain— scientific—">>
She can't even finish the excuse. You're tongue-fucking her ass and she's grinding back onto you.
<<say "Lysara" "I'm going to— this isn't— I never intended— oh—">>
She cums with your tongue buried in her. Still trying to frame it as research gone wrong.
<<say "Lysara" "That was— entirely— your fault— I was just— examining—">>
Blame. Even in the afterglow.
<<else>>
You're already there. Tongue on her ass. She's still "trapped" against the cabinet.
<<say "Lysara" "STOP— please— I was just— getting my key—">>
She writhes against you. Her struggles push her ass harder against your face.
<<say "Lysara" "You can't do this— I'm stuck— I can't get away—">>
You lick deeper. She gasps. Her whole body shudders.
<<say "Lysara" "No— don't— I didn't want— you're USING me—">>
Her arm is still in the gap. Still "stuck." She could pull it out. She doesn't.
<<say "Lysara" "Please— I'm helpless— you're taking advantage of— oh god—">>
Your tongue circles her asshole. Her protests catch in her throat.
<<say "Lysara" "I can't— stop you— trapped like this— you're going to— do whatever you want—">>
She's setting the scene. Narrating her own helplessness. Making it clear she "can't" resist.
<<say "Lysara" "The gas made you— into an animal— and I'm just— stuck here— while you—">>
You push your tongue inside. She MOANS. Then catches herself.
<<storyVideo "characters/lysara/oral_player">>
<<say "Lysara" "NO— I didn't mean to— that sound— I don't WANT this—">>
But her hips are rocking. Grinding back onto your tongue. Her body knows what it wants.
<<say "Lysara" "You're— violating me— I'm a researcher— I was just— looking for my key—">>
She's panting now. The fake struggle becoming harder to maintain.
<<say "Lysara" "I can feel— your tongue— inside— I don't— I shouldn't—">>
Her voice breaks. The performance cracking.
<<say "Lysara" "Deeper— I mean— STOP going deeper— don't— don't stop— I mean STOP—">>
She can't keep her words straight anymore. Her body is overriding her script.
<<say "Lysara" "I'm going to— you're MAKING me— I don't want to— oh god oh god—">>
She cums hard. Her whole body convulsing. Her arm finally pulls free from the gap.
<<say "Lysara" "You— you MONSTER— I was just— I didn't ask for— how DARE you—">>
She's free now. Could move away. Doesn't.
<<say "Lysara" "I should— report this— you attacked me— while I was helpless—">>
Still pressed against the bars. Still breathing hard. Still not moving.
<<say "Lysara" "If you EVER do that again...">>
A threat that trails off into nothing.
<<say "Lysara" "...I might not be able to get free next time either.">>
Almost a whisper. Almost a promise.
<</if>>
<div class="choice-container">
<<vchoice "Bury your face in her ass" "Cell_Lysara_Ass" "intimate" "lips">>
</div>
<<else>>
<<set _event to $flags.lysaraIntimacyEvent || 21>>
<<if _event is 21>>
She's still there. Naked. Her thigh against the bar. Close enough to touch.
Your hand moves before you decide. Through the bars. Fingers closing around her wrist.
<<say "Lysara" "What— what are you—">>
<<storyVideo "story/lysara_intimacy/cell_lysara_intimacy">>
<<if _storyClip is "e78cf4e23250">>You pull her closer and she stumbles into the bars. One breast shoves through the gap, heavy and warm, too much for one hand, so you use both. Your mouth finds the side of her neck and she tips her head to give you more of it.<<else>>You pull her closer. She stumbles against the bars. Her breast presses through the gap. Warm. Soft.<</if>>
<<say "Lysara" "You can't just— I didn't say you could—">>
But she doesn't pull away. Her voice says no. Her body stays pressed against the bars.
<<say $player.name "I can't stop. I need—">>
<<say "Lysara" "The gas— you're not thinking clearly— you shouldn't—">>
Your other hand reaches through. Finds her hip. Pulls her tighter against the metal.
<<say "Lysara" "Stop— I was just— you're taking advantage of—">>
She struggles. Weakly. The motion grinds her body against yours through the bars.
<<say "Lysara" "I didn't give you permission— this isn't— you can't just—">>
But she's not fighting. Not really. Her breath is coming faster. Her nipples are hard against your chest through the bars.
<<say $player.name "Tell me to stop. Mean it. And I will.">>
Silence. Her chest rises and falls. She doesn't say the word.
<<say "Lysara" "I... the gas is affecting my judgment too. I can't be held responsible for... for not stopping you.">>
<<say "Lysara" "Whatever happens next... it's the gas. Not me. Not you. Just... chemistry.">>
<<elseif _event is 22>>
She's still holding the pose. Waiting.
You don't decide. Your body decides.
Your hand shoots through the bars. Grabs her ankle. Pulls.
She collapses out of the bridge with a yelp. Falls toward the bars.
<<say "Lysara" "What— what are you—">>
You catch her. Pull her against the bars. Her naked body pressed against the cold metal.
<<say "Lysara" "You can't just— I was stretching— this isn't—">>
But she doesn't fight. Not really. Her body is warm and soft against yours through the bars.
<<say $player.name "I can't stop. The gas— you— I need—">>
<<say "Lysara" "The gas doesn't— you're choosing to— stop—">>
Your hands find her hips. Turn her. Press her ass against the bars.
<<say "Lysara" "What are you doing— I didn't say you could— this is—">>
She's struggling. The motion grinds her body against yours.
<<say $player.name "Tell me to stop. Say it like you mean it.">>
Her breath comes in short gasps. She doesn't say the word.
<<say "Lysara" "I... the position... I can't think clearly when you're...">>
Her hips press back. Involuntarily. Obviously involuntarily.
<<say "Lysara" "If you do something... I won't be able to stop you. And I won't be responsible for whatever happens.">>
<<elseif _event is 23>>
She's still on the floor. Hand buried between her legs. Fingers moving.
You can't take it anymore.
Your arm shoots through the bars. Grabs her wrist. Pulls.
<<say "Lysara" "What— no— I was just—">>
You drag her toward the bars. She stumbles. Falls against the metal.
<<say "Lysara" "You can't— I didn't ask you to— let go—">>
But her body is pressed against the bars now. Her hand still wet from touching herself.
<<say $player.name "I need to taste you. I need—">>
<<say "Lysara" "The gas is making you— this isn't you— you wouldn't—">>
Your hands find her hips. Turn her. Press her against the bars.
<<say "Lysara" "Stop— I was handling it myself— you don't need to—">>
Her voice breaks. Her legs spread slightly. Betraying her words.
<<say $player.name "You said you couldn't stop yourself. Let me help.">>
<<say "Lysara" "That's not— I didn't mean— you're taking advantage of—">>
She struggles. Weakly. The motion presses her pussy closer to the bars.
<<say "Lysara" "I can't stop you. I can barely stand. This isn't... this isn't fair.">>
But she doesn't move away. Her breath comes faster.
<<say "Lysara" "Whatever you do... it's not my fault. I was already... I couldn't control...">>
<<elseif _event is 24>>
Her legs are still propped up. Still "stuck." Pussy glistening inches from your face.
You don't ask this time.
Your mouth closes the distance. Presses against her through the bars.
<<say "Lysara" "WHAT— oh god— what are you—">>
She jerks. Her leg pulls at the "stuck" stocking. Doesn't come free.
<<say "Lysara" "I didn't say you could— I'm stuck— I can't get away—">>
Your tongue finds her clit. She gasps. Loud.
<<storyVideo "characters/lysara/oral_player">>
<<say "Lysara" "Stop— I didn't— you can't just—">>
But her hips rock forward. Pressing herself harder against your mouth.
<<say "Lysara" "I'm trapped— this isn't fair— you're taking advantage of—">>
You lick deeper. She moans. Tries to muffle it.
<<say "Lysara" "I can't— the stocking— if I move I'll—">>
She's gripping the chair. Knuckles white. Body trembling.
<<say "Lysara" "You're using me— I'm helpless— I can't stop you—">>
Her thighs are shaking. Her pussy is dripping onto your tongue.
<<say "Lysara" "Whatever you do to me... I couldn't prevent it... I'm stuck...">>
<<else>>
She's still crouched. Still "reaching." Her pussy pressed almost against the bars.
You don't wait for permission.
Your face presses through the bars. Your tongue touches her pussy from behind.
<<say "Lysara" "OH— what— WHAT ARE YOU—">>
She jerks forward. But she's wedged against the crate. Can't get away.
<<say "Lysara" "I didn't— I was just getting the— you can't—">>
Your tongue slides between her pussy lips. She's already dripping wet.
<<storyVideo "characters/lysara/oral_player">>
<<say "Lysara" "STOP— I'm stuck— I can't move— this isn't—">>
She tries to crawl forward. Can't. The crate blocks her. Your tongue follows her movements.
<<say "Lysara" "You're— behind me— I can't see what you're— I can't stop—">>
You lick deeper. Find her clit from this angle. She cries out.
<<say "Lysara" "NO— I didn't ask for— you're taking advantage— I'm TRAPPED—">>
Her hips buck back against your face. Involuntarily. Obviously involuntarily.
<<say "Lysara" "I can't— the position— I can't get away— you're just USING me—">>
Her voice breaks. Her thighs are trembling.
<<say "Lysara" "Whatever you do to me... I couldn't stop it... I was just reaching for the vial...">>
<</if>>
<<if _event is 21>>
<div class="choice-container">
<<vchoice "Taste her" "Cell_Lysara_Taste_Potion" "intimate" "lips">>
</div>
<<elseif _event is 22>>
<div class="choice-container">
<<vchoice "Taste her" "Cell_Lysara_Taste_Yoga" "intimate" "lips">>
</div>
<<elseif _event is 23>>
<div class="choice-container">
<<vchoice "Taste her" "Cell_Lysara_Taste_Reading" "intimate" "lips">>
</div>
<<elseif _event is 24>>
<div class="choice-container">
<<vchoice "Taste her" "Cell_Lysara_Taste_Stockings" "intimate" "lips">>
</div>
<<else>>
<div class="choice-container">
<<vchoice "Taste her" "Cell_Lysara_Taste_Organizing" "intimate" "lips">>
</div>
<</if>>
<</if>>
<<else>>
She glances at you. Then back at her work.
<<say "Lysara" "Not now. I'm busy.">>
<<if $temp.lysaraInterest >= 15>>
She pauses. A hint of something in her voice.
<<say "Lysara" "...Perhaps later. If you're patient.">>
<</if>>
<<run document.body.classList.remove("scene-mode-intimate")>>
<div class="choice-container">
<<vchoice "Return to waiting" "Cell_Agony_Wait" "action" "back">>
</div>
<</if>>
<</if>><<set $player.lust to 100>>
<<set $temp.lysaraOralCount to ($temp.lysaraOralCount || 0) + 1>>
<<set $flags.kissedLysara to true>>
<<storyVideo "characters/lysara/kiss">>
<<if _storyClip is "feb4090f063b">>The bars are cold on your cheek, but the moment your eyes close the gas finishes the kiss somewhere else: a sunlit bed, Lysara naked on her knees at the edge of the mattress, her huge tits squashed against your chest and your hands full of her ass. Then the cage pinches, and it's iron and lamplight again.<<elseif _storyClip is "baa013e6a026">>Eyes shut, the gas runs ahead of you: Lysara in a white jacket over a black bra, your hands hooked under her thighs, hoisting her off her heels and onto the edge of her own desk. Then the cage pinches, and you're back at the bars with only her mouth.<</if>>
<<if $flags.lysaraIntimacyEvent is 6>>
You're both breathing hard. The kiss lingers between you like something stolen.
<<say "Lysara" "I— I can't believe you just—">>
Her hand is still on your neck. She hasn't moved it.
<<say "Lysara" "That was... completely inappropriate. I was trying to help you.">>
But her pupils are dilated. Her lips parted. She's not pulling away.
<<say $player.name "I'm sorry, I couldn't—">>
<<say "Lysara" "Don't. Don't apologize.">>
She takes a shaky breath. Her fingers tighten on your neck.
<<say "Lysara" "The gas made you do it. I understand. It's not your fault you're... like this.">>
She leans closer. Her forehead almost touching the bars.
<<say "Lysara" "If you need to do it again... to stabilize... I won't stop you.">>
<<say "Lysara" "Just... be gentle. I'm not used to being... taken.">>
She tilts her chin up slightly. Exposing her lips. Giving you access while pretending she isn't.
<<storyVideo "story/lysara_intimacy/kiss_2_deeper">>
<<if _storyClip is "5059864ac3eb">>Between kisses she pulls back an inch and holds your face in both hands through the bars, her breath on your lips, and makes you lean for the next one.<<elseif _storyClip is "a71e2adac16a">>She sinks against the bars, buries her face in the crook of your neck and clings there, arms through the gap and round you, before her mouth finds yours again.<<elseif _storyClip is "38f955b792dd">>For a few heartbeats the gas runs ahead of the kiss: her hand sliding down your belly and closing round your cock, bare, no cage, stroking it slow under the heavy swing of her tits while her tongue works your mouth. Then the steel pinches, and it's only her mouth again.<</if>>
You kiss her again. Deeper this time. She whimpers—surprised, innocent—but her mouth opens for you.
Her tongue meets yours. She tastes like honey and poison.
When you finally break apart, she's trembling.
<<say "Lysara" "That's... that's enough. You've taken enough.">>
But her voice is breathless. Her eyes dark.
<<say "Lysara" "I need to... compose myself. You've been very... aggressive.">>
She steps back. Touches her swollen lips. Looks at you like you're something dangerous.
<<say "Lysara" "We won't speak of this. It was a medical necessity. Nothing more.">>
<<elseif $flags.lysaraIntimacyEvent is 7>>
You turn your head.
Your lips find hers.
She gasps against your mouth—surprised, innocent, unprepared.
<<say "Lysara" "Mmph— wait— I didn't say you could—">>
But she doesn't pull away. Her hand on your shoulder tightens, pulling you closer to the bars.
You kiss her harder. The metal digs into your face. You don't care.
She tastes like honey and poison. Her lips part—just a little—and you take that too.
<<say "Lysara" "We shouldn't— someone might— oh...">>
Her protests dissolve as your tongue finds hers. She makes a sound—half surprise, half surrender.
<<storyVideo "story/lysara_intimacy/kiss_2_deeper">>
<<if _storyClip is "5059864ac3eb">>Between kisses she pulls back an inch and holds your face in both hands through the bars, her breath on your lips, and makes you lean for the next one.<<elseif _storyClip is "a71e2adac16a">>She sinks against the bars, buries her face in the crook of your neck and clings there, arms through the gap and round you, before her mouth finds yours again.<<elseif _storyClip is "38f955b792dd">>For a few heartbeats the gas runs ahead of the kiss: her hand sliding down your belly and closing round your cock, bare, no cage, stroking it slow under the heavy swing of her tits while her tongue works your mouth. Then the steel pinches, and it's only her mouth again.<</if>>
Her other hand comes up. Grips the bar next to your head. Steadying herself. Or trapping you.
<<say "Lysara" "This isn't— I was just delivering information— you're taking advantage of—">>
You swallow her words. Kiss her deeper. She moans into your mouth.
Her body presses against the bars now. Trying to get closer. The cold metal is the only thing between you.
<<say "Lysara" "You're so— the gas has made you so— I can't—">>
She's losing her composure. The clinical mask cracking.
You pull back just enough to breathe. Her lips chase yours.
<<say "Lysara" "Why did you stop? I didn't say you could stop.">>
Then she catches herself. Blinks. The mask slides back into place.
<<say "Lysara" "I mean— that's enough. You've... satisfied your impulse.">>
But she's still pressed against the bars. Still breathing hard. Still looking at your lips.
<<say "Lysara" "I should... I should go back to work. This was... you shouldn't have done that.">>
She doesn't move.
<<say "Lysara" "I'm going to step back now. And we're going to pretend this was purely... medicinal.">>
She finally pulls away. Her fingers trail along the bar as she goes—reluctant, lingering.
<<say "Lysara" "Don't look at me like that. I'm the victim here. You're the one who... who...">>
She can't finish the sentence. Her face is flushed. Her lips swollen.
<<say "Lysara" "Just... behave yourself. Or I might have to whisper more secrets.">>
A threat that sounds like a promise.
<<elseif $flags.lysaraIntimacyEvent is 8>>
<<say $player.name "Please...">>
The word comes out broken. Desperate.
<<say "Lysara" "Please what? You need to be specific. For the records.">>
<<say $player.name "The... the direct application. Please.">>
A pause. She tilts her head, studying you like a specimen.
<<say "Lysara" "You're requesting mouth-to-mouth compound transfer?">>
<<say $player.name "Yes. Please.">>
<<say "Lysara" "Very well. Since you asked properly.">>
She leans forward. Her lips press against yours through the bars.
The balm is still on your lips—sweet, tingling. Her mouth is soft. Warm. She kisses you slowly, deliberately, like she's following a clinical procedure.
<<storyVideo "story/lysara_intimacy/kiss_2_deeper">>
<<if _storyClip is "5059864ac3eb">>Between kisses she pulls back an inch and holds your face in both hands through the bars, her breath on your lips, and makes you lean for the next one.<<elseif _storyClip is "a71e2adac16a">>She sinks against the bars, buries her face in the crook of your neck and clings there, arms through the gap and round you, before her mouth finds yours again.<<elseif _storyClip is "38f955b792dd">>For a few heartbeats the gas runs ahead of the kiss: her hand sliding down your belly and closing round your cock, bare, no cage, stroking it slow under the heavy swing of her tits while her tongue works your mouth. Then the steel pinches, and it's only her mouth again.<</if>>
Then something shifts. Her hand comes up to grip the bar beside your head. The kiss deepens.
<<say "Lysara" "Mm... the compound is... transferring...">>
She murmurs against your mouth. Her tongue traces your lower lip—collecting the balm, she'd say. If asked.
You press harder against the bars. She doesn't retreat. Her mouth opens slightly. Inviting.
<<say "Lysara" "The absorption is... efficient... when applied this way...">>
Her clinical commentary dissolves into soft sounds. Her breathing quickens.
You kiss her deeper. She lets you. Her fingers curl around the bar, white-knuckled.
<<say "Lysara" "That's— that's sufficient. The compound has been— oh—">>
Her protest dies as your tongue finds hers. She makes a sound—surprised, pleased—then catches herself.
She pulls back. Her eyes are slightly glazed. Her lips glistening with the balm.
<<say "Lysara" "The application was... successful. Your lips should be adequately moisturized now.">>
She's trying to regain clinical distance. But her voice wavers.
<<say "Lysara" "That was purely therapeutic. You understand. A standard treatment protocol.">>
She touches her own lips. Licks them slightly. Tasting the balm—or tasting you.
<<say "Lysara" "I may need to... repeat the application. Periodically. For your continued treatment.">>
Her eyes meet yours. Something hungry behind the clinical mask.
<<say "Lysara" "You may experience side effects. Wanting more. That would be... normal.">>
She steps back. Adjusts her robes. Pretends nothing happened.
<<say "Lysara" "I'll note in your chart that the compound was well-received. Very... well-received.">>
<<else>>
You press your lips to hers through the bars. The cold metal digs into your face but you don't care.
<<storyVideo "story/lysara_intimacy/kiss_2_deeper">>
<<if _storyClip is "5059864ac3eb">>Between kisses she pulls back an inch and holds your face in both hands through the bars, her breath on your lips, and makes you lean for the next one.<<elseif _storyClip is "a71e2adac16a">>She sinks against the bars, buries her face in the crook of your neck and clings there, arms through the gap and round you, before her mouth finds yours again.<<elseif _storyClip is "38f955b792dd">>For a few heartbeats the gas runs ahead of the kiss: her hand sliding down your belly and closing round your cock, bare, no cage, stroking it slow under the heavy swing of her tits while her tongue works your mouth. Then the steel pinches, and it's only her mouth again.<</if>>
She tastes like honey and poison.
<<say "Lysara" "Mmm. So eager. You really needed that, didn't you?">>
She pulls back. Adjusts her robes.
<<say "Lysara" "That's enough for now. I gave you what you asked for.">>
<<say $player.name "Wait— please—">>
<<say "Lysara" "You're still unsatisfied? Even after I was so generous?">>
<<say "Lysara" "The gas makes you insatiable. It's not your fault. But I can't give you everything at once.">>
<<say "Lysara" "Patience. You've earned some... consideration. We'll see if you continue to behave.">>
<</if>>
<<journalAdd "Kissed Lysara through the bars. She came close and I took it - or she gave it, I honestly can't tell anymore. Slow, almost shy, like she'd forgotten how. Centuries, she says. I can still taste her." "relationship">>
<<set $flags.feralLevel to Math.max(0, ($flags.feralLevel || 0) - 2)>>
She returns to her work, leaving you aching but slightly calmer.
<<run document.body.classList.remove("scene-mode-intimate")>>
<div class="choice-container">
<<vchoice "Return to waiting" "Cell_Agony_Wait" "action" "back">>
</div>Her ass is pressed against the bars. Close enough to touch.
You lean forward. Press your mouth to the curve of her ass. Kiss.
She stiffens slightly but doesn't pull away.
You kiss lower. Your tongue traces the curve. And then—
Your tongue finds her asshole.
<<storyVideo "story/lysara_intimacy/cell_lysara_ass" "" "characters/lysara/oral_player">>
<<if _storyClip is "692d6715b988">>She's down on all fours on the padded bench she has shoved up against the bars, ass backed into the gap, bare soles curled up under your chin. You catch her feet in one hand to hold her there and keep licking.<</if>>
<<say "Lysara" "Wait— that's not— oh—">>
She sounds surprised. Shocked even. But she doesn't pull away.
<<say "Lysara" "You're— you're licking my— I didn't expect you to—">>
Her voice breaks as you tongue her asshole through the bars. Circling. Pressing.
<<say "Lysara" "Oh god— that's so— I didn't think you'd be so—">>
She can't finish sentences. Can't maintain the clinical act.
You tongue-fuck her ass. <<if _storyClip is "692d6715b988">>She braces both palms flat on the bench, moaning despite herself.<<else>>She grips the bars, moaning despite herself.<</if>>
<<say "Lysara" "This is— this is very thorough— I was just offering—">>
Trying to reframe it. Like SHE was just being generous and YOU took it too far.
<<set $player.lust to 100>>
<<set $flags.rimmedLysara to true>>
<<set $temp.lysaraOralCount to ($temp.lysaraOralCount || 0) + 1>>
<<journalAdd "She backed her ass up to the bars like it was a favour. I ate her ass through the iron until she was shaking, and then she told me I'd taken advantage. Her words. Her ass." "relationship">>
<<set $flags.feralLevel to Math.max(0, ($flags.feralLevel || 0) - 3)>>
She shudders. Her whole body trembling. Then pulls away suddenly.
<<say "Lysara" "That's— that's enough.">>
She's breathing hard. Flushed. Trying to compose herself.
<<say "Lysara" "You certainly took advantage of that opportunity.">>
<<say "Lysara" "I suppose the gas makes you... uninhibited.">>
<<say "Lysara" "You've earned some consideration.">>
<<run document.body.classList.remove("scene-mode-intimate")>>
<div class="choice-container">
<<vchoice "Return to waiting" "Cell_Agony_Wait" "action" "back">>
</div><<set $temp.lysaraOralCount to ($temp.lysaraOralCount || 0) + 1>>
<<set $flags.feralLevel to Math.max(0, ($flags.feralLevel || 0) - 3)>>
<<set $flags.tastedLysara to true>>
<<set $player.lust to 100>>
She's pressed against the bars. Naked. Her thigh warm against your hand.
<<storyVideo "story/lysara_intimacy/potion__climax" "" "characters/lysara/oral_player">>
<<if _storyClip is "97152b4e1fed">>You pull her down. She ends up on her back on the stone, hips jammed against the bars, and your mouth finds her pussy through them.<<else>>You pull her closer. Your mouth finds her pussy through the bars.<</if>>
<<say "Lysara" "OH— what are you— I didn't say—">>
The taste of her floods your senses. Salt and musk and something sweet. The gas sharpens everything—every slick lip of her pussy, every drop of wetness, every twitch of her hips.
You drag your tongue up her wet slit. She cries out.
<<say "Lysara" "STOP— I was just standing— you can't just—">>
<<if _storyClip is "97152b4e1fed">>But her hands go to her own tits and squeeze. Not pushing you away.<<else>>But her hands grip the bars. Not pushing away. Holding on.<</if>>
You find her clit. Circle it. She shudders.
<<say "Lysara" "That's— you're— I didn't give permission—">>
Her hips rock forward. Pressing herself harder against your mouth. Involuntary. Obviously involuntary.
<<say "Lysara" "The gas is making you— this isn't— oh GOD—">>
You eat her like you're drowning and she's air. Tongue plunging inside her, tasting her depths, feeling her clench around you.
<<say "Lysara" "I can't— you're making me— I didn't want—">>
Her voice breaks. Her thighs tremble against your face.
<<say "Lysara" "Don't stop— I mean STOP— I mean—">>
She can't keep her words straight anymore. Her body has overridden her script.
You suck her clit. Hard. She screams.
<<say "Lysara" "I'M— YOU'RE MAKING ME— I CAN'T—">>
<<set _wpClip to _storyClip>><<set _wpFam to _storyFamily>><<storyVideo "story/lysara_intimacy/potion_2_cums">><<set _wpCums to _storyClip>><<set _storyClip to _wpClip>><<set _storyFamily to _wpFam>>
She cums against your mouth. Her pussy clenching, pulsing, flooding your tongue with her release. Her whole body shaking.
<<say "Lysara" "This is— your fault— I didn't— oh god—">>
<<if _storyClip is "97152b4e1fed">>She pulses again. And again. Her back arches off the floor, head thrown back, mouth open.<<else>>She pulses again. And again. Grinding against your face through the bars.<</if>>
<<set _rpClip to _storyClip>><<set _rpFam to _storyFamily>><<storyVideo "story/lysara_intimacy/potion_3_limp">><<set _rpLimp to _storyClip>><<set _storyClip to _rpClip>><<set _storyFamily to _rpFam>>
<<if _rpLimp is "97745b219186">>When she finally goes limp her head drops back against the stone, eyes rolled half shut, mouth open, gasping. One leg is still hooked over your arm through the bars, and she hasn't the strength to take it back.<<else>><<if _storyClip is "97152b4e1fed">>When she finally goes limp she lies there gasping, one hand still clamped on her tit, too shaky to sit up.<<else>>When she finally pulls away, she's gasping. Trembling. Can barely stand.<</if>><</if>>
<<say "Lysara" "You... you just...">>
She tries to compose herself. Fails.
<<say "Lysara" "I was just... standing there. And you... took advantage.">>
Blame. Even now. Even after cumming on your tongue.
<<say "Lysara" "The gas made you do it. I understand. You're not... responsible.">>
She's already rewriting history. Making herself the victim.
<<say "Lysara" "This doesn't... this doesn't mean anything.">>
But her legs are still shaking.
<div class="choice-container">
<<vchoice "Continue" "Cell_Lysara_Taste_Aftermath" "action" "forward">>
</div><<set $temp.lysaraOralCount to ($temp.lysaraOralCount || 0) + 1>>
<<set $flags.feralLevel to Math.max(0, ($flags.feralLevel || 0) - 3)>>
<<set $flags.tastedLysara to true>>
<<set $player.lust to 100>>
She's pressed against the bars. Her ass against the cold metal. Struggling weakly.
You spin her around. Push her back against the bars. Drop to your knees.
<<say "Lysara" "What are you— I didn't— you can't just—">>
Your face buries between her thighs. Your tongue finds her pussy.
<<storyVideo "characters/lysara/oral_player">>
<<say "Lysara" "NO— I was just stretching— this is— OH—">>
She tastes like want. Like need. The gas has heightened everything—you can feel every flutter of her pulse, every clench of her muscles.
Your tongue parts her pussy lips. Finds her clit.
<<say "Lysara" "You're— I didn't ask for— STOP—">>
But her hand finds the back of your head. Not pushing away. Holding you there.
<<say "Lysara" "I can't— you're making me— my legs won't—">>
Her knees buckle. She slides down the bars. Your mouth follows. Never stopping.
<<say "Lysara" "This isn't— I was just— you're taking—">>
You plunge your tongue inside her. She cries out. Her back arches against the metal.
<<say "Lysara" "DEEPER— no wait— I didn't mean to say—">>
Her hips rock against your face. Grinding. Using your mouth.
<<say "Lysara" "You're making me— I can't control— this is your fault—">>
You suck her clit. Her whole body jerks.
<<say "Lysara" "I'm going to— you're FORCING me to— I can't—">>
She cums with a scream. Her thighs clamping around your head. Her pussy flooding your tongue.
<<say "Lysara" "YOU— you made me— I didn't want— oh GOD—">>
She pulses against your mouth. Wave after wave. Blaming you with every breath.
When she finally pushes you away, she can barely stand. Slumped against the bars.
<<say "Lysara" "That was... entirely your doing.">>
She's gasping. Trembling. Trying to reframe what just happened.
<<say "Lysara" "I was just stretching. You... you attacked me.">>
But her legs are still shaking. Her pussy still dripping.
<div class="choice-container">
<<vchoice "Continue" "Cell_Lysara_Taste_Aftermath" "action" "forward">>
</div><<set $temp.lysaraOralCount to ($temp.lysaraOralCount || 0) + 1>>
<<set $flags.feralLevel to Math.max(0, ($flags.feralLevel || 0) - 3)>>
<<set $flags.tastedLysara to true>>
<<set $player.lust to 100>>
She's against the bars. Her hand still wet from touching herself. Panting.
You don't give her time to think. Your hands find her hips. Turn her. Pull her down.
<<say "Lysara" "WAIT— I wasn't— you can't—">>
<<storyVideo "story/lysara_intimacy/potion__taste_reading" "" "characters/lysara/oral_player">>
<<if _storyClip is "846b36f12495">>She's on her back on the stone now, hips jammed against the bars. You push her legs apart.<<else>>She's on the ground now. Back against the bars. You push her legs apart.<</if>>
<<say "Lysara" "I was handling it myself— you don't need to— STOP—">>
Your mouth finds her pussy. She was already wet from her own fingers. Now she's dripping.
The taste of her floods your senses. Her arousal, salt-sweet and overwhelming.
<<say "Lysara" "NO— I didn't ask for— you're—">>
Your tongue slides into her cunt. Finds where she was touching herself. Takes over.
<<say "Lysara" "That's— you're doing what I was— but I didn't—">>
<<if _storyClip is "846b36f12495">>She's confused. She lies back and squeezes her own tits while you eat her, her body responding even as her mouth protests.<<else>>She's confused. Her body responding even as her mouth protests.<</if>>
<<say "Lysara" "I could have— by myself— you didn't have to—">>
You find her clit. Suck gently. She cries out.
<<say "Lysara" "OH GOD— that's better than— no wait— I didn't mean—">>
Her hips rock up into your mouth. She can't help it.
<<say "Lysara" "You're— using me— I was fine— I didn't need—">>
You tongue-fuck her. Deep. Tasting where her fingers had been.
<<say "Lysara" "STOP— no— don't stop— I mean— I can't—">>
Her words collapse. Her body takes over. She's grinding against your face now.
<<say "Lysara" "You're making me— I was in control— now I can't—">>
You suck her clit hard. She screams.
<<say "Lysara" "I'M— THIS IS YOUR— I DIDN'T WANT TO—">>
She cums on your tongue. Harder than she would have from her own fingers. Her whole body convulsing.
<<say "Lysara" "You— you made me— I could have done it myself—">>
She's still pulsing. Still blaming you. Still cumming.
When you finally pull back, she's a wreck. Sprawled against the bars.
<<say "Lysara" "I was... handling it. You took over without... without permission.">>
She can barely speak. But she's already rewriting history.
<<say "Lysara" "I didn't need your help. You just... decided to take.">>
<div class="choice-container">
<<vchoice "Continue" "Cell_Lysara_Taste_Aftermath" "action" "forward">>
</div><<set $temp.lysaraOralCount to ($temp.lysaraOralCount || 0) + 1>>
<<set $flags.feralLevel to Math.max(0, ($flags.feralLevel || 0) - 3)>>
<<set $flags.tastedLysara to true>>
<<set $player.lust to 100>>
Her legs are still spread. Still "stuck" on the bars. Your tongue already on her pussy.
<<storyVideo "characters/lysara/oral_player">>
You don't stop. You can't stop. She tastes like everything you've ever wanted.
<<say "Lysara" "STOP— I'm stuck— I can't get away— you're—">>
Your tongue slides deeper. Finds her clit. Circles it.
<<say "Lysara" "OH GOD— no— I didn't say you could— PLEASE—">>
Please stop or please don't stop? Even she doesn't seem to know.
<<say "Lysara" "I'm TRAPPED— you're taking advantage— I can't—">>
Her hips rock forward. Grinding against your mouth. Betraying her words.
<<say "Lysara" "The stocking— if I move— I can't escape— you're USING me—">>
You suck her clit. She cries out. Her thighs clamp around your head.
<<say "Lysara" "I can't close my legs— you're between them— I can't stop you—">>
But her hand finds your hair. Threads through it. Pulls you closer.
<<say "Lysara" "You're making me— I didn't want to— this isn't—">>
You tongue-fuck her. Deep. Feeling her clench around you.
<<say "Lysara" "DEEPER— no— I didn't mean— stop MAKING me say—">>
Her whole body is trembling now. The chair creaking beneath her.
<<say "Lysara" "I'm stuck— I'm helpless— you're going to make me—">>
You find her clit again. Suck hard.
<<say "Lysara" "I'M GOING TO— YOU'RE FORCING ME TO— I CAN'T—">>
She cums screaming. Her legs squeezing your head through the bars. Her pussy flooding your tongue.
<<say "Lysara" "THIS IS— YOUR FAULT— I WAS STUCK— I COULDN'T—">>
She pulses against your mouth. Again. Again. Blaming you with every wave of pleasure.
When she finally "frees" her stocking—one simple tug—she's a trembling wreck.
<<say "Lysara" "You... you took advantage of me. I was trapped.">>
She can barely stand. Legs shaking.
<<say "Lysara" "I couldn't stop you. The stocking was caught. I was helpless.">>
The stocking was never caught. You both know it.
<<say "Lysara" "This wasn't... this wasn't my choice.">>
<div class="choice-container">
<<vchoice "Continue" "Cell_Lysara_Taste_Aftermath" "action" "forward">>
</div><<set $temp.lysaraOralCount to ($temp.lysaraOralCount || 0) + 1>>
<<set $flags.feralLevel to Math.max(0, ($flags.feralLevel || 0) - 3)>>
<<set $flags.tastedLysara to true>>
<<set $player.lust to 100>>
She's still crouched. Still "reaching" for the vial. Your tongue already buried in her pussy from behind.
<<storyVideo "characters/lysara/oral_player">>
<<say "Lysara" "STOP— I was just— the vial— you can't—">>
She tries to crawl forward. The crate blocks her. Your tongue follows.
You eat her from behind. Tasting her arousal. Feeling her clench around your tongue.
<<say "Lysara" "I'm STUCK— I can't get away— you're— behind me—">>
Your hands grip her hips through the bars. Hold her in place.
<<say "Lysara" "Let GO— I was just reaching— this isn't— OH GOD—">>
You find her clit from this angle. Tongue circling. She cries out.
<<say "Lysara" "I can't see what you're— I can't STOP you— you're using me from—">>
Her hips buck back against your face. She can't help it.
<<say "Lysara" "The position— I can't move— you're taking— DEEPER—">>
She clamps her hand over her mouth. Trying to stop herself from begging for more.
<<say "Lysara" "This isn't— I was just— you're making me— I can't—">>
You tongue-fuck her. Deep. Relentless. She shakes.
<<say "Lysara" "STOP MAKING ME— I don't want to— you're FORCING—">>
Her thighs tremble. Her whole body quaking.
<<say "Lysara" "I'M GOING TO— YOU'RE MAKING ME— FROM BEHIND— I CAN'T—">>
She cums screaming into her hand. Her pussy clenching around your tongue. Her hips grinding back against your face.
<<say "Lysara" "THIS IS— YOUR— I WAS JUST— REACHING—">>
She pulses against your mouth. Wave after wave. Blaming you even as she cums.
When she finally collapses forward, the vial rolls out from behind the crate. She never needed to reach for it.
<<say "Lysara" "You... you attacked me. From behind. I couldn't even see...">>
She's shaking. Can barely form words.
<<say "Lysara" "I was just getting the vial. You... took advantage.">>
The vial sits there. Mocking her excuse.
<<say "Lysara" "This wasn't... I was helpless...">>
<div class="choice-container">
<<vchoice "Continue" "Cell_Lysara_Taste_Aftermath" "action" "forward">>
</div><<storyVideo "characters/lysara/composed_robe">>
<<if _storyClip is "44b859f6f352">>She's pulled on a pink satin robe and sits on the edge of her bench in her heels, legs crossed, adjusting the robe. Still catching her breath.<<else>>She adjusts her robes. Still catching her breath.<</if>>
<<say "Lysara" "You're... very skilled. That was...">>
She trails off. Flustered.
<<say "Lysara" "Here. You've earned this.">>
She produces a small vial and presses it to your lips.
<<say "Lysara" "A painkiller. It will help with the... effects.">>
<<if $temp.lysaraOralCount is 3>>
<<journalAdd "Tasted her. Properly. My tongue in her through the bars until she forgot every clinical word she knows. Then she fed me a 'painkiller' like a nurse doing her rounds, still red in the face. She's rattled. Good." "relationship">>
<</if>>
<<set $player.health to Math.min($player.maxHealth, $player.health + 15)>>
<<set $temp.alchemyGasLevel -= 10>>
The cool liquid slides down your throat. Your cock still aches in the cage, but the edge of desperation fades slightly.
<<if $temp.lysaraOralCount gte 2 && !$flags.lysaraDeviceUsed>>
She pauses, studying you with new interest.
<<say "Lysara" "You've been... surprisingly attentive. Skilled, even.">>
She disappears deeper into the lab. Returns moments later with something in her hand.
A crystalline cylinder. Pulsing with faint purple light.
<<say "Lysara" "You've earned a reward. Something beyond painkillers.">>
Your eyes go wide as she produces a key.
<<say $player.name "You're... you're taking off the cage?">>
<<say "Lysara" "Temporarily. And you won't be touching yourself—or me.">>
She holds up the crystal device.
<<say "Lysara" "This will do the touching for you.">>
<div class="choice-container">
<<if !$flags.lysaraDeviceRefusedTwice>>
<<vchoice "Accept her offer" "Cell_Lysara_Device" "intimate" "rapid-strikes">>
<</if>>
<<vchoice "Refuse (you don't trust her)" "Cell_Lysara_Device_Refuse" "action" "back">>
</div>
<<else>>
<<run document.body.classList.remove("scene-mode-intimate")>>
<div class="choice-container">
<<vchoice "Continue" "Cell_Day_End" "action" "forward">>
</div>
<</if>><<run VaultUI.setBackground("cell")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<<set $temp.dayActions += 1>>
<<set $temp.lysaraEncounters += 1>>
<<set _spyNext to "">>
<<advanceTime 1 0>>
<h3>Watching Lysara</h3>
You press against the bars, watching Lysara work.
<<set _encounter to $temp.lysaraEncounters>>
<<if $flags.lysaraDeviceUsed>>
<<set _teaseVar to random(1, 10)>>
<<if _teaseVar is 1>>
Lysara is reorganizing her lower shelves. She bends at the waist—not the knees—reaching for something at the back.
Her robes ride up. Slowly. Inch by inch. You can see the backs of her thighs. The curve where they meet her ass.
She takes her time. Rearranging. Adjusting. Never once looking your way.
<<set $player.lust to Math.min(100, $player.lust + 20)>>
When she finally straightens, she walks to her workbench without a glance in your direction.
Was that deliberate? You can't tell anymore.
<<storyVideo "story/lysara_cell_events/postdev_01_low_shelf" "" "characters/lysara/spy_teasing">>
<<elseif _teaseVar is 2>>
Lysara is at her workbench, grinding something with a mortar and pestle. The motion makes her whole body move—hips swaying, breasts bouncing slightly with each thrust.
She's facing away from you. Completely absorbed in her work.
Or so it seems.
But the angle is TOO perfect. The way she's positioned gives you a clear view of her profile—the curve of her breast, the arch of her back, the swell of her ass.
<<set $player.lust to Math.min(100, $player.lust + 20)>>
She never acknowledges you. Not once.
<<storyVideo "story/lysara_cell_events/postdev_02_mortar" "" "characters/lysara/spy_teasing">>
<<elseif _teaseVar is 3>>
Lysara drops something. A small vial that rolls under her workbench.
She sighs. Gets down on her hands and knees to retrieve it.
From your angle, you can see EVERYTHING. The way her robes fall forward, exposing the tops of her breasts. The way her ass rises as she reaches further under the table.
<<set $player.lust to Math.min(100, $player.lust + 25)>>
She finds the vial. Takes her time getting up. Dusts off her knees with slow, deliberate movements.
Still doesn't look at you.
But there's the faintest smile on her lips as she returns to work.
<<storyVideo "story/lysara_cell_events/postdev_03_dropped_vial" "" "characters/lysara/spy_teasing">>
<<elseif _teaseVar is 4>>
Lysara is climbing a ladder to reach a high shelf. Her robes cling to her legs as she ascends.
From below, you have a perfect view up her robes. The curve of her calves. Her thighs. The shadow between them.
<<set $player.lust to Math.min(100, $player.lust + 20)>>
She reaches for something, stretching. Her body elongates, robes pulling tight across her ass.
She takes far longer than necessary to find what she's looking for.
When she descends, she doesn't look your way. But her cheeks are flushed.
<<storyVideo "story/lysara_cell_events/postdev_04_ladder" "" "characters/lysara/spy_teasing">>
<<elseif _teaseVar is 5>>
Lysara is testing a salve. On herself.
She rolls up her sleeve and applies it to her forearm, massaging it in with slow, circular motions.
Then she hums thoughtfully and unties the front of her robe slightly. Applies more salve to her collarbone. Her upper chest.
<<set $player.lust to Math.min(100, $player.lust + 25)>>
Her fingers trace patterns just above her breasts. Slow. Deliberate.
<<say "Lysara" "Hmm. Texture is good. Absorption rate acceptable.">>
Purely scientific, of course.
<<storyVideo "story/lysara_cell_events/postdev_05_salve" "" "characters/lysara/spy_teasing">>
<<elseif _teaseVar is 6>>
Lysara is writing in a journal. She's sucking on the end of her quill, lost in thought.
Her lips wrap around the feathered tip. She pulls it out slowly, touches it to her lower lip.
<<set $player.lust to Math.min(100, $player.lust + 15)>>
Back in. Out. In. Her tongue flicks against it.
She writes something. Sucks the quill again.
You're going to lose your mind.
<<storyVideo "story/lysara_cell_events/postdev_06_quill" "" "characters/lysara/spy_teasing">>
<<elseif _teaseVar is 7>>
Lysara is changing her stockings. Right there, in full view of the cell.
She sits on a stool, hikes up her robes, and slowly rolls down one stocking. Then the other.
<<set $player.lust to Math.min(100, $player.lust + 25)>>
Her legs are bare now. Smooth. Pale. She takes her time selecting new stockings from a drawer.
Rolling them up. Inch by inch. Smoothing them against her skin.
She never looks at you. But she takes twice as long as necessary.
<<storyVideo "story/lysara_cell_events/postdev_07_stockings" "" "characters/lysara/spy_teasing">>
<<elseif _teaseVar is 8>>
Lysara is fanning herself. The laboratory is warm from the alchemical processes.
She unbuttons the top of her robe. Then another button. Then another.
<<set $player.lust to Math.min(100, $player.lust + 20)>>
The fabric falls open, revealing the swell of her breasts, the lace of whatever she wears beneath.
She fans herself with a piece of parchment. The motion makes her breasts shift. Rise. Fall.
<<say "Lysara" "These gas vents make it so stuffy in here.">>
She doesn't button back up.
<<storyVideo "story/lysara_cell_events/postdev_08_fanning" "" "characters/lysara/spy_teasing">>
<<elseif _teaseVar is 9>>
Lysara is stretching after sitting too long. Her hands reach toward the ceiling.
Her back arches. Her breasts thrust forward. The fabric of her robe pulls tight everywhere.
<<set $player.lust to Math.min(100, $player.lust + 20)>>
<<storyVideo "story/lysara_cell_events/postdev_09_stretch" "" "characters/lysara/spy_teasing">>
<<if _storyClip is "5a519865186d">>She sinks to the floor, one leg folded under her and the other stretched out behind, and leans slowly forward over it. Rolls her neck.<<else>>She twists side to side. Rolls her neck. Bends backward, then forward, fingertips touching the floor.<</if>>
Her ass rises. Her robes fall forward, giving you a view straight down her top.
She holds the position for a long moment.
Then straightens and returns to work like nothing happened.
<<else>>
Lysara is brushing her hair. Long, slow strokes.
She's facing a small mirror, but the angle means you can see her reflection. And she can see yours.
<<set $player.lust to Math.min(100, $player.lust + 15)>>
Her eyes meet yours in the glass. Just for a moment.
Then she looks away and continues brushing. Head tilted. Neck exposed. One shoulder of her robe slipping down.
She doesn't fix it.
The brush moves slower. Her lips part slightly.
When she finishes, she sets down the brush and walks away without a backward glance.
But you both know she saw you watching. And she didn't mind.
<<storyVideo "story/lysara_cell_events/postdev_10_hair_mirror" "" "characters/lysara/spy_teasing">>
<</if>>
<<if _storyClip is "e011ce01bb8f">>Later, through the steam from her washbasin, you see more. Lysara, naked and dripping, straddling a thick dark toy cock from her specimen shelf and working it in and out of her pussy, smiling straight at your cell. Testing a reagent on arousal, she would call it.<<elseif _storyClip is "88e3451342ad">>Later she hauls some clattering old-world floor machine across the lab, bent low over it in a thin white tank top and leggings, her tits all but falling out every time she leans into the push. She never looks at the cell. She doesn't need to.<<elseif _storyClip is "86cdb80304f5">>Later she's at her basin in a thin white tank top and blue rubber gloves, bent over the rim to polish the brass tap, her tits swinging over the porcelain with every stroke of the rag.<<elseif _storyClip is "a249aae81d59">>Later she stands at her tall mirror in a pink fishnet dress and heels, then, still facing the mirror, tugs the pink top down, one side and then the other, until her tits spill over it. The mirror happens to face your cell. Checking the fit, she would call it.<<elseif _storyClip is "2795ce1f90e5">>Later she lounges in blue velvet, the dress pulled down under her bare tits, arms folded behind her head, rolling her shoulders slowly so they sway, and watching your cell as if you were the specimen.<<elseif _storyClip is "d6ce38947a12">>Later she stands at her tall mirror in black straps and stockings, a garter belt riding high on her hips, and turns to look at her own ass over her shoulder, cool as a woman checking a stain on a coat.<<elseif _storyClip is "132f41b8d0b1">>Later she sprawls on her couch in a tight white tee and white panties, fiddling with some small old-world trinket. She gets up, walks off, then leans back round the doorway, smiling at nothing in particular, and is gone.<</if>>
<p class="internal-thought">She knows you're watching. She has to know.</p>
<<else>>
<<set $flags.feralLevel to ($flags.feralLevel || 0) + 1>>
<<set $temp.lysaraInterest to ($temp.lysaraInterest || 0) + 5>>
<<if $temp.lysaraInterest gte 20>>
<<if !$flags.lysaraIntimacyPathUnlocked>>
Lysara is standing RIGHT outside the bars now. So close you could almost—
<<say "Lysara" "You're persistent. I admire that.">>
She leans closer. Her lips nearly touch the bars.
<<say "Lysara" "Perhaps... a small mercy. To ease your suffering.">>
<<journalAdd "Kept watching her through the bars. Today she walked right up to them on her own. 'You're persistent. I admire that.' Then something about mercy. I think she's been waiting for me to crack." "reflection">>
<</if>>
<<set $flags.lysaraIntimacyPathUnlocked to true>>
<</if>>
<<if $flags.lysaraCascadeArc is "contaminated_drool" && !$flags.lysaraDroolParked>>
<<set $player.lust to 100>>
<<set _droolTier to $flags.lysaraDroolTier || 0>>
<<if _droolTier is 0>>
<<set $flags.lysaraIntimacyEvent to 101>>
<<set _spyNext to "Cell_Spy_Drool_T1">>
<<elseif _droolTier is 1>>
<<set $flags.lysaraIntimacyEvent to 201>>
<<set _spyNext to "Cell_Spy_Drool_T2">>
<<else>>
<<set $flags.lysaraIntimacyEvent to 301>>
<<set _spyNext to "Cell_Spy_Drool_T3">>
<</if>>
<</if>>
<<if !_spyNext>>
<<set _showTierEvent to $flags.lysaraIntimacyPathUnlocked && random(1, 100) lte 50>>
<<if _showTierEvent>>
<<set $player.lust to 100>>
<<set _oralCount to $temp.lysaraOralCount || 0>>
<<if _oralCount lte 1 && !$flags.lysaraCascadeArc && random(1, 100) lte setup.cellDroolChance>>
<<set $flags.lysaraCascadeArc to "contaminated_drool">>
<<set $flags.lysaraIntimacyEvent to 101>>
<<set _spyNext to "Cell_Spy_Drool_T1">>
<</if>>
<<if !_spyNext>>
<<if _oralCount is 0>>
<<set _highEvent to random(1, 8)>>
<<set $flags.lysaraIntimacyEvent to _highEvent>>
<<if _highEvent is 1>>
Lysara is standing RIGHT outside the bars now. So close you could almost—
<<say "Lysara" "You've been watching me all day. So intently.">>
<<say "Lysara" "The gas makes people fixate. It's not your fault you can't look away.">>
She leans closer. Her lips nearly touch the bars.
<<say "Lysara" "I suppose... when someone is suffering as much as you are... it would be cruel not to offer some relief.">>
<<storyVideo "story/lysara_cell_events/tier1_01_offer_relief">>
<<elseif _highEvent is 2>>
She approaches the cell with a damp cloth. Her hips sway with each step.
<<say "Lysara" "You're sweating. Trembling. The gas affects everyone differently.">>
She reaches through the bars and dabs at your forehead. Her touch lingers.
<<say "Lysara" "You poor thing. You're really struggling, aren't you?">>
Her hand trails down your cheek. Your jaw. Your neck.
<<say $player.name "Lysara...">>
<<say "Lysara" "Shh. Don't speak. You're in no condition to think clearly.">>
<<say "Lysara" "Let me take care of you. Someone has to.">>
<<storyVideo "story/lysara_cell_events/tier1_02_damp_cloth">>
<<elseif _highEvent is 3>>
She's reading near the cell. Close enough that you can see the words on the page. Close enough that you can smell her hair.
<<say "Lysara" "The texts say the gas creates a bond. Between the affected and whoever provides relief.">>
She looks up at you through her lashes.
<<say "Lysara" "Have you fixated on me? It's alright if you have. It's a natural response.">>
<<say $player.name "You know I have.">>
<<say "Lysara" "Of course you have. The gas makes it impossible not to.">>
She sets down the book and approaches the bars.
<<say "Lysara" "I suppose I should help you explore those feelings. Before they become... problematic.">>
<<storyVideo "story/lysara_cell_events/tier1_03_reading">>
<<elseif _highEvent is 4>>
Lysara is changing. Right there. In the middle of the laboratory.
She pulls her robes over her head, revealing a thin shift beneath. The fabric clings to every curve.
<<say "Lysara" "The old robes had acid on them. From an experiment.">>
She glances at you. Doesn't look away.
<<say "Lysara" "Does it bother you? Watching me undress?">>
<<say $player.name "You know it does.">>
<<say "Lysara" "The gas makes you hypersensitive to visual stimuli. Perfectly normal response.">>
She takes her time putting on fresh robes. Very. Slow. Time.
<<say "Lysara" "When you've calmed down... perhaps I could help with that. If you ask nicely.">>
<<storyVideo "story/lysara_cell_events/tier1_04_changing">>
<<elseif _highEvent is 5>>
You're lying on the stone floor of the cell. Conserving energy. Trying not to think about your aching cock.
Lysara is organizing supplies on a shelf near your cell. Right above the bars.
<<say "Lysara" "I need to catalog these samples. Don't mind me.">>
She's reaching up, placing vials on the high shelf. Her robes ride up with each stretch, exposing her legs.
You watch. Can't help it.
Then—
<p class="sound-effect">//CLINK//</p>
A vial slips from her fingers. Falls.
Right through the bars.
She reaches for it—fast—her hand coming through the bars as she tries to catch it.
She misses.
But her momentum carries her forward. Her whole arm through the bars. Her body pressed against them.
Her face is inches from yours. Lips close enough to kiss.
<<say "Lysara" "Oh! I— the vial— I didn't mean to—">>
She's frozen there. Pressed against the bars. Her breath on your face.
<<say "Lysara" "How clumsy of me.">>
But she doesn't pull back. Doesn't move away.
<<say "Lysara" "You must think I'm so careless. Dropping things right into your cell.">>
Her eyes lock with yours. So close.
<<say "Lysara" "Your heart is racing. I can see your pulse. The proximity must be... difficult for you.">>
<<say "Lysara" "I should retrieve the vial and move away. That would be the professional thing to do.">>
<<say "Lysara" "But you look like you're about to break. And I accidentally got so close. It would almost be cruel to pull away now, wouldn't it?">>
<<storyVideo "story/lysara_cell_events/tier1_05_vial_through_bars">>
<<elseif _highEvent is 6>>
Lysara is reviewing a chart near her workbench. She frowns, makes a note, then looks toward your cell.
<<say "Lysara" "I should check your vitals. The gas can cause cardiac irregularities if left unmonitored.">>
She gathers a few instruments. Approaches the cell. Clinical. Professional.
<<say "Lysara" "Hold still. This is purely diagnostic.">>
She reaches through the bars. Her fingers find your neck, pressing gently against your pulse point. Her touch is cool. Electric.
<<say "Lysara" "Elevated heart rate. Expected. The gas tends to make the body... responsive.">>
She doesn't remove her hand. If anything, she presses closer to the bars.
<<say "Lysara" "I need to check your pupils. The gas causes distinctive dilation patterns.">>
She leans in. Her face inches from yours. Studying your eyes. Her lips parted slightly.
<<say "Lysara" "Look at me. Don't look away.">>
Her breath is warm on your lips. You can smell her—soap, herbs, something feminine underneath. Your head swims.
<<say "Lysara" "The dilation is significant. You're responding exactly as expected.">>
She's so close now. Her lips almost touching the bars. Almost touching YOU. Her thumb traces slow circles on your neck.
<<say "Lysara" "Your pulse is racing. I can feel it... throbbing.">>
Was that—? No. She's just being clinical. She has to be.
<<say "Lysara" "Subjects in your condition often experience... urges. Impulses they can't control.">>
Her eyes drop to your lips. Just for a second. Then back to your eyes.
<<say "Lysara" "The gas erodes inhibition. Makes you want to... take things. Even when you shouldn't.">>
She wets her lips. Unconsciously? Deliberately? You can't tell anymore.
<<say "Lysara" "I should probably step back. Before you do something... impulsive.">>
She doesn't step back. She stays RIGHT there. Lips inches away. Fingers on your pulse.
<<say "Lysara" "You're trembling. Are you alright? You look like you're about to—">>
Your control snaps.
<<storyVideo "story/lysara_cell_events/tier1_06_vitals">>
<<elseif _highEvent is 7>>
Lysara is working at her bench when she suddenly stiffens. She glances toward the laboratory entrance. Then back at you.
Something's wrong. Her usual composure is... off.
She approaches your cell quickly. Quietly. Her eyes darting to the shadows.
<<say "Lysara" "There's something you need to know. But I can't say it aloud.">>
She gestures for you to come closer to the bars.
<<say "Lysara" "The walls here... they carry sound. Someone might be listening.">>
You press against the bars. She leans in close. Her lips nearly touching your ear.
Her breath is warm. Soft. You can smell her hair—something floral mixed with alchemical undertones.
<<set _whisperLeft to setup.cellDaysLeft()>><<if _whisperLeft gte 3>><<say "Lysara" "The gas in your system... it peaks on the fourth day. You need to be prepared for what that means.">><<elseif _whisperLeft is 2>><<say "Lysara" "The gas in your system... it will peak tomorrow. You need to be prepared for what that means.">><<elseif _whisperLeft is 1>><<say "Lysara" "The gas in your system... it's peaking now. Today. You need to be prepared for what that means.">><<else>><<say "Lysara" "The gas in your system... it peaked in the night, but it isn't done with you. One last surge before it lets go. You need to be prepared for what that means.">><</if>>
She doesn't pull back. Her lips brush against your ear as she speaks. Barely a whisper.
<<say "Lysara" "Your body will demand... release. The pressure becomes unbearable.">>
Her hand rests on the bar next to your head. Steadying herself. So close.
<<say "Lysara" "I wanted you to know. So you're not... frightened. When it happens.">>
Still she doesn't move away. Her breath warm on your neck now. You can feel her pulse—or is that yours?
<<say "Lysara" "Did you hear me? I should speak closer. To be certain.">>
Her lips brush your ear again. Then your jaw. Barely there. Could be accidental.
<<say "Lysara" "The symptoms can include... fixation. On whoever is nearby. On their voice. Their scent. Their...">>
She trails off. Her breathing has changed. Deeper. Slower.
<<say "Lysara" "I'm only telling you this because you deserve to understand what's happening to you. That's all.">>
But she's still there. Lips at your ear. Body pressed close to the bars. Not moving away.
<<say "Lysara" "The proximity is probably making it worse for you. I should step back.">>
She doesn't step back.
<<storyVideo "story/lysara_cell_events/tier1_07_whisper">>
<<else>>
Lysara is organizing vials on her workbench when she pauses. Her head tilts slightly. Studying you.
You shift uncomfortably under her gaze. The chains rattle.
<<say "Lysara" "Your lips. They're cracking.">>
She sets down the vial she was holding. Approaches the cell with clinical concern.
<<say "Lysara" "Dehydration. A common side effect of prolonged gas exposure. The mucous membranes dry out.">>
She produces a small jar from her apron pocket. Something viscous and amber-colored.
<<say "Lysara" "I prepared a balm. The compound requires regular application to prevent further deterioration.">>
She unscrews the lid. Dips her finger into the salve. It glistens.
<<say "Lysara" "Come closer. I need to apply this before the cracking worsens.">>
You hesitate. She makes an impatient sound.
<<say "Lysara" "This is purely therapeutic. The skin on the lips is particularly thin. Sensitive. It absorbs compounds readily.">>
You lean toward the bars. She reaches through.
Her finger touches your lower lip. Warm. Slick with the balm. She traces it slowly across—corner to corner.
<<say "Lysara" "Hold still. I need to be thorough.">>
Her finger returns to the center of your lower lip. Pressing slightly. Lingering.
<<say "Lysara" "The nerve endings here are remarkably dense. You may notice... heightened sensation.">>
Her thumb joins her finger. Holding your lower lip gently as she applies more balm. The touch is impossibly soft.
<<say "Lysara" "Subjects in your condition often develop oral fixations. An involuntary response to the gas.">>
She's so close now. Her face inches from the bars. Her finger tracing your upper lip.
<<say "Lysara" "You might find yourself wanting to... put your mouth on things. On people. It's perfectly natural.">>
Her thumb brushes the corner of your mouth. Slow. Deliberate.
<<say "Lysara" "There. That should help with the... dryness.">>
But she doesn't pull her hand back. Her finger rests on your bottom lip. Her eyes on your mouth.
<<say "Lysara" "Although I should check if the balm is absorbing properly. The texture should be...">>
Her finger presses slightly into your lip. Testing. Her breathing has changed.
<<say "Lysara" "Yes. Very... supple now. Soft.">>
She still hasn't moved her hand. Her finger still touching your lips. Her face still inches away.
<<say "Lysara" "I should probably apply another coat. To be safe. Unless you'd rather...">>
She trails off. Waiting.
<<storyVideo "story/lysara_cell_events/tier1_08_lip_balm">>
<</if>>
<<elseif _oralCount is 1>>
<<set _highEvent to random(1, 8)>>
<<set $flags.lysaraIntimacyEvent to _highEvent + 10>>
<<if _highEvent is 1>>
Lysara is bent over her workbench, writing notes. Her robes have ridden up, exposing the backs of her thighs.
She shifts her weight from foot to foot, making her ass sway.
She bends lower, reaching for something on the far end of the bench. Her robes ride up even higher. You can see the curve of her ass now.
You make a sound. A caught breath. Too loud.
She stills. Glances back over her shoulder.
<<say "Lysara" "Oh. You're watching.">>
A pause. She doesn't straighten up. Still bent over, ass on display.
<<say "Lysara" "You're breathing quite heavily. The gas must still be affecting you.">>
She shifts slightly. Her robes ride up another inch.
<<say "Lysara" "That kiss I gave you yesterday... I've been monitoring how long the relief lasted. For my research.">>
She glances back at you. Clinical expression. But she's still bent over.
<<say "Lysara" "You might find yourself wanting more direct contact. That would be a natural progression of symptoms.">>
<<storyVideo "story/lysara_cell_events/tier2_01_bent_bench">>
<<elseif _highEvent is 2>>
She's stretching again. But this time she's facing away from you.
Her hands touch the floor. Her ass rises. The fabric of her robes pulls tight across her curves.
<<storyVideo "story/lysara_cell_events/tier2_02_bridge">>
<<if _storyClip is "363d3128b69a">>Then she straightens, laces her fingers over her head and stretches—slowly, so slowly—leaning one way, then the other. Her robes cling and shift against her legs. When she leans, you can see the shadow between her thighs.<<else>>Then she slowly—so slowly—arches backward into a bridge. Her robes fall away from her legs. You can see up them. The shadow between her thighs.<</if>>
You make an involuntary sound. A groan. A whimper. Something.
She holds the position. Doesn't come down. Silence for a moment.
<<say "Lysara" "Did you... need something?">>
Her voice is slightly strained from the position. But still clinical.
<<say "Lysara" "I'm just doing my exercises. The gas builds up tension in my body.">>
<<if _storyClip is "363d3128b69a">>Another pause. Still holding the stretch. Arms up. Everything pulled tight.<<else>>Another pause. Still holding the bridge. Legs spread. Everything on display.<</if>>
<<say "Lysara" "You sound quite distressed. The kiss I gave you yesterday only helped temporarily, didn't it?">>
<<say "Lysara" "When you press your mouth against someone... when you taste them properly... the relief lasts longer. That's what the research suggests.">>
<<elseif _highEvent is 3>>
Lysara is organizing supplies near the cell. She crouches down, back to you.
Her robes pull tight across her ass. You can see the curve of it. The way it shifts as she moves.
She reaches for something on the lowest shelf. Has to lean forward. Her robes ride up the backs of her thighs.
The bars creak slightly as you press against them. Too eager.
She freezes. Then slowly looks back over her shoulder.
<<say "Lysara" "Oh my. You're very... eager today.">>
She stays crouched. Doesn't move away. Ass still on display.
<<say "Lysara" "I've been reviewing my notes from yesterday. The kiss I allowed you. Your physiological response was quite intense.">>
<<say "Lysara" "You probably need more, don't you? Poor thing.">>
<<say "Lysara" "I suppose I could help you again. If it becomes medically necessary.">>
<<storyVideo "story/lysara_cell_events/tier2_03_crouch_shelf">>
<<elseif _highEvent is 4>>
She's sitting on a stool near the cell, facing away. Reading.
But she keeps shifting. Squirming. Her ass pressing against the seat. Arching her back.
Her robes have ridden up. You can see her thighs. The way they press together when she squirms.
You shift position. Your chains rattle against the stone floor.
She glances back. Like she just noticed you were there.
<<say "Lysara" "Oh. I didn't realize you were awake.">>
She doesn't adjust her robes. Doesn't cover up. Stays exposed.
<<say "Lysara" "I'm reading about prolonged gas exposure. You must be suffering quite a bit by now.">>
<<say "Lysara" "This text describes various relief methods. Some quite... intimate.">>
She shifts again. Her thighs part slightly.
<<say "Lysara" "I've been very generous with you. That kiss I gave you. Though I notice you took advantage quite enthusiastically.">>
<<say "Lysara" "I wonder if you'll ask for more. The gas will make you, eventually.">>
<<storyVideo "story/lysara_cell_events/tier2_04_stool_squirm">>
<<elseif _highEvent is 5>>
You're pressed against the bars. Watching her work.
Lysara is carrying a tray of vials across the laboratory. She's focused on balancing them.
She walks past your cell. Close. Too close to the bars.
You can smell her. Soap and sweat and something else. Something feminine. Intoxicating.
<<say "Lysara" "Don't mind me. Just bringing these samples closer to your cell. For observation purposes.">>
Her foot catches on something — a loose stone, a crack in the floor. She stumbles.
<p class="sound-effect">//CRASH//</p>
The tray goes flying. Vials shatter. And she falls backward—
Right against the bars. Her ass presses hard against the metal. RIGHT IN YOUR FACE.
Her robes have ridden up completely. You can see everything. Smell everything.
<<say "Lysara" "Oh! I— the floor must have—">>
Confused victim act. But she doesn't move to get up.
You don't wait. You don't ask.
You bury your face in her ass. Tongue out. Tasting. Licking.
<<say "Lysara" "Wait— I just fell— you're not supposed to—">>
But her protest is weak. Breathless. And she presses BACK into you.
Your tongue finds her asshole. Circles it. She gasps.
<<say "Lysara" "Oh god— I didn't mean for— this is— oops—">>
<<say "Lysara" "You must be so affected by the gas to just— without even asking if I'm hurt—">>
She grinds harder against the bars. Pushing into your face.
<<say "Lysara" "I suppose when someone falls on you like this— it's only natural you'd— oh fuck—">>
<<say "Lysara" "This doesn't mean— I'm not— it's just the position I fell in—">>
She can barely maintain the act. You're tongue-fucking her ass and she's moaning despite "not wanting this."
<<storyVideo "story/lysara_cell_events/tier2_05_fall_against_bars">>
<<elseif _highEvent is 6>>
Lysara curses under her breath. A vial has tipped over on her workbench, spilling something dark and viscous.
<<say "Lysara" "No, no, no— this compound stains permanently if not cleaned immediately.">>
She grabs a rag and hurries toward the spill. But it's already dripped onto the floor. Near your cell.
<<say "Lysara" "I need to scrub this before it sets. Don't mind me.">>
She drops to her hands and knees. Right there. Back to you. Starts scrubbing at the stone floor with vigorous circular motions.
Her robes pull tight across her ass. The motion makes it sway—left, right, left, right.
<<storyVideo "story/lysara_cell_events/tier2_06_floor_scrub">>
You watch. Can't look away. Left. Right. Left. Right.
<<say "Lysara" "This compound is remarkably stubborn. I need to apply more... pressure.">>
She leans forward. Her robes ride up. Her ass rises and falls with each scrubbing motion.
Left. Right. Left. Right.
Your grip tightens on the bars. Your breathing slows. Matches her rhythm.
<<say "Lysara" "Almost... there... just need to reach... this spot...">>
She backs up. Closer. Still scrubbing. Still swaying.
Left. Right. Left. Right.
The motion is everything now. The world narrows to that hypnotic rhythm. Your thoughts dissolve.
<<say "Lysara" "The stain goes further than I thought. Under here...">>
She reaches forward. Back arches. Ass rises. Presses against the bars.
Left. Right. Left. Right.
You don't remember moving. Don't remember pressing your face through the gap in the bars. Don't remember opening your mouth.
Your tongue touches her ass.
She freezes.
<<say "Lysara" "Oh— what— what are you—">>
You lick again. Can't stop. The gas. The rhythm. Something broke inside you.
<<say "Lysara" "I was just— I was cleaning— you can't just—">>
Your tongue traces up. She gasps.
<<say "Lysara" "That's— oh— that's not— I didn't say you could—">>
But she doesn't pull away. She's still on her hands and knees. Still pressed against the bars.
You lick deeper. Finding the cleft. Tasting her.
<<say "Lysara" "The gas must have— you couldn't help— oh god—">>
Her protests dissolve into something else. Her back arches further.
<<say "Lysara" "I was just scrubbing the floor— this is— this is highly irregular—">>
Your tongue finds her asshole. Circles it.
<<say "Lysara" "Ah— that's— the nerve endings there are— for research purposes you should know— they're very sensitive— right— right there—">>
You press deeper. She pushes back against your face.
<<say "Lysara" "The— the compound I spilled— it has stimulating properties— that's why I'm— reacting this way— it's not— oh—">>
<<elseif _highEvent is 7>>
Lysara is reading from her notes. Frowning at something.
<<say "Lysara" "Interesting. The gas can cause dermal changes over time. Increased sensitivity. Flushing.">>
She sets down the notes. Looks at her own arm. Rolls up her sleeve.
<<say "Lysara" "I should verify this empirically. I've been exposed to trace amounts for days now.">>
She examines her forearm. Pressing the skin. Clinical.
<<say "Lysara" "Hmm. Some slight discoloration. Elevated warmth.">>
Her hand moves higher. To her shoulder. She pulls the collar of her robe aside.
<<say "Lysara" "The effect seems more pronounced in areas with thinner skin. I should check...">>
She glances at your cell. Then away. As if she forgot you were there.
Her hands move to the ties of her robe. She loosens them. The fabric parts slightly.
<<say "Lysara" "For thorough documentation, I need to examine areas typically covered.">>
She's talking to herself. Narrating her "research." But she's positioned so you can see.
The robe slips off one shoulder. Then the other. She's examining her collarbone. Her chest. The tops of her breasts.
<<say "Lysara" "Sensitivity appears elevated across the dermis. Particularly in...">>
Her fingers trace down. Over the curve of her breast. She shivers.
<<say "Lysara" "Yes. Significantly heightened response to touch.">>
She lets the robe fall to her waist. Her back is to you now. Pale skin. The curve of her spine.
<<say "Lysara" "I need to check the posterior regions. The gluteal area often shows early signs of...">>
She bends forward. Looking down at her own legs. Her robe rides up.
<<say "Lysara" "Difficult to see properly from this angle.">>
She bends further. Her ass rises. She's trying to look at the backs of her own thighs.
<<say "Lysara" "There does appear to be some flushing here. Increased blood flow to the...">>
She spreads her stance slightly. Bends lower. Her ass is at bar level now. Fully exposed.
<<say "Lysara" "I can't quite see... the inner regions require examination as well...">>
Her hand reaches back. Pulls her cheek aside. Examining herself. Right in front of you.
You make a sound. Strangled. Desperate.
She pauses. Doesn't look back.
<<say "Lysara" "Oh. You're watching, aren't you? I forgot you were there.">>
Lie. Obvious lie. She positioned herself perfectly.
<<say "Lysara" "This must be very difficult for you. In your condition. Seeing someone examine themselves so... thoroughly.">>
She's still bent over. Still holding herself open.
<<say "Lysara" "The gas probably makes you want to... assist. With the examination. That would be a natural urge.">>
<<say "Lysara" "I couldn't possibly ask you to... but if you felt compelled... for medical purposes...">>
<<storyVideo "story/lysara_cell_events/tier2_07_self_exam">>
She trails off. Waiting. Bent over. Exposed. Holding herself open for you.
<<else>>
Lysara is crossing the laboratory, a ring of keys jangling at her hip.
One catches on something. The ring snaps. Keys scatter across the stone floor.
<<say "Lysara" "Oh, blast—">>
She crouches to gather them. Picking them up one by one. Focused. Annoyed.
Then she freezes. Staring at a gap between a heavy cabinet and the wall. Near your cell.
<<say "Lysara" "No. The reagent cabinet key.">>
She moves to the cabinet. Gets on her knees. Peers into the dark gap.
<<say "Lysara" "It's back there. Of course it is.">>
She lies down flat. Reaches her arm into the gap. Her back arches as she stretches.
<<say "Lysara" "I can almost... it's just out of reach...">>
Her ass rises as she strains forward. Her robes pull tight. Then ride up.
You watch. She's focused on the key. Doesn't seem to notice how her position looks from your cell.
<<say "Lysara" "This cabinet is heavier than it looks.">>
She wiggles forward. Her ass rises higher. Points directly at your cell.
<<say "Lysara" "Almost... just a little more...">>
Her robes have bunched around her waist. You can see everything. The curve of her ass. The shadow between her thighs.
She grunts with effort. Her hips shift as she reaches deeper.
You grip the bars. The gas screams in your blood. She's right there. So close.
<<say "Lysara" "I think I can feel it...">>
She backs up slightly, adjusting her angle. Her ass presses against the bars. She doesn't seem to notice.
<<say "Lysara" "Just need to—">>
You don't decide. Your body decides.
Your face presses through the bars. Your tongue touches her ass.
She SCREAMS.
<<say "Lysara" "WHAT— what are you— STOP—">>
She tries to pull away but she's wedged against the cabinet. Arm still stuck in the gap.
<<say "Lysara" "I'm stuck— I can't— you can't just—">>
You lick again. She writhes.
<<say "Lysara" "NO— I was just getting my key— this isn't— STOP IT—">>
Her struggles make it worse. Her ass grinds against your face as she tries to escape.
<<say "Lysara" "The gas has— you've lost your mind— I didn't— I wasn't—">>
Your tongue finds her asshole. She gasps. Her whole body shudders.
<<say "Lysara" "No— don't— I didn't want— you're USING me—">>
Her voice breaks. Her body betrays her words. She pushes back slightly.
<<say "Lysara" "Please— I'm helpless— stuck— and you're just— using me— this is—">>
The protests sound different now. Less panic. More performance.
<<say "Lysara" "I can't stop you— I'm trapped— you're going to— whether I want it or—">>
She's still "struggling." Her ass is still grinding against your face.
<<storyVideo "story/lysara_cell_events/tier2_08_dropped_key">>
<</if>>
<<else>>
<<set _highEvent to random(1, 5)>>
<<set $flags.lysaraIntimacyEvent to _highEvent + 20>>
<<if _highEvent is 1>>
Lysara is at her workbench when something bubbles over. A hiss. She jumps back.
<<say "Lysara" "Damn. Got on my robes.">>
She examines the stain. Sighs. Begins unfastening her clothing.
<<say "Lysara" "This compound stains permanently. I need to wash it immediately.">>
She pulls the robes off. She's not wearing anything underneath.
<<set $player.lust to 100>>
Your breath stops.
Pale skin glowing in the dim light. Huge, heavy breasts, nipples already peaked from the cool air. The soft curve of her stomach. The dark triangle between her legs.
The gas sharpens everything. You can smell her—soap and something else, something warm and female that cuts through the chemical haze of the laboratory. Your cock strains against the cage. The metal bites into you.
She examines the stain on her robes, holding them up to the light. Turning. The motion makes her breasts sway. You watch the play of shadows across her body. Every curve. Every inch.
<<say "Lysara" "Such a waste of good fabric...">>
<<storyVideo "story/lysara_cell_events/tier3_01_contaminated_robes">>
<<if _storyClip is "d44a25436e99">>She sighs and sinks onto the edge of her cot, the ruined robe hanging open off her shoulders, seemingly lost in thought.<<else>>She sighs. Sets the robes aside. Stands there naked, seemingly lost in thought.<</if>>
Her hand absently brushes her breast. Your fingers grip the bars. Knuckles white.
Her hand trails down her stomach. Lower.
<em>Don't look. Don't look. Don't—</em>
You can't look away. The gas won't let you. Time stretches. Each second an eternity of watching her fingers drift toward—
Her hand rests between her thighs. She's touching herself. Absently. Like she doesn't realize she's doing it.
Your chains rattle. You're pressed against the bars without remembering moving. Close enough to smell the heat of her skin. Close enough to see the glisten of moisture on her fingers.
She glances up. Catches your stare. Her hand doesn't move.
<<say "Lysara" "Oh.">>
A pause. She looks down at herself. At her hand. Back at you.
<<say "Lysara" "The gas makes you fixate. I forgot how intense your condition has become.">>
She doesn't cover herself. Doesn't move her hand.
<<say "Lysara" "You're trembling. Your pupils are dilated. You may find yourself wanting to reach through the bars...">>
Her voice is soft. Almost hypnotic.
<<say "Lysara" "I wouldn't blame you if you did. The gas erodes self-control. You're not responsible for what happens next.">>
<<say "Lysara" "I should probably step back. But I can't seem to...">>
She moves closer instead. Her thigh brushes the bar. Inches from your hand.
<<elseif _highEvent is 2>>
Lysara yawns. Stretches her arms above her head. The motion lifts her breasts beneath the thin fabric.
<<say "Lysara" "Long night. My back is killing me.">>
She moves to an open area. Close to your cell. Too close.
Forward bend. Her robes ride up. You can see her legs—smooth, pale, bare almost to her hips. The curve of her ass.
<<set $player.lust to 100>>
Your mouth goes dry. The cage tightens around your cock.
She arches backward. Slowly. So slowly. Into a bridge pose.
The tie on her robes comes loose. The fabric falls away like water.
She's not wearing anything underneath.
Everything. You can see everything. Her breasts, nipples hard in the cool air. Her stomach, the muscles tensing to hold the pose. The space between her spread thighs—pink, glistening, inches from the bars.
<<say "Lysara" "Mmm... that's better...">>
A soft moan of satisfaction. Your chains rattle. You're gripping the bars without remembering moving.
The gas sharpens her scent. Sweat and arousal and something floral. It fills your head. Drowns out thought.
<em>She's right there. Right there. If you reached through the bars—</em>
She holds the position. Eyes closed. Spine curved. Completely exposed.
Time stops. Your heartbeat pounds in your ears. In your cock. The cage is agony.
You make a sound. Something between a groan and a whimper.
Her eyes open. She looks at you upside-down through the bridge pose. Doesn't come down.
<<say "Lysara" "Oh. My robes slipped.">>
She says it like she's commenting on the weather. While her pussy is spread open, eye level, through the bars.
<<say "Lysara" "I suppose the view is... distracting. For someone in your condition.">>
Her voice is breathless. Her nipples are hard. A flush creeps up her chest. But she doesn't acknowledge any of it.
<<say "Lysara" "You may find your hands moving toward the bars. That's the gas. Not you.">>
Your hands ARE on the bars. When did that happen?
<<say "Lysara" "I should probably adjust my clothing.">>
A pause.
<<say "Lysara" "But I can't seem to make myself move. Strange.">>
She holds the pose. Exposed. Waiting.
<<storyVideo "story/lysara_cell_events/tier3_02_morning_bridge">>
<<elseif _highEvent is 3>>
Lysara is sitting on the floor near your cell. Back against the wall. Reading.
One knee drawn up. The other leg stretched out. Her robes have pooled around her hips, exposing her thighs.
You watch her. Can't help it. The gas makes you notice every detail—the way her chest rises and falls, the curve of her neck, the soft skin of her inner thigh.
Her free hand rests on her leg. Then drifts. Higher. Absently.
<<set $player.lust to 100>>
Your breath catches. She doesn't seem to notice what she's doing.
Her fingers trace patterns on her inner thigh. Slow circles. Moving inward.
<em>She's going to— she's about to—</em>
Her hand slips between her legs. She's touching herself. Absently. Like she doesn't realize.
The gas sharpens your hearing. You can hear the wet sound of her fingers. The subtle hitch in her breathing.
Her hips shift. Her head tilts back slightly. A soft moan escapes her lips.
Your cock strains against the cage. Agony. Your hands grip the bars until your knuckles go white.
She's still "reading." Eyes on the text. But her hand keeps moving. Fingers sliding through her wetness.
Another moan. Louder this time. Her thighs part wider.
You make a sound. Desperate. Strangled.
Her eyes snap up. Hand freezes between her legs.
<<say "Lysara" "I... was I...?">>
She looks down at her hand. Glistening. Buried in her pussy. Seems genuinely confused.
<<say "Lysara" "I didn't realize I was...">>
She doesn't move her hand away. You can see her fingers twitch.
<<say "Lysara" "The gas affects everyone differently. Sometimes the body just... acts.">>
Her hand starts moving again. Slowly. While she watches you watch her.
<<say "Lysara" "I can't seem to stop. It's not... it's not something I can control right now.">>
She could stop. You both know she could stop.
<<say "Lysara" "You may find yourself wanting to help. That would be the gas too. Neither of us would be responsible.">>
Her fingers slide deeper. Her breath shudders.
<<say "Lysara" "I wouldn't be able to stop you. I can barely stop myself.">>
<<storyVideo "story/lysara_cell_events/tier3_03_absent_touch">>
<<elseif _highEvent is 4>>
Lysara is adjusting her stockings near your cell. She props one foot up on the bars.
<<say "Lysara" "These things always come loose...">>
Her robes fall back, exposing her leg. Smooth. Pale. The silk stocking hugging her calf, her thigh.
You watch her fingers roll the fabric. Slow. Deliberate. The motion hypnotic.
She switches legs. Higher on the bars this time. The new angle gives you a view up her robes.
<<set $player.lust to 100>>
No underwear. You can see everything. The curve of her ass. Her pink pussy between her legs.
Your cock throbs against the cage. Your hands shake on the bars.
Then she freezes.
<<say "Lysara" "Oh. My stocking is caught on the— I can't—">>
She tugs. Her leg doesn't come free. The motion spreads her thighs wider.
Her pussy is inches from your face now. Through the bars. You can smell her arousal—musky, warm, overwhelming.
<<say "Lysara" "I'm stuck. The lace is tangled on the— if I pull harder I'll tear it—">>
She's not stuck. You can see it. The stocking is barely caught on the metal.
But she stays there. Spread wide. "Struggling."
<em>She's right there. If you leaned forward—</em>
The gas amplifies everything. The heat radiating from her skin. The glistening wetness. The way her pussy clenches slightly when she shifts.
<<say "Lysara" "I can't seem to get free.">>
Her hand brushes her inner thigh as she "struggles." An accident. Clearly an accident.
<<say "Lysara" "And you can't seem to look away. We're both trapped, in a way.">>
Her voice drops. Softer now.
<<say "Lysara" "If you... if you did something... I couldn't stop you. I'm stuck.">>
A helpless smile. Her pussy glistens inches from your mouth.
<<say "Lysara" "Whatever happens while I'm trapped like this... it wouldn't be my fault. Or yours. Just... circumstances.">>
She could free herself in a second. She doesn't.
<<storyVideo "story/lysara_cell_events/tier3_04_stuck_stocking">>
<<else>>
Lysara is organizing supplies near your cell. A vial rolls off the shelf. Falls behind a crate near the bars.
<<say "Lysara" "Oh, damn...">>
She crouches down to retrieve it. Her robes ride up. You can see the backs of her thighs—smooth, pale, disappearing into shadow.
<<set $player.lust to 100>>
She reaches for the vial. Can't quite get it. Shifts position.
Her ass lifts. Her legs spread. The robes slide higher.
You stop breathing.
From behind, you can see everything. Her pussy—pink, wet, swollen. Inches from the bars. Inches from your face.
<<say "Lysara" "Almost... got it...">>
She leans forward more. Her ass presses back. Closer. The heat of her skin radiates through the bars.
The gas sharpens every sensation. Her scent fills your head—arousal and sweat and something sweet. Your cock strains against the cage until you think you might break.
<em>If you leaned forward. Just a little. Your tongue could reach—</em>
You make a sound. Raw. Desperate.
She glances back over her shoulder. Catches your eyes. Doesn't move from the position.
<<say "Lysara" "Oh. You're watching.">>
Her voice is soft. Breathless. She doesn't acknowledge why.
<<say "Lysara" "The gas makes you notice things you normally wouldn't. Every detail becomes... consuming.">>
She stays there. Ass raised. Pussy exposed. Looking at you over her shoulder.
<<storyVideo "story/lysara_cell_events/tier3_05_dropped_vial">>
<<if _storyClip is "79766a17c795">><<say "Lysara" "I should get up. But I can't quite reach the vial. It rolled under the cot.">><<else>><<say "Lysara" "I should get up. But I can't quite reach the vial.">><</if>>
She shifts back. Closer to the bars. Her pussy is almost touching the metal now.
<<say "Lysara" "And you can't quite control yourself. We're both... stuck.">>
Her hips rock slightly. An accident. Obviously an accident.
<<say "Lysara" "If something happened right now... neither of us could be blamed. The gas. The position. It's not like either of us chose this.">>
Still reaching. Still exposed. Her pussy glistening inches from your mouth.
<<say "Lysara" "I certainly couldn't stop you. Not from this position.">>
<</if>>
<</if>>
<</if>>
<<else>>
<<set $flags.lysaraIntimacyEvent to 0>>
<<set _spyEvent to random(1, 10)>>
<<if _encounter gte 1 && _encounter lte 3>><<set _spyEvent to _encounter>><</if>>
<<if _spyEvent is 1>>
She's mixing something at her workbench. The motion requires her whole body—hips swaying, shoulders rolling, breasts shifting beneath thin fabric.
<<set $player.lust to Math.min(100, $player.lust + 15)>>
You watch. The grinding motion. The way her body moves. Circular. Rhythmic.
Your breathing gets heavier. You don't realize how loud until—
She pauses. Doesn't turn around.
<<say "Lysara" "Oh. You're awake.">>
The grinding resumes. Slower now. More deliberate.
<<say "Lysara" "This compound requires precise movements. I hope the motion isn't... distracting.">>
A pause. She still hasn't looked at you.
<<say "Lysara" "The gas can make repetitive motion difficult to ignore. You may find your attention... fixed.">>
She keeps working. Hips swaying. As if she's simply stating medical facts.
<<storyVideo "story/lysara_cell_events/spy_01_mixing" "" "characters/lysara/spy_teasing">>
<<elseif _spyEvent is 2>>
Lysara is stretching. Arms above her head. Back arched.
Her breasts strain against the fabric of her corset. One more deep breath and they might spill free.
<<set $player.lust to Math.min(100, $player.lust + 20)>>
She arches further. The fabric pulls tighter. You shift against the bars, chains clinking softly.
She holds the position. Eyes still closed.
<<say "Lysara" "The gas creates such tension in the muscles.">>
Is she talking to herself? To you?
She bends deeper. Slower. Her body curves in ways that make your cage ache.
<<say "Lysara" "I find myself needing to stretch... frequently.">>
Her eyes open. She glances toward your cell as if just remembering you're there.
<<say "Lysara" "Oh. The movement probably makes it harder for you to look away. The gas does that.">>
She releases the stretch slowly. Takes her time.
<<storyVideo "story/lysara_cell_events/spy_02_corset_stretch" "" "characters/lysara/spy_teasing">>
<<elseif _spyEvent is 3>>
She's working at a shelf near the cell. Close. Closer than usual.
Close enough that you can smell her. Flowers. Musk. Something else.
<<set $player.lust to Math.min(100, $player.lust + 25)>>
You inhale. Can't help it. A sharp breath through your nose.
She pauses. Turns her head slightly.
<<say "Lysara" "Interesting. Your olfactory sensitivity has increased.">>
She doesn't step away. If anything, she shifts closer to the bars.
<<say "Lysara" "The gas heightens certain senses. Smell, particularly. You're probably detecting pheromones you couldn't before.">>
She reaches for something on a higher shelf. Her body stretches. Her scent intensifies.
<<say "Lysara" "It can be... overwhelming. When everything becomes so vivid.">>
She's close enough to touch. But she doesn't look at you. Just keeps working.
<<storyVideo "story/lysara_cell_events/spy_03_shelf_close" "" "characters/lysara/spy_teasing">>
<<elseif _spyEvent is 4>>
Lysara is bent over a low table, examining something through a magnifying lens.
Her robes have ridden up. You can see the backs of her thighs. The curve of her ass.
<<set $player.lust to Math.min(100, $player.lust + 20)>>
She stays like that. Minutes pass. Your cock strains painfully against the cage.
You shift, trying to find a position that doesn't hurt. The movement makes a sound.
She doesn't look up. Still focused on her work.
<<say "Lysara" "Fascinating specimen...">>
A pause. Is she talking about what's under the lens? Or—
<<say "Lysara" "The cellular structure is responding exactly as predicted.">>
She adjusts her position. Bends lower. Her robes ride up another inch.
<<say "Lysara" "Some things just need time. And observation.">>
She still hasn't looked your way. You're not sure if she knows you're watching.
<<storyVideo "story/lysara_cell_events/spy_04_magnifier" "" "characters/lysara/spy_teasing">>
<<elseif _spyEvent is 5>>
She's eating. Something simple—bread and cheese. Her back is to you.
But you can see her in the reflection of a copper vessel. The way her tongue darts out to catch a crumb. The way she licks her fingers clean, one by one.
<<set $player.lust to Math.min(100, $player.lust + 15)>>
Your stomach growls. Loud in the quiet laboratory.
She pauses. Doesn't turn around.
<<say "Lysara" "The gas can affect appetite. Some subjects report... cravings.">>
She licks another finger. Slowly. You watch her reflection.
<<say "Lysara" "Certain oral fixations become more pronounced. It's a documented side effect.">>
She finishes eating. Takes her time cleaning each finger with her tongue.
<<say "Lysara" "Perfectly normal.">>
She never turns around. Never acknowledges what you might be watching.
<<storyVideo "story/lysara_cell_events/spy_05_eating" "" "characters/lysara/spy_teasing">>
<<elseif _spyEvent is 6>>
<<storyVideo "story/lysara_cell_events/spy_06_washing" "" "characters/lysara/spy_teasing">>
<<if _storyClip is "b4e20752ebf9">>Lysara is washing at the basin in the corner, naked, a sponge in her hand. The water runs down her arms and her breasts, dripping from her elbows.<<else>>Lysara is washing her hands in a basin. The water runs down her forearms, dripping from her elbows.<</if>>
She splashes some on her neck. Her chest. The fabric of her robes darkens where the water touches, clinging to her skin.
<<set $player.lust to Math.min(100, $player.lust + 20)>>
You make a sound. Something between a groan and a whimper. You didn't mean to.
She doesn't turn. Just continues splashing water on herself.
<<say "Lysara" "The gas vents make it so warm in here. A side effect of the filtration process.">>
She fans herself with one hand. The motion makes her breasts shift beneath the damp, clinging fabric.
<<say "Lysara" "The heat probably makes your symptoms worse. Elevated temperature increases blood flow to... certain areas.">>
She keeps fanning. Keeps not looking at you.
<<say "Lysara" "I should adjust the vents. Eventually.">>
She doesn't.
<<elseif _spyEvent is 7>>
She's reading in a chair near the cell. One leg crossed over the other.
As she reads, her foot bounces absently. Her robe falls open slightly, revealing bare leg up to mid-thigh.
<<set $player.lust to Math.min(100, $player.lust + 15)>>
You watch her leg. The way it moves. The skin disappearing into shadow.
She turns a page. Speaks to herself, as if taking notes aloud.
<<say "Lysara" "This text describes the gas's effects on libido. Increased arousal by 400%... heightened visual fixation...">>
Her foot keeps bouncing. Her robe slips another inch.
<<say "Lysara" "Subjects report difficulty looking away from... certain stimuli.">>
She pauses. Her foot stills. She looks up—not at you, but toward the cell's general direction.
<<say "Lysara" "Hmm. I wonder if the estimates are conservative.">>
She returns to reading. Her foot resumes bouncing. Her robe stays open.
<<storyVideo "story/lysara_cell_events/spy_07_reading_leg" "" "characters/lysara/spy_teasing">>
<<elseif _spyEvent is 8>>
Lysara drops a vial. It shatters on the floor near your cell.
<<say "Lysara" "Oh. Clumsy.">>
<<storyVideo "story/lysara_cell_events/spy_08_shattered_vial" "" "characters/lysara/spy_teasing">>
<<if _storyClip is "e3ae07f082df">>She kneels to scrub up the mess.<<else>>She crouches to clean it up.<</if>> From your angle, you can see straight down her top. The swell of her breasts. The dark valley between them.
<<set $player.lust to Math.min(100, $player.lust + 25)>>
She takes her time picking up every shard. Every. Single. One. The angle never changes.
You press against the bars. They creak.
She pauses, still crouched. Doesn't look up.
<<say "Lysara" "Almost done. Glass is dangerous. Have to be thorough.">>
She reaches for another shard. Leans forward. The view deepens.
<<say "Lysara" "The gas can make it difficult to close your eyes. Even when you might want to.">>
She finishes. Stands slowly. Brushes off her knees without looking your way.
<<say "Lysara" "There. All clean.">>
She walks back to her workbench as if nothing happened.
<<if _storyClip is "be97524eb56f">>At the bench she undoes one more button against the heat, murmuring to herself about the glass.<<elseif _storyClip is "e465d2ef8ca7">>She pushes her spectacles up, scratches a line on a scrap (one vial, broken, entered in the inventory) and presses it to the wall above the bench.<<elseif _storyClip is "4fa7f4da4a24">>She bends over the workbench to wipe it down and glances back at you once, from under her lashes.<</if>>
<<elseif _spyEvent is 9>>
She's doing some kind of exercise near the cell. Yoga, maybe. Or stretching for alchemy work.
Either way, she's bending in ways that should be illegal.
<<set $player.lust to Math.min(100, $player.lust + 20)>>
Her ass rises. Her chest presses to the floor. Her legs spread wide for balance.
She holds the position. Breathing slowly. You watch, transfixed.
Your chains rattle as you shift.
She doesn't acknowledge it. Just transitions into another pose. Deeper. More exposed.
<<say "Lysara" "Flexibility prevents injury during extraction work. Some ingredients require... difficult positions to reach.">>
She bends lower. Her robes fall forward. You can see down the front of them.
<<say "Lysara" "The body adapts to repeated strain. Eventually, positions that once seemed impossible become... natural.">>
She holds the pose. Breathing. You're not sure if she's talking about alchemy anymore.
<<storyVideo "story/lysara_cell_events/spy_09_yoga" "" "characters/lysara/spy_teasing">>
<<else>>
Lysara is adjusting her corset. The laces have come loose.
She turns her back to you—giving you a perfect view as she unlaces it completely, then slowly, methodically, re-laces it.
<<set $player.lust to Math.min(100, $player.lust + 20)>>
For a moment, you see bare skin. The dimples at the small of her back. The curve of her spine.
You inhale sharply. Too loud.
She pauses, hands still on the laces behind her back.
<<say "Lysara" "The gas makes fine motor control difficult. Even simple tasks become... frustrating.">>
She continues lacing. Slowly. Her bare back still visible.
<<say "Lysara" "The texts say some subjects develop a need to... assist. To use their hands. A displacement behavior.">>
She finishes. Pulls the laces tight. Her waist cinches.
<<say "Lysara" "Fortunately, I manage.">>
She smooths down her robes without turning around. As if you weren't watching the whole time.
<<storyVideo "story/lysara_cell_events/spy_10_corset_lacing" "" "characters/lysara/spy_teasing">>
<</if>>
<<if _storyClip is "e011ce01bb8f">>Later, through the steam from her washbasin, you see more. Lysara, naked and dripping, straddling a thick dark toy cock from her specimen shelf and working it in and out of her pussy, smiling straight at your cell. Testing a reagent on arousal, she would call it.<<elseif _storyClip is "88e3451342ad">>Later she hauls some clattering old-world floor machine across the lab, bent low over it in a thin white tank top and leggings, her tits all but falling out every time she leans into the push. She never looks at the cell. She doesn't need to.<<elseif _storyClip is "86cdb80304f5">>Later she's at her basin in a thin white tank top and blue rubber gloves, bent over the rim to polish the brass tap, her tits swinging over the porcelain with every stroke of the rag.<<elseif _storyClip is "a249aae81d59">>Later she stands at her tall mirror in a pink fishnet dress and heels, then, still facing the mirror, tugs the pink top down, one side and then the other, until her tits spill over it. The mirror happens to face your cell. Checking the fit, she would call it.<<elseif _storyClip is "2795ce1f90e5">>Later she lounges in blue velvet, the dress pulled down under her bare tits, arms folded behind her head, rolling her shoulders slowly so they sway, and watching your cell as if you were the specimen.<<elseif _storyClip is "d6ce38947a12">>Later she stands at her tall mirror in black straps and stockings, a garter belt riding high on her hips, and turns to look at her own ass over her shoulder, cool as a woman checking a stain on a coat.<<elseif _storyClip is "132f41b8d0b1">>Later she sprawls on her couch in a tight white tee and white panties, fiddling with some small old-world trinket. She gets up, walks off, then leans back round the doorway, smiling at nothing in particular, and is gone.<</if>>
<</if>>
<</if>>
<</if>>
<<set _spyFeral to setup.cellFeralNext()>>
<<if _spyFeral>>
<div class="choice-container">
<<vchoice "Continue" _spyFeral "action" "forward">>
</div>
<<elseif _spyNext>>
<div class="choice-container">
<<vchoice "Continue" _spyNext "action" "forward">>
</div>
<<else>>
<<set _evt to $flags.lysaraIntimacyEvent || 0>>
<<set _canAsk to $flags.lysaraIntimacyPathUnlocked && !$flags.lysaraDeviceUsed>>
<<set _advance to _canAsk && _evt >= 1 && _evt <= 30>>
<div class="choice-container">
<<if $temp.dayActions lt 4>>
<<vchoice "Try to meditate" "Cell_Meditate" "action" "meditation">>
<<vchoice "Spy on Lysara more" "Cell_Spy_Lysara" "action" "search">>
<</if>>
<<if _canAsk && (_advance || $temp.dayActions lt 4)>>
<<if _evt is 2 || _evt is 6 || _evt is 7 || _evt is 8>>
<<vchoice "..." "Cell_Lysara_Intimacy" "intimate" "lips">>
<<elseif _evt is 1 || _evt is 5 || _evt is 15 || _evt is 16 || _evt is 18 || _evt is 24 || _evt is 25>>
<<vchoice "Reach for her" "Cell_Lysara_Intimacy" "intimate" "grab">>
<<else>>
<<vchoice "Ask her to come closer" "Cell_Lysara_Intimacy" "intimate" "lips">>
<</if>>
<</if>>
<<if $temp.dayActions lt 4>>
<<vchoice "Just suffer" "Cell_Suffer" "action" "health">>
<<else>>
<<vchoice "Rest until nightfall" "Cell_Day_End" "action" "night">>
<</if>>
</div>
<</if>><<set $currentLocation to "pleasure_den">>
<<set _den to setup.denState()>>
<h2>The Pleasure Den</h2>
<<if !setup.denOpenAt($time.hour)>>
A collapsed storefront in the ruins of a little town. By day it's rubble and a steel door with no handle on the outside. You knock anyway. A slot opens at eye height.
<<say "Brakka" "Shut. Come back after dark.">>
<div class="choice-container">
<<link `setup.denBtn("Wait for dark", "wait", "action")`>><<advanceToHour `setup.DEN.hours.open`>><<goto "Den_Door">><</link>>
<<vchoice "Leave" "WorldMap_View" "move" "map">>
</div>
<<elseif setup.kiraWithYou()>>
The steel door opens. The woman in it is half a head taller than you, and the heels aren't all of it: long black hair down past her shoulders, a sleeve of tattooed flowers down one arm, rhinestones at her throat, and a white dress stretched tight over her curves. She looks at you, then at Kira, and doesn't move.
<<say "Brakka" "Women work here or they don't come in. She doesn't work here.">>
<<say "Kira" "Like I'd want to. Have fun getting robbed, vault boy. I'm going home.">>
<div class="choice-container">
<<link `setup.denBtn("Let her go home", "door", "action")`>><<run setup.denSendKiraHome()>><<goto "Den_Door">><</link>>
<<vchoice "Go home with her" "WorldMap_View" "move" "map">>
</div>
<<else>>
<<set _denDue to setup.denDoorDue()>>
<<if _den.visits is 0>>
<<if setup.denKiraSentTonight()>>Brakka waits till Kira is out of sight.<<else>>The steel door opens. The woman in it is half a head taller than you, and the heels aren't all of it: long black hair down past her shoulders, a sleeve of tattooed flowers down one arm, rhinestones at her throat, and a white dress stretched tight over her curves.<</if>> Behind her, red light and a bass line you feel in your teeth.
<<say "Brakka" `"Rules. I say them once. " + setup.DEN.door.entry + " scrap to get in. That buys two drinks, the house pour. Weapons stay with me, you get them back when you leave. Nobody fights inside. Women work here or they don't come in."`>>
<<elseif _den.door.fineDue gt 0 || _den.door.tabDue gt 0>>
Brakka sees you coming and smiles for the first time since you've known her. It isn't nice.
<<say "Brakka" `"Look who crawled back. You owe the house. " + _denDue + " scrap, all of it, before you get past me. Your weapons stay on my shelf till it's paid."`>>
<<else>>
Brakka looks you up and down like she's counting what's on you.
<<say "Brakka" `setup.DEN.door.entry + ". Weapons."`>>
<</if>>
<<scrapBalance>>
<div class="choice-container">
<<if setup.denScrap() gte _denDue>>
<<link `setup.denBtn("Pay " + _denDue + " scrap and hand over your weapons", "scrap", "action")`>><<set _denSearch to setup.denState().visits is 0>><<run setup.denPayDoor()>><<run setup.denHoldWeapons()>><<if _denSearch>><<goto "Den_Door_Search">><<else>><<goto "Den_Drinks">><</if>><</link>>
<<else>>
<<vchoiceDisabled `"Pay " + _denDue + " scrap (you have " + setup.denScrap() + ")"` "action" "scrap">>
<</if>>
<<vchoice "Leave" "WorldMap_View" "move" "map">>
</div>
<</if>><<storyVideo "story/den_door/search">>
<<say "Brakka" "First time, I check.">>
She means all of it. Belt, boots, whatever you carry, your shirt, the rest. Piece by piece it goes on her shelf, until you're standing naked just inside the door, hard and not hiding it.
The top of her white dress is already down round her ribs, her own hands on her tits. It's that kind of house. You put a hand on her hip. She lets you. Your hand finds its way under the hem and onto her ass, and she smiles down at you as if that was part of the search. When your hand slides up under her breast and your mouth finds her shoulder, she doesn't stop you either.
<<say "Brakka" "No blades. Good. The rest of you, the house sells.">>
She throws your clothes back at you, everything but your weapons. Those stay on her shelf till you leave.
<div class="choice-container">
<<vchoice "Go in" "Den_Drinks" "move" "door">>
</div><<set _den to setup.denState()>>
<<storyVideo "story/den_door/drinks">>
Inside it's red light and smoke and bare brick. At the bar a woman with a bored mouth sets two big round glasses in front of you without being asked and heaps them with ice. Something orange goes in over the ice. Under the pink lights behind the bar it looks pink.
<<if setup.denCanTrip()>>
<<say "Juno" "On the house. Both of them. House rule.">>
<div class="choice-container">
<<link `setup.denBtn("Drink both", "potion", "action")`>><<run setup.denDose()>><<run setup.denDose()>><<run setup.denEnterHub()>><<goto `setup.denNext()`>><</link>>
<<link `setup.denBtn("Drink one", "potion", "action")`>><<run setup.denDose()>><<goto `setup.denEnterHub()`>><</link>>
<<if _den.juno.step is 0>>
<<link `setup.denBtn("Leave them", "back", "action")`>><<run setup.denJunoStep(null, 1)>><<goto "Den_Juno_Notice">><</link>>
<<else>>
<<link `setup.denBtn("Leave them", "back", "action")`>><<goto `setup.denEnterHub()`>><</link>>
<</if>>
</div>
<<else>>
<<say "Juno" "Clean ones for you tonight. You've had your ride, lightweight. Sleep first.">>
<div class="choice-container">
<<link `setup.denBtn("Drink up", "potion", "action")`>><<goto `setup.denEnterHub()`>><</link>>
</div>
<</if>><<set _den to setup.denState()>>
<<if _den.trip.active>><<denHaze>><</if>>
The Den at night: bare brick, red light through pierced tin lanterns, a long bar of dark wood down one wall, a little stage at the back, curtained booths along the walls, sweat and cheap incense. Women in next to nothing work the floor. The men here are their clients, and none of them look at you.
<<if _den.events.now is "catfight">>Over by the stage two of the women go for each other's hair, and the whole room turns to watch.
<<elseif _den.events.now is "party" && !_den.trip.active>>The women are whispering about a party of their own after closing.
<</if>>
<<denWarn>>
<div class="choice-container">
<<if _den.events.now is "catfight">><<vchoice "The fight" "DenEvent_Catfight" "action" "eye">><</if>>
<<if _den.events.now is "party" && !_den.trip.active>><<link `setup.denBtn("Stay for the girls' party after closing", "heart", "intimate")`>><<advanceToHour `setup.DEN.hours.close`>><<run setup.denStartScene(null, "cg_den_party")>><<goto "DenEvent_Party">><</link>><</if>>
<<vchoice "The bar" "Den_Bar" "action" "talk">>
<<vchoice "The floor" "Den_Floor" "action" "seduce">>
<<if _den.seen.stage>><<link `setup.denBtn("Watch the stage", "eye", "action")`>><<goto "Den_StageShow">><</link>><</if>>
<<if _den.seen.corridor>><<link `setup.denBtn("The red corridor", "voyeur", "action")`>><<run setup.storyFamilyForget("cg_den_room_corridor")>><<goto "Den_Corridor">><</link>><</if>>
<<if _den.seen.baths>><<denBuyLink "The baths, with a girl" "baths" "Den_BathsPaid" "heart">><</if>>
<<vchoice "The stairs" "Den_Stairs" "action" "lock">>
<<vchoice "Leave" "Den_Leave" "move" "door">>
</div><<set _den to setup.denState()>>
<<set _denSV to setup.storyFamilySingles("story/den_floor/look", setup.denSinglesHere("story/den_floor/look"))>><<if _denSV or !setup.storyFamilyGap("story/den_floor/look")>><<storyVideo "story/den_floor/look">><</if>><<if _denSV>><<run setup.mediaAvoidEnd("story/den_floor/look")>><</if>>
The women work the floor between the booths. <<if _storyClip is "c3a913507a64">>At the nearest one a woman kneels with a customer's cock in her mouth. Nobody else looks twice. <<elseif _storyClip is "4fc78eb07fdf" or _storyClip is "93db9a4e9545">>Up on the little stage three of them dance round one pole together. <</if>>They put a hand on a shoulder, laugh, whisper in an ear and name a price.
<<scrapBalance>>
<div class="choice-container">
<<denBuyLink "A girl for an hour" "hour" "Den_Floor_Dance" "seduce">>
<<denBuyLink "A girl for the night" "night" "Den_Floor_Dance" "heart">>
<<if _den.events.pipOwes>><<link `setup.denBtn("Pip's night (she owes you)", "heart", "intimate")`>><<run setup.denBuy(null, "pip")>><<goto "Den_Pip_Night">><</link>><</if>>
<<vchoice "Back" "Den_Main" "move" "back">>
</div><<set _denSV to setup.storyFamilySingles("story/den_floor/dance", setup.denSinglesHere("story/den_floor/dance"))>><<if _denSV or !setup.storyFamilyGap("story/den_floor/dance")>><<storyVideo "story/den_floor/dance">><</if>><<if _denSV>><<run setup.mediaAvoidEnd("story/den_floor/dance")>><</if>>
She takes your hand and walks you to a booth, and dances for you <<if _storyFamily is "sf_cg_den_floor_01" or _storyFamily is "sf_cg_den_floor_03">>by the pole<<else>>with her knees either side of yours<</if>><<if _storyFamily is "sf_cg_den_floor_03">>, and when she has your eyes she lifts the hem and shows you her bare ass<<elseif _storyFamily is "sf_cg_den_floor_02">>, then leans back with her legs open over yours and lets your hand wander between them<</if>>.<<if _storyFamily is "sf_cg_den_floor_01" or _storyFamily is "sf_cg_den_floor_03">> Then she turns her back to you and sits in your lap.<</if>> She grinds down on your cock through your trousers and laughs when it jumps.
<div class="choice-container">
<<link `setup.denBtn("Let her", "forward", "intimate")`>><<goto "Den_Floor_Blow">><</link>>
</div><<set _denSV to setup.storyFamilySingles("story/den_floor/blow", setup.denSinglesHere("story/den_floor/blow"))>><<if _denSV or !setup.storyFamilyGap("story/den_floor/blow")>><<storyVideo "story/den_floor/blow">><</if>><<if _denSV>><<run setup.mediaAvoidEnd("story/den_floor/blow")>><</if>>
She <<if _storyFamily is "sf_cg_den_floor_01">>gets up off your lap and bends over you where you sit<<else>>slides off your lap onto her knees<</if>>, opens your trousers and takes your cock in her mouth, slow and wet, looking up at you the whole time.
<div class="choice-container">
<<link `setup.denBtn("Pull her up onto you", "forward", "intimate")`>><<goto "Den_Floor_Sex">><</link>>
</div><<set _denSV to setup.storyFamilySingles("story/den_floor/sex", setup.denSinglesHere("story/den_floor/sex"))>><<if _denSV or !setup.storyFamilyGap("story/den_floor/sex")>><<storyVideo "story/den_floor/sex">><</if>><<if _denSV>><<run setup.mediaAvoidEnd("story/den_floor/sex")>><</if>>
She <<if _storyFamily is "sf_cg_den_floor_01">>lies back on the booth bench, hooks one leg up over your shoulder and pulls you into her<<elseif _storyFamily is "sf_cg_den_floor_03">>climbs on with her back to you and sinks down onto your cock<<elseif _storyClip is "293d75f2149c">>bends over the booth bench and lets you play first. You work your fingers into her from behind, then give her your cock instead<<else>>climbs on and sinks down onto your cock<</if>><<if _storyClip is "293d75f2149c">><<else>>, tight and hot,<</if>> and <<if _storyFamily is "sf_cg_den_floor_01">>you fuck her standing<<elseif _storyClip is "293d75f2149c">>fuck her over the bench<<else>>fucks you in the booth<</if>> while the music covers the noise she makes.<<if _storyFamily is "sf_cg_den_floor_01">> Then she rolls over, bends over the bench, and you take her from behind.<<elseif _storyFamily is "sf_cg_den_floor_02">> Then she bends over the bench for you, and ends up on all fours on it with you behind her.<<elseif _storyFamily is "sf_cg_den_floor_03">> Then she climbs off and bends over the bench for you.<</if>>
<div class="choice-container">
<<link `setup.denBtn("Come", "heart", "intimate")`>><<set $player.lust to 20>><<run setup.playerReleased()>><<goto "Den_Floor_Finish">><</link>>
</div><<set _den to setup.denState()>>
<<set _denSV to setup.storyFamilySingles("story/den_floor/finish", setup.denSinglesHere("story/den_floor/finish"))>><<if _denSV or !setup.storyFamilyGap("story/den_floor/finish")>><<storyVideo "story/den_floor/finish">><</if>><<if _denSV>><<run setup.mediaAvoidEnd("story/den_floor/finish")>><</if>>
You come hard<<if _storyFamily is "sf_cg_den_floor_03">> on her ass<</if>><<if _storyFamily is "sf_cg_den_floor_01" or _storyFamily is "sf_cg_den_floor_03">> with her bent over the bench in front of you. She looks back at you over her shoulder<</if>><<if _storyFamily is "sf_cg_den_floor_01">> and grins<</if>><<if _storyFamily is "sf_cg_den_floor_01" or _storyFamily is "sf_cg_den_floor_03">> while you finish, and only then straightens up<<else>>, and she milks the last of your cum out of you before she<</if>><<if _storyFamily is "sf_cg_den_floor_02">> gets up off the bench<<elseif _storyFamily is "sf_cg_den_floor_01" or _storyFamily is "sf_cg_den_floor_03">><<else>> climbs off<</if>> and fixes her hair.<<if _storyFamily is "sf_cg_den_floor_02">> Then she smiles at you and walks off across the floor.<</if>>
<div class="choice-container">
<<if _den.floor is "night">>
<<link `setup.denBtn("Sleep in her bed till closing", "sleep", "action")`>><<advanceToHour `setup.DEN.hours.close`>><<goto `setup.denNext()`>><</link>>
<<else>>
<<denDone>>
<</if>>
</div><<storyVideo "story/den_pip/night">>
Pip takes your hand and pulls you through a curtain into her own little room, kicks the door shut and pushes you back onto the bed.
<<say "Pip" "A whole night, I said. I pay my debts.">>
She hikes the red dress up round her waist, climbs up the bed on her knees and settles herself on your face, bare and smooth, with a small jewelled bar through her hood, two clear stones, one above the other. Her thighs close in round your ears. She takes her time about it, your mouth and your tongue and her hips rocking slow, and once she lifts off for a breath and looks down at you before she sits right back down. By the time she's had enough of your mouth you're so hard it hurts. Then she takes your cock in her hand, slow, then not slow at all, until you can't hold back.
<div class="choice-container">
<<link `setup.denBtn("Come", "heart", "intimate")`>><<set $player.lust to 20>><<run setup.playerReleased()>><<goto "Den_Pip_After">><</link>>
</div>She doesn't let you go after the first time. Somewhere near closing she falls asleep across your chest.
<<say "Pip" "Now we're square.">>
<div class="choice-container">
<<link `setup.denBtn("Sleep in her bed till closing", "sleep", "action")`>><<advanceToHour `setup.DEN.hours.close`>><<goto `setup.denNext()`>><</link>>
</div><<storyVideo "story/den_stage_show/show">>
A dancer <<if _storyClip is "84e4cf8aa628">>crawls to the edge of the stage on her hands and knees, then gets up at the pole<<else>>works the pole<</if>><<if _storyClip is "167c7dfb0949" or _storyClip is "7bb9b55921fd" or _storyClip is "a0b9c14a85c0" or _storyClip is "c0e29aa704fe" or _storyClip is "84e4cf8aa628" or _storyClip is "fac0169e1a95" or _storyClip is "de13d10dece2">>, slow<<else>> under one hot white light, slow, upside down, then not upside down, until the last of what she wears is on the boards<</if>>.
<div class="choice-container">
<<denDone>>
</div><<storyVideo "story/den_room_corridor/peep">>
A row of peepholes down a red hall. Behind each one a woman is working, on a red leather couch or a black satin bed: on her knees, on her back, on all fours, on top. Nobody minds you looking. That's what the holes are for.
<div class="choice-container">
<<denDone>>
</div><<storyVideo "story/den_baths_paid/spa">>
<<if _storyClip is "982b8ef82d72">>She takes you through the steam to a dry room lit by candles, oils you all over and sucks you, slow, then turns round and straddles your face.<<else>>Steam you can't see across. She pushes you down on the wet bench and rides you, slick and slow, her tits sliding against your chest.<</if>>
<div class="choice-container">
<<link `setup.denBtn("Come for her", "heart", "intimate")`>><<set $player.lust to 20>><<run setup.playerReleased()>><<goto "Den_BathsPaid_End">><</link>>
</div>She rinses you off with a bucket of warm water, kisses you once, and is gone into the steam.
<div class="choice-container">
<<denDone>>
</div><<set _den to setup.denState()>>
<<set _denWay to setup.denStairsWay()>>
A narrow staircase behind the bar, and at the top of it a woman so big she has to stoop under the ceiling. She watches you. She doesn't blink.
<<if _denWay.way is "done">>You remember those stairs. All of them.<<elseif _denWay.way is "juno">><<say "Juno" "Madam sees nobody, lightweight. You only go up those stairs if one of us takes you.">><<else>>One of the women from the floor follows your eyes up the stairs and leans on the bar beside you. <<if _denWay.way is "web">>"You've got all three keys. When the tray comes round, knock it away. One of the doors behind it is spun shut with silk, and that's your way up."<<else>>"There's another way up, through the middle of the house. You need three keys for it<<if _denWay.missing.length is 3>>: the bartender's key, the stage pass and the cellar key."<<else>>, and you're still missing <<print setup.denKeyList(_denWay.missing)>>."<</if>><</if>><</if>>
<div class="choice-container">
<<vchoice "Back" "Den_Main" "move" "back">>
</div><<set _den to setup.denState()>>
<<if _den.door.weapons>>Brakka takes your weapons off her shelf and hands them over without looking up.<</if>>
<<say "Brakka" "Out the way you came.">>
<div class="choice-container">
<<link `setup.denBtn("Head home", "map", "move")`>><<run setup.denLeave(null, "left")>><<goto "WorldMap_View">><</link>>
<<vchoice "Stay a while" "Den_Main" "move" "back">>
</div>The bulbs come up white and ugly. The women are counting scrap.
<<say "Brakka" "Closing. Out. All of you.">>
<div class="choice-container">
<<link `setup.denBtn("Head home", "map", "move")`>><<run setup.denLeave(null, "closing")>><<goto "WorldMap_View">><</link>>
</div><<set _den to setup.denState()>>
A hand closes on the back of your neck. Brakka.
<<set _denWhy to setup.denKickOutWhy()>><<if _denWhy is "both">><<say "Brakka" "Half-starved and dead on your feet. You're no use to anyone like this.">><<elseif _denWhy is "food">><<say "Brakka" "You're half-starved. You're no use to anyone like this.">><<elseif _denWhy is "energy">><<say "Brakka" "You're dead on your feet. You're no use to anyone like this.">><<else>><<say "Brakka" "You're no use to anyone like this.">><</if>>
<<if _den.trip.active>>
She walks you out through the back, past the bins, and shoves. Your weapons stay on her shelf. The street tilts. Then there are trees.
<div class="choice-container">
<<link `setup.denBtn("Walk", "forward", "move")`>><<goto `"DenWoods_" + setup.denWoodsPick(null, setup.denCovenantAgainst())`>><</link>>
</div>
<<else>>
She walks you to the door and gives you your weapons back.
<div class="choice-container">
<<link `setup.denBtn("Go home", "map", "move")`>><<run setup.denLeave(null, "kicked")>><<goto "WorldMap_View">><</link>>
</div>
<</if>><<set _den to setup.denState()>>
<<storyVideo "story/den_bar/talk">>
Juno works the back counter under the pink lights, a towel over her shoulder, like the room owes her money. You get as much of her as she feels like giving: some nights a laugh, some nights one cool look, most nights her back.
<<if _den.juno.after is "hate">><<say "Juno" "You. Drink and get out of my sight.">>
<<elseif _den.juno.step gte 2>><<say "Juno" "Back again. You must like the view.">>
<<else>><<say "Juno" "What'll it be?">>
<</if>>
<<scrapBalance>>
<div class="choice-container">
<<if !_den.juno.closed>><<vchoice "Talk to her" "Den_Bar_Talk" "action" "talk">><</if>>
<<denBuyLink "A clean drink" "clean" "Den_Bar_Drink" "food">>
<<denBuyLink "The pink pour" "pour" "Den_Bar_Pour" "potion">>
<<denBuyLink "A bowl of food" "food" "Den_Bar_Food" "food">>
<<if _den.juno.step gte 2 && !_den.juno.dosed && !_den.juno.closed>><<denBuyLink "Buy her a pink one, and slip it in her glass" "darkPour" "Den_Juno_Dark" "potion">><</if>>
<<vchoice "Back" "Den_Main" "move" "back">>
</div>It's whisky, or it was once. It burns all the way down and does nothing strange at all.
<div class="choice-container">
<<vchoice "Back to the bar" "Den_Bar" "move" "back">>
</div>A bowl of something brown with bread in it. You don't ask. It's hot and there's meat in it.
<div class="choice-container">
<<vchoice "Back to the bar" "Den_Bar" "move" "back">>
</div>Orange over ice, the same as at the door, pink where the light gets into it. Juno watches you drink it, one corner of her mouth up.
<<say "Juno" "Lightweight.">>
<div class="choice-container">
<<link `setup.denBtn("Go on", "forward", "action")`>><<goto `setup.denNext()`>><</link>>
</div><<set _den to setup.denState()>>
<<set _denCan to setup.denJunoCanStep()>>
<<storyVideo "story/den_bar/talk">>
<<if _den.juno.step is 0>><<say "Juno" "I pour, you drink, you tip. That's the whole conversation.">>
<<elseif _den.juno.step is 1>><<say "Juno" "You again. Most men don't come back for the conversation.">>
<<elseif _den.juno.step is 2>><<say "Juno" "Some nights I hate this place. Ask me why. Go on.">>
<<elseif _den.juno.step is 3>><<say "Juno" "Stick around after closing sometime. If you want.">>
<<elseif _den.juno.step is 4>><<say "Juno" "You want to meet Madam? Everyone wants to meet Madam.">>
<<else>><<say "Juno" "Told you, lightweight.">>
<</if>>
<div class="choice-container">
<<if _denCan && _den.juno.step is 1 && !_den.trip.active>>
<<if setup.denCanBuy(null, "tip")>><<link `setup.denBtn("Tip her (" + setup.denPrice("tip") + " scrap)", "scrap", "action")`>><<run setup.denBuy(null, "tip")>><<run setup.denJunoStep(null, 2)>><<goto "Den_Juno_Regular">><</link>><<else>><<vchoiceDisabled `"Tip her (" + setup.denPrice("tip") + " scrap)"` "action" "scrap">><</if>>
<<elseif _denCan && _den.juno.step is 1>>
<<vchoiceDisabled `"Tip her (" + setup.denPrice("tip") + " scrap, not while you're tripping)"` "action" "scrap">>
<<elseif _denCan && _den.juno.step is 2>>
<<vchoice "Ask about the bruises on her girls" "Den_Juno_Problem" "action" "talk">>
<<elseif _denCan && _den.juno.step is 3 && !_den.trip.active>>
<<link `setup.denBtn("Stay after closing", "heart", "intimate")`>><<advanceToHour `setup.DEN.hours.close`>><<run setup.denJunoStep(null, 4)>><<goto "Den_Juno_Night">><</link>>
<<elseif _denCan && _den.juno.step is 3>>
<<vchoiceDisabled "Stay after closing (not while you're tripping)" "intimate" "heart">>
<<elseif _denCan && _den.juno.step is 4>>
<<link `setup.denBtn("Ask her to take you upstairs", "lock", "action")`>><<run setup.denJunoStep(null, 5)>><<run setup.denThrown(null, "front")>><<goto "Den_Juno_Stairs">><</link>>
<</if>>
<<denDone "Back to the room">>
</div><<storyVideo "story/den_juno/notice">>
Juno looks at the two full glasses, then at you, like you've done a trick. Then she smiles at you, slow and sly, and doesn't look away.
<<say "Juno" "Not thirsty? First man all year who didn't drink the pink. I'm Juno. Don't make it weird.">>
<div class="choice-container">
<<link `setup.denBtn("Go on in", "forward", "action")`>><<goto `setup.denEnterHub()`>><</link>>
</div><<storyVideo "story/den_juno/undress">>
The last client at the bar staggers off to the floor. Juno looks both ways<<if _storyClip is "7959fcc87cc7">>, then lets her top slide down off her shoulders behind the counter, slow, like it's nothing.<<elseif _storyClip is "d968f9390dc4">>, turns her back to you and lets her top slide down her bare back to her waist, slow, like it's nothing.<<elseif _storyClip is "b12b6f74735f">>, then opens her top behind the counter, slow, like it's nothing. Under it there is only a black cord harness criss-crossed over her bare tits.<<elseif _storyClip is "11e4d2ca115e">>, opens her top on the black cord harness over her bare tits and stretches her arms over her head, like it's nothing.<<elseif _storyClip is "d5b4f2bc6383">> and lays her hand on the bar, palm up. When you take it she holds on a moment, then straightens up and turns away, slow, like it's nothing.<<else>>, then peels her top over her head behind the counter, slow, like it's nothing.<</if>> Her hand finds your cock under the bar while she pours with the other.
<<say "Juno" "Tips like that, you get a show. Don't tell the girls.">>
<div class="choice-container">
<<denDone>>
</div><<say "Juno" "There's a man drinks in the alley out back every night. Put Odette in the infirmary for a week. House rule says the house can't touch a paying client. You're not house.">>
<div class="choice-container">
<<link `setup.denBtn("Go out to the alley", "sword", "action")`>><<denAlleyFight>><</link>>
<<vchoice "Not my problem" "Den_Bar" "move" "back">>
</div>He goes down in the piss and broken glass and stays down. When you look up, Juno is in the back door with her arms folded.
<<say "Juno" "Huh. Didn't think you had it in you.">>
<div class="choice-container">
<<link `setup.denBtn("Back inside", "door", "action")`>><<run setup.denJunoStep(null, 3)>><<run setup.denHoldWeapons()>><<goto "Den_Bar">><</link>>
</div>You wake up with your face on the cobbles and the taste of blood. He's gone. Juno is crouched next to you with a wet rag.
<<say "Juno" "Well. You tried. Come on, lightweight.">>
<div class="choice-container">
<<link `setup.denBtn("Back inside", "door", "action")`>><<run setup.denHoldWeapons()>><<goto "Den_Bar">><</link>>
</div>You back off down the alley and he laughs at you all the way to the door.
<div class="choice-container">
<<link `setup.denBtn("Back inside", "door", "action")`>><<run setup.denHoldWeapons()>><<goto "Den_Bar">><</link>>
</div><<storyVideo "story/den_juno/night">>
The bulbs go out one by one. Juno locks the front, takes your hand and walks you into the back washroom, and kneels on the wet tiles. She takes your cock in her mouth and takes her time, like she's been thinking about it all night.<<if _storyClip is "0358d077c578">> You keep seeing how she looked back at you on the way down the dim back corridor: over her shoulder, smiling, the bar towel still on her shoulder.<<elseif _storyClip is "ed9591347b04" or _storyClip is "4db870eee466" or _storyClip is "7d6362ac5eab" or _storyClip is "33fc453c328d">> No hands. She takes you deep and stares up at you while she does it.<<elseif _storyClip is "4c514bf4fb31" or _storyClip is "6d2dc806ee3d">> Under her top there is only the black cord harness over her bare tits, and she works your cock with her hand, looking up at you, talking filth.<<elseif _storyClip is "2835b4cb48a2">> She undoes your trousers herself, looking up at you the whole time.<<elseif _storyClip is "62cada2102bf">> Under her top there is only the black cord harness over her bare tits, and she takes you out of her mouth and works your cock with her hand, fast.<</if>>
<div class="choice-container">
<<if _storyClip is "62cada2102bf">><<link `setup.denBtn("Come on her tits", "heart", "intimate")`>><<set setup.denState().juno.nightEnd to "chest">><<set $player.lust to 20>><<run setup.playerReleased()>><<goto "Den_Juno_Night_End">><</link>><<else>><<link `setup.denBtn("Come in her mouth", "heart", "intimate")`>><<set setup.denState().juno.nightEnd to "mouth">><<set $player.lust to 20>><<run setup.playerReleased()>><<goto "Den_Juno_Night_End">><</link>><</if>>
</div><<if setup.denState().juno.nightEnd is "chest">>Your cum goes up her tits and her throat. She gasps, then laughs up at you, looks down at the mess on her chest, and keeps hold of your cock a while longer, pleased with herself.<<else>>She swallows, wipes her mouth with her thumb and grins up at you.<</if>>
<<say "Juno" "Go home, lightweight. Before I change my mind about you.">>
<div class="choice-container">
<<link `setup.denBtn("Head home", "map", "move")`>><<run setup.denLeave(null, "closing")>><<goto "WorldMap_View">><</link>>
</div><<storyVideo "story/den_juno/stairs">>
Juno takes you up the stairs behind the bar. At the top the huge woman steps into the light and looks you over, slowly, from your boots to your face.
<<say "Hulda" "Madam sees men who are worth something.">>
Then she picks you up and throws you down the stairs. All of them. The whole bar laughs.
<<say "Juno" "Told you, lightweight.">>
<div class="wip-notice">⚠ Work in Progress — how you prove yourself to Madam Silk comes in a later update.</div>
<div class="choice-container">
<<denDone "Pick yourself up">>
</div><<storyVideo "story/den_juno/undress">>
She clinks her glass against yours and drinks it in one. A minute later she's laughing at nothing, pulling at her top, staring at her own hands. Her key ring is on the bar. Then it's in your pocket.
<div class="choice-container">
<<link `setup.denBtn("Take her slowly", "heart", "intimate")`>><<run setup.denJunoAfter(null, "gentle")>><<goto "Den_Juno_Dark_Sex">><</link>>
<<link `setup.denBtn("Take her hard", "dominant", "intimate")`>><<run setup.denJunoAfter(null, "rough")>><<goto "Den_Juno_Dark_Sex">><</link>>
</div><<set _den to setup.denState()>>
<<storyVideo "story/den_juno/night">>
<<if _den.juno.after is "want">>You walk her into the back washroom and she goes down on her knees for you, giggling, sucking your cock like it's the most interesting thing she's ever seen. You go slow. You let her set the pace.
<<else>>You drag her into the back washroom and push her down on her knees, a fist in her hair, and fuck her mouth while she gags and laughs and doesn't know where she is.
<</if>>
<div class="choice-container">
<<link `setup.denBtn("Come", "heart", "intimate")`>><<set $player.lust to 20>><<run setup.playerReleased()>><<goto "Den_Juno_Dark_After">><</link>>
</div><<set _den to setup.denState()>>
<<if _den.juno.after is "want">>
An hour later she comes back to herself on the washroom floor with her head in your lap. She looks at you a long time.
<<say "Juno" "You. You did that. ...Do it again some time. Ask first.">>
<<else>>
An hour later she comes back to herself on the washroom floor, alone, sore. When she comes out she doesn't look at you. She doesn't have to. Everyone in the bar knows.
<<say "Juno" "Get out of my sight.">>
<</if>>
<div class="choice-container">
<<denDone>>
</div><<say "Brakka" "Short. Everyone's short.">>
Two of her women hold your arms while she goes through your pockets, then hits you, carefully, where it won't show.
<<say "Brakka" "The Covenant buys what you can't pay. Get in.">>
They walk you out the back, past the bins, to a cart with an iron cage bolted to its bed.
<div class="choice-container">
<<link `setup.denBtn("Into the cage", "lock", "move")`>><<run setup.denCage()>><<goto "DenDebt_Ride">><</link>>
</div><<run VaultUI.setBackgroundDirect(setup.GROVE_BG.woods)>>
<<storyVideo "story/den_cage_ride/ride">>
The cart jolts east for hours. You ride on your knees with your fingers through the bars, and two of Brakka's women ride on the box with their boots up, passing a bottle between them.
The bored one climbs back over the load to look at you. She reaches through the bars, opens your trousers and takes hold of you, idly, the way you'd hold a stick on a walk, and lets go every time your breathing changes. Her friend laughs every time she does it. She tells you the Covenant will have the rest of you, and that she only wanted to see what they were buying.
<div class="choice-container">
<<link `setup.denBtn("The Grove", "forward", "move")`>><<set $player.lust to Math.min(100, ($player.lust || 0) + 20)>><<advanceTime `setup.DEN.captive.rideHours`>><<set $currentLocation to setup.GROVE_NODE.id>><<goto `setup.denCageArrive()`>><</link>>
</div><<run VaultUI.setBackgroundDirect(setup.GROVE_BG.grounds)>>
The cart rolls in through the Grove's gate and stops in the yard, and half the estate comes out to look. Lady Selene comes last. She walks once round the cage, slowly, and she is smiling.
<<say "Lady Selene" "One of mine, delivered in a debtor's cage. I'm not even angry. I'm delighted.">>
<<say "Lady Selene" "The Den sold me what you owe. You'll work it off like anyone else.">>
A warden lets you out, buckles a leather collar round your neck and clips a chain to it. <<print $den.debt.daysLeft>> <<print $den.debt.daysLeft is 1 ? "day" : "days">> of work, Lady Selene says, and not one of them sitting down.
<div class="choice-container">
<<link `setup.denBtn("To work", "forward", "action")`>><<goto `"DenDebt_Grove_Labor_" + setup.denLaborScene()`>><</link>>
</div><<run VaultUI.setBackgroundDirect(setup.GROVE_BG.fields)>>
<<storyVideo "story/den_labor/hay">>
They put you in a pair of old work overalls on the farm side of the estate, with a pitchfork and a cart, and you spend the day forking hay up into the loft of the big barn. The warden takes the collar off for the work, since nobody forks hay on a chain, and hangs it on a nail by the door. By noon the overalls are rolled down to your waist, and the warden sits on an upturned bucket watching you sweat. By evening your shoulders are on fire.
When the warden goes to her supper, the overseer climbs up to the loft and fucks you in the hay until the light is gone.
At dark the warden takes the collar off its nail and buckles it back on you.
<div class="choice-container">
<<link `setup.denBtn("Done for the day", "sleep", "action")`>><<set $player.lust to 10>><<run setup.playerReleased()>><<advanceToHour 19>><<goto `setup.denLaborDone()`>><</link>>
</div><<run VaultUI.setBackgroundDirect(setup.GROVE_BG.grounds)>>
<<storyVideo "story/den_labor/stocks">>
All day you haul water up from the well to the troughs and the kitchen barrels, two buckets at a time, while a warden counts the trips out loud. You lose count long before she does. At dusk she says you were slow, and they take you down to the <<if _storyClip is "3597a789c023" or _storyClip is "32dc863de72f">>cellar under the barn, strip you and hang you by the wrists from a beam<<else>>store room under the barn, all crates and rusted sheet metal under a red lamp, and lock you bent over in the old iron frame there<</if>><<if _storyClip is "3597a789c023" or _storyClip is "32dc863de72f">><<else>>, your neck between two posts and your wrists cuffed wide on the bar<</if>>, to think about it.
When the yard above has gone quiet, one of the overseers comes down the cellar steps and takes her time with your face and your cock, and there is nothing at all you can do about it.
<div class="choice-container">
<<link `setup.denBtn("Done for the day", "sleep", "action")`>><<set $player.lust to 10>><<run setup.playerReleased()>><<advanceToHour 19>><<goto `setup.denLaborDone()`>><</link>>
</div><<run VaultUI.setBackgroundDirect(setup.GROVE_BG.greenhouse)>>
They put you on your knees in the glasshouse rows with a trowel and a basket, and you weed until you can't feel your fingers, in heat like a kitchen's. The overseer is a big woman with soil to her elbows, and she walks the row behind you and taps the back of your neck with her switch whenever you stop.
At the end of the day she sits down on an upturned crate in the potting shed, hitches her skirt up and has you kneel and lick her until her thighs shake round your head. Then she pulls you up by the collar, sits you on the crate and rides you, chain and all, while the warden by the door pretends to be looking at the tomatoes.
<div class="choice-container">
<<link `setup.denBtn("Done for the day", "sleep", "action")`>><<set $player.lust to 10>><<run setup.playerReleased()>><<advanceToHour 19>><<goto `setup.denLaborDone()`>><</link>>
</div><<run VaultUI.setBackgroundDirect(setup.GROVE_BG.kitchen)>>
They chain you to the scullery sink and you scrub pots from breakfast to long after supper, a mountain of them, with the cook shouting at you every time one goes back on the rack still greasy.
When the last of the kitchen women has gone up to bed, the cook comes back with a lamp. She looks you over the way she looks over a joint of meat, backs you against the big table, and works you with her floury hand, slow, watching your face, until you come all over her apron. She tells you that's the first thing you've done right all day.
<div class="choice-container">
<<link `setup.denBtn("Done for the day", "sleep", "action")`>><<set $player.lust to 10>><<run setup.playerReleased()>><<advanceToHour 19>><<goto `setup.denLaborDone()`>><</link>>
</div><<run VaultUI.setBackgroundDirect(setup.GROVE_BG.cellars)>>
They unclip the chain from your collar and lock you in a cell in the Cellars with a bucket, a blanket and a bowl of something warm. <<print $den.debt.daysLeft>> more <<print $den.debt.daysLeft is 1 ? "day" : "days">>.
<div class="choice-container">
<<link `setup.denBtn("Sleep", "sleep", "action")`>><<advanceToHour 7>><<run setup.countSleep()>><<run setup.denCellNight()>><<goto `"DenDebt_Grove_Labor_" + setup.denLaborScene()`>><</link>>
</div><<run VaultUI.setBackgroundDirect(setup.GROVE_BG.grounds)>>
At the gate the warden unbuckles the collar and hangs it back on its hook like any other tool. Lady Selene is crossing the yard and doesn't stop walking.
<<say "Lady Selene" "Paid in full. Do try to owe people less.">>
Your weapons are still on Brakka's shelf at the Den, and she'll want her fine before she gives them back.
<div class="choice-container">
<<link `setup.denBtn("Out of the gate", "map", "move")`>><<run setup.denCageHome()>><<goto "WorldMap_View">><</link>>
</div><<run VaultUI.setBackgroundDirect(setup.GROVE_BG.grounds)>>
The cart rolls in through the Grove's gate and stops in the yard. Lady Selene is waiting for it, and she doesn't smile.
<<if setup.groveClosed()>><<say "Lady Selene" "The vault boy who went over my wall. Back again, in a cage I hardly had to pay for.">><<else>><<say "Lady Selene" "The vault boy with a price on his head. The Den sold you to me for the price of a bar tab.">><</if>>
<<say "Lady Selene" "No, you won't work it off. You'll be an example.">>
A warden buckles a leather collar round your neck and hangs a board from it. Painted on the board in letters a hand high: <<print setup.groveClosed() ? setup.COVENANT.payoff.sneakSign : setup.COVENANT.bounty.sign>>.
<div class="choice-container">
<<link `setup.denBtn("The first day", "forward", "action")`>><<goto `setup.denHeldGo()`>><</link>>
</div><<run VaultUI.setBackgroundDirect(setup.GROVE_BG.fields)>>
<<storyVideo "story/den_selene_example/post">>
They tie you naked to the wall of the big barn in the yard, arms up, the board hung over your head, and the Grove comes to look. Lady Selene has a chair brought out and watches with a cup of tea.
<<if _storyClip is "dd7f236adc66">>A woman strokes you while the yard counts, and when you come she holds her palm up to show Lady Selene what the Den sold her.<<else>>The women take turns with you on the wall, teasing, never finishing, and the yard keeps count.<</if>>
<div class="choice-container">
<<link `setup.denBtn("Night", "sleep", "action")`>><<if _storyClip is "dd7f236adc66">><<set $player.lust to 10>><<run setup.playerReleased()>><<else>><<set $player.lust to Math.min(100, ($player.lust || 0) + 20)>><</if>><<advanceToHour 21>><<goto "DenDebt_Grove_Night">><</link>>
</div><<run VaultUI.setBackgroundDirect(setup.GROVE_BG.grounds)>>
Today they walk you. A warden leads you on a chain through every yard and garden of the Grove, naked but for the board, and the women come out of the houses to see. They pinch, they slap, they weigh you in their hands and tell each other what they'd do with you, and Lady Selene strolls a few paces behind with her parasol and tells them they may.
The route goes all the way round, along the inside of the east wall, where the vines grow thick over the stones.
<div class="choice-container">
<<link `setup.denBtn("Watch the women", "eye", "action")`>><<set $player.lust to Math.min(100, ($player.lust || 0) + 20)>><<advanceToHour 21>><<goto "DenDebt_Grove_Night">><</link>>
<<link `setup.denBtn("Watch the wall", "eye", "action")`>><<run setup.denWatchWall()>><<advanceToHour 21>><<goto "DenDebt_Grove_Night">><</link>>
</div><<run VaultUI.setBackgroundDirect(setup.GROVE_BG.cellars)>>
<<set _denC to $den.captive>>
They lock you in a barred cell in the Cellars for the night. <<if _denC.bars gte setup.DEN.captive.barNights>>One bar of the window turns in its socket now, and the gap is just wide enough.<<elseif _denC.bars gt 0>>The bar you've been working at moves a hair when you lean on it.<<else>>The bars on the window are old iron set in old stone.<</if>><<if _denC.weakSpot>> And you know where the wall is weakest: behind the vines on the east side, where the stones have slipped.<</if>>
<<if _denC.bars gte setup.DEN.captive.barNights && !setup.denCanEscape()>>Not yet. They watch the new ones too closely for the first days.<</if>>
<div class="choice-container">
<<if setup.denCanEscape()>><<link `setup.denBtn("Through the bars", "forward", "move")`>><<goto "DenDebt_Grove_Wall">><</link>><</if>>
<<if _denC.bars lt setup.DEN.captive.barNights>><<link `setup.denBtn("Work at the bars", "lock", "action")`>><<run setup.denBarNight()>><<goto "DenDebt_Grove_Bars">><</link>><</if>>
<<link `setup.denBtn("Sleep", "sleep", "action")`>><<advanceToHour 7>><<run setup.countSleep()>><<run setup.denCellNight()>><<goto `setup.denHeldGo()`>><</link>>
</div><<run VaultUI.setBackgroundDirect(setup.GROVE_BG.cellars)>>
<<if $den.captive.bars is 0>>A lantern stops outside the cell. The warden looks at the mortar dust on the sill, then at your hands, and sends for the smith. By midnight the bar sits in fresh mortar, and she tells you that's one more day on show for your trouble.
<<else>>You work at the bar until your fingers bleed, scraping the mortar out a grain at a time with the edge of the bowl. <<print $den.captive.bars>> <<print $den.captive.bars is 1 ? "night" : "nights">> of it now.<</if>>
<div class="choice-container">
<<link `setup.denBtn("Sleep", "sleep", "action")`>><<advanceToHour 7>><<run setup.countSleep()>><<run setup.denCellNight()>><<goto `setup.denHeldGo()`>><</link>>
</div><<run VaultUI.setBackgroundDirect(setup.GROVE_BG.woodsNight)>>
You squeeze out through the gap in the window and drop into the herb garden in the dark, and keep low along the hedges to the east wall.
<<if setup.denPlantingNight()>>The whole Grove is at the Main House tonight: drums, singing, every lantern lit for the Planting. Nobody is watching the wall.<<elseif $den.captive.weakSpot>>You go straight to the place behind the vines where the stones have slipped.<<else>>You pick a stretch of wall where the shadows look deepest and hope.<</if>>
<div class="choice-container">
<<link `setup.denBtn("Climb", "forward", "move")`>><<set _denTo to setup.denWallGo()>><<if _denTo isnot "DenDebt_Grove_Out">><<advanceToHour 6>><</if>><<goto _denTo>><</link>>
<<link `setup.denBtn("Back to the cell", "back", "action")`>><<advanceToHour 7>><<run setup.countSleep()>><<run setup.denCellNight()>><<goto `setup.denHeldGo()`>><</link>>
</div><<run VaultUI.setBackgroundDirect(setup.GROVE_BG.woods)>>
<<set _denSV to setup.storyFamilySingles("story/grove_perimeter/pulled", setup.denSinglesHere("story/grove_perimeter/pulled"))>><<if _denSV or !setup.storyFamilyGap("story/grove_perimeter/pulled")>><<storyVideo "story/grove_perimeter/pulled">><</if>><<if _denSV>><<run setup.mediaAvoidEnd("story/grove_perimeter/pulled")>><</if>>
You get over. You run all night, and when the sun comes up you find you haven't run far at all: the wall is still there through the trees, and a warden is leaning on an oak in front of you, waiting.
<<say "Warden" "Look what came over the wall. Hold still. You've given me a long night.">>
She <<if _storyFamily is "sf_cg_grove_perimeter_01" or _storyFamily is "sf_cg_grove_perimeter_03" or _storyClip is "c6f7bfbe934a" or _storyClip is "45eb5d05be0c" or _storyClip is "56c65597b5e6">>goes down on her knees in front of you<<elseif _storyFamily is "sf_cg_grove_perimeter_02">>pushes you down to sit and pulls her tits out<<else>>pins you back against the tree with a hand flat on your chest<</if>>, and she doesn't call the others. Not yet.
<div class="choice-container">
<<link `setup.denBtn("Let her", "submit", "action")`>><<goto "DenDebt_Grove_Caught_taken">><</link>>
</div><<run VaultUI.setBackgroundDirect(setup.GROVE_BG.woods)>>
<<set _denSV to setup.storyFamilySingles("story/grove_perimeter/taken", setup.denSinglesHere("story/grove_perimeter/taken"))>><<if _denSV or !setup.storyFamilyGap("story/grove_perimeter/taken")>><<storyVideo "story/grove_perimeter/taken">><</if>><<if _denSV>><<run setup.mediaAvoidEnd("story/grove_perimeter/taken")>><</if>>
<<if _storyFamily is "sf_cg_grove_perimeter_03">>She won't let you fuck her. <</if>>She uses your cock however she likes <<if _storyFamily is "sf_cg_grove_perimeter_02">>in her tent<<else>>right there under the trees<</if>><<if _storyFamily is "sf_cg_grove_perimeter_01" or _storyClip is "326420ad2d36" or _storyClip is "9669ec8495a5">><<else>>, unhurried<</if>><<if _storyFamily is "sf_cg_grove_perimeter_01" or _storyFamily is "sf_cg_grove_perimeter_02" or _storyFamily is "sf_cg_grove_perimeter_03" or _storyClip is "326420ad2d36" or _storyClip is "24bdb8dbcb3f" or _storyClip is "ac6f9b921696" or _storyClip is "1c63db900085" or _storyClip is "9669ec8495a5" or _storyClip is "a200611fd5e6">>.<<else>>, with one hand on your collar so you remember you're wearing it. The other wardens arrive in time to watch the end of it.<</if>>
<div class="choice-container">
<<link `setup.denBtn("Come", "heart", "intimate")`>><<set $player.lust to 10>><<run setup.playerReleased()>><<goto "DenDebt_Grove_Caught_finish">><</link>>
</div><<run VaultUI.setBackgroundDirect(setup.GROVE_BG.woods)>>
<<set _denSV to setup.storyFamilySingles("story/grove_perimeter/finish", setup.denSinglesHere("story/grove_perimeter/finish"))>><<if _denSV or ($den.scene.singlesAt isnot "taken" and !setup.storyFamilyGap("story/grove_perimeter/finish"))>><<storyVideo "story/grove_perimeter/finish">><</if>><<if _denSV>><<run setup.mediaAvoidEnd("story/grove_perimeter/finish")>><</if>>
<<if _storyClip is "f714fd5bfda8">>By the end the others have come out of the trees to watch, and one of them won't just watch.<</if>>
When it's over she clips a chain to your collar and walks you back to the gate in front of her sisters, and they make sure the whole Grove sees you come in.
<<say "Lady Selene" "Again? Weld the bar. Put him back on show.">>
<div class="choice-container">
<<link `setup.denBtn("Back on the post", "submit", "action")`>><<goto `setup.denHeldGo()`>><</link>>
</div><<run VaultUI.setBackgroundDirect(setup.GROVE_BG.woodsNight)>>
You go over the east wall<<if setup.denPlantingNight()>> to the sound of the Planting drums<</if>> and drop into the dark trees on the other side, and run, and nobody comes after you.
<p class="narrator">The Covenant wants you more than ever now. Your weapons are still on Brakka's shelf at the Den, with her fine and what you owe her.</p>
<div class="choice-container">
<<link `setup.denBtn("Into the woods", "map", "move")`>><<run setup.denEscapeCost()>><<run setup.denCageHome()>><<goto "WorldMap_View">><</link>>
</div><<set _denSV to setup.storyFamilySingles("story/den_catfight/fight", setup.denSinglesHere("story/den_catfight/fight"))>><<if _denSV or !setup.storyFamilyGap("story/den_catfight/fight")>><<storyVideo "story/den_catfight/fight">><</if>><<if _denSV>><<run setup.mediaAvoidEnd("story/den_catfight/fight")>><</if>>
Two of the women are at it on the floor by the stage, round the black leather couch there, all hair and nails and torn lace, and the clients are cheering them on.<<if _storyClip is "7ee21c160606">> When you get close they are still only standing side by side, trading sneers, until one flick of a hand too many and they go for each other's hair.<<elseif _storyClip is "b523e66864c7">> Hair flies. One of them tears open the other's top, and the clients roar.<<elseif _storyClip is "eac3b26a1cca">> One has the other in a headlock from behind.<</if>>
<<scrapBalance>>
<div class="choice-container">
<<link `setup.denBtn("Break it up", "dominant", "action")`>><<run setup.denCatfightBreak()>><<goto "DenEvent_Catfight_Broken">><</link>>
<<denBuyLink "Bet on the taller one" "bet10" "DenEvent_Catfight_Bet" "dice">>
<<denBuyLink "Bet big on the taller one" "bet25" "DenEvent_Catfight_Bet" "dice">>
<<link `setup.denBtn("Leave them to it", "back", "move")`>><<run setup.denEventDone()>><<goto "Den_Main">><</link>>
</div><<set _den to setup.denState()>>
You haul them apart by the backs of their necks. The one with the brown hair stops spitting long enough to look at you properly, holding the torn front of her red halter together with one hand.
<<if _den.events.pipOwes>><<say "Pip" "I'm Pip. I owe you one. A whole night. Ask for me.">><<else>><<say "Pip" "You again. Still owe you, remember? Come and collect.">><</if>>
<div class="choice-container">
<<denDone>>
</div><<set _denBet to setup.denState().events.bet || { stake: 0, won: false }>>
<<set _denSV to setup.storyFamilySingles("story/den_catfight/winner", setup.denSinglesHere("story/den_catfight/winner"))>><<if _denSV or !setup.storyFamilyGap("story/den_catfight/winner")>><<storyVideo "story/den_catfight/winner">><</if>><<if _denSV>><<run setup.mediaAvoidEnd("story/den_catfight/winner")>><</if>>
<<if _denBet.won>>The taller one comes out on top, sitting on the other woman's chest with a fistful of her hair. You win <<print _denBet.stake * 2>> scrap.<<else>>The taller one goes down and stays down. Your scrap goes into somebody else's pocket.<</if>>
The winner <<if _storyClip is "cbc4ddd4f8e6" or _storyClip is "a14caab3bc17">>shoves you back onto the leather couch by the stage<<else>>gets up, wipes her lip, and looks straight at you<</if>><<if _storyClip is "a14caab3bc17">> and sinks down on your cock, then drags the woman she beat into a kiss right over you<<elseif _storyClip is "cbc4ddd4f8e6">>, but the woman she beat gets to you first and sinks down on your cock. The winner takes her by the throat, shoves her off and climbs on you herself<</if>>.<<if _storyClip is "a14caab3bc17">> When she lifts off you, wet to the root, she tells you that was only the taste: the rest of you she collects in a booth.<</if>>
<div class="choice-container">
<<link `setup.denBtn("Let her claim her prize", "heart", "intimate")`>><<goto "DenEvent_Catfight_Reward">><</link>>
<<link `setup.denBtn("Back to the bar", "back", "move")`>><<run setup.denEventDone()>><<goto "Den_Main">><</link>>
</div><<set _denSV to setup.storyFamilySingles("story/den_catfight/reward", setup.denSinglesHere("story/den_catfight/reward"))>><<if _denSV or !setup.storyFamilyGap("story/den_catfight/reward")>><<storyVideo "story/den_catfight/reward">><</if>><<if _denSV>><<run setup.mediaAvoidEnd("story/den_catfight/reward")>><</if>>
<<if _storyFamily is "sf_cg_den_catfight_01">>She doesn't get off you. She rides you right there on the couch.<<else>>She drags you into a booth, and the woman she beat comes too, because that's the deal now.<</if>> <<if _storyFamily is "sf_cg_den_catfight_01">>The one she beat stands on the couch over you, the winner licks her pussy without missing a stroke on your cock, and the two of them kiss over you.<<elseif _storyFamily is "sf_cg_den_catfight_02">>The one she beat squats on your face while the winner sucks your cock, then slides down onto you backwards and rides, the winner's hand round her throat.<<else>>They share you, one on your cock and one on your face, kissing each other over you, and then they swap.<</if>>
<div class="choice-container">
<<link `setup.denBtn("Come", "heart", "intimate")`>><<set $player.lust to 20>><<run setup.playerReleased()>><<run setup.denEventDone()>><<denHour>><<goto `setup.denNext()`>><</link>>
</div><<set _denSV to setup.storyFamilySingles("story/den_party/alone", setup.denSinglesHere("story/den_party/alone"))>><<if _denSV or !setup.storyFamilyGap("story/den_party/alone")>><<storyVideo "story/den_party/alone">><</if>><<if _denSV>><<run setup.mediaAvoidEnd("story/den_party/alone")>><</if>>
The doors are locked, the clients are gone, and the women are throwing a party of their own: bottles, music, and nobody wearing much.<<if _storyClip is "a4ede195c89f" or _storyClip is "b33d16cb8208" or _storyClip is "53624c77cea3">> Nobody has looked your way yet.<</if>>
<div class="choice-container">
<<link `setup.denBtn("Watch from the bar", "eye", "action")`>><<goto "DenEvent_Party_Drag">><</link>>
</div><<set _denSV to setup.storyFamilySingles("story/den_party/drag", setup.denSinglesHere("story/den_party/drag"))>><<if _denSV or !setup.storyFamilyGap("story/den_party/drag")>><<storyVideo "story/den_party/drag">><</if>><<if _denSV>><<run setup.mediaAvoidEnd("story/den_party/drag")>><</if>>
They spot you. Four of them drag you off your stool and <<if _storyClip is "4a6052b6c84b">>through to the back room, and you hold one of them up by her ass and fuck her standing in the middle of a crowd of topless women<<else>>into the middle of it, and you're on your back on a couch with women everywhere, on your face, on your cock, in your hands<</if>>.
<div class="choice-container">
<<link `setup.denBtn("Come", "heart", "intimate")`>><<set $player.lust to 20>><<run setup.playerReleased()>><<goto "DenEvent_Party_Finish">><</link>>
</div><<set _denSV to setup.storyFamilySingles("story/den_party/finish", setup.denSinglesHere("story/den_party/finish"))>><<if _denSV or !setup.storyFamilyGap("story/den_party/finish")>><<storyVideo "story/den_party/finish">><</if>><<if _denSV>><<run setup.mediaAvoidEnd("story/den_party/finish")>><</if>>
They share your cum between them and laugh at the look on your face. Somebody puts your boots in your hands and points you at the door.
<div class="choice-container">
<<link `setup.denBtn("Head home", "map", "move")`>><<run setup.denLeave(null, "closing")>><<goto "WorldMap_View">><</link>>
</div><<set _denH to $den.home>>
<<set _denWarm to $companions[0] && $companions[0].trust gte setup.DEN.kira.warmTrust>>
<<if _denH.how is "woods">>Kira looks you over: leaves in your hair, mud to the knees.
<<say "Kira" "Where the fuck have you been? You smell like a ditch.">>
<<elseif _denH.how is "cage">>Kira takes one look at the bruises.
<<if _denH.sent>><<say "Kira" "Let me guess. The place with the door bitch.">><<else>><<say "Kira" "Let me guess. That whorehouse.">><</if>>
Then she sees the raw red line a collar wore round your neck.
<<if _denH.cage is "selene">>You tell her the rest: the cage, Lady Selene's post in the yard, the wall in the dark. <<print _denH.away gt 1 ? _denH.away + " days" : "A day and a night">> gone.
<<say "Kira" "The Covenant had you on a post for the whole Grove to gawk at. And then you went over their wall. They'll want you twice as bad now, idiot.">>
<<else>>You tell her the rest: the cage, the Grove, work in a collar until the tab was paid off. <<print _denH.away gt 1 ? _denH.away + " days" : "A day and a night">> gone.
<<say "Kira" "You let the Covenant work you like a mule. Over a bar tab.">>
<</if>>
<<elseif _denH.sent>><<say "Kira" "So. Have fun in the whorehouse while I walked home on my own?">>
<<else>><<say "Kira" "You stink of cheap perfume, vault boy.">>
<</if>>
<<if _denH.tab>><<say "Kira" "And you owe them, don't you, idiot.">><<elseif _denH.spent gt 0>><<say "Kira" "And your pockets are lighter. What did you spend it on? No. Don't tell me.">><</if>>
<<if _denH.juno>><<say "Kira" "And who the fuck is Juno? Half the road's talking about you and the bartender.">><</if>>
<<if _denWarm>>She shakes her head, but she checks you over for cuts all the same.<<if _denH.how is "cage">> Her hand stays on the collar mark a moment too long.
<<say "Kira" "Don't you fucking dare do that to me again.">><</if>><<else>>She turns her back on you before you can answer.<</if>>
<div class="choice-container">
<<if _denH.juno>>
<<link `setup.denBtn("Tell her it was nothing", "talk", "action")`>><<relationChange "kira" "jealousy" 15>><<run setup.denKiraTalkDone()>><<goto "Kira_Room">><</link>>
<<link `setup.denBtn("Tell her the truth", "talk", "action")`>><<relationChange "kira" "jealousy" 10>><<relationChange "kira" "trust" 2>><<run setup.denKiraTalkDone()>><<goto "Kira_Room">><</link>>
<<else>>
<<link `setup.denBtn("Shrug", "talk", "action")`>><<run setup.denKiraTalkDone()>><<goto "Kira_Room">><</link>>
<</if>>
</div><<set _denSV to setup.storyFamilySingles("story/den_room_bar/open", setup.denSinglesHere("story/den_room_bar/open"))>><<if _denSV or !setup.storyFamilyGap("story/den_room_bar/open")>><<storyVideo "story/den_room_bar/open">><</if>><<if _denSV>><<run setup.mediaAvoidEnd("story/den_room_bar/open")>><</if>>
<<denHaze>>
The bar goes on forever, bottles all the way to the horizon. <<if _storyClip is "27cc127b1d7a" or _storyFamily is "sf_cg_den_room_bar_01" or _storyFamily is "sf_cg_den_room_bar_02">>There is nobody at it but you and one woman.<<else>>The bartender has gold cat eyes and no top, and she pours for a row of faceless clients without looking at you.<</if>> "You look thirsty," she says<<if _storyClip is "27cc127b1d7a" or _storyFamily is "sf_cg_den_room_bar_01" or _storyFamily is "sf_cg_den_room_bar_02">>.<<else>>, and her eyes do something eyes shouldn't.<</if>>
<div class="choice-container">
<<denBeatEnd>>
</div><<set _denSV to setup.storyFamilySingles("story/den_room_bar/under", setup.denSinglesHere("story/den_room_bar/under"))>><<if _denSV or !setup.storyFamilyGap("story/den_room_bar/under")>><<storyVideo "story/den_room_bar/under">><</if>><<if _denSV>><<run setup.mediaAvoidEnd("story/den_room_bar/under")>><</if>>
<<denHaze>>
<<if _storyFamily is "sf_cg_den_room_bar_01" or _storyClip is "17e50f6a6664">>She takes your hand, walks you down to the end of the bar and sits you down on a couch.<<else>>She drops down behind the bar. You feel her mouth before you see her: warm and wet on your cock, while above the counter the bottles go on pouring themselves.<</if>> <<if _storyClip is "17e50f6a6664">>She strokes your cock, slow, watching your face the whole time.<<else>>She sucks you like she has all night. Maybe she has.<</if>>
<div class="choice-container">
<<denBeatEnd>>
</div><<set _denSV to setup.storyFamilySingles("story/den_room_bar/hotter", setup.denSinglesHere("story/den_room_bar/hotter"))>><<if _denSV or !setup.storyFamilyGap("story/den_room_bar/hotter")>><<storyVideo "story/den_room_bar/hotter">><</if>><<if _denSV>><<run setup.mediaAvoidEnd("story/den_room_bar/hotter")>><</if>>
<<denHaze>>
No slow start this time. <<if _storyClip is "4f0163718f4a">>She bends at the waist and sucks your cock.<<elseif _storyClip is "614e367f36f8" or _storyClip is "f463534c0345" or _storyClip is "3d31d27b6556">>She lies back and you fuck her.<<elseif _storyFamily is "sf_cg_den_room_bar_01">>She pushes you down, climbs on and rides you with your cock in her ass.<<elseif _storyClip is "5a7f5525ce9a">>She drags you down and rides you.<<elseif _storyClip is "ab90c61ba9d4">>Everything blurs, and you are fucking her before you know how you got there.<<elseif _storyClip is "42ab4aa64e64">>She gets on all fours and you fuck her from behind.<<elseif _storyClip is "74f363d1b942" or _storyFamily is "sf_cg_den_room_bar_03">>She bends over for you and you fuck her from behind.<<elseif _storyFamily is "sf_cg_den_room_bar_02">>You fuck her on the cushions.<<else>>She grabs your shirt, hauls you behind the bar and bends over the ice bins, and you fuck her from behind while the clients keep drinking and nobody looks round.<</if>>
<div class="choice-container">
<<denBeatEnd>>
</div><<set _denSV to setup.storyFamilySingles("story/den_room_bar/finish", setup.denSinglesHere("story/den_room_bar/finish"))>><<if _denSV or !setup.storyFamilyGap("story/den_room_bar/finish")>><<storyVideo "story/den_room_bar/finish">><</if>><<if _denSV>><<run setup.mediaAvoidEnd("story/den_room_bar/finish")>><</if>>
<<denHaze>>
You come <<if _storyClip is "277c5a9df025">>on her tongue and her chin<<elseif _storyClip is "8a6f71630f1b">>over her belly and her pussy<<else>>in her mouth and she swallows, slides up your body and smiles at you with gold eyes<</if>>.<<if setup.denPrizeKey()>> Something cold presses into your palm.<</if>>
<<denPrizeLine>>
<div class="choice-container">
<<denDone>>
</div><<set _denSV to setup.storyFamilySingles("story/den_room_stage/pole", setup.denSinglesHere("story/den_room_stage/pole"))>><<if _denSV or !setup.storyFamilyGap("story/den_room_stage/pole")>><<storyVideo "story/den_room_stage/pole">><</if>><<if _denSV>><<run setup.mediaAvoidEnd("story/den_room_stage/pole")>><</if>>
<<denHaze>>
A dancer on a pole that goes up into the dark. The footlights have teeth.<<if _storyClip is "2dc8add3246e" or _storyClip is "ba3144e0b445" or _storyClip is "7b3c7ad320af" or _storyClip is "b08100a4ca7e">><<else>> She spins down to the edge of the stage and looks right at you.<</if>>
<div class="choice-container">
<<denBeatEnd>>
</div><<set _denSV to setup.storyFamilySingles("story/den_room_stage/pulled", setup.denSinglesHere("story/den_room_stage/pulled"))>><<if _denSV or !setup.storyFamilyGap("story/den_room_stage/pulled")>><<storyVideo "story/den_room_stage/pulled">><</if>><<if _denSV>><<run setup.mediaAvoidEnd("story/den_room_stage/pulled")>><</if>>
<<denHaze>>
She crooks a finger. The women in the wings are shouting, get him up here<<if _storyClip is "99640ac74d98" or _storyClip is "cf0eb98dfa1f" or _storyClip is "64d7a01be90e" or _storyClip is "0ef59d8ceec1" or _storyClip is "8633238c8328">>.<<else>>, and then you are up there on your back on the warm boards, and she's straddling your face.<</if>>
<div class="choice-container">
<<denBeatEnd>>
</div><<set _denSV to setup.storyFamilySingles("story/den_room_stage/ride", setup.denSinglesHere("story/den_room_stage/ride"))>><<if _denSV or !setup.storyFamilyGap("story/den_room_stage/ride")>><<storyVideo "story/den_room_stage/ride">><</if>><<if _denSV>><<run setup.mediaAvoidEnd("story/den_room_stage/ride")>><</if>>
<<denHaze>>
<<if _storyClip is "e4e67cc3215e">>She kneels and sucks your cock<<elseif _storyClip is "0d895b59b8b0" or _storyClip is "f69e00f457b2">>You fuck her from behind<<elseif _storyClip is "62feb1b66f65">>She lies back with her legs up, and you fuck her<<elseif _storyFamily is "sf_cg_den_room_stage_04">>She sits on the edge of the stage, and you stand and fuck her there<<else>>She sinks down onto your cock under the lights and rides you in front of a crowd you can't see, slow, then hard<</if>><<if _storyClip is "e4e67cc3215e" or _storyClip is "0d895b59b8b0" or _storyClip is "f69e00f457b2" or _storyClip is "62feb1b66f65" or _storyFamily is "sf_cg_den_room_stage_04" or _storyClip is "ab80fd632027" or _storyClip is "ca206e3d716f">><<else>>, tits bouncing<</if>>, the wings yelling what she should do next.
<div class="choice-container">
<<denBeatEnd>>
</div><<set _denSV to setup.storyFamilySingles("story/den_room_stage/hotter", setup.denSinglesHere("story/den_room_stage/hotter"))>><<if _denSV or !setup.storyFamilyGap("story/den_room_stage/hotter")>><<storyVideo "story/den_room_stage/hotter">><</if>><<if _denSV>><<run setup.mediaAvoidEnd("story/den_room_stage/hotter")>><</if>>
<<denHaze>>
Two of them this time. <<if _storyClip is "b6bf520e95cd">>One squats over you and rides you, then sinks your cock into her ass instead, while the other one kneels beside her and rubs her clit.<<elseif _storyClip is "e726bddf0816" or _storyClip is "aa4d25a9b448">>They don't come for you yet.<<else>>The second woman crawls out of the wings on her hands and knees, and they share you on the stage, one on your cock and one on your face.<</if>>
<div class="choice-container">
<<denBeatEnd>>
</div><<set _denSV to setup.storyFamilySingles("story/den_room_stage/finish", setup.denSinglesHere("story/den_room_stage/finish"))>><<if _denSV or !setup.storyFamilyGap("story/den_room_stage/finish")>><<storyVideo "story/den_room_stage/finish">><</if>><<if _denSV>><<run setup.mediaAvoidEnd("story/den_room_stage/finish")>><</if>>
<<denHaze>>
You come<<if _storyClip is "02722056cb9f" or _storyClip is "91a9f07b80cc" or _storyClip is "353df979072a" or _storyClip is "8af9cc8567f3">>. Somewhere out in the dark the whole crowd applauds.<<else>>, and the lights go out with you, and the whole dark crowd applauds.<</if>>
<<denPrizeLine>>
<div class="choice-container">
<<denDone>>
</div><<set _denSV to setup.storyFamilySingles("story/den_room_corridor/peep", setup.denSinglesHere("story/den_room_corridor/peep"))>><<if _denSV or !setup.storyFamilyGap("story/den_room_corridor/peep")>><<storyVideo "story/den_room_corridor/peep">><</if>><<if _denSV>><<run setup.mediaAvoidEnd("story/den_room_corridor/peep")>><</if>>
<<denHaze>>
A long red hall full of peepholes. Behind each one a woman is working a client, on a red leather couch or a black satin bed: on her knees, on her back, on all fours, on top. The men are shadows. The women are bright.
<div class="choice-container">
<<denBeatEnd>>
</div><<set _denSV to setup.storyFamilySingles("story/den_room_corridor/walkin", setup.denSinglesHere("story/den_room_corridor/walkin"))>><<if _denSV or !setup.storyFamilyGap("story/den_room_corridor/walkin")>><<storyVideo "story/den_room_corridor/walkin">><</if>><<if _denSV>><<run setup.mediaAvoidEnd("story/den_room_corridor/walkin")>><</if>>
<<denHaze>>
One door is open. Inside, a woman <<if _storyFamily is "sf_cg_den_room_corridor_01" or _storyClip is "6fa0ac16b639" or _storyClip is "fa9dab56d0c4" or _storyClip is "39c9116eafd5" or _storyClip is "e96eee5823be" or _storyClip is "1a8aecc8c8bb" or _storyClip is "7d5428bdabbb" or _storyClip is "8e2897a35971">><<else>>in a fur coat and nothing else <</if>>is waiting for you. She <<if _storyFamily is "sf_cg_den_room_corridor_01" or _storyClip is "6fa0ac16b639" or _storyClip is "fa9dab56d0c4" or _storyClip is "39c9116eafd5" or _storyClip is "e96eee5823be" or _storyClip is "1a8aecc8c8bb" or _storyClip is "7d5428bdabbb" or _storyClip is "8e2897a35971">><<else>>pulls you down onto the bed and <</if>><<if _storyClip is "6fa0ac16b639">>bends over for you, and you fuck her from behind standing up<<elseif _storyClip is "39c9116eafd5">>pushes you down and rides you<<elseif _storyClip is "1a8aecc8c8bb">>is on her back, and you get her leg up on your shoulder and fuck her<<elseif _storyClip is "fa9dab56d0c4">>crouches in front of you and smiles like she's been paid in advance<<else>>takes your cock in her mouth like she's been paid in advance<</if>>.
<div class="choice-container">
<<denBeatEnd>>
</div><<set _denSV to setup.storyFamilySingles("story/den_room_corridor/finish", setup.denSinglesHere("story/den_room_corridor/finish"))>><<if _denSV or !setup.storyFamilyGap("story/den_room_corridor/finish")>><<storyVideo "story/den_room_corridor/finish">><</if>><<if _denSV>><<run setup.mediaAvoidEnd("story/den_room_corridor/finish")>><</if>>
<<denHaze>>
You come on her tongue. She shows you<<if _storyClip is "179224835c0d">><<else>>, swallows,<</if>> and points you back to the hall.
<<denPrizeLine>>
<div class="choice-container">
<<denDone>>
</div><<set _denSV to setup.storyFamilySingles("story/den_room_baths/hands", setup.denSinglesHere("story/den_room_baths/hands"))>><<if _denSV or !setup.storyFamilyGap("story/den_room_baths/hands")>><<storyVideo "story/den_room_baths/hands">><</if>><<if _denSV>><<run setup.mediaAvoidEnd("story/den_room_baths/hands")>><</if>>
<<denHaze>>
Steam so thick you can't see your own feet, soap, and hands, more hands than there are women: <<if _storyClip is "4a41ed64f891" or _storyClip is "590e9f0b598d" or _storyClip is "3abaa0a5159e" or _storyClip is "0194ea9d3108" or _storyClip is "2c476eef252f">>two<<else>>three<</if>> of them washing each other<<if _storyClip is "4a41ed64f891" or _storyClip is "590e9f0b598d" or _storyClip is "3abaa0a5159e" or _storyClip is "0194ea9d3108" or _storyClip is "2c476eef252f">><<else>>, and then you, everywhere<</if>>.
<div class="choice-container">
<<denBeatEnd>>
</div><<set _denSV to setup.storyFamilySingles("story/den_room_baths/wash", setup.denSinglesHere("story/den_room_baths/wash"))>><<if _denSV or !setup.storyFamilyGap("story/den_room_baths/wash")>><<storyVideo "story/den_room_baths/wash">><</if>><<if _denSV>><<run setup.mediaAvoidEnd("story/den_room_baths/wash")>><</if>>
<<denHaze>>
They hand you on. One woman <<if _storyClip is "4bf0452c28bf" or _storyClip is "9efee2fa5d31" or _storyClip is "8a4ccf137dbe" or _storyClip is "bad5131d2402">>waits for you under the hot water<<else>>takes you under the hot water and soaps your cock with both hands, slow and slippery, then sinks to her knees<</if>>.<<if _storyClip is "8a4ccf137dbe">> You kiss her neck and soap her tits.<</if>>
<div class="choice-container">
<<denBeatEnd>>
</div><<set _denSV to setup.storyFamilySingles("story/den_room_baths/sex", setup.denSinglesHere("story/den_room_baths/sex"))>><<if _denSV or !setup.storyFamilyGap("story/den_room_baths/sex")>><<storyVideo "story/den_room_baths/sex">><</if>><<if _denSV>><<run setup.mediaAvoidEnd("story/den_room_baths/sex")>><</if>>
<<denHaze>>
<<if _storyClip is "24c44b73884d" or _storyClip is "877deb5d2538">>You stay standing, and you fuck her from behind<<else>>She pulls you down onto the wet tiles, climbs on, and rides you<</if>> in the steam with the water pouring over you both.
<div class="choice-container">
<<denBeatEnd>>
</div><<set _denSV to setup.storyFamilySingles("story/den_room_baths/finish", setup.denSinglesHere("story/den_room_baths/finish"))>><<if _denSV or !setup.storyFamilyGap("story/den_room_baths/finish")>><<storyVideo "story/den_room_baths/finish">><</if>><<if _denSV>><<run setup.mediaAvoidEnd("story/den_room_baths/finish")>><</if>>
<<denHaze>>
You pull out and come on her face, and she laughs<<if _storyClip is "05f004b5468e">> up at you<<else>> and turns her face up into the water<</if>>.
<<denPrizeLine>>
<div class="choice-container">
<<denDone>>
</div><<storyVideo "story/den_room_pit/pile">>
<<denHaze>>
<<if _storyClip is "0fdfb4e1ab13">>A pack of women comes running past you, laughing, and they throw themselves down on a table, waiting to see what you'll do about it.<<elseif _storyClip is "4c0c14b8ec3e">>Four women are stacked two high on all fours, and the pile comes down in a heap of laughing women at your feet.<<else>>The floor is a pit of velvet cushions and naked women, warm and tangled. A dozen arms reach up for you.<</if>>
<div class="choice-container">
<<denBeatEnd>>
</div><<storyVideo "story/den_room_pit/buried">>
<<denHaze>>
You fall in. <<if _storyClip is "4a9798ab5bdd">>Eight of them kneel round you in a ring, and a dozen hands go over you at once. Nobody takes your shorts off you.<<else>>One sits on your face, her pussy wet and heavy on your mouth, and <</if>><<if _storyClip is "4a9798ab5bdd">><<elseif _storyClip is "19bf3a98be12">>one is already riding your cock backwards.<<else>>two more lick your cock between them, taking turns.<</if>>
<div class="choice-container">
<<denBeatEnd>>
</div><<storyVideo "story/den_room_pit/many">>
<<denHaze>>
<<if _storyClip is "453f76536786">>Four mouths on you at once.<<elseif _storyClip is "bab396e7b737">>It's hands: six or seven of them, stroking you together.<<else>>They take turns on you.<</if>><<if _storyClip is "c72001608692" or _storyClip is "bab396e7b737" or _storyClip is "453f76536786">><<else>> Every time one of them finishes, the next is already climbing on.<</if>>
<div class="choice-container">
<<denBeatEnd>>
</div><<storyVideo "story/den_room_pit/finish">>
<<denHaze>>
You come <<if _storyClip is "01d4bd8515c2">>on one tongue, and she passes your cum on, mouth to mouth, down a line of four of them<<else>>over two faces at once, and they kiss your cum off each other<</if>>.
<<denPrizeLine>>
<div class="choice-container">
<<denDone>>
</div><<set _denSV to setup.storyFamilySingles("story/den_room_milking/down", setup.denSinglesHere("story/den_room_milking/down"))>><<if _denSV or !setup.storyFamilyGap("story/den_room_milking/down")>><<storyVideo "story/den_room_milking/down">><</if>><<if _denSV>><<run setup.mediaAvoidEnd("story/den_room_milking/down")>><</if>>
<<denHaze>>
A padded table, and you're face down on it, with a hole in it under your hips that your cock hangs through. Straps across your back that you can feel and can't see.
<<switch setup.denMilkingSet(_storyClip)>>
<<case "table">>A blonde woman rubs oil into your shoulders, and lower.
<<default>>A woman rubs oil into your shoulders, and lower.
<</switch>>
<div class="choice-container">
<<denBeatEnd>>
</div><<set _denSV to setup.storyFamilySingles("story/den_room_milking/first", setup.denSinglesHere("story/den_room_milking/first"))>><<if _denSV or !setup.storyFamilyGap("story/den_room_milking/first")>><<storyVideo "story/den_room_milking/first">><</if>><<if _denSV>><<run setup.mediaAvoidEnd("story/den_room_milking/first")>><</if>>
<<denHaze>>
<<switch setup.denMilkingSet(_storyClip)>>
<<case "table">>The blonde takes your cock in her hand, then her mouth. You can't move. You can only feel her.
<<default>>A woman takes your cock in her hand, then her mouth. You can't move. You can only feel her.
<</switch>>
<div class="choice-container">
<<denBeatEnd>>
</div><<set _denSV to setup.storyFamilySingles("story/den_room_milking/next", setup.denSinglesHere("story/den_room_milking/next"))>><<if _denSV or !setup.storyFamilyGap("story/den_room_milking/next")>><<storyVideo "story/den_room_milking/next">><</if>><<if _denSV>><<run setup.mediaAvoidEnd("story/den_room_milking/next")>><</if>>
<<denHaze>>
The woman changes. You hear them swap.
<<switch setup.denMilkingSet(_storyClip)>>
<<case "redhead">>A redhead this time, greedier than the first, and she doesn't let you rest.<<if _storyClip is "d794c91f5879">> She loosens the straps just long enough to roll you onto your back, buckles you down again and goes down on you while you watch.<</if>>
<<default>>The new one is greedier than the first, and she doesn't let you rest.
<</switch>>
<div class="choice-container">
<<denBeatEnd>>
</div><<set _denSV to setup.storyFamilySingles("story/den_room_milking/peak", setup.denSinglesHere("story/den_room_milking/peak"))>><<if _denSV or !setup.storyFamilyGap("story/den_room_milking/peak")>><<storyVideo "story/den_room_milking/peak">><</if>><<if _denSV>><<run setup.mediaAvoidEnd("story/den_room_milking/peak")>><</if>>
<<denHaze>>
<<switch setup.denMilkingSet(_storyClip)>>
<<case "masseuse">>Another woman again: a masseuse with dark skin and strong hands, and she knows exactly where you are.<<if _storyClip is "b456ebd9d175">> She has you on your back first and works you with her slick hands, then turns you over and buckles you down again.<</if>> She works you right up to the edge and holds you there.
<<default>>Another woman again, and she knows exactly where you are. She works you right up to the edge and holds you there.
<</switch>>
<div class="choice-container">
<<denBeatEnd>>
</div><<set _denSV to setup.storyFamilySingles("story/den_room_milking/hotter", setup.denSinglesHere("story/den_room_milking/hotter"))>><<if _denSV or !setup.storyFamilyGap("story/den_room_milking/hotter")>><<storyVideo "story/den_room_milking/hotter">><</if>><<if _denSV>><<run setup.mediaAvoidEnd("story/den_room_milking/hotter")>><</if>>
<<denHaze>>
<<if _storyClip is "c37e5ac4d13f">>Two women this time. Their oiled hands go all over your back, and then one bends over right in front of your face, and you lick her<<else>>No slow start this time.<</if>><<if _storyClip is "92b39fa37b09" or _storyClip is "a8e1a84cb16c">> You're on your back.<</if>><<if _storyClip is "c37e5ac4d13f">><<else>> Hands and mouths from the first moment<</if>><<if _storyClip is "c37e5ac4d13f" or _storyClip is "92b39fa37b09" or _storyClip is "de36756c30c7" or _storyClip is "a8e1a84cb16c">><<else>>, more of them than you can count<</if>>.
<div class="choice-container">
<<denBeatEnd>>
</div><<set _denSV to setup.storyFamilySingles("story/den_room_milking/finish", setup.denSinglesHere("story/den_room_milking/finish"))>><<if _denSV or !setup.storyFamilyGap("story/den_room_milking/finish")>><<storyVideo "story/den_room_milking/finish">><</if>><<if _denSV>><<run setup.mediaAvoidEnd("story/den_room_milking/finish")>><</if>>
<<denHaze>>
<<switch setup.denMilkingSet(_storyClip)>>
<<case "masseuse">>The masseuse doesn't stop when you beg. You come, and she keeps going until you jerk against the straps.
<<default>>She doesn't stop when you beg. You come, and she keeps going until you jerk against the straps.
<</switch>>
<<denPrizeLine>>
<div class="choice-container">
<<denDone>>
</div><<set _denSV to setup.storyFamilySingles("story/den_room_milking/drained", setup.denSinglesHere("story/den_room_milking/drained"))>><<if _denSV or !setup.storyFamilyGap("story/den_room_milking/drained")>><<storyVideo "story/den_room_milking/drained">><</if>><<if _denSV>><<run setup.mediaAvoidEnd("story/den_room_milking/drained")>><</if>>
<<denHaze>>
They don't stop. You beg, and they don't stop. One woman after another milks you until there's nothing left.
<<switch setup.denMilkingSet(_storyClip)>>
<<case "table">>The last of them is the blonde from the start, back for what's left.
<<case "fishnet">>The last of them is a blonde in fishnets, and she takes what's left.
<<default>>The last of them takes what's left.
<</switch>>
<<denPrizeLine>>
<div class="choice-container">
<<denDone>>
</div><<set _denSV to setup.storyFamilySingles("story/den_room_cellar/tied", setup.denSinglesHere("story/den_room_cellar/tied"))>><<if _denSV or !setup.storyFamilyGap("story/den_room_cellar/tied")>><<storyVideo "story/den_room_cellar/tied">><</if>><<if _denSV>><<run setup.mediaAvoidEnd("story/den_room_cellar/tied")>><</if>>
<<denHaze>>
Down, and down<<if _storyFamily is "sf_cg_den_room_cellar_01">>, and you're already in the chair: an iron collar round your neck, a chain wound round your chest, iron cuffs on your ankles.<<elseif _storyClip is "f875328ac4f6">>, and you're hanging upside down by your feet, wrapped in clear plastic from your ankles to your chest, a ball in your mouth.<<else>>. Stone walls, a chair, chains.<</if>> A woman in black <<if _storyFamily is "sf_cg_den_room_cellar_01" or _storyClip is "f875328ac4f6">><<else>>leather straps your wrists to the arms of the chair and <</if>>doesn't say a word.
<div class="choice-container">
<<denBeatEnd>>
</div><<set _denSV to setup.storyFamilySingles("story/den_room_cellar/edged", setup.denSinglesHere("story/den_room_cellar/edged"))>><<if _denSV or !setup.storyFamilyGap("story/den_room_cellar/edged")>><<storyVideo "story/den_room_cellar/edged">><</if>><<if _denSV>><<run setup.mediaAvoidEnd("story/den_room_cellar/edged")>><</if>>
<<denHaze>>
<<if _storyClip is "ed36fea2664d" or _storyClip is "adcd1beb1970">>She's cut you down. <<elseif _storyClip is "0b54e63c9bed" or _storyClip is "351b02896552" or _storyClip is "f1021ef86fc3" or _storyClip is "5ec12354619d" or _storyClip is "a4f6224bf800" or _storyClip is "1f4b7eda7a2f">><<else>>She grabs your face and makes you look at her. <</if>><<if _storyClip is "f1021ef86fc3">>She slaps your cock when it twitches, then grinds her bare ass into your lap, and never once lets you in.<<elseif _storyClip is "5ec12354619d">>She sits down beside your chair and fucks herself with a dildo right in front of you, where you can touch none of it.<<elseif _storyClip is "ed36fea2664d">>She bends over in front of you, and you kneel behind her and lick her.<<elseif _storyClip is "adcd1beb1970">>She holds her feet up to your face, and you kneel and suck her toes.<<elseif _storyClip is "a4f6224bf800">>She clips a clamp onto each of your nipples and tugs the chain between them, and she never touches your cock once.<<elseif _storyClip is "1f4b7eda7a2f">>She bends beside you and plays with your balls, looking at your cock like it belongs to her.<<else>>She strokes your cock with a gloved hand, slow, slower, and stops every time you get close.<</if>>
<div class="choice-container">
<<denBeatEnd>>
</div><<set _denSV to setup.storyFamilySingles("story/den_room_cellar/taken", setup.denSinglesHere("story/den_room_cellar/taken"))>><<if _denSV or !setup.storyFamilyGap("story/den_room_cellar/taken")>><<storyVideo "story/den_room_cellar/taken">><</if>><<if _denSV>><<run setup.mediaAvoidEnd("story/den_room_cellar/taken")>><</if>>
<<denHaze>>
She <<if _storyClip is "5c3dc90d0d11">>has you flat on your back on the floor, squats over your hips<<else>>climbs onto your lap<</if>> and takes your cock inside her, grinding, and still she won't let you come. She rides you to the edge and keeps you there.
<div class="choice-container">
<<denBeatEnd>>
</div><<set _denSV to setup.storyFamilySingles("story/den_room_cellar/denial", setup.denSinglesHere("story/den_room_cellar/denial"))>><<if _denSV or !setup.storyFamilyGap("story/den_room_cellar/denial")>><<storyVideo "story/den_room_cellar/denial">><</if>><<if _denSV>><<run setup.mediaAvoidEnd("story/den_room_cellar/denial")>><</if>>
<<denHaze>>
She stops. She leaves you there, hard and aching, and smiles for the first time. "Good boy," she says<<if setup.denPrizeKey()>>, and hangs something cold around your neck.<<elseif setup.denState().keys.cellar>>, and flicks the key that already hangs at your throat.<<else>>. "One key a night, and you've had yours."<</if>>
<<denPrizeLine>>
<div class="choice-container">
<<denDone>>
</div><<denHaze>>
You come anyway, and she watches you do it with no expression at all. "Then you pay," she says.
<<denPrizeLine>>
<div class="choice-container">
<<denDone>>
</div><<storyVideo "story/den_room_web/heart">>
<<denHaze>>
All three keys turn at once. Behind the door <<if _storyClip is "0578a8074e59">>the haze spins a web, and then it isn't one: it's a bright office, and a woman across a desk from you. She's been waiting for you.<<else>>is a web of silk ropes, and in the middle of it a woman in black lace, waiting for you.<</if>>
<div class="choice-container">
<<denBeatEnd>>
</div><<storyVideo "story/den_room_web/uses">>
<<denHaze>>
She <<if _storyClip is "dd073d179e02" or _storyClip is "ae7df9d60d59">>sits on<<elseif _storyClip is "de0f55ae84c5">>sits at<<else>>bends you over<</if>> a desk that wasn't there a moment ago and <<if _storyClip is "dd073d179e02">>gives you her foot, and you kneel and suck her toes<<elseif _storyClip is "ae7df9d60d59">>pulls your face between her thighs<<elseif _storyClip is "de0f55ae84c5">>pulls you down across her lap and spanks you<<else>>spanks you, then sits on the desk and pulls your face between her thighs<</if>>.
<div class="choice-container">
<<denBeatEnd>>
</div><<denHaze>>
<<storyVideo "story/den_room_web/stairs">>
<<if $den.trip.lastPeak isnot "hold">>She reaches down without looking and strokes your cock until you come all over the desk, your face still buried between her thighs.
<</if>>The web comes apart in your hands. It was never silk. It's a staircase, steep and narrow, and at the top of it a very big woman steps into the light.
<<say "Hulda" "Madam sees men who are worth something.">>
Then she picks you up and throws you down the stairs. You land on your back at the bottom. High above you a wooden fan goes round, slowly, and you watch it until the dark comes.
<div class="choice-container">
<<link `setup.denBtn("…", "sleep", "action")`>><<advanceToHour `setup.DEN.hours.close`>><<run setup.denThrown(null, "back")>><<goto "DenTrip_Comedown">><</link>>
</div><<set _den to setup.denState()>>
<<storyVideo "story/den_tray/tray">>
<<denHaze>>
A woman in gold paint holds out a tray. The glasses on it glow: pink, blue, gold, black. She smiles like she already knows which one you'll take.
<<if _den.trip.level gte setup.DEN.trip.maxLevel>>She leans in close. "One more and you're gone, sweetheart."<</if>>
<<denWarn>>
<div class="choice-container">
<<link `setup.denBtn("The pink glass", "potion", "intimate")`>><<goto `setup.denTakeGlass(null, "pink")`>><</link>>
<<link `setup.denBtn("The blue glass", "potion", "intimate")`>><<goto `setup.denTakeGlass(null, "blue")`>><</link>>
<<link `setup.denBtn("The gold glass", "dominant", "intimate")`>><<goto `setup.denTakeGlass(null, "gold")`>><</link>>
<<link `setup.denBtn("The black glass", "submit", "intimate")`>><<goto `setup.denTakeGlass(null, "black")`>><</link>>
<<link `setup.denBtn("Knock the tray away", "door", "action")`>><<run setup.denDoors()>><<goto "DenTrip_Doors">><</link>>
</div><<set _den to setup.denState()>>
<<denHaze>>
The tray goes flying. Glass everywhere, and nobody minds. Behind the woman the wall has grown doors.
<div class="choice-container">
<<for _denI, _denRoom range _den.trip.doors>>
<<capture _denRoom>><<link `setup.denBtn(_den.trip.blindNext ? "A door" : setup.DEN.looks[_denRoom], "door", "action")`>><<goto `setup.denTakeDoor(null, _denRoom)`>><</link>><</capture>>
<</for>>
</div><<denHaze>>
She feels it coming and stops dead, her fist tight around the root of your cock, and holds you right there on the edge until your cock stops jerking in her fist. She laughs. The room laughs. Nobody lets you finish.
Your balls ache, and the next room will be hotter for it.
<div class="choice-container">
<<denDone>>
</div><<storyVideo "story/den_big_finish/big">>
<<denHaze>>
<<if _storyClip is "d0c1242c3b0d" or _storyClip is "896f68142a00" or _storyClip is "8bb800343e0e">>Three of them<<else>>Four of them, all over you, hands and mouths and cunts<</if>>, and none of them will let you hold it any more. You come so hard the light goes white, and they keep going until you've got nothing left.
<<denPrizeLine>>
<div class="choice-container">
<<denDone>>
</div>You drink. The glass keeps emptying after it's empty, and so do you. The floor comes up soft as a mouth.
<div class="choice-container">
<<link `setup.denBtn("…", "sleep", "action")`>><<advanceToHour `setup.DEN.hours.close`>><<run setup.denEndTrip()>><<goto "DenTrip_Comedown">><</link>>
</div><<storyVideo "story/den_room_bar/hotter">>
Something cold slides up your spine and sits down behind your eyes.
<<say "Thara" "Hello again, little vessel. Lie still. I'll drive.">>
Your hands move without you. They take the nearest woman by the hips.
<div class="choice-container">
<<link `setup.denBtn("Let her", "submit", "intimate")`>><<run setup.denTharaStart()>><<goto "DenTrip_Thara_Night">><</link>>
</div><<set _dtA to setup.denTharaAvoid("story/den_thara/bar")>>
<<storyVideo "story/den_thara/bar">>
<<if _dtA>><<run setup.mediaAvoidEnd("story/den_thara/bar")>><</if>>
She fucks them with your body, one after another, bent over the bar, on the stage, against the wall. You feel all of it and choose none of it. She laughs with your mouth.
<<if $den.tharaHouse gt 1>><<say "Thara" "Same house. Same soft hole in your head. I left it warm.">><</if>>
<<if _storyClip is "56c60736b784">>The first two are already laid out for you, bent face-down, a wand buzzing between one's thighs. Your body squats over her raised ass like a man mounting a horse.<<elseif _storyClip is "0750caf3c7eb">>She stands your body astride the nearest woman and squats you straight down into her ass until your thighs burn.<<elseif _storyClip is "346023ece032">>The first is on all fours. Your hands gather her hair into a fist like reins.<<else>>She bends the nearest woman over and puts your hands on her hips.<</if>><<if _storyClip is "56c60736b784">><<elseif _storyClip is "0750caf3c7eb">> She pulls you out and your hand works the buzzing wand into her crack.<<else>> Your cock goes into her from behind, and your hips find a rhythm you never chose: hard, deep, endless.<</if>><<if _storyClip is "5017955b53b1">> Then your hand finds the leash clipped to her collar and winds it twice round your fist.<</if>>
<<say $player.name "Stop.">>
<<if $den.tharaCount gt 1>><<if _storyClip is "5017955b53b1">><<say "Thara" "Reins. I've wanted reins since the last time I wore you. Every wet inch of her comes up your nerves to me.">><</if>><<else>><<if _storyClip is "5017955b53b1">><<say "Thara" "Reins. An age without a body, and the first thing I get is reins. Every wet inch of her comes up your nerves to me.">><</if>><</if>>
<<if $den.tharaCount gt 1>><<if _storyClip is "84943b200e2b">><<say "Thara" "Ass first. You kept me waiting far too long for something this tight, and I want to feel it fight my cock all the way in.">><</if>><<else>><<if _storyClip is "84943b200e2b">><<say "Thara" "Ass first. I've waited an age for something this tight, and I want to feel it fight my cock all the way in.">><</if>><</if>>
<<if $den.tharaCount gt 1>><<if _storyClip is "56c60736b784">><<say "Thara" "Look at them, served up like a tray. I've been hungry since the last time I wore you, and I'll start with the one already humming.">><</if>><<else>><<if _storyClip is "56c60736b784">><<say "Thara" "Look at them, served up like a tray, and me starved an age for it. I'll start with the one already humming.">><</if>><</if>>
<<if _storyClip is "5017955b53b1" or _storyClip is "84943b200e2b" or _storyClip is "56c60736b784">><<elseif _storyClip is "0750caf3c7eb">><<say "Thara" "Legs, weight, a cock, and a toy for the free hand: I'm using the lot.">><<elseif _storyClip is "346023ece032">><<say "Thara" "Hair is a handle. Mortals grow handles everywhere, and I mean to pull every one I find.">><<else>><<say "Thara" "Bend her over. My hands on her hips, my cock splitting her from behind, and every wet inch of it running up your nerves to me. I'm STARVING.">><</if>>
<<say "Thara" "Yell stop again. Louder. She can hear you, and look: your hips still don't care.">>
<div class="choice-container">
<<link `setup.denBtn("Stop", "submit", "intimate")`>><<goto "DenTrip_Thara_Throat">><</link>>
</div><<set _dtA to setup.denTharaAvoid("story/den_thara/throat")>>
<<storyVideo "story/den_thara/throat">>
<<if _dtA>><<run setup.mediaAvoidEnd("story/den_thara/throat")>><</if>>
<<if _storyClip is "610c8fc55655">>She lays your body on its back and holds every muscle still, and lets the next two come to you.<<elseif _storyClip is "d9273c231781">>Two of them kneel at your crotch at once.<<elseif _storyClip is "b5c78cda38a3" or _storyClip is "ef57a3fdde32">>The next woman has your cock in her mouth and her fingers round the shaft, bobbing at her own steady pace.<<elseif _storyClip is "fa8f73ecf705">>Your hand slides under the next woman's chin, cups her jaw and her throat together, and guides her down your cock.<<elseif _storyClip is "3a94c50d155b">>Your hand moves to the back of the next woman's head, and your hips feed her your cock.<<else>>She shuts both your fists in the next woman's hair and feeds your cock down her throat until her chin sits on your balls.<</if>> Spit runs hot down the inside of your thigh. <<if _storyClip is "610c8fc55655" or _storyClip is "fa8f73ecf705">><<elseif _storyClip is "b5c78cda38a3">>Your body doesn't move. It doesn't need to.<<elseif _storyClip is "ef57a3fdde32">>Your body stands and lets her.<<else>>You try to pull your hips back. They drive forward instead, to a beat kept somewhere behind your eyes.<</if>>
<<if $den.tharaCount gt 1>><<if _storyClip is "ef57a3fdde32">><<say "Thara" "Mouth and fist at once. I've missed hands since I last wore yours, and now a whore is using hers on me.">><</if>><<else>><<if _storyClip is "ef57a3fdde32">><<say "Thara" "Mouth and fist at once. I've had no hands for an age, and now a whore is using hers on me.">><</if>><</if>>
<<if _storyClip is "610c8fc55655">><<say "Thara" "Still. Not a twitch. I want every lick of two hungry mouths, and I want to feel her throat close on my cock without you wriggling.">><<elseif _storyClip is "b5c78cda38a3">><<say "Thara" "She does the work, I take the feeling. That's the whole arrangement, and it's a good one.">><<elseif _storyClip is "d9273c231781">><<say "Thara" "One hand each. I'd grow a third if I could, just to have another head to hold.">><<elseif _storyClip is "ef57a3fdde32">><<elseif _storyClip is "fa8f73ecf705">><<say "Thara" "A throat in my palm and a cock in her mouth. I can feel her swallow from both ends.">><<elseif _storyClip is "3a94c50d155b">><<say "Thara" "Watch her work for it. I barely have to lift a finger of yours, and I can taste her spit through your nerves.">><<else>><<say "Thara" "Fists in her hair. Feed her my cock till her throat shuts on it. That choke, that squeeze: I feel it through you, and I could live on it.">><</if>>
<<if _storyClip is "610c8fc55655">><<say "Thara" "My cock, my bed, my two whores. Your part is the shame, and you're doing it beautifully.">><<elseif _storyClip is "b5c78cda38a3">><<say "Thara" "I'm not even moving you. Your cock is twitching in her mouth all on its own.">><<elseif _storyClip is "ef57a3fdde32">><<say "Thara" "Mine, every stroke of it. You only get to sweat.">><<elseif _storyClip is "fa8f73ecf705">><<say "Thara" "My hand on her throat. Your pulse in my cock. Don't mix them up.">><<else>><<say "Thara" "You'd never have held one down this deep. Say thank you. No? Then keep whining, and watch her swallow.">><</if>>
<div class="choice-container">
<<link `setup.denBtn("Get out of me", "submit", "intimate")`>><<goto "DenTrip_Thara_Pinned">><</link>>
</div><<set _dtA to setup.denTharaAvoid("story/den_thara/pinned")>>
<<storyVideo "story/den_thara/pinned">>
<<if _dtA>><<run setup.mediaAvoidEnd("story/den_thara/pinned")>><</if>>
<<if _storyClip is "4ee17c65e954">>Your hand closes round the next one's throat, just under her jaw, and squeezes.<<elseif _storyClip is "a1a24736cfed">>The next is laid back, and your body kneels between her legs, one hand clamped on her throat.<<elseif _storyClip is "d58c2b93e59a">>The next lies flat on her back. Your body settles between her legs and leans down with both hands round her throat.<<else>>She throws the next woman down on her back, folds her legs to her chest and leans your whole weight onto the backs of her thighs.<</if>> Your cock goes straight down into her, and you feel the breath leave her each time your hips land.
<<if _storyClip is "4ee17c65e954">><<say "Thara" "Feel that? Her pulse knocking on my palm. I want it louder.">><<elseif _storyClip is "d58c2b93e59a">><<say "Thara" "Both hands. Her breath in one palm, her pulse in the other, and my cock doing the rest.">><<elseif _storyClip is "a1a24736cfed">><<say "Thara" "Hold her head down. I like them pinned at both ends: throat in my hand, hips on my cock.">><<else>><<say "Thara" "Fold the bitch in half. Your weight on the backs of her thighs, my cock driven straight down into her. I've got WEIGHT again.">><</if>>
<<if _storyClip is "4ee17c65e954">><<say "Thara" "Yours is going faster than hers. Fragile little thing. Don't you dare faint on me.">><<else>><<say "Thara" "She's looking up at your face. She thinks that grin is yours. So will you, by morning.">><</if>>
<div class="choice-container">
<<link `setup.denBtn("Please, no more", "submit", "intimate")`>><<goto "DenTrip_Thara_Two">><</link>>
</div><<set _dtA to setup.denTharaAvoid("story/den_thara/two")>>
<<storyVideo "story/den_thara/two">>
<<if _dtA>><<run setup.mediaAvoidEnd("story/den_thara/two")>><</if>>
She takes two at once.
<<say $player.name "Let them go.">>
<<if _storyClip is "13b441278bcb">><<say "Thara" "They do it themselves. I only have to stand here, feel one and watch the other.">><<elseif _storyClip is "438c562392d2">><<say "Thara" "One on the shaft, one on the balls. Everything this body grew, wet at once.">><<elseif _storyClip is "ddd5bcdfe306">><<say "Thara" "One sucks, one serves. They've turned my cock into a dish. Good. I'm hungry.">><<elseif _storyClip is "69048aa11938">><<say "Thara" "One on my cock, one on her tongue, and both of them working for me. I barely have to move you.">><<else>><<say "Thara" "Two hands, two holes, one cock: I'm not leaving one part of you idle.">><</if>>
<<say "Thara" "Let them go? Your cock says otherwise, and I listen to your cock.">>
<div class="choice-container">
<<link `setup.denBtn("Endure", "submit", "intimate")`>><<goto "DenTrip_Thara_Line">><</link>>
</div><<set _dtA to setup.denTharaAvoid("story/den_thara/line")>>
<<storyVideo "story/den_thara/line">>
<<if _dtA>><<run setup.mediaAvoidEnd("story/den_thara/line")>><</if>>
<<if _storyClip is "5529e724d9ab">>These two have stacked themselves, one on all fours on top, the other on her back underneath.<<else>>She bends them over in a row, asses up, and walks your body down it.<</if>> In, out, and on to the next one. Your hands hold each one where she wants her while your cock moves on.
<<if _storyClip is "5529e724d9ab">><<say "Thara" "They've built me a shelf of holes, and the bottom one holds the top one open. Clever animals.">><<else>><<say "Thara" "A row of asses, all turned up for me. I'm not fucking women, I'm counting cunts on your cock, and I'm going down the line till your balls beg.">><</if>>
<<say "Thara" "How many is that? Count them for me. No? There's so little of you left in here that you can't even count.">>
<div class="choice-container">
<<link `setup.denBtn("Not again", "submit", "intimate")`>><<goto "DenTrip_Thara_Anal">><</link>>
</div><<set _dtA to setup.denTharaAvoid("story/den_thara/anal")>>
<<storyVideo "story/den_thara/anal">>
<<if _dtA>><<run setup.mediaAvoidEnd("story/den_thara/anal")>><</if>>
She takes the next woman's ass, slow at first and then hard.
<<say "Thara" "Tightest thing in this house, clamped round my cock. I'm going to ream it loose for the joy of feeling it give.">>
<<say "Thara" "You just thought of the little alchemist's ass. I felt your cock jump. It was never the gas, was it?">>
<div class="choice-container">
<<link `setup.denBtn("...", "submit", "intimate")`>><<goto "DenTrip_Thara_Finish">><</link>>
</div><<set _dtA to setup.denTharaAvoid("story/den_thara/finish")>>
<<storyVideo "story/den_thara/finish">>
<<if _dtA>><<run setup.mediaAvoidEnd("story/den_thara/finish")>><</if>>
<<if _storyClip is "b07d43596720" or _storyClip is "2c027525c715">>Two faces wait at your cock, cheek to cheek. <</if>><<if _storyClip is "d5c6c4549702">>Your cum has already torn out of you once, all over the next one's face, and she isn't spared a second round.<<elseif _storyClip is "294189eebd96">>She pulls your cock out of the next woman, and it empties over her in long hot pulls.<<elseif _storyClip is "352d5ca50d55">>She pulls your cock out and fists it over the next woman's spread cunt, and your cum lands there in thick ropes.<<else>>She pulls your cock out and fists it over the nearest face, and your cum tears out of you in long hot pulls across a stranger's tongue.<</if>> You have never come this hard.
<<if $den.tharaCount gt 1>><<if _storyClip is "2c027525c715">><<say "Thara" "Two tongues, one cock, and a mouth that won't close. I've missed having a cock to paint with, and I mean to do it properly.">><</if>><<else>><<if _storyClip is "2c027525c715">><<say "Thara" "Two tongues, one cock, and a mouth that won't close. I never had a cock to paint with before, and I mean to do it properly.">><</if>><</if>>
<<if _storyClip is "294189eebd96">><<say "Thara" "Out, and over her. Your cum is hers to wear. Your coming is MINE to eat.">><</if>>
<<if _storyClip is "352d5ca50d55">><<say "Thara" "Delicious. She wears it, I eat it. That's what you're for.">><<elseif _storyClip is "d5c6c4549702">><<say "Thara" "Covered, and still fucked. I'm not done just because the cock spat. I'm never done.">><<elseif _storyClip is "2c027525c715" or _storyClip is "294189eebd96">><<else>><<say "Thara" "Now paint her: face, tongue, tits, every thick rope these balls saved up all night. Your cum is hers to wear. Your coming is MINE to eat.">><</if>>
<<say "Thara" "Empty, shaking and sticky with whores: that's what I'm leaving on their stage, little vessel, and you'll remember who did it.">>
<<if setup.denTharaHasAfter(_storyClip)>><div class="choice-container">
<<link `setup.denBtn("Please, it's over", "submit", "intimate")`>><<run setup.denTharaAfterPick()>><<goto "DenTrip_Thara_After">><</link>>
</div><<else>>You both came. Yours is still in your cock and your shaking legs. Hers lies on top of it, far bigger, a whole meal of it, and none of that is for you.
<<say "Thara" "Say it. Out loud. Who did this to them?">>
<<say $player.name "I did.">>
<<say "Thara" "Good boy.">>
Then the cold lifts out of your skull, and every muscle she borrowed comes back to you at once, sore, wet and used.
<<say "Thara" "Oh, I like this house. We'll come back.">>
<div class="choice-container">
<<link `setup.denBtn("Wake up", "sleep", "action")`>><<set $player.lust to 20>><<run setup.playerReleased()>><<set $player.strength to Math.max(1, $player.strength - setup.DEN.trip.thara.strength)>><<addCorruption `setup.DEN.trip.thara.corruption`>><<advanceToHour `setup.DEN.hours.close`>><<run setup.denEndTrip(null, "thara")>><<goto "DenTrip_Comedown">><</link>>
</div>
<</if>><<set _dtA to setup.denTharaAfterAvoid("story/den_thara/finish")>>
<<storyVideo "story/den_thara/finish">>
<<if _dtA>><<run setup.mediaAvoidEnd("story/den_thara/finish")>><</if>>
<<if _storyClip is "c434a8671a27">>She sits your spent body back on its heels and makes you watch the rest. They<<else>>She keeps your cock out for them. Two tongues lick it clean between them, then<</if>> kiss what's left of your cum off each other's mouths.
<<say "Thara" "Every drop went through me first. Now watch them pass you round like a cup.">>
You both came. Yours is still in your cock and your shaking legs. Hers lies on top of it, far bigger, a whole meal of it, and none of that is for you.
<<say "Thara" "Say it. Out loud. Who did this to them?">>
<<say $player.name "I did.">>
<<say "Thara" "Good boy.">>
Then the cold lifts out of your skull, and every muscle she borrowed comes back to you at once, sore, wet and used.
<<say "Thara" "Oh, I like this house. We'll come back.">>
<div class="choice-container">
<<link `setup.denBtn("Wake up", "sleep", "action")`>><<set $player.lust to 20>><<run setup.playerReleased()>><<set $player.strength to Math.max(1, $player.strength - setup.DEN.trip.thara.strength)>><<addCorruption `setup.DEN.trip.thara.corruption`>><<advanceToHour `setup.DEN.hours.close`>><<run setup.denEndTrip(null, "thara")>><<goto "DenTrip_Comedown">><</link>>
</div><<set _den to setup.denState()>>
<<set _denT to _den.trip>>
<<if _denT.endPlace is "stairs">>You wake at the bottom of a narrow staircase behind the bar, one cheek on the boards, and everything hurts. There was never a web. There was a door, and stairs, and a very big woman.
<<elseif _denT.endPlace is "thara">>You wake on the stage in grey light, sticky, empty and sore. The women step around you. Some of them give you a wide berth now.
<<elseif _denT.room>>
<<storyVideo "story/den_comedown/room">>
You come round in <<print setup.DEN.roomReal[_denT.room]>>, alone, with your trousers open. The light is just a bulb. The doors were curtains.
<<else>>You come round slumped at the bar with your cheek in a puddle of something pink.
<</if>>
<<print setup.denNightLog(null, "you")>>
<div class="choice-container">
<<link `setup.denBtn("Find Juno", "forward", "action")`>><<run setup.denEndTrip()>><<run setup.denJournal(null, setup.denNightLog())>><<goto "DenTrip_Bill">><</link>>
</div><<set _den to setup.denState()>>
<<set _denB to setup.denBill()>>
<<set _denWoods to _den.trip.endPlace is "woods">>
<<if _denWoods && _denB.tab is 0>>At noon one of Brakka's women finds you in the road and drops your weapons at your feet. The house is square with you.
<<elseif _denWoods>>Two of Brakka's women find you at noon, sitting in the road with leaves in your hair. Brakka holds out a slip of paper, your weapons over her shoulder.
<<say "Brakka" `"You walked out on your tab. " + _denB.tab + " scrap."`>>
<<elseif _denB.tab is 0>>Juno slides over a slip of paper with nothing on it.
<<say "Juno" "Nothing on your tab. Lucky you, lightweight.">>
<<else>>Juno slides a slip of paper across the bar.
<<say "Juno" `_den.trip.glasses + " glasses you don't remember asking for" + (_den.trip.fell ? ", and the carry-out. " : ". ") + _denB.tab + " scrap."`>>
<</if>>
<<scrapBalance>>
<div class="choice-container">
<<if _denB.tab is 0>>
<<link `setup.denBtn("Go on", "forward", "action")`>><<if $den.trip.endPlace isnot "woods">><<run setup.denJunoStep(null, 1)>><</if>><<run setup.denSettle()>><<goto `setup.denAfterBill()`>><</link>>
<<elseif _denB.canPay>>
<<link `setup.denBtn("Pay " + _denB.tab + " scrap", "scrap", "action")`>><<if $den.trip.endPlace isnot "woods">><<run setup.denJunoStep(null, 1)>><</if>><<run setup.denSettle()>><<goto `setup.denAfterBill()`>><</link>>
<<else>>
<<link `setup.denBtn("Pay what you have (" + _denB.scrap + " scrap)", "scrap", "action")`>><<run setup.denSettle()>><<goto `setup.denAfterBill()`>><</link>>
<</if>>
</div><<widget "denHour">>
<<advanceTime `setup.DEN.trip.roomHours` 0>><<run setup.denRoomCost()>><<run setup.denAfterRoom()>>
<</widget>>
<<widget "denDone">>
<<link `setup.denBtn(_args[0] || "Go on", "forward", "action")`>><<denHour>><<goto `setup.denNext()`>><</link>>
<</widget>>
<<widget "denBeatEnd">>
<<if setup.denAtPeak()>>
<<if setup.denState().trip.edge gte setup.DEN.trip.maxHolds>>
<<link `setup.denBtn("You can't hold it any more", "heart", "intimate")`>><<set _denPk to setup.denPeak(null, "let")>><<set $player.lust to 20>><<run setup.playerReleased()>><<goto `setup.denPeakPassage(null, _denPk.result)`>><</link>>
<<else>>
<<link `setup.denBtn("Let go", "heart", "intimate")`>><<set _denPk to setup.denPeak(null, "let")>><<set $player.lust to 20>><<run setup.playerReleased()>><<goto `setup.denPeakPassage(null, _denPk.result)`>><</link>>
<<link `setup.denBtn("Hold back", "lock", "action")`>><<set _denPk to setup.denPeak(null, "hold")>><<clampStat "player.lust" 15 0 $player.maxLust>><<goto `setup.denPeakPassage(null, _denPk.result)`>><</link>>
<</if>>
<<else>>
<<link `setup.denBtn("More", "forward", "intimate")`>><<goto `setup.denNextBeat()`>><</link>>
<</if>>
<</widget>>
<<widget "denWarn">>
<<set _denWarn to setup.denWarnings()>>
<<if _denWarn.includes("food")>><p class="den-warning">Your stomach is knotting. Eat something, or Brakka will have you out.</p><</if>>
<<if _denWarn.includes("energy")>><p class="den-warning">Your legs are going. A room or two more and Brakka will have you out.</p><</if>>
<</widget>>
<<widget "denPrizeLine">>
<<set _denP to setup.denState().trip.lastPrize>>
<<if !_denP>>
<<elseif _denP.kind is "key">><p class="system-message"><<icon "key">> You have <<print setup.DEN.keyNames[_denP.key]>>.</p>
<<elseif _denP.kind is "clue">><p class="system-message"><<icon "eye">> Something about this house sticks in your head. (Journal)</p>
<<elseif _denP.kind is "scrap">><p class="system-message"><<icon "scrap">> <<print _denP.amount>> scrap, pressed into your hand.</p>
<<elseif _denP.what is "key">><p class="system-message"><<icon "key">> <<print setup.DEN.keyNames[_denP.key]>> is gone.</p>
<<elseif _denP.what is "scrap">><p class="system-message"><<icon "scrap">> <<print _denP.amount>> scrap is gone from your pocket.</p>
<<else>><p class="system-message"><<icon "door">> You've lost your way. The next door is anyone's guess.</p>
<</if>>
<</widget>>
<<widget "denHaze">>
<<set _denL to setup.denHazeLevel()>>
<<if _denL gte 3>><p class="den-haze">Colours have weight. You can't tell which body is yours.</p>
<<elseif _denL is 2>><p class="den-haze">The light runs pink and blue, and the walls breathe with you.</p>
<<elseif _denL is 1>><p class="den-haze">Everything is warm and a little too bright.</p>
<</if>>
<</widget>>
<<widget "denBuyLink">>
<<set _denBW to _args[1]>><<set _denBT to _args[2]>><<set _denBL to _args[0] + " (" + setup.denPrice(_args[1]) + " scrap)">>
<<if setup.denCanBuy(null, _denBW)>>
<<capture _denBW, _denBT>><<link `setup.denBtn(_denBL, _args[3], "action")`>><<run setup.denBuy(null, _denBW)>><<goto _denBT>><</link>><</capture>>
<<else>>
<<vchoiceDisabled _denBL "action" `_args[3]`>>
<</if>>
<</widget>>
<<widget "denAlleyFight">>
<<run setup.denReturnWeapons()>>
<<createEnemy "raider_brute" "standard">>
<<set _denE to clone(_returnEnemy)>>
<<set _denE.name to "the man in the alley">>
<<set _denE.properName to false>>
<<startCombat `[_denE]` null true>>
<<set $combat.returnPassage to "Den_Alley_Fled">>
<<set $combat.victoryPassage to "Den_Alley_Won">>
<<set $combat.defeatPassage to "Den_Alley_Lost">>
<<goto "Combat_Start">>
<</widget>><<storyVideo "story/den_woods/river">>
<<denHaze>>
Water. You walk into a river in your clothes, and the haze turns the night bright as noon: sun on the stones, the sky blue as glass.<<if _storyClip is "11e6f5d36bac" or _storyClip is "afabf2b1d327" or _storyClip is "ff0134129955">> Up the far bank, dripping, you find a woman<<else>> A woman in the water, naked, laughing,<</if>> who doesn't seem surprised to see you<<if _storyClip is "e3ef58c6cd17">>, bends forward with her ass pushed back at you, and you take her by the hips and fuck her standing up<<elseif _storyClip is "11e6f5d36bac">>, lying back in the leaves with her legs open, and you lick her pussy and finger her until her head rolls<<elseif _storyClip is "afabf2b1d327">>. You lie down behind her, hold her top leg up and fuck her on your sides until you pull out and come on her belly<<elseif _storyClip is "ff0134129955">>, standing with a foot on each of two stones, legs wide. You lick her from below, then take her from behind<<elseif _storyClip is "e04c2a0a1607">>, stands among the stepping stones and shows herself to you, then turns her ass to you and looks back over her shoulder, smiling<<elseif _storyClip is "9fc074753019" or _storyClip is "d498acb9f7bc" or _storyClip is "4354d7bc3a5a">>, kneels and sucks your cock there in the sun<<else>>, pulls you down onto a rock and sucks your cock there in the sun<</if>>.
<div class="choice-container">
<<link `setup.denBtn("Come", "heart", "intimate")`>><<set $player.lust to 20>><<run setup.playerReleased()>><<advanceToHour 7>><<run setup.countSleep()>><<run setup.denWoodsLoss(null, "river")>><<updateExposure "player">><<goto "DenWoods_Wake">><</link>>
</div><<denHaze>>
Something hits you from the bushes, low and fast, and you're on your back in the leaves. A woman in paint and not much else kneels on your arms. She grins with a lot of teeth, pulls your trousers down and rides you right there on the forest floor while her sisters watch from the trees.
<div class="choice-container">
<<link `setup.denBtn("Come", "heart", "intimate")`>><<set $player.lust to 20>><<run setup.playerReleased()>><<advanceToHour 7>><<run setup.countSleep()>><<run setup.denWoodsLoss(null, "huntress")>><<goto "DenWoods_Wake">><</link>>
</div><<storyVideo "story/den_woods/wander">>
<<denHaze>>
You walk for hours. The trees lean in to listen. Somewhere a blonde woman, naked <<if _storyClip is "d59437270658">>in a clearing, waits on all fours, and you kneel behind her and fuck her<<else>>among the trunks, takes you by the hand, kneels, and sucks you off<</if>> without a word.
<div class="choice-container">
<<link `setup.denBtn("Come", "heart", "intimate")`>><<set $player.lust to 20>><<run setup.playerReleased()>><<advanceToHour 7>><<run setup.countSleep()>><<run setup.denWoodsLoss(null, "wander")>><<goto "DenWoods_Wake">><</link>>
</div><<storyVideo "story/den_room_stage/ride">>
Something cold sits down behind your eyes.
<<say "Thara" "Trees. How dull. Let's find someone.">>
She walks your body through the dark until <<if _storyFamily is "sf_cg_den_room_stage_01" or _storyFamily is "sf_cg_den_room_stage_02" or _storyFamily is "sf_cg_den_room_stage_03" or _storyFamily is "sf_cg_den_room_stage_04">>there are lights between the trees and music under them, and a woman<<else>>she finds a woman alone by a fire<</if>>, and she takes her with your hands and your cock, and you feel all of it and choose none of it.
<div class="choice-container">
<<link `setup.denBtn("Wake up", "sleep", "action")`>><<set $player.lust to 20>><<run setup.playerReleased()>><<set $player.strength to Math.max(1, $player.strength - setup.DEN.trip.thara.strength)>><<addCorruption `setup.DEN.trip.thara.corruption`>><<advanceToHour 7>><<run setup.countSleep()>><<run setup.denWoodsLoss(null, "thara")>><<goto "DenWoods_Wake">><</link>>
</div><<set _denW to setup.denState().trip.woodsLoss || { scrap: 0 }>>
<<if _denW.place>>You wake in wet leaves with the sun in your eyes and mud to the knees, on the edge of <<print ($worldMap.nodes[_denW.place] || {}).name>>, miles from where you started.<<else>>You wake in wet leaves with the sun in your eyes, mud to the knees and no idea where the road is.<</if>> <<if _denW.scrap gt 0>>Your pockets are lighter by <<print _denW.scrap>> scrap.<<else>>Your pockets were empty anyway.<</if>><<if _denW.clothes>> Your <<print _denW.clothes>> came out of the river in rags.<</if>><<if _denW.item>> Someone has been through your pack and taken the <<print _denW.item>>.<</if>> Everything aches, and you're starving.
<div class="choice-container">
<<link `setup.denBtn("Find the road", "map", "move")`>><<run setup.denJournal(null, setup.denNightLog())>><<goto "DenTrip_Bill">><</link>>
</div><<set $currentLocation to "fishers_rest">>
<<setBackground "fishers_rest/fishers_rest_lakeside">>
<<setTimeOfDay $time.phase>>
<<if !$locations.fishers_rest>>
<<set $locations.fishers_rest to {
visited: false,
cabinSearched: false,
waterCollectedToday: false,
fishedToday: 0,
lastVisitDay: 0,
snaggedTop: false,
arrivalEncounter: null,
snagDay: 0,
dockDay: 0,
pendingCast: null,
handDay: 0,
betDay: 0,
ladyUntil: 0,
soaked: false,
nightSwim: false,
nightFry: false,
fishLanded: 0,
contest: null,
angler: { rollDay: 0, here: false, doneDay: 0, met: false, trick: false, wins: 0, losses: 0 },
red: { rollDay: 0, here: false, doneDay: 0, met: false, visits: 0 }
}>>
<</if>>
<<if $locations.fishers_rest.lastVisitDay !== $time.day>>
<<set $locations.fishers_rest.waterCollectedToday to false>>
<<set $locations.fishers_rest.fishedToday to 0>>
<<set $locations.fishers_rest.lastVisitDay to $time.day>>
<</if>>
<<set $locations.fishers_rest.snaggedTop to false>>
<<set $locations.fishers_rest.pendingCast to null>>
<<set $locations.fishers_rest.soaked to false>>
<<set $locations.fishers_rest.nightSwim to false>>
<<set $locations.fishers_rest.nightFry to false>>
<<run setup.fishingGame.rollVisitEvents()>>
<<if !$locations.fishers_rest.visited>>
<<set $locations.fishers_rest.arrivalEncounter to null>>
<<goto "FishersRest_FirstVisit">>
<<else>>
<<set _encounterRoll to random(1, 100)>>
<<set $locations.fishers_rest.arrivalEncounter to (setup.fishingGame.eventsLeft() gt 0 && _encounterRoll lte setup.fishersRest.encounters.encounterChance)>>
<<if $locations.fishers_rest.arrivalEncounter>>
<<run setup.fishingGame.spendEvent()>>
<<goto "FishersRest_Encounter">>
<<else>>
<<goto "FishersRest_Hub">>
<</if>>
<</if>><<set $currentLocation to "fishers_rest">>
<<setBackground "fishers_rest/fishers_rest_lakeside">>
<<setTimeOfDay $time.phase>>
<<set $locations.fishers_rest.visited to true>>
<<set $mapExploration.visited.fishers_rest to true>>
<<journalAdd "Found an old fishing cabin by a lake today. Quiet. Peaceful. The water looks clean enough to collect, and there might be fish. Hard to believe places like this still exist. The previous owner left behind a journal - lived here alone for three years after everything fell apart. Three years of peace. That's more than most get." "discovery">>
<h2>Fisher's Rest</h2>
<<storyVideo "story/mv_fishers/first_visit">>
The path opens to reveal something unexpected - a small lake, its surface still and mirror-like, reflecting the sky above. At its edge sits a weathered cabin, half-hidden by overgrown reeds and wild shrubs.
It's... peaceful. The constant tension of the wasteland seems to ease here, replaced by the gentle lap of water against the shore and birdsong from the surrounding trees.
<<if setup.fishingGame.kiraAlong()>>
<<say "Kira" "Holy shit... I didn't think places like this still existed.">>
She steps forward, eyes wide as she takes in the scene.
<<say "Kira" "A lake. An actual fucking lake. And it looks... clean?">>
<</if>>
The cabin appears abandoned - the door hangs slightly open, and there's no smoke from the chimney. But someone lived here once. A fisherman, perhaps, who found their own little slice of paradise amid the chaos.
<div class="choice-container">
<<vchoice "Explore the cabin" "FishersRest_CabinExplore" "action" "search">>
<<vchoice "Check out the lake first" "FishersRest_LakeFirst" "action" "water">>
</div><<set $currentLocation to "fishers_rest">>
<<setBackground "fishers_rest/fishers_rest_dock_alt">>
<h2>The Lake</h2>
You approach the water's edge. The lake is larger than it first appeared - the far shore barely visible through a light mist that hovers over the surface. A wooden dock extends a few meters out, old but still sturdy.
The water itself is remarkably clear. You can see stones on the bottom near the shore, small fish darting between them.
<<if setup.fishingGame.kiraAlong()>>
<<say "Kira" "This water looks drinkable. Well, after we run it through the purifier back at the vault, anyway.">>
She crouches by the edge, trailing her fingers through the water.
<<say "Kira" "We should come back here. Regularly.">>
<</if>>
<div class="choice-container">
<<vchoice "Now explore the cabin" "FishersRest_CabinExplore" "action" "search">>
</div><<set $currentLocation to "fishers_rest">>
<<setBackground "fishers_rest/fishers_rest_cabin">>
<h2>The Cabin</h2>
<<if $locations.fishers_rest.cabinSearched>>
The cabin is as you left it - empty now, but still a good shelter if needed.
<div class="choice-container">
<<vchoice "Continue" "FishersRest_Hub" "move" "back">>
</div>
<<else>>
You push open the cabin door. Inside is a single room - a cot against one wall, a small wood stove, a table with a single chair. Dust motes float in the light streaming through a cracked window.
Someone lived here for a while. Alone, by the looks of it. There are personal touches - a faded photograph on the wall, marks on the doorframe counting days.
<<if setup.fishingGame.kiraAlong()>>
<<say "Kira" "Whoever lived here... they made it work. For a while, at least.">>
She picks up a journal from the table, flipping through it.
<<say "Kira" "There's writing in here. Might be worth reading later.">>
<</if>>
On the floor beside the cot, you spot a fishing rod - worn but functional.
<div class="choice-container">
<<vchoice "Search the cabin thoroughly" "FishersRest_CabinSearch" "action" "search">>
</div>
<</if>><<set $currentLocation to "fishers_rest">>
<<setBackground "fishers_rest/fishers_rest_cabin">>
<<advanceTime 0 20>>
<<set $locations.fishers_rest.cabinSearched to true>>
<h2>Cabin Search</h2>
You search the cabin carefully. The previous occupant left behind useful supplies:
<div class="loot-display">
<h4>Found:</h4>
<ul>
<<if setup.bagFits("player", "fishing rod", 1) gt 0>>
<<run setup.giveItem("fishing rod", 1)>>
<li><strong>Fishing Rod</strong> - Essential for lake fishing</li>
<<else>>
<<set $locations.fishers_rest.rodAtCabin to true>>
<li><strong>Fishing Rod</strong> - Essential for lake fishing. Your Backpack is full, so you leave it by the cabin door; you can fish with it here.</li>
<</if>>
<<for _loot range setup.fishersRest.cabinLoot.random>>
<<if random(1, 100) lte _loot.chance>>
<<set _qty to _loot.quantity || 1>>
<<set _got to setup.giveItem(_loot.id, _qty)>>
<li><<print _loot.name>> x<<print _qty>><<if _got.stored gt 0>> (<<print _got.stored>> to the vault storage: your Backpack is full)<</if>></li>
<</if>>
<</for>>
</ul>
</div>
<<if setup.fishersRest.cabinLoot.journal>>
You also find a worn journal. The entries tell the story of Marcus Chen - a survivor who found this place shortly after the Cataclysm. He lived here alone for three years, fishing, growing a small garden, avoiding the chaos of the outside world.
<div class="journal-entry">
<em>"Day 1,127. The lake provides. The world can burn, but here... here I have peace. I wonder sometimes if anyone else found their own piece of quiet. I hope so."</em>
</div>
The final entries are harder to read - the handwriting shaky, the words confused. Whatever happened to Marcus, his end came quietly here, in the place he loved.
<<if setup.fishingGame.kiraAlong()>>
<<say "Kira" "He had three years of peace. That's... that's more than most people get these days.">>
<</if>>
<</if>>
<<notify "success">>Cabin searched! Found a fishing rod and supplies.<</notify>>
<div class="choice-container">
<<vchoice "Continue" "FishersRest_Hub" "move" "back">>
</div><<set $currentLocation to "fishers_rest">>
<<setBackground "fishers_rest/fishers_rest_lakeside">>
<<setTimeOfDay $time.phase>>
<<if $locations.fishers_rest>><<set $locations.fishers_rest.snaggedTop to false>><<set $locations.fishers_rest.contest to null>><<set $locations.fishers_rest.soaked to false>><</if>>
<<if $locations.fishers_rest && $locations.fishers_rest.cabinSearched && !$locations.fishers_rest.rodAtCabin && !setup.ownsItem("fishing rod")>>
<<set $locations.fishers_rest.rodAtCabin to true>>
<</if>>
<h2>Fisher's Rest</h2>
The abandoned fishing cabin sits peacefully by the lake's edge. Sunlight sparkles on the water, and the air smells fresh - a stark contrast to the rest of the wasteland.
<<if setup.fishingGame.kiraAlong()>>
<<set _kira to $companions[0]>>
<<if _kira.trust gte 30>>
Kira seems more relaxed here than you've ever seen her.
<<else>>
Kira keeps watch, though even she seems affected by the tranquility.
<</if>>
<<if setup.fishingGame.kiraForfeit() === "naked">>
She's still stark naked from the bet, her clothes in a bundle on top of your pack, and she walks the shore like that, ass bare, not even pretending to look for cover.
<<elseif setup.fishingGame.kiraForfeit() === "top">>
Her top is still in your back pocket. Her tits are out in the breeze, nipples hard in the lake wind, and she catches you staring every single time.
<</if>>
<</if>>
<div class="location-options">
<h3>What do you want to do?</h3>
<div class="choice-container">
<<if !$locations.fishers_rest.waterCollectedToday>>
<<vchoice "Collect water from the lake" "FishersRest_CollectWater" "action" "water">>
<<else>>
<<vchoiceDisabled "Water already collected today" "action" "water">>
<</if>>
<<hasItem "fishing rod">>
<<if $hasItem || $locations.fishers_rest.rodAtCabin>>
<<if setup.fishingGame.nightTrip()>>
<<vchoice "Fish by firelight" "FishersRest_Night" "action" "fire">>
<<elseif $locations.fishers_rest.fishedToday lt setup.fishersRest.fishing.maxPerDay>>
<<vchoice "Go fishing" "FishingGame" "action" "fish">>
<<else>>
<<vchoiceDisabled "Already fished twice today" "action" "fish">>
<</if>>
<<else>>
<<vchoiceDisabled "Need a fishing rod to fish" "action" "fish">>
<</if>>
<<if setup.fishingGame.anglerHere()>>
<<vchoice `setup.fishingGame.anglerState().met ? "Tess is fishing across the cove" : "Across the cove, a woman is fishing topless"` "FishersRest_Angler" "action" "eye">>
<</if>>
<<if setup.fishingGame.redHere()>>
<<vchoice `setup.fishingGame.redState().met ? "Red's boat is at the pier" : "A redhead is struggling with a boat at the pier"` "FishersRest_Red" "action" "fish">>
<</if>>
<<if !$locations.fishers_rest.cabinSearched>>
<<vchoice "Search the cabin" "FishersRest_CabinSearch" "action" "search">>
<</if>>
<<if $locations.fishers_rest.rodAtCabin>>
<<if setup.bagFits("player", "fishing rod", 1) gt 0>>
<<vchoice "Take the fishing rod from the cabin" "FishersRest_TakeRod" "action" "fish">>
<<else>>
<<vchoiceDisabled "The fishing rod waits by the cabin door (Backpack full)" "action" "fish">>
<</if>>
<</if>>
<<vchoice "Rest by the lake" "FishersRest_Rest" "action" "rest">>
<<vchoice "Open map" "WorldMap_View" "move" "map">>
<<vchoice "Return to vault" "Journey_ReturnToVault" "move" "house">>
</div>
</div><<set $currentLocation to "fishers_rest">>
<<setBackground "fishers_rest/fishers_rest_cabin">>
<<run setup.giveItem("fishing rod", 1)>>
<<set $locations.fishers_rest.rodAtCabin to false>>
You take the old fishing rod from beside the cabin door and stow it in your Backpack.
<div class="choice-container">
<<vchoice "Continue" "FishersRest_Hub" "move" "back">>
</div><<set $currentLocation to "fishers_rest">>
<<setBackground "fishers_rest/fishers_rest_lakeside">>
<<advanceTime 0 setup.fishersRest.water.timeCost>>
<<set $locations.fishers_rest.waterCollectedToday to true>>
<h2>Collecting Water</h2>
You make your way to the lake's edge with empty containers. The water is cool and clear - far cleaner than anything you'd find elsewhere in the wasteland, though it still needs purification.
<<if setup.fishingGame.kiraAlong()>>
<<set _waterAmount to random(setup.fishersRest.water.companionMin, setup.fishersRest.water.companionMax)>>
Kira helps you fill the containers, working efficiently.
<<say "Kira" "This is so much better than digging through ruins for sealed bottles.">>
<<else>>
<<set _waterAmount to random(setup.fishersRest.water.soloMin, setup.fishersRest.water.soloMax)>>
<</if>>
<<run setup.fightLootStart()>>
<<run setup.postBattleTakeLoot("dirty water", "Dirty Water", _waterAmount, "", "fightLoot")>>
<div class="loot-display">
<h4>Collected:</h4>
<ul>
<li>Dirty Water x<<print _waterAmount>></li>
</ul>
<p class="info-text">Take this back to the vault kitchen to purify it.</p>
</div>
<<lootLeftList "fightLoot">>
<<notify "success">>Collected <<print _waterAmount>> dirty water!<</notify>>
<div class="choice-container">
<<if previous() === "FishersRest_Cabin_Truce">>
<<vchoice "Leave" "WorldMap_View" "move" "map">>
<<else>>
<<vchoice "Continue" "FishersRest_Hub" "move" "back">>
<</if>>
</div><<set $currentLocation to "fishers_rest">>
<<setBackground "fishers_rest/fishers_rest_lakeside">>
<<advanceTime 1 0>>
<<set $player.energy to Math.min($player.maxEnergy, $player.energy + 15)>>
<<set $player.health to Math.min($player.maxHealth, $player.health + 10)>>
<<if setup.fishingGame.kiraAlong()>><<set $companions[0].health to Math.min($companions[0].maxHealth, $companions[0].health + 10)>><</if>>
<h2>Resting by the Lake</h2>
You find a comfortable spot by the water's edge and just... sit. Watch the light play across the surface. Listen to the birds. Breathe.
It's strange how rare moments like this have become. Time to do nothing. Time to just exist.
<<if setup.fishingGame.kiraAlong()>>
Kira joins you, settling down nearby. For once, she's not scanning for threats or checking weapons. She's just... present.
<<say "Kira" "We should come back here. When we can. It's good to remember that not everything out there is trying to kill us.">>
<<relationChange "kira" "affection" 1>>
<</if>>
<<notify "success">>Rested. Health +10, Energy +15<</notify>>
<div class="choice-container">
<<vchoice "Continue" "FishersRest_Hub" "move" "back">>
</div><<set $currentLocation to "fishers_rest">>
<<setBackground "fishers_rest/fishers_rest_lakeside">>
<<setTimeOfDay $time.phase>>
<<set _totalWeight to 0>>
<<for _type, _config range setup.fishersRest.encounters.types>>
<<set _totalWeight += _config.weight>>
<</for>>
<<set _roll to random(1, _totalWeight)>>
<<set _currentWeight to 0>>
<<set _selectedType to "">>
<<for _type, _config range setup.fishersRest.encounters.types>>
<<set _currentWeight += _config.weight>>
<<if _roll lte _currentWeight && _selectedType eq "">>
<<set _selectedType to _type>>
<</if>>
<</for>>
<<set $fishersRestEncounter to {
type: _selectedType,
config: setup.fishersRest.encounters.types[_selectedType]
}>>
<<switch _selectedType>>
<<case "bathing_raiders">>
<<goto "FishersRest_Enc_BathingRaiders">>
<<case "cabin_occupied">>
<<goto "FishersRest_Enc_CabinOccupied">>
<<case "water_ambush">>
<<goto "FishersRest_Enc_WaterAmbush">>
<<case "lone_bather">>
<<goto "FishersRest_Enc_LoneBather">>
<<case "fishing_trap">>
<<goto "FishersRest_Enc_FishingTrap">>
<<default>>
<<goto "FishersRest_Hub">>
<</switch>><<set $currentLocation to "fishers_rest">>
<<setBackground "fishers_rest/fishers_rest_lakeside">>
<h2>Occupied Waters</h2>
You approach Fisher's Rest, expecting the usual tranquil scene. Instead, you freeze at the treeline.
The lake is not empty.
<<storyVideo "story/fishers_bathing_voyeur/fishers_rest_enc_bathing_raiders">>
<<set _raiderCount to random($fishersRestEncounter.config.minEnemies, $fishersRestEncounter.config.maxEnemies)>>
<<set $fishersRestEncounter.raiderCount to _raiderCount>>
<<if _raiderCount eq 2>>
Two women are in the water near the dock - raiders, by the look of their discarded clothing and weapons on the shore. They're bathing, washing off the grime of wasteland life, completely unaware of your presence.
<<else>>
Three women splash in the shallows - raiders, their discarded weapons and clothing visible on the shore. They're laughing, relaxed, taking advantage of the clean water.
<</if>>
<<if setup.fishingGame.kiraAlong()>>
Kira's hand goes to her weapon, but she doesn't draw.
<<say "Kira" "Raiders. But they don't see us. We could take them by surprise... or...">>
She glances at you, a hint of something else in her expression.
<<say "Kira" "Or we could try something else. They look... relaxed.">>
<</if>>
<div class="choice-container">
<<vchoice "Approach openly" "FishersRest_Bathing_Approach" "action" "wave">>
<<vchoice "Sneak closer to observe" "FishersRest_Bathing_Observe" "action" "stealth">>
<<vchoice "Attack while they're vulnerable" "FishersRest_Bathing_Attack" "action" "attack">>
<<vchoice "Leave quietly" "WorldMap_View" "move" "back">>
</div><<setBackground "fishers_rest/fishers_rest_lakeside">>
<h2>Watching</h2>
You move quietly through the brush, finding a concealed position with a clear view of the lake.
<<storyVideo "story/fishers_bathing_voyeur/observe">>
<<if _storyClip is "66cdff79d115">>The raiders are young - early twenties, perhaps. Lean, sun-darkened, down to scraps of thong bikini that the surf keeps dragging up their cracks. Kneeling in the wash, splashing each other and shrieking, they look less like raiders than like two girls who stole an afternoon off.<<else>>The raiders are young - early twenties, perhaps. Their bodies bear the marks of wasteland life - scars, lean muscle, sun-darkened skin. But here, in the water, they seem almost... normal. Just women enjoying a rare moment of peace.<</if>>
<<if $fishersRestEncounter.raiderCount eq 2>>
<<if _storyClip is "66cdff79d115">>They kneel in the shallows side by side, wet thongs riding up their asses. One splashes the other, then twists her long wet hair and wrings it out over her shoulder.<<else>>One of them floats on her back, breasts breaking the surface, eyes closed. The other wades waist-deep, running her fingers through wet hair.<</if>>
<<else>>
They take turns dunking each other, shrieking with laughter. One floats lazily while another scrubs her companion's back.
<</if>>
<<if setup.fishingGame.kiraAlong()>>
Kira watches beside you, her breathing slightly quickened.
<<say "Kira" "They're just... people. Like us.">>
A pause.
<<say "Kira" "That water does look good...">>
<</if>>
<div class="choice-container">
<<vchoice "Step out and approach" "FishersRest_Bathing_Approach" "action" "wave">>
<<vchoice "Keep watching" "FishersRest_Bathing_Watch" "action" "eye">>
<<vchoice "Attack now" "FishersRest_Bathing_Attack" "action" "attack">>
</div><<setBackground "fishers_rest/fishers_rest_lakeside">>
<<addLust "player" 5>>
<h2>Watching...</h2>
You continue to observe, telling yourself it's tactical surveillance. The raiders are completely at ease, unaware of their audience.
<<storyVideo "story/fishers_bathing_voyeur/watch">>
<<if $fishersRestEncounter.raiderCount gte 3>>
One of the women wades toward the shore, water streaming from her naked body. She stretches in the sunlight, apparently enjoying the warmth, before calling something to her companions that makes them laugh.
<<else>>
<<if _storyClip is "de25fcb6b2af">>One of them stands suddenly, water cascading from her skin. She says something to her companion that makes them both laugh, then they come up out of the water hand in hand, scraps of bikini clinging, and walk up the sand between the rocks - straight toward your hiding place.<<else>>The woman floating on her back stands suddenly, water cascading from her skin. She says something to her companion that makes them both laugh, then both women begin wading toward shore.<</if>>
<</if>>
<<if setup.fishingGame.kiraAlong()>>
<<set _kira to $companions[0]>>
<<if setup.fishingGame.exhibTier("kira") gte 2>>
Kira shifts beside you, and you notice her thighs pressed together.
<<say "Kira" "We should... we should either join them or leave. This feels...">>
She doesn't finish the thought.
<<else>>
<<say "Kira" "We've seen enough. What's the plan?">>
<</if>>
<</if>>
<div class="choice-container">
<<vchoice "Reveal yourself now" "FishersRest_Bathing_Approach" "action" "wave">>
<<vchoice "Wait until they notice you" "FishersRest_Bathing_Spotted" "action" "wait">>
</div><<setBackground "fishers_rest/fishers_rest_lakeside">>
<h2>Spotted!</h2>
One of the raiders glances toward the treeline - and freezes. Her eyes lock with yours.
"WE'VE GOT COMPANY!"
<<storyVideo "story/fishers_bathing_voyeur/spotted">>
The peaceful scene shatters. The women scramble for the shore, but their weapons are too far. <<if _storyClip is "b94e94a431c1">>They drop to their knees in the wash and freeze there, two black shapes against the sun, one gripping the other's arm, both staring at the treeline.<<else>>They freeze, naked and exposed, hands raised defensively.<</if>>
<<set _angryRoll to random(1, 100)>>
<<if _angryRoll lte $fishersRestEncounter.config.angryChance>>
<div class="choice-container">
<<vchoice "Continue" "FishersRest_Bathing_Angry" "action" "forward">>
</div>
<<else>>
<div class="choice-container">
<<vchoice "Continue" "FishersRest_Bathing_Nervous" "action" "forward">>
</div>
<</if>><<setBackground "fishers_rest/fishers_rest_lakeside">>
<h2>Making Contact</h2>
<<storyVideo "story/fishers_bathing_voyeur/spotted">>
You step out of the treeline with your hands visible, trying to appear non-threatening. <<if _storyClip is "b94e94a431c1">>The reaction is immediate - startled gasps; both women jerk up onto their knees in the shallows and freeze, one clutching the other's arm.<<else>>The reaction is immediate - startled gasps, splashing as they try to cover themselves.<</if>>
"Who the fuck—"
"Don't move! I'll—" One of them starts toward the weapons on shore, but realizes she won't make it.
You hold your ground, keeping your voice calm. "Not looking for trouble. Just came here for the water."
<<set _angryRoll to random(1, 100)>>
<<if _angryRoll lte $fishersRestEncounter.config.angryChance>>
<div class="choice-container">
<<vchoice "Continue" "FishersRest_Bathing_Angry" "action" "forward">>
</div>
<<else>>
<div class="choice-container">
<<vchoice "Continue" "FishersRest_Bathing_Nervous" "action" "forward">>
</div>
<</if>><<setBackground "fishers_rest/fishers_rest_lakeside">>
<h2>Tense Standoff</h2>
<<storyVideo "story/fishers_bathing_voyeur/nervous">>
The women exchange glances. Without their weapons, without clothes, they're vulnerable and they know it. But you haven't attacked.
<<if $fishersRestEncounter.raiderCount gte 3>>
The apparent leader - a dark-haired woman with a scar across her shoulder - speaks first.
"You could've jumped us. Didn't."
<<else>>
The taller of the two women narrows her eyes.
"You're not attacking. Why?"
<</if>>
<<if setup.fishingGame.kiraAlong()>>
<<say "Kira" "Because we're not assholes? The lake's big enough to share.">>
<<else>>
"Because I'm not an asshole. The lake's big enough to share."
<</if>>
<<if _storyClip is "5d48e796175b">>A long pause. Then one of them snorts, the other laughs, and the standoff breaks: they sink back chest-deep in the clear water, tits bare, and splash at you.<<else>>A long pause. Then, slowly, the tension begins to drain from their postures.<</if>>
"The water IS big enough to share," one of them says, a hint of something else in her voice. "If you wanted to... join us?"
<<if setup.fishingGame.kiraAlong()>>
Kira looks at you, eyebrows raised. This is your call.
<</if>>
<div class="choice-container">
<<vchoice "Accept the invitation" "FishersRest_Bathing_Join" "action" "heart">>
<<vchoice "Politely decline" "FishersRest_Bathing_Decline" "action" "wave">>
<<vchoice "This is a trick - attack!" "FishersRest_Bathing_AttackNaked" "action" "attack">>
</div><<setBackground "fishers_rest/fishers_rest_lakeside">>
<h2>Hostile!</h2>
"YOU FUCKING CREEPS!"
The mood shifts instantly. Despite their vulnerability, the raiders' fear turns to rage. One of them grabs a rock from the shallows.
"Think you can just spy on us?! I'll tear your fucking eyes out!"
They charge, naked and unarmed but furious.
<<if setup.fishingGame.kiraAlong()>>
<<say "Kira" "Shit! Here they come!">>
<</if>>
<div class="choice-container">
<<vchoice "Fight them off" "FishersRest_Bathing_CombatStart" "action" "attack">>
<<vchoice "Try to calm them down" "FishersRest_Bathing_Calm" "action" "speech">>
<<vchoice "Run!" "WorldMap_View" "action" "run">>
</div><<setBackground "fishers_rest/fishers_rest_lakeside">>
<h2>Failed Diplomacy</h2>
<<if setup.fishingGame.kiraAlong()>>"Wait! We don't want to—"<<else>>"Wait! I don't want to—"<</if>>
A rock catches you in the shoulder. They're not listening.
<<set $player.health -= 5>>
<<notify "warning">>Hit by thrown rock! -5 health<</notify>>
The raiders are upon you, bare hands and fury.
<div class="choice-container">
<<vchoice "Continue" "FishersRest_Bathing_CombatStart" "action" "forward">>
</div><<setBackground "fishers_rest/fishers_rest_lakeside">>
<h2>Ambush!</h2>
You burst from cover, weapon ready. The raiders scream in shock, scrambling for the shore.
But they won't reach their weapons in time.
<div class="choice-container">
<<vchoice "Continue" "FishersRest_Bathing_CombatStart" "action" "forward">>
</div><<setBackground "fishers_rest/fishers_rest_lakeside">>
<h2>Betrayal!</h2>
You draw your weapon. Their expressions shift from hope to horror as they realize the invitation was their last mistake.
<<if setup.fishingGame.kiraAlong()>>
<<say "Kira" "Cold. But practical, I guess.">>
<</if>>
<div class="choice-container">
<<vchoice "Continue" "FishersRest_Bathing_CombatStart" "action" "forward">>
</div><<setBackground "fishers_rest/fishers_rest_lakeside">>
<<set $combat to {
active: true,
companionInCombat: setup.fishingGame.fightCompanion(),
enemies: [],
turn: 1,
phase: "player",
victoryPassage: "FishersRest_Bathing_Victory", defeatPassage: "FishersRest_Bathing_Defeat"
}>>
<<for _i to 0; _i lt $fishersRestEncounter.raiderCount; _i++>>
<<set _enemy to {
id: "naked_raider_" + _i,
name: "Naked Raider",
health: 25,
maxHealth: 25,
damage: 5,
dodge: 10,
armor: 0,
lust: 30,
maxLust: 100,
lustResistance: 15,
weapon: "fists",
isHuman: true,
gender: "female",
naked: true,
position: "standing",
visualGroup: "predatory",
clothing: { top: 0, bottom: 0, underwear: 0, titsExposed: true, pussyExposed: true, assExposed: true, topDamage: 100, bottomDamage: 100 }
}>>
<<run $combat.enemies.push(_enemy)>>
<</for>>
<<goto "Combat_Start">><<setBackground "fishers_rest/fishers_rest_lakeside">>
<<set $currentLocation to "fishers_rest">>
<h2>Victory</h2>
<<storyVideo "story/fishers_bathing_victory/bathing_victory">>
<<if _storyClip is "df88ef611756">>The raiders lie defeated, their naked bodies sprawled on the shore. The last one slumps back against the stone edge in the shallows, legs spread, nothing on but a torn scrap of red string, and flashes you a smile and a little wave instead of a fight. Without weapons or armor, they never stood a chance.<<else>>The raiders lie defeated, their naked bodies sprawled on the shore. Without weapons or armor, they never stood a chance.<</if>>
<<if setup.fishingGame.kiraAlong()>>
Kira looks down at them, expression unreadable.
<<say "Kira" "That was... almost too easy. They really thought they could take us with their bare hands.">>
<</if>>
<div class="choice-container">
<<vchoice "Leave them and continue" "FishersRest_Hub" "move" "back">>
<<vchoice "Take advantage of the situation..." "FishersRest_Victory_BathingRaiders" "action" "heart">>
</div><<setBackground "fishers_rest/fishers_rest_lakeside">>
<h2>Declined</h2>
<<if setup.fishingGame.kiraAlong()>>You shake your head. "Thanks, but we'll just wait our turn. Take your time."<<else>>You shake your head. "Thanks, but I'll just wait my turn. Take your time."<</if>>
The raiders exchange glances - surprised, maybe a little disappointed.
"Suit yourself." The leader shrugs, then turns back to the water. "We'll be done soon."
<<if setup.fishingGame.kiraAlong()>>
<<say "Kira" "Really? You're just... no? Okay then.">>
She looks back at the water, then sighs.
<<say "Kira" "Your call.">>
<</if>>
<<storyVideo "story/fishers_bathing_voyeur/decline">>
<<if _storyClip is "9557aab02591">>True to their word, the raiders finish up within half an hour and walk off along the empty beach hand in hand, bikinis back on. At the water's edge one of them pulls the other round to face her and says something that makes her laugh; neither looks back.<<else>>True to their word, the raiders finish up within half an hour, dressing and gathering their weapons before heading out. One of them gives you a lingering look before disappearing into the trees.<</if>>
<<notify "info">>The raiders have left. The lake is yours.<</notify>>
<div class="choice-container">
<<vchoice "Continue" "FishersRest_Hub" "move" "back">>
</div><<set $currentLocation to "fishers_rest">>
<<setBackground "fishers_rest/fishers_rest_lakeside">>
<h2>Unwelcome Guests</h2>
Smoke rises from the cabin's chimney. Someone's inside.
You approach carefully, staying low. Through the window, you can see movement - raiders, making themselves at home in Marcus's old cabin.
<<set _raiderCount to random($fishersRestEncounter.config.minEnemies, $fishersRestEncounter.config.maxEnemies)>>
<<set $fishersRestEncounter.raiderCount to _raiderCount>>
<<if _raiderCount gte 3>>
At least three of them, armed and at ease. They've been here a while - bedrolls laid out, supplies unpacked.
<<else>>
Two raiders, both women, lounging inside. Their weapons are within reach, but they seem relaxed.
<</if>>
<<if setup.fishingGame.kiraAlong()>>
<<say "Kira" "They've set up camp. We could try to talk our way in... or clear them out.">>
<</if>>
<div class="choice-container">
<<vchoice "Knock on the door" "FishersRest_Cabin_Knock" "action" "wave">>
<<vchoice "Burst in, weapons ready" "FishersRest_Cabin_Attack" "action" "attack">>
<<vchoice "Observe and wait" "FishersRest_Cabin_Wait" "action" "eye">>
<<vchoice "Leave - not worth the risk" "WorldMap_View" "move" "back">>
</div><<setBackground "fishers_rest/fishers_rest_neutral">>
<h2>Negotiation</h2>
You approach the door openly and knock. The reaction inside is immediate - scrambling, weapons being drawn.
"Who the fuck is it?!"
"Traveler! Looking to share the lake, not looking for trouble!"
A long pause. Then the door cracks open, a blade visible in the gap.
"How many of you?"
<<if setup.fishingGame.kiraAlong()>>
"Two."
<<else>>
"Just me."
<</if>>
Another pause. Then the door opens wider. A scarred woman eyes you up and down.
"Lake's free. Cabin's ours. That work for you?"
<div class="choice-container">
<<vchoice "That works fine" "FishersRest_Cabin_Truce" "action" "handshake">>
<<vchoice "Actually, I want the cabin too" "FishersRest_Cabin_Attack" "action" "attack">>
</div><<setBackground "fishers_rest/fishers_rest_lakeside">>
<h2>Uneasy Truce</h2>
An agreement is reached. You have access to the lake; they keep the cabin. It's not ideal, but it's practical.
<<if setup.fishingGame.kiraAlong()>>
<<say "Kira" "Not how I pictured this going, but I'll take it over a fight.">>
<</if>>
The raiders watch you from the cabin as you collect water, never quite relaxing their guard. But they don't interfere.
<<notify "info">>Truce established. You can use the lake, but the cabin is off-limits today.<</notify>>
<div class="choice-container">
<<vchoice "Collect water and leave" "FishersRest_CollectWater" "action" "water">>
</div><<setBackground "fishers_rest/fishers_rest_lakeside">>
<<advanceTime 1 0>>
<h2>Patience</h2>
You settle into a concealed position and wait. Hours pass.
Eventually, the raiders emerge from the cabin. They gather their things, having apparently decided to move on.
"—too exposed here. Better to find somewhere more defensible."
They head off into the wasteland, leaving the cabin empty once more.
<<notify "success">>The raiders have left.<</notify>>
<div class="choice-container">
<<vchoice "Continue" "FishersRest_Hub" "move" "back">>
</div><<setBackground "fishers_rest/fishers_rest_lakeside">>
<h2>Assault!</h2>
<<if setup.fishingGame.kiraAlong()>>
<<say "Kira" "Alright, let's do this!">>
<</if>>
You burst through the door, catching them off-guard!
<<set $combat to {
active: true,
companionInCombat: setup.fishingGame.fightCompanion(),
enemies: [],
turn: 1,
phase: "player",
victoryPassage: "FishersRest_Cabin_Victory", defeatPassage: "FishersRest_Defeat_CabinOccupied"
}>>
<<for _i to 0; _i lt $fishersRestEncounter.raiderCount; _i++>>
<<set _gender to "female">>
<<set _enemy to {
id: "cabin_raider_" + _i,
name: _gender eq "female" ? "Raider Woman" : "Raider",
health: 35,
maxHealth: 35,
damage: 8,
dodge: 15,
armor: 5,
lust: 0,
maxLust: 100,
weapon: "machete",
isHuman: true,
gender: _gender,
clothing: { topDamage: 0, bottomDamage: 0 }
}>>
<<run $combat.enemies.push(_enemy)>>
<</for>>
<div class="choice-container">
<<vchoice "Continue" "Combat_Start" "action" "forward">>
</div><<setBackground "fishers_rest/fishers_rest_lakeside">>
<<set $currentLocation to "fishers_rest">>
<h2>Cabin Cleared</h2>
The raiders lie defeated. The cabin is yours again.
<<if setup.fishingGame.kiraAlong()>>
<<say "Kira" "That's that. Cabin's ours.">>
<</if>>
<<run setup.fightLootStart()>>
<<set _frl to [setup.postBattleTakeLoot("scrap metal", "Scrap Metal", 2, "", "fightLoot"), setup.postBattleTakeLoot("dirty water", "Dirty Water", 2, "", "fightLoot")]>>
<div class="loot-display">
<h4>Looted from raiders:</h4>
<ul>
<<for _frli range _frl>><li><<print _frli>></li><</for>>
</ul>
</div>
<<lootLeftList "fightLoot">>
<div class="choice-container">
<<vchoice "Continue" "FishersRest_Hub" "move" "back">>
<<vchoice "Take advantage of the defeated raiders..." "FishersRest_Victory_CabinOccupied" "action" "heart">>
</div><<set $currentLocation to "fishers_rest">>
<<setBackground "fishers_rest/fishers_rest_lakeside">>
<h2>Ambush!</h2>
You approach the lake as usual, focused on the water. That's when they strike.
"DON'T FUCKING MOVE!"
<<storyVideo "story/fishers_ambush_defeat/fishers_rest_enc_water_ambush">>
<<if _storyClip is "dc410f81b86f">>Women rise out of the reeds - raiders, naked and caked in mud, spears levelled at you. Behind them more of the band waits around a smoking fire on the shore. They were waiting - using the lake as bait.<<else>>Raiders emerge from the brush, weapons trained on you. They were waiting - using the lake as bait.<</if>>
<<set _raiderCount to random($fishersRestEncounter.config.minEnemies, $fishersRestEncounter.config.maxEnemies)>>
<<set $fishersRestEncounter.raiderCount to _raiderCount>>
<<if setup.fishingGame.kiraAlong()>>
Kira is grabbed from behind, a knife at her throat.
"Drop your weapons. Both of you."
<</if>>
<div class="choice-container">
<<vchoice "Surrender" "FishersRest_Ambush_Surrender" "action" "submit">>
<<vchoice "Fight back!" "FishersRest_Ambush_Fight" "action" "attack">>
<<vchoice "Try to talk your way out" "FishersRest_Ambush_Talk" "action" "speech">>
</div><<setBackground "fishers_rest/fishers_rest_lakeside">>
<h2>Captured</h2>
You drop your weapons. The raiders move in quickly, binding your hands.
"Smart choice. Now let's see what you've got..."
<div class="choice-container">
<<vchoice "Continue" "FishersRest_Defeat_WaterAmbush" "action" "forward">>
</div><<setBackground "fishers_rest/fishers_rest_lakeside">>
<h2>Negotiation Attempt</h2>
"Wait! We can work something out—"
The raider leader laughs. "Yeah? What've you got that I can't just take?"
<<set _charmRoll to random(1, 100)>>
<<if _charmRoll lte ($player.charm * 2)>>
<div class="choice-container">
<<vchoice "Continue" "FishersRest_Ambush_TalkSuccess" "action" "forward">>
</div>
<<else>>
"Nothing convincing," she decides. "Take them."
<div class="choice-container">
<<vchoice "Continue" "FishersRest_Defeat_WaterAmbush" "action" "forward">>
</div>
<</if>><<setBackground "fishers_rest/fishers_rest_lakeside">>
<h2>Smooth Talker</h2>
Something in your words gives her pause. Maybe it's the promise of supplies, or the implication of allies nearby. Either way, she hesitates.
"You've got a tongue on you." She lowers her weapon slightly. "Alright. Leave your pack and go. Don't come back today."
It's not ideal, but it's better than the alternative.
<<set _lostScrap to Math.min($vault.scrap, 5)>>
<<set $vault.scrap -= _lostScrap>>
<div class="loot-display">
<h4>Lost:</h4>
<ul>
<li>Scrap x<<print _lostScrap>></li>
</ul>
</div>
<<notify "warning">>You escaped, but lost some supplies.<</notify>>
<div class="choice-container">
<<vchoice "Leave" "WorldMap_View" "move" "back">>
</div><<setBackground "fishers_rest/fishers_rest_lakeside">>
<h2>Fighting Back!</h2>
<<if setup.fishingGame.kiraAlong()>>
Kira throws her head back, catching her captor's nose. In the confusion, you draw your weapon.
<<say "Kira" "Let's go!">>
<</if>>
<<set $player.health to Math.max(1, $player.health - 10)>>
<<notify "warning">>Ambush! -10 health<</notify>>
<<set $combat to {
active: true,
companionInCombat: setup.fishingGame.fightCompanion(),
enemies: [],
turn: 1,
phase: "player",
victoryPassage: "FishersRest_Ambush_Victory", defeatPassage: "FishersRest_Defeat_WaterAmbush"
}>>
<<for _i to 0; _i lt $fishersRestEncounter.raiderCount; _i++>>
<<set _enemy to {
id: "ambush_raider_" + _i,
name: "Raider Woman",
health: 30,
maxHealth: 30,
damage: 8,
dodge: 20,
armor: 5,
lust: 0,
maxLust: 100,
weapon: "combat knife",
isHuman: true,
gender: "female",
clothing: { topDamage: 0, bottomDamage: 0 }
}>>
<<run $combat.enemies.push(_enemy)>>
<</for>>
<div class="choice-container">
<<vchoice "Continue" "Combat_Start" "action" "forward">>
</div><<setBackground "fishers_rest/fishers_rest_lakeside">>
<<set $currentLocation to "fishers_rest">>
<h2>Tables Turned</h2>
The ambushers become the ambushed. They didn't expect you to fight back - certainly not this effectively.
<<if setup.fishingGame.kiraAlong()>>
Kira wipes blood from her lip, grinning fiercely.
<<say "Kira" "Thought they had us. Fucking amateurs.">>
<</if>>
<div class="choice-container">
<<vchoice "Continue to the lake" "FishersRest_Hub" "move" "back">>
<<vchoice "Show them what happens to ambushers..." "FishersRest_Victory_WaterAmbush" "action" "heart">>
</div><<set $currentLocation to "fishers_rest">>
<<setBackground "fishers_rest/fishers_rest_lakeside">>
<<if !$fishersRestEncounter>><<set $fishersRestEncounter to { type: "lone_bather" }>><</if>>
<<set $fishersRestEncounter.raiderCount to 1>>
<<set _snag to $locations.fishers_rest && $locations.fishers_rest.snaggedTop>>
<<if _snag>>
<h2>Something Snagged</h2>
<<storyVideo "story/fishers_lone_snag/snagged_top">>
<<if _storyClip is "4efb6d7a6742">>That's her. A minute ago she was wading through the shallows in a little black bikini, minding her own business, when your cast came down right beside her and the hook caught the string between her tits. You reeled on reflex. The knot gave.<<else>>Out past the end of the dock, a woman is standing in the water. A minute ago she had a bikini top on. Then your cast came down right beside her, the hook caught the string, and you reeled on reflex.<</if>>
Now she's chest-deep, one arm clamped across her tits and failing, and her top is dripping off the end of your rod.
"Hey! Asshole with the rod!" She glares up at the dock. "You planning to give that back, or do I have to come up there and take it?"
<<set _sc to setup.fishingGame.companion()>>
<<if _sc && _sc.id === "kira">>
Kira snorts beside you.
<<say "Kira" "Oh, she's definitely coming up here.">>
<<elseif _sc>>
<<say _sc.name "I think she means you.">>
<<else>>
There's nobody around to laugh at you. That's something.
<</if>>
<div class="choice-container">
<<vchoice 'Hold it up: "Looking for this?"' "FishersRest_Lone_CallOut" "action" "wave">>
<<vchoice "Make her come and get it" "FishersRest_Lone_Flirt" "action" "heart">>
<<vchoice "Keep it and enjoy the view" "FishersRest_Lone_Watch" "action" "eye">>
<<vchoice "Toss it back to her and go" "FishersRest_Hub" "move" "back">>
</div>
<<else>>
<h2>Unexpected Company</h2>
<<storyVideo "story/fishers_lone_voyeur/fishers_rest_enc_lone_bather">>
<<if _storyClip is "ad2fa003218c">>The lake isn't empty. A single figure stands waist-deep in the water - a young woman, her back to you, splashing water up her arms. Once she turns toward the shore, laughing at nothing, bare tits catching the light - then turns away again.<<else>>The lake isn't empty. A single figure stands waist-deep in the water - a young woman, her back to you, washing herself in the shallows.<</if>>
Raider, by the look of her clothing discarded on the shore. But alone, unarmed, and completely unaware of your presence.
<<if setup.fishingGame.kiraAlong()>>
<<say "Kira" "Just one. And she hasn't seen us.">>
Kira's voice is quiet, her eyes on the woman's bare back.
<<say "Kira" "What's the play?">>
<</if>>
<div class="choice-container">
<<vchoice "Call out to her" "FishersRest_Lone_CallOut" "action" "wave">>
<<vchoice "Sneak up on her" "FishersRest_Lone_Sneak" "action" "stealth">>
<<vchoice "Watch quietly" "FishersRest_Lone_Watch" "action" "eye">>
<<vchoice "Leave her be" "WorldMap_View" "move" "back">>
</div>
<</if>><<setBackground "fishers_rest/fishers_rest_lakeside">>
<<set _snag to $locations.fishers_rest && $locations.fishers_rest.snaggedTop>>
<h2>Announcement</h2>
<<if _snag>>You hold her top up, dripping, like a white flag. "Looking for this?"<<else>>"Hey! Don't be alarmed!"<</if>>
<<storyVideo "story/fishers_lone_voyeur/call_out__call_out">>
<<if _snag>>She wades closer, arms crossed over her chest, eyes narrowed.
"Give it here. Slowly."
"Wasn't aiming for you. Honest. Just wanted to use the lake."<<else>>She whirls, arms crossing over her chest, eyes wide with fear.
"Who— stay back!"
"Not here to hurt you. Just wanted to use the lake."<</if>>
She backs toward the shore, clearly calculating her chances of reaching her weapon. Then she pauses, really looking at you.
"You're... not raiders?"
<div class="choice-container">
<<vchoice "No. Are you?" "FishersRest_Lone_Talk" "action" "speech">>
<<vchoice "Does it matter?" "FishersRest_Lone_Flirt" "action" "heart">>
</div><<setBackground "fishers_rest/fishers_rest_lakeside">>
<h2>Not What She Seems</h2>
<<storyVideo "story/fishers_lone_voyeur/talk">>
"Was." She relaxes slightly, though she doesn't lower her guard. "Left the crew three days ago. Looking for something better."
<<if setup.fishingGame.kiraAlong()>>
<<say "Kira" "Alone in the wasteland? That's a death sentence.">>
<</if>>
<<if _storyClip is "fef684dff6d9">>"Better than staying with them." She shrugs, waist-deep in the water again, hands on her bare hips, then half-turns away from you. "You're the first people I've met who didn't immediately try to kill or capture me."<<else>>"Better than staying with them." She shrugs, still half-submerged. "You're the first people I've met who didn't immediately try to kill or capture me."<</if>>
<<if _storyClip is "fef684dff6d9">>She turns her shoulder to you and looks off at the rocks, and for a second she's just a girl with nobody left to talk to.<<else>>There's something vulnerable in her expression. Lonely.<</if>>
<div class="choice-container">
<<vchoice "Join you for a swim?" "FishersRest_Lone_Join" "action" "heart">>
<<vchoice "Good luck out there" "FishersRest_Hub" "move" "back">>
</div><<setBackground "fishers_rest/fishers_rest_lakeside">>
<h2>Flirtation</h2>
<<storyVideo "story/fishers_lone_voyeur/flirt">>
<<set _snag to $locations.fishers_rest && $locations.fishers_rest.snaggedTop>>
<<if _snag>>You let her top dangle from one finger. "Come and get it."
She tilts her head, a slight smile breaking through the glare.
"Is that how it is? You want me to climb up there with my tits out?"<<else>>"Does it matter? You're here, I'm here. Lake's big enough for both of us."
She tilts her head, a slight smile breaking through her fear.
"Is that what this is? You just want to... share the water?"<</if>>
"Unless you have other ideas."
<<if setup.fishingGame.kiraAlong()>>
Kira makes a small sound - surprise, or something else.
<</if>>
<<if _storyClip is "bab6c5a44f48">>The woman laughs - genuine, surprised. She dragged her orange top on while you talked; now she hooks the straps down, lets her tits spill out and doesn't bother covering them.<<else>>The woman laughs - genuine, surprised.<</if>>
"You're bold. I like that."
<div class="choice-container">
<<vchoice "Join her in the water" "FishersRest_Lone_Join" "action" "heart">>
<<vchoice "Actually, just here for water" "FishersRest_Hub" "move" "back">>
</div><<setBackground "fishers_rest/fishers_rest_lakeside">>
<<addLust "player" 10>>
<h2>Watching</h2>
<<storyVideo "story/fishers_lone_voyeur/call_out__watch">>
<<set _snag to $locations.fishers_rest && $locations.fishers_rest.snaggedTop>>
<<if _snag>><<if _storyClip is "b16871a7c302">>You don't hide; there's no point. She knows exactly where you are and exactly what you're holding. She's mid-twenties, perhaps, with the lean body of a wasteland survivor and full, heavy tits, and she ducks under and swims a few lazy strokes, making a point of ignoring you.<<else>>You don't hide; there's no point. She knows exactly where you are and exactly what you're holding, and she makes a point of ignoring you while she washes.<</if>><<else>><<if _storyClip is "b16871a7c302">>You stay hidden, observing. She's young - mid-twenties, perhaps - with the lean body of a wasteland survivor and full, heavy tits. She ducks under and swims a few lazy strokes, unaware of her audience.<<else>>You stay hidden, observing. She's young - mid-twenties, perhaps - with the lean, scarred body of a wasteland survivor. She washes methodically, unaware of her audience.<</if>><</if>>
<<if setup.fishingGame.kiraAlong()>>
<<set _kira to $companions[0]>>
Kira watches too, her breathing slightly quickened.
<<if setup.fishingGame.exhibTier("kira") gte 2>>
<<say "Kira" "She's... actually pretty hot.">>
A pause.
<<say "Kira" "Don't look at me like that. I have eyes.">>
<</if>>
<</if>>
Eventually, she wades toward shore.
<div class="choice-container">
<<vchoice "Reveal yourself now" "FishersRest_Lone_Reveal" "action" "wave">>
<<vchoice "Keep watching" "FishersRest_Lone_KeepWatching" "action" "eye">>
</div><<setBackground "fishers_rest/fishers_rest_lakeside">>
<h2>Caught Watching</h2>
<<storyVideo "story/fishers_lone_voyeur/reveal">>
<<if _storyClip is "c92f25ae55c5">>You catch her on the pine path above the shore as she snatches up her dress. She freezes, naked and exposed, one arm over her tits.<<else>>You step out as she reaches for her clothes. She freezes, naked and exposed.<</if>>
<<if $locations.fishers_rest && $locations.fishers_rest.snaggedTop>>"How long are you going to stand there holding that?"
"Long enough."<<else>>"How long were you—"
"Long enough."<</if>>
Her cheeks flush, but not just from embarrassment. There's something else in her eyes.
"And you didn't attack me."
"Didn't see a reason to."
<div class="choice-container">
<<vchoice "Continue" "FishersRest_Lone_Talk" "action" "forward">>
</div><<setBackground "fishers_rest/fishers_rest_lakeside">>
<<addLust "player" 10>>
<h2>The Show</h2>
<<storyVideo "story/fishers_lone_voyeur/keep_watching">>
<<if _storyClip is "966512719977">>She walks up the sand streaming wet, wringing out her hair. Then you watch her dress, the slow reveal in reverse.<<else>>She reaches shore, water streaming from her body. You watch her dress, the slow reveal in reverse.<</if>>
<<if setup.fishingGame.kiraAlong()>>
<<set _kira to $companions[0]>>
<<set _kira.lust = Math.min(_kira.maxLust || 100, _kira.lust + 5)>>
<</if>>
<<if $locations.fishers_rest && $locations.fishers_rest.snaggedTop>>Then she turns to face you, hands on her hips, not covering anything any more.
"Enjoying yourself? I still want my top back."<<else>>Then she freezes. Slowly, she turns.
"I know you're there."
Busted.<</if>>
<div class="choice-container">
<<vchoice "Step out and face her" "FishersRest_Lone_Reveal" "action" "wave">>
<<vchoice "Stay hidden, see what she does" "FishersRest_Lone_HerMove" "action" "stealth">>
</div><<setBackground "fishers_rest/fishers_rest_lakeside">>
<h2>Her Move</h2>
<<storyVideo "story/fishers_lone_voyeur/her_move">>
<<if _storyClip is "84a29a9e455d">>She doesn't run for her weapon. Instead, she walks out along the old dock in her black swimsuit, turns fully toward where you're hiding, tosses her wet hair back, and peels the suit down off her tits.<<else>>She doesn't run for her weapon. Instead, she turns fully toward where you're hiding, hands on her hips.<</if>>
<<if $locations.fishers_rest && $locations.fishers_rest.snaggedTop>>"You could have thrown my top back ten minutes ago. So either you're a creep, or you enjoyed the show."<<else>>"If you wanted to attack, you would have. So you're either a coward, or you enjoyed the show."<</if>>
A beat.
"I'm hoping it's the second one."
<div class="choice-container">
<<vchoice "Step out" "FishersRest_Lone_Flirt" "action" "wave">>
</div><<setBackground "fishers_rest/fishers_rest_lakeside">>
<h2>Predator</h2>
<<storyVideo "story/fishers_lone_voyeur/call_out__watch">>
<<if _storyClip is "b16871a7c302">>You move silently through the brush, circling around. She pushes off and swims a few lazy strokes out, her bare ass breaking the surface, then ducks under. Oblivious.<<else>>You move silently through the brush, circling around. She continues to wash, oblivious.<</if>>
You could take her by surprise. She'd never see you coming.
<div class="choice-container">
<<vchoice "Grab her" "FishersRest_Lone_Grab" "action" "grab">>
<<vchoice "Reveal yourself instead" "FishersRest_Lone_Reveal" "action" "wave">>
</div><<setBackground "fishers_rest/fishers_rest_lakeside">>
<h2>Ambush</h2>
You surge from cover, catching her from behind. She screams, struggles, but you're stronger.
"Don't fight. You'll only make this harder."
<<if setup.fishingGame.kiraAlong()>>
Kira hangs back, watching with an unreadable expression.
<</if>>
The fight goes out of her quickly. Alone, naked, no weapon - she knows she's caught.
<div class="choice-container">
<<vchoice "See where this goes..." "FishersRest_Scene_LoneBather_Dom" "action" "heart">>
<<vchoice "Let her go" "FishersRest_Hub" "move" "back">>
</div><<include "FishersRest_Scene_LoneBather_Mutual">><<set $currentLocation to "fishers_rest">>
<<setBackground "fishers_rest/fishers_rest_lakeside">>
<h2>Something's Off</h2>
As you approach the lake, something feels wrong. The usual calm is there, but...
<<storyVideo "story/fishers_trap_defeat/fishers_rest_enc_fishing_trap">>
<<if _storyClip is "a8e399408e51">>A blonde woman in a white crop top stands on the sun-bleached deck by the old boathouse, rigging a rod, the lake glittering behind her. She looks up as you approach, offering a friendly smile.<<elseif _storyFamily is "sf_cg_fishers_trap_defeat_04">>A woman in a white tee sits in the dim mouth of the old boathouse, her line trailing out through the open doors into the water. She looks up as you approach, offering a friendly smile.<<else>>A woman sits on the dock, fishing line in the water. She looks up as you approach, offering a friendly smile.<</if>>
"Hey there! Great spot, isn't it? Fish aren't biting today, though."
<<set _seeThrough to random(1, 100)>>
<<if _seeThrough lte setup.fishersRest.encounters.types.fishing_trap.seeThoughChance>>
<<set $fishersRestEncounter.sawThroughTrap to true>>
Something about this feels staged. The way she's positioned, the slight tension in her shoulders despite her casual demeanor. And is that movement in the brush behind the cabin?
<<else>>
<<set $fishersRestEncounter.sawThroughTrap to false>>
She seems friendly enough. Just another survivor making use of the lake.
<</if>>
<<if setup.fishingGame.kiraAlong()>>
<<if $fishersRestEncounter.sawThroughTrap>>
Kira tenses beside you, her hand drifting toward her weapon.
<<say "Kira" "Something's not right here.">>
<<else>>
<<say "Kira" "Maybe she'd share the spot?">>
<</if>>
<</if>>
<div class="choice-container">
<<if $fishersRestEncounter.sawThroughTrap>>
<<vchoice "Call out the trap" "FishersRest_Trap_CallOut" "action" "speech">>
<<vchoice "Play along, but be ready" "FishersRest_Trap_PlayAlong" "action" "stealth">>
<<else>>
<<vchoice "Approach and chat" "FishersRest_Trap_FallFor" "action" "wave">>
<</if>>
<<vchoice "Attack first" "FishersRest_Trap_Attack" "action" "attack">>
<<vchoice "Leave - not worth it" "WorldMap_View" "move" "back">>
</div><<setBackground "fishers_rest/fishers_rest_lakeside">>
<h2>Trapped!</h2>
<<storyVideo "story/fishers_trap_defeat/trap_fall_for">>
<<if _storyClip is "73d963b495e4">>She waves you along the path toward the water, rod over her shoulder, and glances back once to make sure you're following. You're halfway to the jetty when you open your mouth. "Mind if I join—"<<else>>You approach the woman on the dock. "Mind if I join—"<</if>>
"NOW!"
Raiders burst from concealment. You're surrounded before you can react.
<<if setup.fishingGame.kiraAlong()>>"Caught another one! And this one brought a friend!"<<else>>"Caught another one!"<</if>>
<<if setup.fishingGame.kiraAlong()>>
Kira curses, finding herself at knifepoint.
<</if>>
<div class="choice-container">
<<vchoice "Continue" "FishersRest_Defeat_FishingTrap" "action" "forward">>
</div><<setBackground "fishers_rest/fishers_rest_lakeside">>
<h2>Called Out</h2>
"Nice try. Tell your friends in the bushes to come out."
The woman's smile freezes. For a moment, she maintains the act.
"I don't know what you're—"
"Now, or I start shooting into the brush."
A tense pause. Then, slowly, two more women emerge from concealment, weapons ready.
"Shit. Perceptive fucker, aren't you?"
<div class="choice-container">
<<vchoice "Fight them" "FishersRest_Trap_Fight" "action" "attack">>
<<vchoice "Negotiate" "FishersRest_Trap_Negotiate" "action" "speech">>
</div><<setBackground "fishers_rest/fishers_rest_lakeside">>
<h2>Playing Along</h2>
You approach casually, but your hand stays near your weapon. The woman chatters about the weather, the fishing - but her eyes keep flicking to the brush behind you.
When the attack comes, you're ready.
"NOW!"
You spin, weapon already drawn—
<div class="choice-container">
<<vchoice "Continue" "FishersRest_Trap_Fight" "action" "forward">>
</div><<setBackground "fishers_rest/fishers_rest_lakeside">>
<h2>Preemptive Strike</h2>
You don't give them the chance. Your weapon comes up, and the woman on the dock barely has time to scream before you're on her.
"AMBUSH! AMBUSH!"
Her backup bursts from hiding, but they're scrambling to react.
<div class="choice-container">
<<vchoice "Continue" "FishersRest_Trap_Fight" "action" "forward">>
</div><<setBackground "fishers_rest/fishers_rest_lakeside">>
<h2>Combat!</h2>
<<set $combat to {
active: true,
companionInCombat: setup.fishingGame.fightCompanion(),
enemies: [],
turn: 1,
phase: "player",
victoryPassage: "FishersRest_Trap_Victory", defeatPassage: "FishersRest_Defeat_FishingTrap"
}>>
<<for _i to 0; _i lt 3; _i++>>
<<set _enemy to {
id: "trap_raider_" + _i,
name: _i eq 0 ? "Raider Bait" : "Raider Ambusher",
health: 28,
maxHealth: 28,
damage: 7,
dodge: 18,
armor: 3,
lust: 0,
maxLust: 100,
weapon: "combat knife",
isHuman: true,
gender: "female",
clothing: { topDamage: 0, bottomDamage: 0 }
}>>
<<run $combat.enemies.push(_enemy)>>
<</for>>
<div class="choice-container">
<<vchoice "Continue" "Combat_Start" "action" "forward">>
</div><<setBackground "fishers_rest/fishers_rest_lakeside">>
<h2>Standoff</h2>
"Look, we both know how this goes. You try to take us, maybe you win, maybe we kill some of you first. Or..."
The lead raider tilts her head. "Or?"
"Or we both walk away. Lake's big enough. You want travelers, set your trap somewhere else."
A long moment. Then she laughs.
"You've got balls. Fine. Today. But don't expect this mercy twice."
They melt back into the brush, leaving you alone.
<<notify "success">>Negotiation successful. The raiders have left.<</notify>>
<div class="choice-container">
<<vchoice "Continue" "FishersRest_Hub" "move" "back">>
</div><<setBackground "fishers_rest/fishers_rest_lakeside">>
<<set $currentLocation to "fishers_rest">>
<h2>Trap Sprung - On Them</h2>
The would-be ambushers lie defeated. Their clever plan didn't account for you.
<<if setup.fishingGame.kiraAlong()>>
<<say "Kira" "That's what you get for trying to be clever. Amateurs.">>
<</if>>
<<run setup.fightLootStart()>>
<<set _frl to [setup.postBattleTakeLoot("scrap metal", "Scrap Metal", 3, "", "fightLoot"), setup.postBattleTakeLoot("dirty water", "Dirty Water", 2, "", "fightLoot")]>>
<div class="loot-display">
<h4>Looted:</h4>
<ul>
<<for _frli range _frl>><li><<print _frli>></li><</for>>
</ul>
</div>
<<lootLeftList "fightLoot">>
<div class="choice-container">
<<vchoice "Continue to the lake" "FishersRest_Hub" "move" "back">>
<<vchoice "Teach them a lesson about traps..." "FishersRest_Victory_FishingTrap" "action" "heart">>
</div><<set $currentLocation to "fishers_rest">>
<<setBackground "fishers_rest/fishers_rest_lakeside">>
<h2>Joining the Waters</h2>
<<if !$fishersRestEncounter>><<set $fishersRestEncounter to {}>><</if>>
<<set _participantCount to random(setup.fishersRest.bathingScene.minParticipants, setup.fishersRest.bathingScene.maxParticipants)>>
<<set _participantCount to Math.min(_participantCount, $fishersRestEncounter.raiderCount || _participantCount)>>
<<set $fishersRestEncounter.bathing to { participants: _participantCount, kiraJoins: false }>>
<<storyVideo "story/fishers_bathing_group_sex/fishers_rest_bathing_join">>
<<if _storyFamily is "sf_cg_fishers_bathing_group_sex_03">>You begin to undress. The raiders sprawl on the sun-warmed dock, two of them tangled together on a scavenged lounger, watching you strip with open, grinning interest; the redhead in white lace is already chewing her lip.<<else>>You begin to undress. The raiders watch with open interest, their earlier wariness replaced by something hungrier.<</if>>
<<if setup.fishingGame.kiraAlong()>>
<<set _kira to $companions[0]>>
<<if setup.fishingGame.exhibTier("kira") gte setup.fishersRest.bathingScene.kiraExhibTierRequired>>
Kira hesitates only a moment before following suit, peeling off her clothes with a defiant lift of her chin.
<<say "Kira" "What? The water looks good.">>
<<set $fishersRestEncounter.bathing.kiraJoins to true>>
<<set _kira.lust = Math.min(_kira.maxLust || 100, _kira.lust + setup.fishersRest.bathingScene.kiraLustGain)>>
<<else>>
Kira crosses her arms, staying on shore.
<<say "Kira" "I'll... keep watch. Have fun.">>
There's something in her voice - jealousy? Curiosity? Either way, she doesn't join.
<<set $fishersRestEncounter.bathing.kiraJoins to false>>
<</if>>
<</if>>
<<addLust "player" setup.fishersRest.bathingScene.playerLustGain>>
<div class="choice-container">
<<vchoice "Continue..." "FishersRest_Bathing_Scene_1" "action" "heart">>
</div><<set _bathing to ($fishersRestEncounter && $fishersRestEncounter.bathing) || {}>><<set _participantCount to _bathing.participants || 1>><<set _kiraJoins to _bathing.kiraJoins || false>>
<<setBackground "fishers_rest/fishers_rest_lakeside">>
<h2>The Lake</h2>
<<storyVideo "story/fishers_bathing_group_sex/scene_1">>
<<if _storyFamily is "sf_cg_fishers_bathing_group_sex_03">>You pad across the warm boards of the dock toward them. The raiders on the lounger watch you come, no longer hiding their interest.<<else>>The water is cool against your skin as you wade in. The raiders circle closer, no longer hiding their interest.<</if>>
<<if _participantCount gte 2>>
<<if _storyFamily is "sf_cg_fishers_bathing_group_sex_03">>"Been a while since we had company," one of them says from the lounger, catching your arm. "Nice company."<<else>>"Been a while since we had company," one of them says, her hand trailing along your arm underwater. "Nice company."<</if>>
<<if _storyFamily is "sf_cg_fishers_bathing_group_sex_03">>Her companion catches your other arm and pulls you down to where they sit, and between them they kiss you, wet skin pressing against you from both sides.<<else>>Her companion moves behind you, close enough that you can feel the warmth of her body despite the cool water.<</if>>
"Very nice."
<<else>>
<<if _storyFamily is "sf_cg_fishers_bathing_group_sex_03">>"Just us, then," she says from the lounger, pulling you down beside her, wet skin pressed to yours. "I don't mind."<<else>>"Just us, then," she says, moving closer. Her body presses against yours underwater, slick and warm. "I don't mind."<</if>>
<</if>>
<<if _kiraJoins>>
Kira wades in beside you, trying to look casual and failing utterly. One of the raiders turns her attention to your companion, appreciation clear in her gaze.
"Your friend's cute too. Does she share?"
Kira's cheeks flush, but she doesn't move away.
<</if>>
<div class="choice-container">
<<vchoice "Let things progress naturally..." "FishersRest_Bathing_Scene_2" "action" "heart">>
<<vchoice "Take the lead" "FishersRest_Bathing_Scene_Dom" "action" "dominant">>
</div><<set _bathing to ($fishersRestEncounter && $fishersRestEncounter.bathing) || {}>><<set _participantCount to _bathing.participants || 1>><<set _kiraJoins to _bathing.kiraJoins || false>>
<<setBackground "fishers_rest/fishers_rest_lakeside">>
<h2>Escalation</h2>
<<storyVideo "story/fishers_bathing_group_sex/scene_2__scene_2">>
<<if _storyFamily is "sf_cg_fishers_bathing_group_sex_03">>They haul you out of the water onto the bedrolls in the boathouse. Hands find you there.<<else>>Hands find you underwater.<</if>> Fingers trace along your body, exploring, teasing. The raiders move with practiced coordination - they've done this before.
<<if _participantCount gte 2>>
<<if _storyFamily is "sf_cg_fishers_bathing_group_sex_03">>They kiss and grind on you and on each other. Then the blonde turns, shoves her ass back at your face, and you drag her bikini bottom aside and eat her pussy from behind while the redhead kisses her.<<else>>One kisses your neck while the other's hand slides lower.<</if>> You're surrounded by slick, warm bodies, the peaceful setting at odds with the growing intensity.
"Relax," one whispers against your ear. "Let us take care of you."
<<else>>
She presses against you, lips finding your neck, hands roaming freely. The intimacy of the setting - the quiet lake, the distant birdsong - makes it feel almost surreal.
"This is nice," she murmurs. "No fighting, no running. Just... this."
<</if>>
<<if _kiraJoins>>
<<set _kira to $companions[0]>>
<<set _kira.lust = Math.min(_kira.maxLust || 100, _kira.lust + 10)>>
Kira gasps nearby - one of the raiders has turned her attention to your companion. You catch a glimpse of hands on Kira's body, her back arching.
<<say "Kira" "Oh... oh fuck...">>
<</if>>
<<addLust "player" 15>>
<div class="choice-container">
<<vchoice "Give in to the sensation..." "FishersRest_Bathing_Scene_Climax" "action" "heart">>
</div><<set _bathing to ($fishersRestEncounter && $fishersRestEncounter.bathing) || {}>><<set _participantCount to _bathing.participants || 1>><<set _kiraJoins to _bathing.kiraJoins || false>>
<<setBackground "fishers_rest/fishers_rest_lakeside">>
<h2>Taking Charge</h2>
<<storyVideo "story/fishers_bathing_group_sex/scene_2__scene_2">>
You're not content to be passive. Your hand catches one raider's wrist, pulling her closer, asserting control.
"My turn."
Her eyes widen, then darken with desire. "Oh, I like that."
<<if _participantCount gte 2>>
<<if _storyFamily is "sf_cg_fishers_bathing_group_sex_03">>Her companion watches with hungry interest as you drag the first woman up onto the boathouse bedrolls, pin her face-down and bury your face between her thighs from behind.<<else>>Her companion watches with hungry interest as you push the first woman against the dock's support beam, taking what you want.<</if>>
"Fuck... yes..."
The other moves to assist, hands roaming your body as you take her friend.
<<else>>
She yields willingly, letting you guide her against the dock. The water swirls around you as you take control.
"Yes... please..."
<</if>>
<<if _kiraJoins>>
<<set _kira to $companions[0]>>
Kira watches you, her own situation momentarily forgotten. There's something in her eyes - arousal, certainly, but also something else. Seeing you like this affects her.
<<set _kira.lust = Math.min(_kira.maxLust || 100, _kira.lust + 15)>>
<</if>>
<div class="choice-container">
<<vchoice "Continue..." "FishersRest_Bathing_Scene_Climax" "action" "heart">>
</div><<set _bathing to ($fishersRestEncounter && $fishersRestEncounter.bathing) || {}>><<set _participantCount to _bathing.participants || 1>><<set _kiraJoins to _bathing.kiraJoins || false>>
<<setBackground "fishers_rest/fishers_rest_lakeside">>
<<advanceTime 0 45>>
<h2>Release</h2>
<<storyVideo "story/fishers_bathing_group_sex/climax">>
<<if _storyFamily is "sf_cg_fishers_bathing_group_sex_03">>Nobody makes it back to the water. On the boathouse bedrolls it's a wet tangle of knees and hair, skin slapping, the blonde's gasps climbing every time you bottom out in her while the redhead holds her open for you.<<else>>The peaceful lake becomes witness to something far more primal. Bodies move together, the water splashing with each thrust, each gasp.<</if>>
<<if _participantCount gte 2>>
They take turns - one riding you while the other watches, then switching. Sometimes both at once, hands and lips everywhere.
<<else>>
She wraps her legs around you, drawing you deeper, her moans echoing across the water.
<</if>>
<<if _kiraJoins>>
<<set _kira to $companions[0]>>
Kira's cries join the chorus. Whatever reserve she had is gone now, her body writhing under a raider's attention.
<<say "Kira" "F-fuck... I'm... I'm going to—">>
<<set _kira.lust to 0>>
<<relationChange "kira" "affection" 2>>
<</if>>
<<if _storyFamily is "sf_cg_fishers_bathing_group_sex_03">>When it's finally over, you lie sprawled on the bedrolls with somebody's leg across your chest and somebody's hair in your mouth. The raiders stretch like cats, sticky and very pleased with themselves.<<else>>When it's finally over, you float in the aftermath, bodies tangled together in the shallows. The raiders look satisfied, sated.<</if>>
"That was... not what I expected from today."
<<set $player.lust to Math.max(0, $player.lust - 30)>><<run setup.playerReleased()>>
<<notify "success">>Satisfying encounter. Lust reduced.<</notify>>
<div class="choice-container">
<<vchoice "Rest together" "FishersRest_Bathing_Afterglow" "action" "rest">>
</div><<set _bathing to ($fishersRestEncounter && $fishersRestEncounter.bathing) || {}>><<set _participantCount to _bathing.participants || 1>><<set _kiraJoins to _bathing.kiraJoins || false>>
<<setBackground "fishers_rest/fishers_rest_lakeside">>
<<advanceTime 0 30>>
<h2>Afterglow</h2>
<<storyVideo "story/fishers_bathing_group_sex/fishers_rest_bathing_afterglow">>
<<if _storyFamily is "sf_cg_fishers_bathing_group_sex_03">>Two of them kneel in front of you first, your cum glazing their faces, and share your cock between their lips, kissing each other around it, slow and lazy, before you all flop onto the dock to dry in the sun. Nobody reaches for a weapon now; the redhead uses your thigh for a pillow and licks the last of you off her lip.<<else>>You lie on the dock together, drying in the sun. The raiders have relaxed completely now, any earlier tension forgotten.<</if>>
"You're alright," the leader says, propped up on one elbow. "Not many people would've handled that the way you did."
<<if $fishersRestEncounter>><<run delete $fishersRestEncounter.bathing>><</if>>
<<if _kiraJoins>>
Kira lies beside you, still catching her breath. She meets your eyes and smiles - genuinely, without her usual edge.
<<say "Kira" "Okay. I admit it. This place is amazing.">>
<</if>>
Eventually, the raiders dress and prepare to leave.
"Maybe we'll see you again. If you're lucky."
They disappear into the wasteland, leaving you with the lake - and the memories.
<div class="choice-container">
<<vchoice "Continue" "FishersRest_Hub" "move" "back">>
</div><<set $currentLocation to "fishers_rest">>
<<setBackground "fishers_rest/fishers_rest_lakeside">>
<h2>An Understanding</h2>
The invitation hangs in the air between you. She watches, waiting, vulnerable but not afraid.
<<if !$fishersRestEncounter>><<set $fishersRestEncounter to {}>><</if>>
<<set $fishersRestEncounter.bathing to { participants: 1, kiraJoins: false }>>
<<storyVideo "story/fishers_lone_mutual/fishers_rest_scene_lone_bather_mutual">>
<<if $locations.fishers_rest && $locations.fishers_rest.snaggedTop>>She plucks her bikini top out of your hand, looks at it, and drops it on the dock. "Keep it warm for me. I'll want it after."
<</if>><<if _storyClip is "4e9cd3a59a2b">>She climbs the ladder onto the dock, dripping, pulls on the white crop top she left on the boards and shoves it straight back up over her wet tits, then walks into your arms and kisses you, hard and hungry, her hands already on your belt.<<elseif _storyClip is "fdd959c75c53">>You begin to undress. She laughs, genuinely pleased, gives you a little wave from the sun-warmed boards of the old bathing deck, and sinks down into the water of the fishers' soaking tub, making room for you.<<else>>You begin to undress. She smiles - genuinely pleased - and wades deeper to give you room.<</if>>
<<if setup.fishingGame.kiraAlong()>>
<<set _kira to $companions[0]>>
<<if setup.fishingGame.exhibTier("kira") gte 2>>
Kira hesitates, then follows suit.
<<say "Kira" "Room for one more?">>
The woman's smile widens. "The more the merrier."
<<set $fishersRestEncounter.bathing.kiraJoins to true>>
<<else>>
<<say "Kira" "I'll... give you two some privacy.">>
She retreats to the cabin, though you catch her glancing back.
<<set $fishersRestEncounter.bathing.kiraJoins to false>>
<</if>>
<</if>>
<div class="choice-container">
<<vchoice "Continue..." "FishersRest_LoneBather_Mutual_2" "action" "heart">>
</div><<set _bathing to ($fishersRestEncounter && $fishersRestEncounter.bathing) || {}>><<set _participantCount to _bathing.participants || 1>><<set _kiraJoins to _bathing.kiraJoins || false>>
<<setBackground "fishers_rest/fishers_rest_lakeside">>
<<addLust "player" 20>>
<h2>Connection</h2>
<<storyVideo "story/fishers_lone_mutual/mutual_2">>
<<if _storyClip is "4606d3f1d3fe">>Out at the end of the dock she presses against you, still cool and wet from the lake.<<else>>The water is cool, but she is warm as she presses against you.<</if>> Her name is Petra - she offers it freely now, along with her body.
"It's been so long since anyone was... gentle," she whispers. "Since anyone just wanted to share something instead of take."
<<if _storyClip is "4606d3f1d3fe">>Her hand finds your cock and strokes it, slow, while she kisses you. Then she sinks to her knees on the sun-warm boards and her mouth follows, soft and searching.<<elseif _storyClip is "4a4bfddd9cb0">>Her hand finds your cock under the water, and then her mouth follows, soft and searching.<<else>>Her lips find yours, soft and searching.<</if>> Her hands explore with a tenderness that speaks of desperation as much as desire.
<<if _kiraJoins>>
<<set _kira to $companions[0]>>
<<set _kira.lust = Math.min(_kira.maxLust || 100, _kira.lust + 15)>>
Kira joins the embrace, and Petra welcomes her without hesitation. Soon all three of you are tangled together, the boundaries between bodies blurring.
<<say "Petra" "You're both so... god, I needed this.">>
<</if>>
<div class="choice-container">
<<vchoice "Give her what she needs..." "FishersRest_LoneBather_Mutual_Climax" "action" "heart">>
</div><<set _bathing to ($fishersRestEncounter && $fishersRestEncounter.bathing) || {}>><<set _participantCount to _bathing.participants || 1>><<set _kiraJoins to _bathing.kiraJoins || false>>
<<setBackground "fishers_rest/fishers_rest_lakeside">>
<<advanceTime 0 40>>
<h2>Together</h2>
<<storyVideo "story/fishers_lone_mutual/mutual_climax">>
<<if _storyClip is "2e09cd568acf">>You take her standing on the grass at the water's edge, the dock and the lake behind her, one of her legs hooked high over your arm, her arms locked round your neck.<<elseif _storyClip is "c3750640aac3">>She turns in the water, braces on the edge of the tub and pulls you into her from behind, smiling back over her shoulder and reaching back for your hand.<<else>>You take her there in the shallows, her legs wrapped around you, her face buried in your neck.<</if>> She cries out when she comes - not just from physical pleasure, but from something deeper. Relief, perhaps. Connection.
<<if _kiraJoins>>
Kira reaches her peak moments later, Petra's fingers working magic between her legs. The three of you collapse together in the water, spent and satisfied.
<<set _kira to $companions[0]>>
<<set _kira.lust to 0>>
<<relationChange "kira" "affection" 3>>
<</if>>
<<set $player.lust to Math.max(0, $player.lust - 40)>><<run setup.playerReleased()>>
Afterward, Petra clings to you, reluctant to let go.
"Thank you. I... thank you."
<div class="choice-container">
<<vchoice "Rest together" "FishersRest_LoneBather_Afterglow" "action" "rest">>
</div><<setBackground "fishers_rest/fishers_rest_lakeside">>
<h2>Parting Ways</h2>
<<if $fishersRestEncounter>><<run delete $fishersRestEncounter.bathing>><</if>>
<<storyVideo "story/fishers_lone_mutual/afterglow">>
<<if _storyClip is "91b94329dbae">>Afterward she kneels in the grass by the upturned boats, your cum still striped across her face, and licks your cock slowly clean, grinning up at you. Then you spend time together, talking.<<elseif _storyClip is "b101fd563bae">>Afterward she lies back in the water between your legs, laughing, and licks your cock slowly clean, tongue out, grinning up at you. Then you spend time together, talking.<<else>>You spend time together afterward, talking.<</if>> Petra was with the Blood Serpents - a raider crew known for their cruelty. She couldn't stomach it anymore.
"I don't know where I'm going. Just... away from them."
<<if setup.fishingGame.kiraAlong()>>
Kira glances at you. "We could... no, never mind."
<</if>>
Eventually, Petra dresses and prepares to leave.
"Maybe I'll find somewhere like this. Somewhere peaceful." She kisses you one last time. "Thank you for reminding me that not everyone is a monster."
<<notify "info">>Petra has departed. Perhaps you'll meet again.<</notify>>
<div class="choice-container">
<<vchoice "Continue" "FishersRest_Hub" "move" "back">>
</div><<set $currentLocation to "fishers_rest">>
<<setBackground "fishers_rest/fishers_rest_lakeside">>
<h2>Prey</h2>
<<storyVideo "story/fishers_lone_dom/fishers_rest_scene_lone_bather_dom">>
<<if _storyClip is "1e4cc653514a">>You catch her by the upturned boats on the shore and push her down over a hull on her hands and knees. She squirms against your grip, and when she looks back at you over her shoulder there's more dare in it than fear.
"Rough, is it?" she breathes. "Fine. Show me what you've got."<<else>>She's caught, naked and helpless in your grip. Her struggles weaken as she realizes she has no options.
"Please... please don't hurt me..."<</if>>
<<if setup.fishingGame.kiraAlong()>>
<<set _kira to $companions[0]>>
Kira watches from the shore, expression unreadable.
<<say "Kira" "What are you going to do with her?">>
<</if>>
That's entirely up to you.
<div class="choice-container">
<<vchoice "Take what you want" "FishersRest_LoneBather_Dom_Take" "action" "dominant">>
<<vchoice "Make her serve you" "FishersRest_LoneBather_Dom_Serve" "action" "dominant">>
</div><<setBackground "fishers_rest/fishers_rest_lakeside">>
<<addLust "player" 15>>
<h2>Claiming</h2>
<<storyVideo "story/fishers_lone_dom/take__take">>
<<if _storyClip is "7088ad0d5e2b">>You flip her onto her back on the hull of an upturned boat, pin her knees up and back, and drive into her. She gasps, grabs the edge of the hull and meets every thrust, her mouth open, her eyes on yours.<<elseif _storyClip is "d73c6f9db73c">>You push her down on her back on the wet stones of the shore, against a bleached driftwood log, pinning her beneath you. She whimpers but doesn't fight - she knows better.<<else>>You push her down against the muddy shore, pinning her beneath you. She whimpers but doesn't fight - she knows better.<</if>>
<<if _storyClip is "7088ad0d5e2b">>"Harder," she hisses. "You wanted to take it. Take it."
You fuck her hard on the hull, the boat booming under her back with every stroke, until she's gasping at the sky.<<else>>"This doesn't have to hurt," you tell her. "If you behave."
She nods frantically. "I'll behave. I'll be good. Just please—"
You silence her with your body, taking what you want from her trembling form. She gasps, then moans despite herself, her body responding even as tears streak her cheeks.<</if>>
<<if setup.fishingGame.kiraAlong()>>
<<set _kira to $companions[0]>>
Kira moves closer, watching intently.
<<if setup.fishingGame.exhibTier("kira") gte 3>>
<<say "Kira" "Save some for me.">>
<<set _kira.lust = Math.min(_kira.maxLust || 100, _kira.lust + 20)>>
<</if>>
<</if>>
<div class="choice-container">
<<vchoice "Continue..." "FishersRest_LoneBather_Dom_Climax" "action" "heart">>
</div><<setBackground "fishers_rest/fishers_rest_lakeside">>
<<addLust "player" 15>>
<h2>Obedience</h2>
"On your knees."
<<storyVideo "story/fishers_lone_dom/take__serve">>
<<if _storyClip is "4ad2aae19921">>She sinks to her knees on the dock boards without a word, looking up at you.<<elseif _storyClip is "1f4e50c913e9">>She complies immediately, sinking onto the wet rocks at the water's edge, scared and eager in the same breath.<<else>>She complies immediately, sinking into the shallow water, looking up at you with fearful, eager eyes.<</if>>
"Please me. Do it well, and I might let you go."
<<if _storyClip is "4ad2aae19921">>She doesn't need to be told twice. You fist a hand in her hair and guide her mouth onto your cock, and she takes it, eyes up at you and watering, working you deeper every time you pull.<<elseif _storyClip is "1f4e50c913e9">>She doesn't need to be told twice. She wraps both hands around your cock and her mouth finds you, eyes squeezed shut, desperate to please, desperate to earn her freedom.<<else>>She doesn't need to be told twice. Her mouth finds you, desperate to please, desperate to earn her freedom.<</if>>
<<if setup.fishingGame.kiraAlong()>>
<<set _kira to $companions[0]>>
<<set _kira.lust = Math.min(_kira.maxLust || 100, _kira.lust + 15)>>
Kira watches with undisguised interest, her breathing heavy.
<<if setup.fishingGame.exhibTier("kira") gte 3>>
<<say "Kira" "She's... really going at it.">>
<</if>>
<</if>>
<div class="choice-container">
<<vchoice "Use her fully" "FishersRest_LoneBather_Dom_Climax" "action" "heart">>
</div><<setBackground "fishers_rest/fishers_rest_lakeside">>
<<advanceTime 0 30>>
<h2>Satisfaction</h2>
<<storyVideo "story/fishers_lone_dom/climax">>
<<if _storyClip is "b2ae1b911114">>You finish with her on all fours on the hull of the upturned boat, one hand fisted in her hair and the other on her hip, pounding her from behind with the lake and the thatched hut behind her. When you let go she sags onto the hull, spent, and laughs breathlessly.<<elseif _storyClip is "94e6967adab6">>You use her thoroughly, taking your pleasure from her willing-enough body. You finish with her on all fours on the rocks above the pool, your hands locked on her hips, pounding her from behind; when you let go she sags onto the stone, spent and used.<<else>>You use her thoroughly, taking your pleasure from her willing-enough body. By the end, she's limp in your grasp, spent and used.<</if>>
<<set $player.lust to Math.max(0, $player.lust - 35)>><<run setup.playerReleased()>>
"Can I... can I go now?"
<div class="choice-container">
<<vchoice "Let her go" "FishersRest_LoneBather_Dom_Release" "action" "wave">>
<<vchoice "Keep her a while longer" "FishersRest_LoneBather_Dom_Keep" "action" "dominant">>
</div><<setBackground "fishers_rest/fishers_rest_lakeside">>
<h2>Released</h2>
"Go."
She scrambles for her clothes, dressing with shaking hands. At the treeline, she pauses, looking back.
"I... thank you. For not killing me."
Then she's gone.
<<if setup.fishingGame.kiraAlong()>>
<<say "Kira" "Merciful. Maybe she'll remember that.">>
<</if>>
<div class="choice-container">
<<vchoice "Continue" "FishersRest_Hub" "move" "back">>
</div><<setBackground "fishers_rest/fishers_rest_lakeside">>
<<advanceTime 1 0>>
<h2>Extended Stay</h2>
"Not yet. I'm not done with you."
Her eyes widen, but she doesn't resist as you pull her back down.
The afternoon stretches on, filled with her gasps and pleas. By the time you finally release her, she can barely walk.
<<set $player.lust to 0>><<run setup.playerReleased()>>
"Now you can go."
She doesn't look back this time. Just runs.
<<if setup.fishingGame.kiraAlong()>>
<<say "Kira" "That was... intense.">>
There's something in her eyes. Want, maybe. Or fear. Perhaps both.
<</if>>
<div class="choice-container">
<<vchoice "Continue" "FishersRest_Hub" "move" "back">>
</div><<set $currentLocation to "fishers_rest">>
<<setBackground "fishers_rest/fishers_rest_lakeside">>
<h2>Defeated</h2>
The naked raiders overwhelm you. Despite their lack of weapons, there are too many, and they're driven by fury.
<<storyVideo "story/fishers_bathing_defeat/fishers_rest_bathing_defeat">>
<<if _storyFamily is "sf_cg_fishers_bathing_defeat_02">>You go down hard on the wet rocks at the water's edge. Two of them reach you first - a naked redhead in pink stockings and a platinum blonde with red-dyed ends in a torn fishnet bodystocking - and crawl over you from both sides, grinning at each other across your chest.<<else>>You go down hard, pinned in the shallows. They're on you in moments, wet bodies pressing you into the mud.<</if>>
"Thought you could spy on us?! Let's see how YOU like being exposed!"
<<if setup.fishingGame.kiraAlong()>>
Kira struggles nearby, similarly pinned.
"Get off me! I'll fucking—"
"Shut her up."
<</if>>
<div class="choice-container">
<<vchoice "..." "FishersRest_Bathing_Defeat_2" "action" "submit">>
</div><<setBackground "fishers_rest/fishers_rest_lakeside">>
<<addLust "player" 20>>
<h2>Turnabout</h2>
<<storyVideo "story/fishers_bathing_defeat/defeat_2">>
Your clothes are torn away with vicious efficiency. The raiders' anger hasn't cooled - if anything, their victory has stoked it into something else.
"Look at this. Not so intimidating now, are you?"
<<if _storyFamily is "sf_cg_fishers_bathing_defeat_02">>Hands roam your body - rough, possessive, taking inventory. The blonde fists your cock and holds it up while the redhead takes it in her mouth, grinning around it. The blonde leans in and kisses her cheek, watching you.<<else>>Hands roam your body - rough, possessive, taking inventory.<</if>>
"We're going to enjoy this."
<<if setup.fishingGame.kiraAlong()>>
<<set _kira to $companions[0]>>
<<set _kira.lust = Math.min(_kira.maxLust || 100, _kira.lust + 15)>>
Kira is forced to watch, her captors keeping her facing you.
"Eyes open, bitch. Watch what we do to your friend."
<</if>>
<div class="choice-container">
<<vchoice "..." "FishersRest_Bathing_Defeat_3" "action" "submit">>
</div><<setBackground "fishers_rest/fishers_rest_lakeside">>
<<advanceTime 0 45>>
<h2>Used</h2>
<<storyVideo "story/fishers_bathing_defeat/defeat_3">>
<<if _storyFamily is "sf_cg_fishers_bathing_defeat_02">>They use you right there on the wet rocks. The blonde lies on her side in front of you and shoves her ass back onto your cock while the redhead licks where you're joined, sucks you clean, feeds you back in - forcing you from one degrading position into the next.<<else>>They take turns with you, right there in the shallows. The water splashes with each thrust, each degrading position they force you into.<</if>>
"That's right. Take it. This is what happens to creeps like you."
Your body responds despite everything - they make sure of that, hands and mouths working you until you can't tell pain from pleasure.
<<if setup.fishingGame.kiraAlong()>>
<<set _kira to $companions[0]>>
<<set _kira.lust = Math.min(_kira.maxLust || 100, _kira.lust + 20)>>
Kira's own violation happens parallel to yours. You hear her cries, her curses, eventually her helpless moans as her body betrays her too.
<</if>>
<<set $player.lust = Math.min($player.maxLust, $player.lust + 25)>>
<<set $player.health to Math.max(1, $player.health - 10)>>
<div class="choice-container">
<<vchoice "..." "FishersRest_Bathing_Defeat_End" "action" "submit">>
</div><<setBackground "fishers_rest/fishers_rest_lakeside">>
<h2>Aftermath</h2>
<<storyVideo "story/fishers_bathing_defeat/end">>
<<if _storyFamily is "sf_cg_fishers_bathing_defeat_02">>When it's finally over, the raiders leave you there - sticky, spent and sore, sprawled on the wet rocks like something the lake coughed up.<<else>>When it's finally over, the raiders leave you there - used, humiliated, discarded in the shallows.<</if>>
"Maybe think twice before spying next time."
<<if _storyFamily is "sf_cg_fishers_bathing_defeat_02">>The blonde looks back at you over the redhead sprawled beneath her, laughs, and gives you a little wave. Then they gather their things and disappear into the wasteland, laughter echoing behind them.<<else>>They gather their things and disappear into the wasteland, laughter echoing behind them.<</if>>
<<if setup.fishingGame.kiraAlong()>>
<<set _kira to $companions[0]>>
<<if setup.kiraAllowsUse()>>
Kira crawls to you, equally wrecked, and flops down on the rocks beside you with her legs still sprawled open.
<<say "Kira" "That was... fuck. Are you okay? ...Me? I'm a lot better than okay. They didn't even ask, and I'd have said yes.">>
You're both wrecked. You're both alive. She lies there grinning at the sky.
<<else>>
Kira crawls to you, equally wrecked.
<<say "Kira" "That was... fuck. Are you okay?">>
Neither of you is okay. But you're alive.
<</if>>
<<relationChange "kira" "trust" `setup.kiraUseTrust(-2)`>>
<</if>>
<<notify "warning">>Defeated and used. -10 health.<</notify>>
<div class="choice-container">
<<vchoice "Recover and leave" "WorldMap_View" "move" "back">>
</div><<set $currentLocation to "fishers_rest">>
<<setBackground "fishers_rest/fishers_rest_cabin">>
<h2>Captured</h2>
<<storyVideo "story/fishers_cabin_defeat/fishers_rest_defeat_cabin_occupied">>
The cabin raiders overwhelm you. You're disarmed, bound, and thrown onto one of the bedrolls.
"Well, well. Look what wandered into our new home."
They're armed, organized, and in no hurry.
"We were getting bored here anyway. Now we have entertainment."
<<if _storyFamily is "sf_cg_fishers_cabin_defeat_04">>One of them, braids down her back, drags your trousers off before the knots are even tight, drops to her knees and takes your cock in her mouth, grinning up at you. A blonde in red climbs onto the bedroll beside you and leans over your shoulder to watch.<</if>>
<<if setup.fishingGame.kiraAlong()>>
Kira is bound beside you, gagged to stop her curses.
<</if>>
<div class="choice-container">
<<vchoice "..." "FishersRest_Defeat_Cabin_2" "action" "submit">>
</div><<setBackground "fishers_rest/fishers_rest_cabin">>
<<advanceTime 1 0>>
<<addLust "player" 15>>
<h2>Taken</h2>
<<storyVideo "story/fishers_cabin_defeat/cabin_2">>
<<if _storyFamily is "sf_cg_fishers_cabin_defeat_04">>They take their time with you in the cabin, using Marcus's old bed, and your face, for purposes he never intended. The braided one sits on your face and grinds her pussy on your mouth while the blonde sucks your cock; then the blonde climbs on and rides you, and they swap, the blonde licking her friend's clit while she bounces on you, laughing.<<else>>They take their time with you in the cabin, using Marcus's old bed for purposes he never intended.<</if>> Your bindings keep you helpless as they do whatever they want.
"Struggle all you like. Makes it more fun for us."
<<set $player.health to Math.max(1, $player.health - 15)>>
<<set $player.lust = Math.min($player.maxLust, $player.lust + 30)>>
<<if setup.fishingGame.kiraAlong()>>
<<set _kira to $companions[0]>>
<<set _kira.lust = Math.min(_kira.maxLust || 100, _kira.lust + 25)>>
<<set _kira.health to Math.max(1, setup.kiraFloorHealth(_kira.health - 10))>>
Kira suffers alongside you, their attention divided between the two of you.
<</if>>
Hours pass before they finally tire of their games.
<div class="choice-container">
<<vchoice "..." "FishersRest_Defeat_Cabin_End" "action" "submit">>
</div><<setBackground "fishers_rest/fishers_rest_cabin">>
<h2>Discarded</h2>
<<storyVideo "story/fishers_cabin_defeat/end">>
<<if _storyFamily is "sf_cg_fishers_cabin_defeat_04">>Before they go they cut one hand free for one last round. "Go on. Jerk it for us." They kneel on the rug in front of you, tongues out, until you cum across both their faces - then they share it in a long, sloppy kiss, laughing. They tie your wrist again and leave you bound in the cabin, taking your supplies.<<else>>They leave you bound in the cabin, taking your supplies.<</if>>
"Been fun. Maybe we'll come back for more later."
It takes an hour to work free of the ropes. By then, they're long gone.
<<set $vault.scrap -= Math.min($vault.scrap, 10)>>
<<if setup.fishingGame.kiraAlong()>>
<<relationChange "kira" "trust" `setup.kiraUseTrust(-3)`>>
<</if>>
<<notify "warning">>Captured and used. Lost supplies.<</notify>>
<div class="choice-container">
<<vchoice "Recover and leave" "WorldMap_View" "move" "back">>
</div><<set $currentLocation to "fishers_rest">>
<<setBackground "fishers_rest/fishers_rest_lakeside">>
<h2>Ambushed</h2>
<<storyVideo "story/fishers_ambush_defeat/water_ambush">>
<<if _storyClip is "b1a03f528b2b">>They had you from the start. Bound and helpless, you're hauled through the long grass to the water's edge by two of the mud-caked women.<<else>>They had you from the start. Bound and helpless, you're dragged to the water's edge.<</if>>
"Traveler looking for water? We'll give you more water than you can handle."
They force your head underwater briefly - a show of power - then drag you up, gasping.
"Now let's see what else you're good for."
<<if setup.fishingGame.kiraAlong()>>
Kira is held at knifepoint, forced to watch.
<</if>>
<div class="choice-container">
<<vchoice "..." "FishersRest_Defeat_Ambush_2" "action" "submit">>
</div><<setBackground "fishers_rest/fishers_rest_lakeside">>
<<advanceTime 0 40>>
<<addLust "player" 20>>
<h2>Punished</h2>
<<storyVideo "story/fishers_ambush_defeat/ambush_2">>
<<if _storyFamily is "sf_cg_fishers_ambush_defeat_01">>They take you right there on the flat wet rocks of the shore. Two of them, washed clean of the mud and wearing scavenged fishnet: a platinum blonde with red-dyed ends climbs on facing away and sinks down on your cock, and a redhead kneels beside her and licks her ass and your shaft where you're joined. The stone is cold and slick under your back; the bodies on you are hot.<<else>>They take you right there on the shore, half in and out of the water. The contrast of cool lake and hot bodies adds to the sensation.<</if>>
"Thought you were tough? Not so tough now."
<<if _storyFamily is "sf_cg_fishers_ambush_defeat_01">>Your body is used for their pleasure, positioned and repositioned as they see fit. The redhead slides onto her back beneath you both and tongues your balls while the blonde keeps grinding on your cock. Every time you groan, the blonde laughs and grinds down harder.<<else>>Your body is used for their pleasure, positioned and repositioned as they see fit. The humiliation burns as hot as their touch.<</if>>
<<set $player.health to Math.max(1, $player.health - 10)>>
<<set $player.lust = Math.min($player.maxLust, $player.lust + 25)>>
<<if setup.fishingGame.kiraAlong()>>
<<set _kira to $companions[0]>>
<<set _kira.lust = Math.min(_kira.maxLust || 100, _kira.lust + 20)>>
Eventually, they turn their attention to Kira as well.
<<say "Kira" "Don't you fucking— ahhh!">>
<</if>>
<div class="choice-container">
<<vchoice "..." "FishersRest_Defeat_Ambush_End" "action" "submit">>
</div><<setBackground "fishers_rest/fishers_rest_lakeside">>
<h2>Left Behind</h2>
They take everything of value before departing, leaving you wet and used on the shore.
"Good ambush spot. Maybe we'll see you again."
<<set $vault.scrap -= Math.min($vault.scrap, 8)>>
<<if setup.fishingGame.kiraAlong()>>
<<relationChange "kira" "trust" `setup.kiraUseTrust(-2)`>>
<</if>>
<<notify "warning">>Ambushed and used. Lost supplies.<</notify>>
<div class="choice-container">
<<vchoice "Recover and leave" "WorldMap_View" "move" "back">>
</div><<set $currentLocation to "fishers_rest">>
<<setBackground "fishers_rest/fishers_rest_lakeside">>
<h2>Hooked</h2>
<<storyVideo "story/fishers_trap_defeat/fishing_trap">>
<<if _storyFamily is "sf_cg_fishers_trap_defeat_04">>Their trap worked perfectly. You're bound before you can react - the next thing you see is the "bait" dangling a ring of keys from her fingers, laughing at your predicament, and the iron locked on your wrists.<<else>>Their trap worked perfectly. You're bound before you can react, the "bait" laughing at your predicament.<</if>>
"Works every time! People are so trusting when they see a friendly face."
"What should we do with this one?"
"Same as the others."
<<if setup.fishingGame.kiraAlong()>>
Kira curses as she's similarly subdued.
<</if>>
<div class="choice-container">
<<vchoice "..." "FishersRest_Defeat_Trap_2" "action" "submit">>
</div><<setBackground "fishers_rest/fishers_rest_lakeside">>
<<advanceTime 0 50>>
<<addLust "player" 15>>
<h2>The Real Catch</h2>
<<set _trapFamily to ($media && $media.storyFamilies && $media.storyFamilies.cg_fishers_trap_defeat) ? $media.storyFamilies.cg_fishers_trap_defeat.family : null>>
<<if _trapFamily is "sf_cg_fishers_trap_defeat_04">>The trap raiders are practiced at this. They strip you efficiently, chain your cuffed wrists to a chair in the dark of the boathouse, and take their time.<<else>>The trap raiders are practiced at this. They strip you efficiently, tie you to the dock, and take their time.<</if>>
"See, we could just rob people. But where's the fun in that?"
The "bait" takes first turn, her earlier friendly demeanor replaced by something predatory.
"I like to play with my food."
<<set $player.health to Math.max(1, $player.health - 12)>>
<<set $player.lust = Math.min($player.maxLust, $player.lust + 25)>>
<<if setup.fishingGame.kiraAlong()>>
<<set _kira to $companions[0]>>
<<set _kira.lust = Math.min(_kira.maxLust || 100, _kira.lust + 20)>>
<<if _trapFamily is "sf_cg_fishers_trap_defeat_04">>Kira is chained in the seat beside you, receiving similar treatment.<<else>>Kira is bound to the other side of the dock, receiving similar treatment.<</if>>
<</if>>
<div class="choice-container">
<<vchoice "..." "FishersRest_Defeat_Trap_End" "action" "submit">>
</div><<setBackground "fishers_rest/fishers_rest_lakeside">>
<h2>Release</h2>
<<storyVideo "story/fishers_trap_defeat/trap_end">>
<<if _storyFamily is "sf_cg_fishers_trap_defeat_04">>Hours later, satisfied, they pack up. The bait strolls past you one last time hand in hand with one of them, arms hugged over her tits, still smiling. Their trap moves with them - they'll set up somewhere else, catch more victims.<<else>>Hours later, satisfied, they pack up and leave. Their trap moves with them - they'll set up somewhere else, catch more victims.<</if>>
"Thanks for the fun. Try not to fall for such obvious bait next time."
<<set $vault.scrap -= Math.min($vault.scrap, 12)>>
<<if setup.fishingGame.kiraAlong()>>
<<relationChange "kira" "trust" `setup.kiraUseTrust(-3)`>>
<</if>>
<<notify "warning">>Trapped and used. Lost significant supplies.<</notify>>
<div class="choice-container">
<<vchoice "Recover and leave" "WorldMap_View" "move" "back">>
</div><<set $currentLocation to "fishers_rest">>
<<setBackground "fishers_rest/fishers_rest_lakeside">>
<h2>Spoils</h2>
<<storyVideo "story/fishers_bathing_victory/victory_bathing_raiders">>
The naked raiders lie defeated, completely at your mercy. No weapons, no armor, nothing to protect them now.
"Please... we surrender..."
<<addLust "player" 15>>
They're yours to do with as you please.
<<if _storyClip is "8f58d9d7ff6f">>You pick one - the one who kept a scrap of white top on. You bend her over the hull of an upturned boat on the shore and fuck her from behind, her ass slapping back against you with every thrust, the lake glittering past her shoulder.<<elseif _storyClip is "614778022d51">>You pick one - the one in the scrap of red string. You bend her over the stone edge, face down on a towel, hips still in the water, and fuck her from behind, her big oiled ass slapping back against you with every thrust.<</if>>
<<advanceTime 0 30>>
<<set $player.lust to Math.max(0, $player.lust - 25)>>
<div class="choice-container">
<<vchoice "Continue" "FishersRest_Hub" "move" "back">>
</div><<set $currentLocation to "fishers_rest">>
<<setBackground "fishers_rest/fishers_rest_lakeside">>
<h2>New Ownership</h2>
The cabin raiders are beaten. You've reclaimed Marcus's old sanctuary, and the former occupants are at your mercy.
<<addLust "player" 15>>
<<advanceTime 0 30>>
<<set $player.lust to Math.max(0, $player.lust - 25)>>
<div class="choice-container">
<<vchoice "Continue" "FishersRest_Hub" "move" "back">>
</div><<set $currentLocation to "fishers_rest">>
<<setBackground "fishers_rest/fishers_rest_lakeside">>
<h2>Turnabout</h2>
The ambushers lie defeated. They thought they had you - now they're at your mercy.
<<addLust "player" 15>>
<<advanceTime 0 30>>
<<set $player.lust to Math.max(0, $player.lust - 25)>>
<div class="choice-container">
<<vchoice "Continue" "FishersRest_Hub" "move" "back">>
</div><<set $currentLocation to "fishers_rest">>
<<setBackground "fishers_rest/fishers_rest_lakeside">>
<h2>Trapped Trappers</h2>
Their clever scheme backfired spectacularly. The "bait" and her friends are now the ones at your mercy.
<<addLust "player" 15>>
<<advanceTime 0 30>>
<<set $player.lust to Math.max(0, $player.lust - 25)>>
<div class="choice-container">
<<vchoice "Continue" "FishersRest_Hub" "move" "back">>
</div><<set $currentLocation to "fishers_rest">>
<<setBackground "fishers_rest/fishers_rest_dock">>
<<set _fl to setup.fishingGame.loc()>>
<<set _dc to setup.fishingGame.companion()>>
<<if !_fl.pendingCast>><<set _fl.pendingCast to { quality: "ok", tier: String(setup.fishingGame.dockTier(_dc)), day: $time.day }>><</if>>
<<set _dt to String(_fl.pendingCast.tier)>>
<<set _dn to _dc ? _dc.name : "">>
<<set _dKira to _dc && _dc.id === "kira">>
<<set _dw to setup.fishersRest.fishingGame.dock.watch[_dt] || {}>>
<h2>Waiting for a Bite</h2>
<<switch _dt>>
<<case "0">>
<<storyVideo "story/fishers_dock/t0">>
<<if _dKira>><<showCharacter "kira" "left" "content">><</if>>
<<if _dKira>>Kira sits down on the sun-warm edge of the dock beside you, already down to her cut-off denim shorts, and lets her bare feet drop into the water next to yours. She hisses at the cold, then sighs.
<<say "Kira" "Don't look at me like that. My feet have walked through half the wasteland. They've earned this.">><<else>><<print _dn>> sits down on the edge of the dock beside you, pulls off her boots and dangles her bare feet in the water, kicking little ripples out toward your line.<</if>>
<<case "1">>
<<if _dKira>><<storyVideo "story/fishers_dock/t1_kira">><<else>><<storyVideo "story/fishers_dock/t1">><</if>>
<<if _dKira>><<showCharacter "kira" "left" "flirty">><</if>>
<<if _dKira>><<if _storyClip is "dced6120806a">>The sun's beating down on the boards. Kira drags her tank top over her head and drops it on your tackle box. Underneath there's only a little white crop top, already damp with sweat and clinging to her. She picks up the spare rod and casts out beside you in it, like it's nothing.<<elseif _storyClip is "8dfc500e1332" or _storyClip is "33126063aa99">>The sun's beating down on the boards. Kira sits on the edge of the dock in a thin summer dress, and when you flick lake water at her she shrieks, laughs and lets you soak the front of it. The cotton goes dark and clings.<<else>>The sun's beating down on the boards. Kira drags her tank top over her head, drops it on your tackle box and sits there in her sports bra, scooping lake water over her neck and chest. The cotton goes dark and clings.<</if>>
<<say "Kira" "It's hot. Don't make it a thing.">><<else>><<if _storyClip is "dced6120806a">><<print _dn>> strips off her top in the heat, down to a thin white crop top that clings to her, and casts out beside you in it.<<elseif _storyClip is "be87abb4c858">><<print _dn>> tips her head back in the heat, eyes closed, then tips her water bottle over her shoulder and lets the first of it run down into the neck of her thin white top.<<elseif _storyClip is "c8297d54b5b1">><<print _dn>> pours her water bottle down the front of her thin white top in the heat until it goes see-through and clings to her.<<else>><<print _dn>> strips off her top in the heat and sits in her bra, splashing lake water over her chest until the fabric clings to her.<</if>><</if>>
<<case "2">>
<<if _dKira>><<storyVideo "story/fishers_dock/t2_kira">><<else>><<storyVideo "story/fishers_dock/t2">><</if>>
<<if _dKira>><<showCharacter "kira" "left" "seductive">><</if>>
<<if _dKira>><<if _storyClip is "9f5d1b91d2af">>Kira peels off her shirt "for the sun". Underneath, she's been wearing a tiny orange string bikini all day, apparently. She leans over the rail at the end of the dock with her back to you, pushes her ass out and wiggles it, the string riding up between her cheeks. Then she tosses the little bottle of oil from the tackle box into your lap without looking round.<<elseif _storyClip is "7913ff505152">>Kira hitches her dress up "for the sun" and sits with her knees apart on your towel, nothing under it but a pair of white panties, and grins at you over the top of it. Then she tosses the little bottle of oil from the tackle box into your lap.<<else>>Kira strips to her underwear "for the sun", spreads your towel on the warm planks and kneels on it with her back to you, arching as she stretches. Then she tosses the little bottle of oil from the tackle box into your lap.<</if>>
<<say "Kira" "Don't get a boner and fall in. Oil. Now. And if your hand slips lower than my waist, I'm not stopping you.">><<else>><<print _dn>> strips down to her underwear, kneels on a towel on the warm boards with her back to you and holds a bottle of oil out over her shoulder without looking round.<</if>>
<<case "3">>
<<if _dKira>><<storyVideo "story/fishers_dock/t3_kira">><<else>><<storyVideo "story/fishers_dock/t3">><</if>>
<<if _dKira>><<showCharacter "kira" "left" "seductive" "exposed_tits">><</if>>
<<if _dKira>><<if _storyClip is "ab3c8eace1dc">>Kira drags her crop top up over her tits and just leaves it there, bunched under her collarbone, and picks up the spare rod, fishing topless beside you in her shorts<<else>>Kira pulls her top off over her head, tosses it on the boards and picks up the spare rod, topless in her shorts<</if>>. She casts out next to you like it's nothing. Her tits bounce with every flick of the rod, her nipples tight in the breeze off the water.
<<say "Kira" "You're staring at my tits instead of your line. It's bobbing, genius.">><<else>><<print _dn>> <<if _storyClip is "ab3c8eace1dc" or _storyClip is "4981242a6324">>shoves her top up over her tits and leaves it there<<else>>takes her top off<</if>>, picks up the spare rod and fishes beside you topless, not bothering to cover up. Every cast makes her tits bounce.<</if>>
<<case "4">>
<<if _dKira>><<set _storyClip to null>><<else>><<storyVideo "story/fishers_dock/t4">><</if>>
<<if _dKira>><<showCharacter "kira" "left" "seductive" "naked">><</if>>
<<if _dKira>><<if _storyClip is "6299e7163c99">>Kira walks to the very end of the dock and strips there, with the whole lake in front of her: top off over her head, then she bends over, shoves her shorts down and kicks them away, her bare ass right at you. She straightens up stark naked, stretches in the sun and looks back at you over her shoulder.<<else>>A rustle, and Kira's clothes are a heap on the dock. She dives off the end of the boards stark naked, swims out underwater and comes up laughing in the clear water. Then she splashes you<<if _storyClip is "a486456026ca">>, laughs, and pushes off to swim out into the clear water<</if>>.<</if>>
<<say "Kira" "Water's warm. Your rod can babysit itself for five minutes.">><<else>><<if _storyClip is "6299e7163c99">><<print _dn>> strips at the end of the dock, bending over to kick her shorts off with her bare ass towards you, then straightens up naked and looks back at you over her shoulder.<<else>><<print _dn>> drops every stitch she's wearing on the dock and wades out naked into the lake, water climbing her thighs, her ass, the small of her back.<</if>><</if>>
<<case "5">>
<<storyVideo "story/fishers_dock/t5">>
<<if _dKira>><<showCharacter "kira" "left" "seductive" "naked">><</if>>
<<if _dKira>>Kira is naked on the flat rock at the end of the dock, feet in the water, knees wide open. She holds your eyes while she spreads her pussy lips with two fingers and slides the middle one inside, slow, already wet.
<<say "Kira" "Rod stays in the water. You stay right there. Let's see who comes first, me or the fish.">><<else>><<print _dn>> is naked on the rock at the end of the dock, legs spread, fingers working her pussy while she watches you fish.
<<say _dn "Don't mind me. Eyes on the line. If you can.">><</if>>
<<case "s2">>
<<storyVideo "story/fishers_dock/solo_s2">>
<<if _storyClip is "1e6cca069d3b">>A little white boat drifts past the end of the dock with its engine off. On the bow, a redhead in an orange bikini is sunning herself, and she has seen you. She doesn't wave. She sits up, lets her knees fall open and slides a hand down between her legs, rubbing herself through the bikini while she looks straight at you.<<else>>On the rocks along the shore, a woman in a black swimsuit is sunning herself, and she has seen you. She doesn't wave. She hooks a finger under the strap, peels the suit aside and lets you look at her tits, smiling like she's the one who caught something.<</if>>
<<default>>
<<storyVideo "story/fishers_dock/solo_s1">>
Far across the cove, a woman walks down to the water with the sun behind her. She's naked. She wades in slowly, a dark shape against the glare, and has no idea anyone is watching. Or doesn't care.
<</switch>>
<<set _dStem to _storyClip>>
<span id="dock-more"></span>
<div class="choice-container" id="dock-choices">
<<link '<span class="choice-button action"><span class="gi gi-eye gi-large"></span><span class="label">Keep watching</span></span>'>>
<<run setup.fishingGame.markWatched()>>
<<if _dw.lust>><<addLust "player" _dw.lust>><</if>>
<<if _dc>>
<<if _dw.exhib && $exhibitionism && $exhibitionism[_dc.id] !== undefined>><<gainExhibitionism _dc.id _dw.exhib "fishing dock">><</if>>
<<if _dw.herLust>>
<<if _dKira>><<addKiraLust _dw.herLust>><<else>><<run _dc.obj.lust = Math.min(_dc.obj.maxLust || 100, (_dc.obj.lust || 0) + _dw.herLust)>><</if>>
<</if>>
<</if>>
<<replace "#dock-choices">><</replace>>
<<replace "#dock-more">><<include "FishingGame_Dock_Watch">><</replace>>
<</link>>
<<link '<span class="choice-button move"><span class="gi gi-fish gi-large"></span><span class="label">Back to the rod</span></span>' "FishingGame">>
<<run setup.fishingGame.backToRod(true)>>
<</link>>
</div><<if typeof _dStem === "undefined">><<set _dStem to null>><</if>><<if typeof _dt === "undefined">><<set _dt to "s1">><<set _dKira to false>><<set _dn to "">><</if>>
<<switch _dt>>
<<case "0">>
<<if _dKira>>You watch her instead of the float. She notices, of course, and flicks a handful of cold water straight into your face.<br><br><<say "Kira" "Eyes on the rod, perv. They're feet.">><<else>>You watch her toes curl in the water. She catches you at it and laughs.<</if>>
<<case "1">>
<<if _dKira>>You don't look away. A drop runs down between her tits and disappears under the <<if _dStem is "dced6120806a">>damp crop top<<elseif _dStem is "8dfc500e1332" or _dStem is "33126063aa99">>soaked front of her dress<<else>>wet bra<</if>>, and she watches you follow it. She doesn't cover up. She arches her back a little, actually, and pretends it's a stretch.<br><br><<say "Kira" "Having a nice time over there?">><<else>>You don't look away, and she doesn't ask you to. She arches her back and lets you look.<</if>>
<<case "2">>
<<if _dKira>><<if _dStem is "7913ff505152">>You kneel between her knees on the towel and pour the oil into your hands. Her calves first, then her thighs, slow, your thumbs working higher until they brush the edge of her white panties. She lets her knees fall wider, grinning at you over the hem of her dress, and makes a low sound in her throat.<<else>><<if _dStem is "9f5d1b91d2af">>You stand behind her at the rail and pour the oil straight onto her ass. It runs down the backs of her thighs, and you follow it with both hands, working it into her until she shines.<<else>>You kneel behind her and pour the oil into your hands. Her shoulders first, then down her spine, your thumbs pressing slow circles into the small of her back.<</if>> When your hands slide down over the curve of her ass she pushes back into them and makes a low sound in her throat.<</if>><br><br><<say "Kira" "Told you. Not stopping you.">><<else>>You oil her back, her shoulders, the small of her back, and when your hands slide lower she pushes her ass back into them.<</if>>
<<case "3">>
<<if _dKira>>You keep watching her instead of your line. She knows. The next cast is slower, deliberate, her tits swaying as she winds the reel, and she wets her lips when she catches your eye.<br><br><<say "Kira" "Like the view? Earn it. Catch me something.">><<else>>She casts again, slower, for you, and grins when she catches you staring at her tits.<</if>>
<<case "4">>
<<if _dKira>><<if _dStem is "6299e7163c99">>She walks down off the end of the boards into the lake, taking her time about it. Then she<<else>>She<</if>> floats on her back in the shallows, tits and belly breaking the surface, her pussy a dark shadow under the water, and lets you look for as long as you like. When she finally stands, water streams off her nipples.<br><br><<say "Kira" "You're hard. I can see it from here.">><<else>>She floats on her back in the shallows, naked and in no hurry at all, and lets you look.<</if>>
<<case "5">>
<<if _dKira>>You watch every second of it. Two fingers, then three, her hips rolling up off the rock, her other hand pinching her nipple hard. She comes with her eyes locked on yours, shaking, her pussy clenching on her fingers, a raw moan carrying across the whole lake. Then she pulls her fingers out and sucks them clean.<br><br><<say "Kira" "I win. Your turn once you've caught something. Then I'm riding you on this dock.">><<else>>You watch her finger herself right to the end. She comes shaking on the rock, moaning your name across the water, then sucks her fingers clean.<</if>>
<<case "s2">>
She takes her time. Her fingers circle a nipple, then slide down her belly and under the swimsuit, and she bites her lip while she rubs herself, eyes on you the whole time. When she's done she pulls the suit back up and blows you a kiss<<if _dStem is "1e6cca069d3b">>, and the boat drifts on round the point<<else>> and walks off into the reeds<</if>>.
<<default>>
You watch her wade out until the water reaches her shoulders and she dives, a flash of pale ass and legs, and then there's only rings spreading on the water.
<</switch>>
<div class="choice-container">
<<link '<span class="choice-button move"><span class="gi gi-fish gi-large"></span><span class="label">Back to the rod: something is biting</span></span>' "FishingGame">>
<<run setup.fishingGame.backToRod(false)>>
<</link>>
</div><<set $currentLocation to "fishers_rest">>
<<setBackground "fishers_rest/fishers_rest_dock">>
<h2>Fishing</h2>
<div id="fishing-game-content">
<<if $locations.fishers_rest && $locations.fishers_rest.pendingCast && $locations.fishers_rest.pendingCast.resume>>
<p class="wait-msg">You settle back over the rod.</p>
<<else>>
<div class="fishing-intro">
<<set _fgComp to setup.fishingGame.companion()>>
<<set _fgContest to $locations.fishers_rest && $locations.fishers_rest.contest>>
<<if _fgComp>><<storyVideo "story/fishers_reel/together">><<else>><<storyVideo "story/fishers_reel/wait">><</if>>
<p>You take the old fishing rod and walk out onto the weathered dock<<if _fgComp>> with <<print _fgComp.name>> beside you<</if>>. The boards creak but hold firm. The lake stretches out before you, calm and inviting.</p>
<<if _fgContest && !_fgContest.done>>
<p class="fishing-contest-banner"><strong><<if _fgContest.who is "angler">>Tess is casting from the far end of the dock. One cast each: the bigger catch wins, and a tie is hers.<<else>>The bet is on. One cast each: the bigger catch wins, and a tie is yours.<</if>></strong></p>
<</if>>
<<set _fgLine to setup.fishingGame.line("cast_before", setup.fishingGame.companion())>>
<<if _fgLine && !_fgLine.thought>>
<<say _fgLine.speaker _fgLine.text>>
<<elseif _fgLine>>
<p class="fishing-thought"><em><<print _fgLine.text>></em></p>
<</if>>
<p>The water is clear today. You can see fish moving in the shallows.</p>
<p class="fishing-relaxed-option"><label><<if settings.relaxedReel>><input type="checkbox" id="fg-relaxed-toggle" checked><<else>><input type="checkbox" id="fg-relaxed-toggle"><</if>> Relaxed reel: tap PULL / HOLD / SLACK instead of holding REEL</label></p>
<div class="choice-container">
<a id="fg-start-btn" class="link-internal macro-link"><span class="choice-button action"><span class="gi gi-fish gi-large"></span><span class="label">Ready your cast</span></span></a>
<<if !_fgContest && setup.fishingGame.betEligible(_fgComp)>>
<<vchoice `_fgComp.name + " wants to make it interesting"` "FishingGame_Bet" "action" "heart">>
<</if>>
<<vchoice "Nevermind" "FishersRest_Hub" "move" "back">>
</div>
</div>
<</if>>
</div><<set $currentLocation to "fishers_rest">>
<<setBackground "fishers_rest/fishers_rest_dock">>
<h2>The Lady of the Lake</h2>
<<storyVideo "story/fishers_lady/appear">>
<<if _storyClip is "e3c293bcfe40">>She's standing in the stream where a second ago there was nothing, a crown of pink flowers on white hair, one arm across her breasts, smiling like she already owns you.
<<elseif _storyClip is "8d87bb6a1cbe">>She's standing ankle-deep in the stream where a second ago there was nothing, a crown of pink flowers on white hair, smiling like she already owns you.
<<elseif _storyClip is "29477190dbc1">>She's standing among the rocks with the water running round her where a second ago there was nothing, white hair spilling over her breasts, smiling like she already owns you.
<<elseif _storyClip is "17a281531a7a">>She's standing at the water's edge where a second ago there was nothing, a crown of pink flowers on white hair, laughing like she already owns you.
<<else>>She's standing in water to the knee where a second ago there was nothing, a crown of pink flowers on white hair, smiling like she already owns you.
<</if>>
<<say "Lady of the Lake" "Little fisherman. You've taken so much from my lake.">>
<<if _storyClip is "e3c293bcfe40">>She lets the arm fall.
<<elseif _storyClip is "8d87bb6a1cbe">>She trails a hand down her body.
<<elseif _storyClip is "17a281531a7a">>She throws her arms wide.
<<else>>She crooks a finger.
<</if>>
<<say "Lady of the Lake" "Your turn to give.">>
<div class="choice-container">
<<vchoice "Go to her" "FishingGame_Lady_Drink" "action" "heart">>
<<vchoice "Refuse" "FishingGame_Lady_Refuse" "move" "back">>
</div><<set $currentLocation to "fishers_rest">>
<<setBackground "fishers_rest/fishers_rest_dock">>
<h2>The Lady of the Lake</h2>
She laughs and snaps the line.
<div class="choice-container">
<<if setup.fishingGame.canFishAgain()>><<vchoice "Try again" "FishingGame" "action" "fish">><<else>><<vchoiceDisabled "Already fished twice today" "action" "fish">><</if>>
<<vchoice "Give up" "FishersRest_Hub" "move" "back">>
</div><<set $currentLocation to "fishers_rest">>
<<setBackground "fishers_rest/fishers_rest_dock">>
<<advanceTime 0 setup.fishersRest.fishingGame.lady.minutes>>
<<run setup.fishingGame.ladyAccept()>>
<h2>The Lady of the Lake</h2>
<<storyVideo "story/fishers_lady/drink">>
<<say "Lady of the Lake" "Let me drink from you, and the lake gives you its best for a week.">>
<<if _storyClip is "de2ef0ba2fe2">>She draws you up out of the water onto the sun-warm rocks and kneels.
<<elseif _storyClip is "61fe3d1237e9">>She leads you onto the rocks above the water, sinks to her knees and looks up at you through the flowers.
<</if>>
She takes your cock in her mouth and sucks you, her hand working the shaft, and she doesn't let up until you cum. She drinks every drop.
<<set $player.lust to 0>><<run setup.playerReleased()>>
<p class="fishing-thought"><em>For the next <<print setup.fishersRest.fishingGame.lady.days>> days every fish you hook here is one step rarer.</em></p>
<div class="choice-container">
<<if setup.fishingGame.canFishAgain()>><<vchoice "Fish again" "FishingGame" "action" "fish">><<else>><<vchoiceDisabled "Already fished twice today" "action" "fish">><</if>>
<<vchoice "Done fishing" "FishersRest_Hub" "move" "back">>
</div><<set $currentLocation to "fishers_rest">>
<<setBackground "fishers_rest/fishers_rest_dock">>
<<set _fl to setup.fishingGame.loc()>>
<<set _hc to setup.fishingGame.companion()>>
<<if !_fl.pendingCast>><<set _fl.pendingCast to { quality: "ok", tier: "hand", day: $time.day, hand: (_hc ? setup.fishingGame.handKind(_hc) : "hj") }>><</if>>
<<set _hk to _fl.pendingCast.hand || "hj">>
<<set _hn to _hc ? _hc.name : "She">>
<<set _hKira to _hc && _hc.id === "kira">>
<<set _hh to _hc ? setup.fishingGame.heat(_hc) : 0>>
<h2>Waiting for a Bite</h2>
<<if _hKira>><<showCharacter "kira" "left" "seductive">><</if>>
<<if _hk is "bj">>
<<if _hKira>>You've been hard since you sat down, and Kira has been watching the front of your pants instead of the water. She slides off the edge of the dock and onto her knees on the warm boards beside you, and pops the button on your fly with two fingers.
<<say "Kira" "Eyes on the water. I'm going to suck your cock while you fish. You drop that rod, I stop. You cum before that fish is on the dock, you lose it, and I win. Land it first and I'll swallow every drop. Deal?">><<else>><<print _hn>> has been watching the bulge in your pants more than the water. She kneels on the boards beside you and hooks a finger in your waistband.
<<say _hn "Keep fishing. I'm going to suck you while you do. Land the fish before you cum and I'll finish you properly. Cum first and the fish swims. Want to play?">><</if>>
<<else>>
<<if _hKira>><<if _hh lt 1>>Kira sighs, loud enough for the fish to hear.
<<say "Kira" "Your hand's been on your thigh for ten minutes. You're going to scare everything in this lake off.">>
She shuffles over on the boards until her hip is against yours, and her hand settles on your lap.
<<say "Kira" "Fine. I'll help you concentrate. Land the fish before you finish, and don't make it weird.">><<else>>Kira scoots up behind you on the boards, her tits pressed against your back, and her hand slides down the front of your pants and wraps round your cock like it lives there.
<<say "Kira" "You're so hard it's distracting me. Eyes on the water. Land that fish before you cum all over my hand, or it gets away and I laugh at you. Ready?">><</if>><<else>><<print _hn>> sits down on the boards right behind you, her chin on your shoulder and her hand already undoing your belt.
<<say _hn "You look like you need a hand. Keep fishing. Land it before you finish, and you win.">><</if>>
<</if>>
<div class="choice-container">
<<link '<span class="choice-button action"><span class="gi gi-heart gi-large"></span><span class="label">Let her</span></span>' "FishingGame">>
<<run setup.fishingGame.acceptHand()>>
<</link>>
<<link '<span class="choice-button move"><span class="gi gi-fish gi-large"></span><span class="label">Not now, I want this fish</span></span>' "FishingGame">>
<<run setup.fishingGame.declineHand()>>
<</link>>
</div><<set $currentLocation to "fishers_rest">>
<<setBackground "fishers_rest/fishers_rest_dock">>
<<set _fl to setup.fishingGame.loc()>>
<<set _bc to setup.fishingGame.companion()>>
<<if !_bc>><<goto "FishingGame">><</if>>
<<set _fl.betDay to $time.day>>
<<set _bn to _bc.name>>
<<set _bKira to _bc.id === "kira">>
<<set _bh to setup.fishingGame.heat(_bc)>>
<<set $locations.fishers_rest.betDraft to { win: null, lose: (_bh gte 2 ? either("knees", "boots") : (_bh gte 1 ? "carry" : "chores")), heat: _bh }>>
<h2>A Friendly Wager</h2>
<<if _bKira>><<showCharacter "kira" "left" "flirty">><</if>>
<<if _bh gte 2>>
<<if _bKira>>Kira picks up the spare rod, weighs it in her hand and looks at you sideways.
<<say "Kira" "Bet my fish is bigger than yours. And not for fish. Loser gets on their knees on this dock.">>
She holds a hand up before you can answer.
<<say "Kira" "Rules. You pick what I do if you win. I pick what you do if I win. We both say yes before anybody casts. Ties go to you, because I'm generous.">><<else>><<print _bn>> picks up the spare rod and grins at you.
<<say _bn "Bet you my catch beats yours. Loser pays up, right here on the dock. You pick my forfeit, I pick yours, and we both agree before we cast. Ties go to you.">><</if>>
<<else>>
<<if _bKira>>Kira picks up the spare rod and twirls it.
<<say "Kira" "Bet I catch a bigger one than you. Loser does the dirty work. Ties go to you, since you need the help.">><<else>><<print _bn>> picks up the spare rod.
<<say _bn "Want to make it interesting? Bigger catch wins, loser does the dirty work. Ties go to you.">><</if>>
<</if>>
<div id="bet-pick">
<p><strong>If you win, <<print _bn>>...</strong></p>
<div class="choice-container">
<<if _bh gte 2>>
<<link '<span class="choice-button action"><span class="gi gi-heart gi-large"></span><span class="label">...kneels and blows you on the dock, your line still in the water</span></span>'>>
<<set $locations.fishers_rest.betDraft.win to "mouth">><<replace "#bet-pick">><<include "FishingGame_Bet_Terms">><</replace>>
<</link>>
<<if setup.fishingGame.betStakeOpen("naked", _bc)>>
<<link '<span class="choice-button action"><span class="gi gi-eye gi-large"></span><span class="label">...fishes the rest of the day naked</span></span>'>>
<<set $locations.fishers_rest.betDraft.win to "naked">><<replace "#bet-pick">><<include "FishingGame_Bet_Terms">><</replace>>
<</link>>
<</if>>
<<else>>
<<link '<span class="choice-button action"><span class="gi gi-fish gi-large"></span><span class="label">...guts and cleans every fish</span></span>'>>
<<set $locations.fishers_rest.betDraft.win to "chores">><<replace "#bet-pick">><<include "FishingGame_Bet_Terms">><</replace>>
<</link>>
<<if _bh gte 1 && setup.fishingGame.betStakeOpen("top", _bc)>>
<<link '<span class="choice-button action"><span class="gi gi-eye gi-large"></span><span class="label">...walks back with her top off</span></span>'>>
<<set $locations.fishers_rest.betDraft.win to "top">><<replace "#bet-pick">><<include "FishingGame_Bet_Terms">><</replace>>
<</link>>
<</if>>
<</if>>
<<link '<span class="choice-button move"><span class="gi gi-back gi-large"></span><span class="label">No bet. Just fish.</span></span>' "FishingGame">><</link>>
</div>
</div><<set _bd to $locations.fishers_rest.betDraft>>
<<set _bc to setup.fishingGame.companion()>>
<<set _bn to _bc ? _bc.name : "She">>
<<set _bKira to _bc && _bc.id === "kira">>
<p><strong>If <<print _bn>> wins, you...</strong>
<<switch _bd.lose>>
<<case "knees">>...get on your knees behind her at the end of the dock and eat her pussy while she keeps fishing.
<<case "boots">>...carry the whole catch back to the cabin in nothing but your boots.
<<case "carry">>...carry everything back, rods, bucket and all, and she gets to sit on the dock and supervise.
<<default>>...gut and clean every fish while she watches.
<</switch>></p>
<<if _bKira>><<if _bd.win is "mouth" or _bd.win is "naked">><<say "Kira" "That's my price. Take it or leave it. Last chance to back out.">><<else>><<say "Kira" "Deal? Shake on it.">><</if>><<else>><<say _bn "That's my price. Deal?">><</if>>
<div class="choice-container">
<<link '<span class="choice-button action"><span class="gi gi-check gi-large"></span><span class="label">Deal</span></span>' "FishingGame">>
<<set _bc to setup.fishingGame.companion()>>
<<run setup.fishingGame.startContest({ who: _bc ? _bc.id : "companion", name: _bc ? _bc.name : "She", passage: "FishingGame_BetResult", ties: "you", skill: setup.fishersRest.fishingGame.bet.herSkill, win: $locations.fishers_rest.betDraft.win, lose: $locations.fishers_rest.betDraft.lose, heat: $locations.fishers_rest.betDraft.heat })>>
<<set $locations.fishers_rest.betDraft to null>>
<</link>>
<<link '<span class="choice-button move"><span class="gi gi-back gi-large"></span><span class="label">No bet. Just fish.</span></span>' "FishingGame">>
<<set $locations.fishers_rest.betDraft to null>>
<</link>>
</div><<set $currentLocation to "fishers_rest">>
<<setBackground "fishers_rest/fishers_rest_dock">>
<<set _fl to setup.fishingGame.loc()>>
<<set _c to setup.fishingGame.settleContest()>>
<<set _rc to setup.fishingGame.companion()>>
<<set _rn to _c ? _c.name : "She">>
<<set _rKira to _rc && _rc.id === "kira">>
<h2>Weighing In</h2>
<<if !_c>>
The bet's off. Nobody remembers who was winning.
<<else>>
<p>Your catch: <strong><<if _c.mine gt 0>><<print _c.mineName>> (<<print _c.mine>> fish)<<else>>nothing<</if>></strong>. <<print _rn>>'s: <strong><<print _c.her.name>> (<<print _c.her.food>> fish)</strong>.</p>
<<if !_c.paid>><<set _c.paid to true>><<run setup.fightLootStart()>><<run setup.postBattleTakeLoot("fish", "Fish", _c.her.food, "", "fightLoot")>><</if>>
<<lootLeftList "fightLoot">>
<<if _c.outcome is "win">>
<<if _rKira>><<run setup.fishingGame.payKiraForfeit(_c.win)>><<showCharacter "kira" "left" "seductive">><</if>>
You win, so <<print _rn>> pays up.<<if _c.mine is _c.her.food>> Only just: she said ties go to you, and she's a woman of her word.<</if>>
<<switch _c.win>>
<<case "mouth">>
<<if _rKira>><<storyVideo "story/fishers_bet/you_win_kira">><<else>><<storyVideo "story/fishers_bet/you_win">><</if>>
<<print _rn>> doesn't argue. <<if _storyClip is "daafa222666c">>She props her rod against the rail, pushes you down onto your back on the warm boards and stretches out beside you, pulling your cock out while you're still holding yours.<<else>>She props her rod against the rail, kneels on the boards in front of you and pulls your cock out while you're still holding yours.<</if>> You keep your line in the water. She keeps her eyes on you. She takes you deep and slow, one hand wrapped round the base, her tits brushing your thighs, and every time the float bobs she sucks harder, like she's daring you to look away from her.
<<if _rKira>><<say "Kira" "Don't you dare reel in. You won. Enjoy it.">><</if>>
You last longer than you'd bet on, and not much. You come with a groan across the whole cove, and she swallows it all, then wipes her mouth with the back of her hand and stands up, smug even though she lost.
<<set $player.lust to 0>><<run setup.playerReleased()>>
<<relationChange _c.who "affection" setup.fishersRest.fishingGame.bet.affection>>
<<case "naked">>
<<print _rn>> strips right there: top, boots, shorts, the lot, dropped in a pile on your tackle box. She picks her rod back up and casts again, stark naked in the sun, her tits bouncing every time she flicks the line out, her bare ass on the warm boards when she sits. She doesn't cover up for the rest of the day<<if _rKira>>, not on the road, not until the vault door shuts behind you<</if>>. She stops pretending she isn't enjoying it round about the second cast.
<<if _rKira>><<say "Kira" "A bet's a bet. My clothes stay in the pile until we're home. Carry them.">><</if>>
<<if $exhibitionism && $exhibitionism[_c.who] !== undefined>><<gainExhibitionism _c.who setup.fishersRest.fishingGame.bet.exhib "fishing bet">><</if>>
<<addLust "player" 10>>
<<case "top">>
<<print _rn>> pulls her top off and stuffs it in your back pocket. She'll walk back like that, tits out in the breeze<<if _rKira>>, all the way to the vault door<</if>>, and she spends the rest of the afternoon pretending not to notice you noticing.
<<if _rKira>><<say "Kira" "Don't look so smug. You get it back when we're home. Not before.">><</if>>
<<if $exhibitionism && $exhibitionism[_c.who] !== undefined>><<gainExhibitionism _c.who 1 "fishing bet">><</if>>
<<addLust "player" 5>>
<<default>>
<<print _rn>> groans, rolls up her sleeves and starts gutting the catch at the end of the dock, muttering about luck.
<</switch>>
<<else>>
<<if _rKira>><<showCharacter "kira" "left" "flirty">><</if>>
<<print _rn>> wins, so you pay up.
<<switch _c.lose>>
<<case "knees">>
<<storyVideo "story/fishers_bet/she_wins">>
<<print _rn>> strolls to the end of the dock, casts her line far out into the lake, and plants her feet wide.
<<if _rKira>><<say "Kira" "I'm still fishing. You're not. Knees. Get to work.">><<else>><<say _rn "I'm still fishing. You're not. On your knees.">><</if>>
You kneel on the boards behind her and peel her shorts down over her ass. She pushes back into your face without turning round. You spread her with your thumbs and lick her pussy from behind, slow at first, then deep, your tongue buried in her while she winds the reel. She's soaking. She moans every time a fish nibbles and keeps casting anyway, grinding her cunt back against your mouth until her legs start to shake. She comes with the rod bent double, gasping, and lands a perch at the same time.
<<if _rKira>><<say "Kira" "Best fishing trip of my life.">><</if>>
<<addLust "player" 15>>
<<if _rc>><<run _rc.obj.lust = 0>><</if>>
<<relationChange _c.who "affection" setup.fishersRest.fishingGame.bet.affection>>
<<case "boots">>
You pay up. You strip to your boots, pick up the bucket and the rods, and carry the lot back to the cabin with your ass out, while <<print _rn>> walks behind you, laughing, and whistles every time you bend over.
<<addLust "player" 5>>
<<case "carry">>
You carry everything back: rods, bucket, tackle and all, while <<print _rn>> strolls beside you with her hands in her pockets, offering advice.
<<default>>
You get the knife and the bucket. <<print _rn>> sits on the edge of the dock, dangling her feet in the water, and supervises every cut.
<</switch>>
<</if>>
<</if>>
<<set _fl.contest to null>>
<div class="choice-container">
<<if setup.fishingGame.canFishAgain()>><<vchoice "Fish again" "FishingGame" "action" "fish">><<else>><<vchoiceDisabled "Already fished twice today" "action" "fish">><</if>>
<<vchoice "Done fishing" "FishersRest_Hub" "move" "back">>
</div><<set $currentLocation to "fishers_rest">>
<<setBackground "fishers_rest/fishers_rest_lakeside">>
<<set _A to setup.fishingGame.anglerState()>>
<<set _ac to setup.fishingGame.companion()>>
<<set _aKira to _ac && _ac.id === "kira">>
<<set _ah to setup.fishingGame.heat(_ac)>>
<h2>The Angler</h2>
<<storyVideo "story/fishers_angler/intro">>
<<if !_A.met>>
Across the cove, where an old jetty runs out from the reeds, a woman is fishing. Mid-twenties, blonde, a tattoo sleeve down one arm, a white crop top shoved up over her tits and just left there. She's fishing topless, and she's good: every cast drops her lure exactly where she wants it.
She sees you watching. She doesn't cover up. She grins, flicks another cast out, tits bouncing with it, and calls across the water.
<<say "Tess" "You're scaring my fish, dock boy. Unless you're here to lose.">>
She reels in, slow.
<<say "Tess" "Tess. I fish this cove. I hear you fish it too. Badly.">>
<<set _A.met to true>>
<<else>>
Tess is back on the far jetty, crop top shoved up over her tits, line already in the water. She spots you and lifts the rod in greeting.
<<set _tessHi to "Back for another lesson?" + (_A.wins gt 0 ? " Or are you here to get lucky twice?" : "")>>
<<say "Tess" _tessHi>>
<</if>>
<<if $traders && $traders.tessLast && $traders.tessLast.day === $time.day>>
<<set _tsTold to setup.tessResaleOnce()>>
<<if _tsTold>>
<<set _tsWords to ["nothing", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten"]>>
<p>Tess tips your fish into her bucket, counts them twice, and grins at you over the rim like she's landed something a lot bigger than a bass.</p>
<<say "Tess" `"The quartermaster at Trader's Rest pays " + (_tsWords[setup.ECONOMY.fish.buyer] || setup.ECONOMY.fish.buyer) + " scrap a fish, dock boy. I pay you " + (_tsWords[setup.ECONOMY.fish.tess] || setup.ECONOMY.fish.tess) + ", walk the fuckers over in the morning and pocket the difference. You're paying me to take a walk, bait. Best catch I make all week, and I never even wet a line. Shit, look at your face."`>>
<<else>>
<<say "Tess" "Fish for scrap. You're getting robbed, dock boy, and you fucking know it. Bring me something bigger next time. In the bucket or in your trousers, I'm not fussy.">>
<</if>>
<<if $traders.tessLast.haggle gt 0 && setup.kiraWithYou()>><<say "Kira" "She'll pay one more. Won't you, Tess? Don't make me fucking ask twice.">><<say "Tess" "...Fine. One more, you hard-faced bitch. She's meaner than you, dock boy. I like her.">><</if>>
<<if _tsTold && setup.kiraWithYou()>><<say "Kira" "Fuck that. Next time we walk them over ourselves. Your legs work, don't they, idiot?">><</if>>
<</if>>
<<if _ac>>
<<if _aKira>>
<<if _ah gte 2>><<say "Kira" "Fuck. Beat her. Then let's see if she shares.">><<elseif _ah gte 1>><<say "Kira" "If you don't beat her I'm never letting you touch that rod again.">><<else>><<say "Kira" "She's showing off. Ignore her.">><</if>>
<<else>>
<<if _ah gte 2>><<say _ac.name "Oh, I like her. Go on. Win.">><<elseif _ah gte 1>><<say _ac.name "You're staring. Either say something or stop.">><<else>><<say _ac.name "Friend of yours?">><</if>>
<</if>>
<<else>>
<<if _ah gte 2>><em>Your cock is already hard. You haven't even cast yet.</em><<elseif _ah gte 1>><em>You try to look at her rod. You don't manage it.</em><<else>><em>Company, at last. Topless company.</em><</if>>
<</if>>
<div class="choice-container">
<<vchoice "Watch her fish" "FishersRest_Angler_Watch" "action" "eye">>
<<vchoice "Challenge her" "FishersRest_Angler_Terms" "action" "fish">>
<<set _tsFish to setup.fishingGame.fishInPack()>>
<<if _tsFish gt 0>>
<<link `'<span class="choice-button action"><img class="shop-item-thumb" src="' + setup.itemImage("fish") + '" alt="" onerror="this.style.display=\'none\'"><span class="label">Sell Tess your fish (' + _tsFish + ' for ' + (_tsFish * setup.ECONOMY.fish.tess) + ' scrap)</span></span>'`>><<set _tsR to setup.tessSellFish("all")>><<set $traders to $traders || {}>><<set $traders.tessLast to { day: $time.day, sold: _tsR.sold, scrap: _tsR.scrap, haggle: _tsR.haggle }>><<goto "FishersRest_Angler">><</link>>
<</if>>
<<link '<span class="choice-button move"><span class="gi gi-back gi-large"></span><span class="label">Leave her to it</span></span>' "FishersRest_Hub">><<set setup.fishingGame.anglerState().doneDay to $time.day>><</link>>
</div><<setBackground "fishers_rest/fishers_rest_lakeside">>
<<set _ac to setup.fishingGame.companion()>>
<<addLust "player" 6>>
<h2>The Angler</h2>
<<storyVideo "story/fishers_angler/watch">>
<<if _storyClip is "2bd41e6c29e9" || _storyClip is "8ddb54a988d3">>You wander over to the end of her dock and watch her. She knows. She lets you stand right beside her while she fishes, her top shoved up, her tits bare in the sun as she winds the reel, the waistband of her shorts riding low. When she lands a bass she holds it up to you like a trophy, then bites her lip and tucks it in her bucket.<<else>>You sit on the end of your own dock and watch her. She knows. Every cast gets a little slower, a little more of a show: her back arched, her tits swinging as she winds the reel, the waistband of her shorts riding low. When she lands a bass she holds it up to you like a trophy, then bites her lip and tucks it in her bucket.<</if>>
<<say "Tess" "Seen enough? Or do you want to see what you get if you beat me?">>
<<if _ac && _ac.id === "kira">><<say "Kira" "She's asking for it. Literally.">><</if>>
<div class="choice-container">
<<vchoice "Challenge her" "FishersRest_Angler_Terms" "action" "fish">>
<<link '<span class="choice-button move"><span class="gi gi-back gi-large"></span><span class="label">Leave her to it</span></span>' "FishersRest_Hub">><<set setup.fishingGame.anglerState().doneDay to $time.day>><</link>>
</div><<setBackground "fishers_rest/fishers_rest_lakeside">>
<<set _A to setup.fishingGame.anglerState()>>
<h2>Terms</h2>
Tess wades round the edge of the cove to your dock with her rod over her shoulder and her tits still out, and plants herself on the other end of the boards.
<<say "Tess" "One cast each. Biggest catch wins. My lake, so a tie's mine.">>
<<say "Tess" "Now, stakes. If I win, I keep your two best fish, and you get on your knees behind me at the end of this dock and eat my pussy while I keep fishing. If you win, I show you my trick, and then you can have whatever you want from me. Right here.">>
She shrugs.
<<say "Tess" "Or we play for fish, like boring people. Loser hands over their catch and their shirt. Your call. Nobody casts till we both say yes.">>
<div class="choice-container">
<<if setup.fishingGame.canFishAgain()>>
<<link '<span class="choice-button action"><span class="gi gi-heart gi-large"></span><span class="label">Deal. The dock stakes.</span></span>' "FishingGame">>
<<run setup.fishingGame.startContest({ who: "angler", name: "Tess", passage: "FishersRest_Angler_Result", ties: "her", skill: setup.fishingGame.anglerSkill(), stakes: "dock" })>>
<</link>>
<<link '<span class="choice-button action"><span class="gi gi-fish gi-large"></span><span class="label">Just for fish. And shirts.</span></span>' "FishingGame">>
<<run setup.fishingGame.startContest({ who: "angler", name: "Tess", passage: "FishersRest_Angler_Result", ties: "her", skill: setup.fishingGame.anglerSkill(), stakes: "fish" })>>
<</link>>
<<else>>
<<vchoiceDisabled "You've already fished twice today" "action" "fish">>
<</if>>
<<link '<span class="choice-button move"><span class="gi gi-back gi-large"></span><span class="label">Not today</span></span>' "FishersRest_Hub">><<set setup.fishingGame.anglerState().doneDay to $time.day>><</link>>
</div>
<<if !setup.fishingGame.canFishAgain()>><<say "Tess" "Fished out already? Come back tomorrow, then.">><</if>><<setBackground "fishers_rest/fishers_rest_lakeside">>
<<set _fl to setup.fishingGame.loc()>>
<<set _c to setup.fishingGame.settleContest()>>
<<set _A to setup.fishingGame.anglerState()>>
<<set _A.doneDay to $time.day>>
<h2>Weighing In</h2>
<<if !_c>>
Tess has already packed up and gone.
<div class="choice-container"><<vchoice "Back" "FishersRest_Hub" "move" "back">></div>
<<else>>
<p>Your catch: <strong><<if _c.mine gt 0>><<print _c.mineName>> (<<print _c.mine>> fish)<<else>>nothing<</if>></strong>. Tess's: <strong><<print _c.her.name>> (<<print _c.her.food>> fish)</strong>.</p>
<<set _stakes to _c.stakes>>
<<set _outcome to _c.outcome>>
<<set _fl.contest to null>>
<<if _outcome is "win">>
<<set _A.wins += 1>>
You beat her. Tess stares at your fish, then at hers, then laughs out loud.
<<say "Tess" "Well, fuck me. Fine. A deal's a deal.">>
<<if _stakes is "fish">>
<<run setup.fightLootStart()>><<run setup.postBattleTakeLoot("fish", "Fish", setup.fishersRest.fishingGame.angler.winFish, "", "fightLoot")>>
She tips her catch into your bucket, pulls her crop top off over her head and tosses it at you.
<<lootLeftList "fightLoot">>
<<say "Tess" "My shirt, as promised. And since you're better than you look, here's something free.">>
<</if>>
<div class="choice-container">
<<vchoice "Let her show you her trick" "FishersRest_Angler_Win" "action" "fish">>
</div>
<<else>>
<<set _A.losses += 1>>
<<set _took to setup.fishingGame.takeFish(setup.fishersRest.fishingGame.angler.takeFish)>>
Tess wins<<if _c.mine is _c.her.food>>, on a tie: her lake, her rules<</if>>. <<if _took gt 0>>She helps herself to <<print _took>> of your fish.<<else>>She checks your bucket, finds nothing worth taking and laughs at you.<</if>>
<<if _stakes is "fish">>
<<say "Tess" "And your shirt. Off.">>
You pull your shirt over your head and hand it over. She sniffs it, pulls a face, and ties it round her waist like a trophy.
<<say "Tess" "Come back when you can fish.">>
<div class="choice-container">
<<vchoice "Walk back shirtless" "FishersRest_Hub" "move" "back">>
</div>
<<else>>
<div class="choice-container">
<<vchoice "Pay up" "FishersRest_Angler_Lose" "action" "heart">>
</div>
<</if>>
<</if>>
<</if>><<setBackground "fishers_rest/fishers_rest_lakeside">>
<<set _A to setup.fishingGame.anglerState()>>
<<set _ac to setup.fishingGame.companion()>>
<<set _firstTrick to !_A.trick>>
<<set _A.trick to true>>
<h2>Her Trick</h2>
<<storyVideo "story/fishers_angler/lesson">>
Tess pushes her rod into your hands and steps in close in front of you, her back against your chest, her bare tits bouncing against your forearms.
<<say "Tess" "It's all in the wrist and the hips. Hands on me. Feel it.">>
You put your hands on her hips. She winds the reel and snaps the cast out, and her whole body turns under your hands, her ass grinding back against your cock. She does it again, slower. The lure drops exactly where she wanted it.
<<say "Tess" "See? You were throwing with your arm like a boy. Throw with your hips. Like you're fucking the lake.">>
<<if _firstTrick>><<notify "success">>Tess's trick: your cast has a wider sweet spot from now on.<</notify>><</if>>
She doesn't step away. She reaches back, finds the hard line of your cock through your pants and squeezes.
<<say "Tess" "Lesson's over. Now, the rest of your winnings. Whatever you want.">>
<<if _ac>><<if _ac.id === "kira">><<say "Kira" "I'm watching. Don't mind me.">><<else>><<say _ac.name "Go on. I'll watch.">><</if>><</if>>
<div class="choice-container">
<<vchoice "Collect: her mouth, right here" "FishersRest_Angler_PaysUp" "action" "heart">>
<<vchoice "Just the lesson, thanks" "FishersRest_Hub" "move" "back">>
</div><<setBackground "fishers_rest/fishers_rest_lakeside">>
<<set _ac to setup.fishingGame.companion()>>
<<addLust "player" 15>>
<h2>Paying Up</h2>
<<storyVideo "story/fishers_angler/pays_up">>
Tess drops to her knees on the sun-warm boards and pulls your cock out like she's landing something. She looks up at you the whole time she sucks it: slow, deep, her tongue flat under the shaft, spit running down to her fist. When you groan she grins round your cock and takes you deeper, until her nose is pressed to your belly and her eyes are watering.
She pulls off with a wet pop and wipes her chin.
<<say "Tess" "Not here. My camp's round the point. I want to be fucked properly by the man who beat me.">>
<<if _ac>><<if _ac.id === "kira">><<say "Kira" "I'm coming too. Obviously.">><<else>><<say _ac.name "Lead the way.">><</if>><</if>>
<div class="choice-container">
<<vchoice "Follow her" "FishersRest_Angler_Camp" "action" "heart">>
</div><<setBackground "fishers_rest/fishers_rest_lakeside">>
<<set _ac to setup.fishingGame.companion()>>
<<advanceTime 0 40>>
<h2>Her Camp</h2>
<<storyVideo "story/fishers_angler/camp">>
Tess's camp is a patch of grass round the point: an upturned boat, a fire pit and a thatch shelter over her gear. She drapes a towel over the hull of the boat, climbs up on it on all fours, and looks back at you over her shoulder, crop top still shoved up, shorts gone.
<<say "Tess" "Well? You won. Take it.">>
You take it. You grab her hips and push into her from behind in one long stroke, and she's so wet you slide in to the hilt. You fuck her hard over the boat, the hull booming under her hands, her ass slapping back against you, the whole lake watching. She comes swearing, clawing at the towel, and when you pull out she turns round, gets on her knees in the grass and finishes you with her hand and her open mouth, laughing.
<<if _ac>><<if _ac.id === "kira">><<if setup.fishingGame.heat(_ac) gte 2>>Kira watched the whole thing from the shelter, one hand in her shorts. She doesn't even pretend otherwise.<<addKiraLust 20>><<else>>Kira watched from the end of the point with her arms crossed, and says nothing at all on the walk back. Her cheeks are pink.<<addKiraLust 10>><</if>><<else>><<print _ac.name>> watched from the shelter, flushed and quiet.<</if>><</if>>
<<set $player.lust to 0>><<run setup.playerReleased()>>
<<say "Tess" "Rematch soon. I'm getting better at losing to you.">>
<div class="choice-container">
<<vchoice "Head back" "FishersRest_Hub" "move" "back">>
</div><<setBackground "fishers_rest/fishers_rest_lakeside">>
<<set _ac to setup.fishingGame.companion()>>
<<addLust "player" 15>>
<<advanceTime 0 20>>
<h2>Paying Up</h2>
<<storyVideo "story/fishers_angler/she_wins">>
Tess walks to the very end of the dock, casts, and plants her feet wide with the rod held out over the water.
<<say "Tess" "Knees, dock boy. I'm still fishing. You're not.">>
You kneel behind her and pull her shorts down. She's already wet. You spread her ass with your hands and lick her from behind, slow and deep, your tongue working her pussy while she winds the reel over your head. She moans at the fish, not you, and pushes back into your face anyway, grinding on your tongue until her thighs are shaking. She comes with the rod bent, cursing, and doesn't lose the fish.
<<say "Tess" "Good boy. Now that's a lesson. Come back when you can fish.">>
<<if _ac>><<if _ac.id === "kira">><<if setup.fishingGame.heat(_ac) gte 2>><<say "Kira" "Okay. That was hot. You're doing that to me later.">><<addKiraLust 15>><<else>><<say "Kira" "You lost. To her. I'm never letting you forget it.">><</if>><<else>><<say _ac.name "You're not going to live that down.">><</if>><</if>>
<div class="choice-container">
<<vchoice "Head back" "FishersRest_Hub" "move" "back">>
</div><<set $currentLocation to "fishers_rest">>
<<setBackground "fishers_rest/fishers_rest_lakeside">>
<<setTimeOfDay $time.phase>>
<<set _ntL to setup.fishingGame.loc()>>
<<set _ntC to setup.fishingGame.companion()>>
<<set _ntFry to setup.fishersRest.fishingGame.night.fry>>
<h2>Night Fishing</h2>
<<storyVideo "story/fishers_night/dock">>
You build a small fire on the shore and fish by its light.
<div class="choice-container">
<<if setup.fishingGame.canFishAgain()>><<vchoice "Cast a line" "FishingGame" "action" "fish">><<else>><<vchoiceDisabled "Already fished twice today" "action" "fish">><</if>>
<<if _ntC && !_ntL.nightSwim>><<vchoice `"Skinny dip with " + _ntC.name` "FishersRest_Night_Swim" "action" "water">><</if>>
<<if _ntC && !_ntL.nightFry && setup.fishingGame.fryOpen(_ntC)>><<if setup.fishingGame.fishInPack() gte _ntFry.fish>><<vchoice `"Fry " + _ntFry.fish + " fish over the fire"` "FishersRest_Night_Fry" "action" "fire">><<else>><<vchoiceDisabled `"Fry fish over the fire (you need " + _ntFry.fish + " fish)"` "action" "fire">><</if>><</if>>
<<vchoice "Back to the lake side" "FishersRest_Hub" "move" "back">>
</div><<set $currentLocation to "fishers_rest">>
<<setBackground "fishers_rest/fishers_rest_lakeside">>
<<setTimeOfDay $time.phase>>
<<set _ntL to setup.fishingGame.loc()>>
<<set _ntC to setup.fishingGame.companion()>>
<<set _ntName to _ntC ? _ntC.name : "She">>
<<set _ntL.nightSwim to true>>
<<advanceTime 0 setup.fishersRest.fishingGame.night.swim.minutes>>
<<addLust "player" setup.fishersRest.fishingGame.night.swim.lust>>
<h2>The Skinny Dip</h2>
<<storyVideo "story/fishers_night/skinny_dip">>
<<if _storyClip is "6d2bd85b74fa">>A skinny dip off the end of the dock in the afternoon heat.
<<elseif _storyClip is "5a022d8b1049">>A skinny dip at last light, the sun going down behind the bare hills.
<<elseif _storyClip is "cf9675cdad86">>A skinny dip off the shore rocks in the midday sun.
<<else>>A moonlit skinny dip.
<</if>>
<<print _ntName>> goes in first, naked, and you watch her go.
<div class="choice-container">
<<if setup.fishingGame.nightTrip()>><<vchoice "Back to the fire" "FishersRest_Night" "move" "back">><<else>><<vchoice "Back to the lake side" "FishersRest_Hub" "move" "back">><</if>>
</div><<set $currentLocation to "fishers_rest">>
<<setBackground "fishers_rest/fishers_rest_lakeside">>
<<setTimeOfDay $time.phase>>
<<set _ntL to setup.fishingGame.loc()>>
<<set _ntC to setup.fishingGame.companion()>>
<<set _ntName to _ntC ? _ntC.name : "She">>
<<set _ntFry to setup.fishersRest.fishingGame.night.fry>>
<<set _ntL.nightFry to true>>
<<run setup.fishingGame.takeFish(_ntFry.fish)>>
<<advanceTime 0 setup.fishersRest.fishingGame.night.fry.minutes>>
<<set $player.hunger to Math.min($player.maxHunger, $player.hunger + _ntFry.hunger)>>
<<if _ntC>><<relationChange _ntC.id "affection" _ntFry.affection>><<relationChange _ntC.id "trust" _ntFry.trust>><</if>>
<h2>The Fish Fry</h2>
<<storyVideo "story/fishers_night/campfire">>
<<if _storyClip is "36a63a9c2eaf">>The fire's down to coals and the fish is gone to bones. She takes a last drag, blows the smoke at the stars and climbs into your lap.
<<elseif _storyClip is "f2cda1002377">>The fire's down to coals and the fish is gone to bones. She pushes the basket aside, turns her back to you and sinks down onto your lap, looking back over her shoulder.
<<else>>The fire's down to coals and the fish is gone to bones. <<print _ntName>> licks grease off her fingers, then off yours, then stops pretending it's about the grease.
<</if>>
She rides you by the fire until you cum.
<<set $player.lust to 0>><<run setup.playerReleased()>>
<p class="fishing-thought"><em><<print _ntFry.fish>> fish fried and eaten. Hunger +<<print _ntFry.hunger>>.</em></p>
<div class="choice-container">
<<if setup.fishingGame.nightTrip()>><<vchoice "Back to the fire" "FishersRest_Night" "move" "back">><<else>><<vchoice "Back to the lake side" "FishersRest_Hub" "move" "back">><</if>>
</div><<set _pi to (setup.fishingGame.state && setup.fishingGame.state.pulledIn) || { landed: true, fish: "pike" }>>
<<set _pc to setup.fishingGame.companion()>>
<<set _pn to _pc ? _pc.name : "She">>
<<storyVideo "story/fishers_pulled_in/soaked">>
The <<if _pi.fish is "pike" or _pi.fish is "ghost_pike">>pike<<else>>fish<</if>> bolts, the rod jerks, and <<print _pn>> – who grabbed your belt to help – goes straight over the edge. <<if _storyClip is "1dd33ff21da4" or _storyClip is "a70a6a3c767f">>She hauls herself back up onto the boards a minute later, dripping, and her white tank is glued to her like paint.<<else>>She comes up spluttering, and her white tank is glued to her like paint.<</if>> You can see every inch of her nipples through it.
<<say _pn "Don't. Say. Anything.">>
<<if _storyClip is "1dd33ff21da4" or _storyClip is "a70a6a3c767f">>She stands on the boards streaming water, wipes her face, then catches you looking and drops her arms.
<<else>>She wades out, arms crossed, then catches you looking and drops them.
<</if>>
<<if _pi.landed>><<say _pn "…Fine. Look. You earned it, you caught the damn fish.">><<else>><<say _pn "…Fine. Look.">><</if>>
<<if setup.fishersRest.fishingGame.pulledIn.exhib gt 0 && _pc && $exhibitionism && $exhibitionism[_pc.id] !== undefined>><<gainExhibitionism _pc.id setup.fishersRest.fishingGame.pulledIn.exhib "pulled into the lake">><</if>><<set $currentLocation to "fishers_rest">>
<<setBackground "fishers_rest/fishers_rest_lakeside">>
<<set _R to setup.fishingGame.redState()>>
<<set _rc to setup.fishingGame.companion()>>
<<set _rKira to _rc && _rc.id === "kira">>
<<set _rch to _rc ? setup.fishingGame.heat(_rc) : 0>>
<<set _R.doneDay to $time.day>>
<h2>Red</h2>
<<storyVideo "story/fishers_red/arrive">>
<<if !_R.met>>
There's a boat at the old pier today: a little white motorboat, sun-bleached, with a canopy and two rod holders nobody has ever used. A redhead in a striped crop top and a denim skirt comes bouncing down the boards toward it, a brand-new rod over her shoulder, and stops dead when she sees you with yours.
<<say "Red" "Oh thank god. A real one. You know how to fish, right? Tell me you know how to fish.">>
She doesn't wait for an answer.
<<say "Red" "I'm Red. I've got a boat, a full tank and absolutely no idea what I'm doing. You teach me, I drive. Deal?">>
<<set _R.met to true>>
<<else>>
Red's boat is back at the pier. She spots you from the bow and waves both arms over her head, rod and all.
<<say "Red" "My teacher! Get in. I've been practising. I'm still terrible.">>
<</if>>
<<if _rc>>
<<if _rKira>>
<<if _rch gte 2>><<say "Kira" "A boat and a redhead. Go on. I'm coming too, and I'm watching.">><<elseif _rch gte 1>><<say "Kira" "Teach her to fish. Just fish. I'll be right there.">><<else>><<say "Kira" "A boat's a boat. Fine. I'm coming.">><</if>>
<<else>>
<<if _rch gte 2>><<say _rc.name "She's cute. Let's go.">><<else>><<say _rc.name "A boat trip? Sure.">><</if>>
<</if>>
<</if>>
<div class="choice-container">
<<vchoice "Get in the boat" "FishersRest_Red_Lesson" "action" "fish">>
<<vchoice "Not today" "FishersRest_Hub" "move" "back">>
</div><<setBackground "fishers_rest/fishers_rest_lakeside">>
<<set _R to setup.fishingGame.redState()>>
<<set _rc to setup.fishingGame.companion()>>
<<set _rh to setup.fishingGame.redHeat()>>
<<advanceTime 0 45>>
<<set _R.visits += 1>>
<h2>Casting Lessons</h2>
<<storyVideo "story/fishers_red/lesson">>
Red drives like she fishes: badly and with total confidence. Out in the middle of the lake she kills the engine, drops her skirt on the deck, and turns out to be wearing a tiny orange bikini underneath.
<<say "Red" "Okay. Teach me.">>
You stand behind her on the bow and put your hands over hers on the rod. She fits back against you like she's done it before.
<<if _rh gte 1>>"Throw with your hips," you tell her. She grinds her ass back into you, slow, and looks up at you over her shoulder. <<say "Red" "Like this?">> It's a very good cast.<<else>>"Wrist, then hips," you tell her. She laughs, wiggles, and flings the lure about four feet. The second one's better. The fifth one's actually good.<</if>>
<<run setup.fightLootStart()>><<run setup.postBattleTakeLoot("fish", "Fish", 2, "", "fightLoot")>>
By the time the sun's high you've pulled two decent fish out of the water between you, and Red is very proud of herself.
<<lootLeftList "fightLoot">>
<<if _rc>><<if _rc.id === "kira">><<say "Kira" "She's a fast learner. With your hands all over her, sure.">><<else>><<say _rc.name "You're a good teacher.">><</if>><</if>>
<div class="choice-container">
<<if _rh gte 1>>
<<vchoice "Let her cool off" "FishersRest_Red_Topless" "action" "eye">>
<<else>>
<<vchoice "Keep fishing" "FishersRest_Red_Flash" "action" "fish">>
<</if>>
<<vchoice "Take her back to the pier" "FishersRest_Red_Goodbye" "move" "back">>
</div><<setBackground "fishers_rest/fishers_rest_lakeside">>
<<addLust "player" 4>>
<h2>Casting Lessons</h2>
You fish until the shadows turn. Red chatters the whole time: where she got the boat (won it, apparently, in a card game she's vague about), which fish she wants to catch (all of them), and what she's going to name the boat (she keeps changing it).
On the way back she lands a perch all by herself and is so pleased she yanks her bikini top up, flashes you, and pulls it back down before you've even registered it.
<<say "Red" "Celebration. Don't make it weird.">>
<div class="choice-container">
<<vchoice "Take her back to the pier" "FishersRest_Red_Goodbye" "move" "back">>
</div><<setBackground "fishers_rest/fishers_rest_lakeside">>
<<set _rc to setup.fishingGame.companion()>>
<<set _rh to setup.fishingGame.redHeat()>>
<<addLust "player" 8>>
<h2>Too Hot for Clothes</h2>
<<storyVideo "story/fishers_red/topless">>
<<say "Red" "It's too hot. The fish can look too. They're not getting any.">>
She pulls the bikini top off over her head and drops it on the deck. Her tits are enormous, pale and freckled across the top, and she knows exactly what they're doing to you. She shakes them at you from the bow, laughing, then cups them and lets them go.
<<if _rc>><<if _rc.id === "kira">><<if setup.fishingGame.heat(_rc) gte 2>><<say "Kira" "Okay. Those are unfair. I'm allowed to look too, right?">><<else>><<say "Kira" "...Right. Fishing.">><</if>><<else>><<say _rc.name "Well. That's one way to cool down.">><</if>><</if>>
<<say "Red" "I'm going to burn. There's oil in the cooler. Do my back? Or my front. I'm not fussy.">>
<div class="choice-container">
<<vchoice "Get the oil" "FishersRest_Red_Oil" "action" "heart">>
<<vchoice "Just fish" "FishersRest_Red_Goodbye" "move" "fish">>
</div><<setBackground "fishers_rest/fishers_rest_lakeside">>
<<set _rc to setup.fishingGame.companion()>>
<<set _rh to setup.fishingGame.redHeat()>>
<<addLust "player" 10>>
<h2>Oil</h2>
<<storyVideo "story/fishers_red/oil">>
You stand behind her and pour the oil straight over her tits. It runs down between them and over her belly and she squeals, then laughs, then stops laughing when your hands follow it. You work it into her slowly: under the heavy weight of them, over her nipples until they're hard and shining, down her sides. She leans her head back on your shoulder and moans.
<<say "Red" "Fuck. You're good at this too. Is there anything you're bad at?">>
<<if _rh gte 2>>
She turns round in your arms, slippery all over, and presses a hand flat to the front of your shorts.
<<say "Red" "You taught me to fish. Let me say thank you properly. You keep your line in the water, I'll keep my mouth on you. Yes?">>
<<else>>
She turns round in your arms, slippery all over, and kisses you, long and slow, oil smearing across your shirt.
<<say "Red" "That's all you're getting today, teacher. Next time, maybe.">>
<</if>>
<div class="choice-container">
<<if _rh gte 2>>
<<vchoice "Yes" "FishersRest_Red_Mouth" "action" "heart">>
<</if>>
<<vchoice "Take her back to the pier" "FishersRest_Red_Goodbye" "move" "back">>
</div><<setBackground "fishers_rest/fishers_rest_lakeside">>
<<set _rc to setup.fishingGame.companion()>>
<<addLust "player" 15>>
<h2>Keep Your Line In</h2>
<<storyVideo "story/fishers_red/mouth">>
You cast out off the bow. Red kneels on the hot white deck in front of you, tugs your shorts down, and takes your cock into her mouth like she's been waiting all day to do it. You keep reeling. She keeps sucking, slow and wet, both oily hands wrapped round you, her huge tits pressed against your thighs, her eyes up at you the whole time. Every time the float dips she takes you deeper, gagging a little and grinning round it.
<<if _rc>><<if _rc.id === "kira">><<if setup.fishingGame.heat(_rc) gte 2>>Kira sits on the gunwale with one hand down the front of her shorts and doesn't pretend otherwise.<<addKiraLust 15>><<else>>Kira finds something very interesting to look at on the far shore. Her cheeks are pink.<<addKiraLust 5>><</if>><<else>><<print _rc.name>> watches from the stern, flushed.<</if>><</if>>
She pulls off with a wet pop.
<<say "Red" "Put the rod in the holder. I want you in me. Right here on the rail.">>
<div class="choice-container">
<<vchoice "Bend her over the rail" "FishersRest_Red_Rail" "action" "heart">>
<<link '<span class="choice-button move"><span class="gi gi-back gi-large"></span><span class="label">Finish in her mouth and head back</span></span>' "FishersRest_Red_Goodbye">><<set $player.lust to 0>><<run setup.playerReleased()>><<set $locations.fishers_rest.red.swallowed to true>><</link>>
</div><<setBackground "fishers_rest/fishers_rest_lakeside">>
<<addLust "player" 10>>
<h2>Over the Rail</h2>
<<storyVideo "story/fishers_red/rail">>
She bends over the bow rail with her arms stretched out over the water, pushes her ass back at you and shoves the orange string aside herself. You keep one hand on the rod and grab her hip with the other and push into her pussy. She's soaking. You fuck her over the rail with the line still out, the whole boat rocking under you, her tits swinging over the lake and her moans carrying all the way to the shore.
<<say "Red" "Don't you dare stop. Not even if something bites.">>
<div class="choice-container">
<<vchoice "Lie back on the deck for her" "FishersRest_Red_Ride" "action" "heart">>
</div><<setBackground "fishers_rest/fishers_rest_lakeside">>
<<set _rc to setup.fishingGame.companion()>>
<<advanceTime 0 30>>
<h2>Adrift</h2>
<<storyVideo "story/fishers_red/ride">>
You lie back on the warm deck and she climbs on top of you, glistening with oil, and sinks down onto your cock with a long groan. The boat drifts. Red rides you under the open sky with the mangroves sliding past behind her, bouncing hard, her tits heaving, her hands braced on your chest. She comes first, shaking and swearing at the sky, and doesn't stop. When you come she grinds down and holds you deep inside her until you're done.
<<set $player.lust to 0>><<run setup.playerReleased()>>
<<if _rc>><<if _rc.id === "kira">><<if setup.fishingGame.heat(_rc) gte 2>><<say "Kira" "My turn on the way home.">><<else>><<say "Kira" "I'm going to pretend I was asleep.">><</if>><<else>><<say _rc.name "Well. That was a fishing trip.">><</if>><</if>>
<div class="choice-container">
<<vchoice "Head back to the pier" "FishersRest_Red_Goodbye" "move" "back">>
</div><<setBackground "fishers_rest/fishers_rest_lakeside">>
<<set _R to setup.fishingGame.redState()>>
<<set _rTop to previous() === "FishersRest_Red_Ride" || previous() === "FishersRest_Red_Mouth" || previous() === "FishersRest_Red_Oil" || previous() === "FishersRest_Red_Topless">>
<h2>Back at the Pier</h2>
<<if _R.swallowed>><<set _R.swallowed to false>>You come in her mouth with the boat drifting in circles. Red swallows, wipes her lips with the back of her hand and grins up at you. <<say "Red" "Mm. I'll take that as tuition.">><</if>>
<<if _rTop>>
<<storyVideo "story/fishers_red/goodbye">>
Red ties the boat up at the pier still topless, grinning, oil shining on her tits, and doesn't bother looking for her bikini top. She waves you off with one finger to her lips.
<<say "Red" "Same time next week? Bring bait. I'll bring the oil.">>
<<else>>
Red ties the boat up at the pier and throws you a grin over her shoulder.
<<say "Red" "Same time next week? I'm getting better. Say I'm getting better.">>
<</if>>
<div class="choice-container">
<<vchoice "Back to the lake" "FishersRest_Hub" "move" "back">>
</div><<set $grove.runnerSeen to true>>
<<run setup.groveDiscover()>>
<h2>A Runner at the Door</h2>
<<storyVideo "story/grove_runner/visit">>
<p>A lean blonde woman in a faded plaid shirt is sitting on the step outside the vault door when you open it. Mud to the knees, a long knife on her hip. She doesn't get up.</p>
<<say "Covenant runner" "You're the one with our token. The Lady is tired of waiting.">>
<p>She draws the way in the dust with her knife: east past the crossroads, into the woods, to an old walled estate.</p>
<<say "Covenant runner" "Greenhollow. We call it the Grove. Show the token at the gate. Bring your woman if she's yours to bring.">>
<<if setup.kiraWithYou()>>
<<say "Kira" "Friendly. Real friendly.">>
<</if>>
<p>Then she's gone into the morning.</p>
<p class="discovery-note"><<icon "map">> New place on your map: The Grove.</p>
<div class="choice-container">
<<vchoice "Start your day" `setup.hubWakeTarget()` "move" "map">>
</div><<journeyTerrainBackground>>
<<set $grove.patrolSeen to true>>
<h2>A Covenant Patrol</h2>
<<storyVideo "story/grove_patrol/stop">>
<p>Four women step out of the trees around you, rifles low, faces daubed green and brown to match their cloth. No raider leather.</p>
<<say "Covenant warden" "This road belongs to the Verdant Covenant. Passage is paid.">>
<p>You ask how much scrap. She laughs.</p>
<<say "Covenant warden" "Not scrap. You. We choose how.">>
<<if setup.kiraWithYou()>>
<<say "Kira" "They mean it. Four of them, one of you. Your call.">>
<</if>>
<div class="choice-container">
<<vchoice "Pay their price" "Travel_Covenant_Patrol_Pay" "action" "seduce">>
<<vchoice "Refuse" "Travel_Covenant_Patrol_Refuse" "action" "shield">>
</div>
<<storyVideo "story/grove_patrol/stock">>
<<if _storyClip>>
<p>Someone else is watching the road from higher ground: a lone figure with a long gun, hood up, who hasn't moved since you came into sight. A fifth woman, covering the other four.</p>
<</if>><<journeyTerrainBackground>>
<h2>The Toll</h2>
<<storyVideo "story/grove_patrol/demand">>
<p>The leader hands her rifle to the woman beside her and <<if _storyFamily is "sf_cg_grove_patrol_01">>pushes you down to sit in the grass. She kneels between your legs, looks up at you and opens your trousers herself<<elseif _storyFamily is "sf_cg_grove_patrol_02">>steps back into the pines. She pulls her top up over her breasts and just stands there, letting you look, deciding<<elseif _storyFamily is "sf_cg_grove_patrol_03">>peels the top of her dress down to her waist. She cups her breasts in both hands and watches your face, unhurried, deciding<<else>>steps up close. She looks you over, unhurried, deciding<</if>>.</p>
<<if _storyFamily is "sf_cg_grove_patrol_01">><<say "Covenant warden" "Lie back.">><<elseif _storyFamily is "sf_cg_grove_patrol_03">><<say "Covenant warden" "Stay on your feet.">><<else>><<say "Covenant warden" "On your back.">><</if>>
<<say "Covenant warden" "Hands where I can see them.">>
<div class="choice-container">
<<vchoice "Do as she says" "Travel_Covenant_Patrol_Pay_Mouth" "action" "submit">>
</div><<journeyTerrainBackground>>
<<advanceTime 0 30>>
<h2>The Toll</h2>
<<storyVideo "story/grove_patrol/mouth">>
<p>She <<if _storyFamily is "sf_cg_grove_patrol_03">>drops to her knees in front of you, opens your trousers<<else>>kneels between your legs in the dirt<</if>> and takes your cock into her mouth with no ceremony at all, slow and wet and deep, while the other three keep their rifles on the road and their eyes on you. Every time your hips <<if _storyFamily is "sf_cg_grove_patrol_03">>push forward<<else>>lift<</if>> she pulls off and waits, tongue out, until you <<if _storyFamily is "sf_cg_grove_patrol_03">>stand<<else>>lie<</if>> still again.</p>
<div class="choice-container">
<<vchoice "Let her finish" "Travel_Covenant_Patrol_Pay_Finish" "action" "seduce">>
</div><<journeyTerrainBackground>>
<<if !$grove.patrolPaid>>
<<set $grove.patrolPaid to true>>
<<set $player.lust to 20>><<run setup.playerReleased()>>
<<run setup.giveItem("verdant_token", 1)>>
<<run setup.groveDiscover()>>
<<run setup.factionRep("verdant", setup.COVENANT.rep.patrolPaid, "paid the patrol")>>
<</if>>
<h2>Paid in Full</h2>
<<storyVideo "story/grove_patrol/finish">>
<p>You come in her mouth with your hands still where she told you to keep them. She holds it there, swallows, and keeps sucking until you flinch, then wipes her lips on her wrist, gets up and tucks a token of green metal, carved with symbols, into your belt.</p>
<<say "Covenant warden" "Show that at the gate. East, past the crossroads. The Grove.">>
<<if setup.kiraWithYou()>>
<<say "Kira" "Well. That's one way to pay a toll.">>
<</if>>
<p class="discovery-note"><<icon "map">> New place on your map: The Grove.</p>
<<journeyEventReturn>><<journeyTerrainBackground>>
<<if !$grove.patrolRefused>>
<<set $grove.patrolRefused to true>>
<<advanceTime 4>>
<<run setup.groveDiscover()>>
<<run setup.grovePatrolRefusedRep()>>
<</if>>
<h2>Refused</h2>
<p>You keep your hands where they can see them and say no. The leader looks at you for a long moment. Then she nods to the others, and two of them take your arms.</p>
<<say "Covenant warden" "No? Nobody says no on this road, vault boy. You'll come and say it to the Lady, then. She collects men with manners like yours.">>
<<if setup.kiraWithYou()>>
<<say "Kira" "Get your fucking hands off him. ...Fine. Fine! We'll walk. Nobody's getting shot over your shitty toll.">>
<</if>>
<p>They walk you east between their rifles for hours, off the road and through the woods, to an old estate wall behind the trees. The leader slaps your back at the gate, almost friendly.</p>
<<say "Covenant warden" "Welcome to the Grove. Mind the Law in there. They don't ask nicely twice either.">>
<p class="discovery-note"><<icon "map">> New place on your map: The Grove.</p>
<div class="choice-container">
<<link `'<span class="choice-button move"><span class="gi gi-forward gi-large"></span><span class="label">To the gate</span></span>'`>><<set $journey.destination to setup.GROVE_NODE.id>><<set $journey.returnToPassage to null>><<endJourney>><<goto "Location_VerdantOutpost">><</link>>
</div><h2>Wardens at the Door</h2>
<p>Two Covenant wardens are waiting outside the vault door at first light. They came a long way to stand there.</p>
<<say "Warden" "You broke the Law of the Grove. The Lady has spoken. Hear her sentence.">>
<div class="choice-container">
<<vchoice "Hear the sentence" "Grove_Sentence" "action" "scroll">>
</div><<run setup.groveKiraReturn()>>
<h2>Kira Comes Home</h2>
<<storyVideo "story/grove_kira_return/back">>
<p>A warden walks Kira to the vault door at dawn, nods once and leaves.</p>
<<groveKiraReturnScene>>
<div class="choice-container">
<<vchoice "Start your day" `setup.hubWakeTarget()` "move" "map">>
</div><h2>Kira's Room</h2>
<p>Her bed is made. Her things are where she left them. The Covenant has her at the Center for <<= setup.groveKiraDaysLeft()>> more day<<if setup.groveKiraDaysLeft() !== 1>>s<</if>>.</p>
<div class="choice-container">
<<vchoice "Leave" "Vault_Hub" "move" "return">>
</div><<run VaultUI.setBackground("kira_room")>>
<<set _kdtHow to $grove.den.how>>
<<set _kdtMood to setup.groveKiraReturnMood()>>
<<set _kdtHeld to $grove.kira && $grove.kira.times > 0>>
<<if setup.groveKiraDenTalkDone()>>
<<if _kdtHow === "earned" && _kdtMood === "angry">><<relationChange "kira" "trust" `setup.COVENANT.kiraDen.earnedAngry`>><</if>>
<<if _kdtHow === "taken" && _kdtMood === "thrill">><<addTension "kira" `setup.COVENANT.kiraDen.takenThrill`>><</if>>
<</if>>
<h2>Kira's Room</h2>
<<if _kdtHow === "taken">>
<p>She's sitting cross-legged on her bed, sharpening her knife, and she doesn't stop when you come in. She points the tip at the chair.</p>
<<if $grove.kira.denLater>>
<<say "Kira" "Sit. You said talk later. It's later.">>
<<else>>
<<say "Kira" "Sit. Those scratches on your neck have been home a whole day and they still haven't told me anything. You're going to.">>
<</if>>
<p>You tell her. The back stairs, the Lady's rooms, the door you didn't knock on. What you did to Selene to get the Den's whereabouts out of her, and how long it took, and what she said when she finally broke.</p>
<<if _kdtMood === "angry">>
<<say "Kira" "So that's what it takes. You'll hold a woman down and fuck an answer out of her for Sera. ...You never once did that for me.<<if _kdtHeld>> When they took me. You stood there.<</if>>">>
<p>The whetstone goes back and forth, back and forth.</p>
<<say "Kira" "I'm not saying she didn't have it coming. She had it coming for years. I'm saying I watched you find your spine for somebody else. Get out. I'll be over it tomorrow. Probably.">>
<<elseif _kdtMood === "numb">>
<<say "Kira" "Good.">>
<p>She tests the edge of the blade on her thumb.</p>
<<say "Kira" "Really. Good. She sat up there in her rooms and <<if _kdtHeld>>sent me down to the Cellars like she was sending back soup<<else>>ran that whole place like a stud farm<</if>>. Somebody should've done it to her years ago. I'm just... I don't know what I'm supposed to feel about it being you. So I'm not going to feel anything. That's allowed.">>
<<else>>
<p>The whetstone stops halfway through your story. By the end of it she isn't pretending to sharpen anything.</p>
<<say "Kira" "In her own rooms. In front of her own mirror. ...Fuck. You actually did that.">>
<p>She puts the knife down, very carefully, on the floor, and looks at the scratches on your neck, and her tongue touches her lip.</p>
<<say "Kira" "I should hate this. I think about <<if _kdtHeld>>what they did to me down there<<else>>what that place does to every woman in it<</if>>, and then I think about her face, and... Don't look at me like that. Shut the door. No. Leave it open. Come here.">>
<</if>>
<<else>>
<p>She's lying on her bed with her boots on, reading something she's pretending to read. She doesn't look up when you tell her. The Den, south-west. Silk's house. And the price: you gave the Lady your word. You're hers now, hers and her Center's, whenever she sends for you.</p>
<<if _kdtMood === "angry">>
<<say "Kira" "Hers. Of course you are. You'd crawl up those stairs on your knees if she clicked her fingers. You probably did.">>
<<say "Kira" "...I hope Sera's worth it. I really fucking do. Go on. Go and tell the Lady how good you are.">>
<<elseif _kdtMood === "numb">>
<<say "Kira" "So she owns you now. Good trade. Your leash for a map.">>
<p>She turns a page she hasn't read.</p>
<<say "Kira" "I'm not jealous. I'd just like to push her down her own stairs. Once. Slowly.">>
<<else>>
<<say "Kira" "Hers. Wow. She's going to have you up those stairs every night she's bored. ...Do you like it? Her? Don't answer that.">>
<p>She drops the book on her chest and looks at you over it.</p>
<<say "Kira" "You remember whose bed you actually sleep in. I'm not sharing you with some green-dress bitch who thinks she bought you. ...I'm going to make that very clear. Later. Tonight.">>
<</if>>
<</if>>
<div class="choice-container">
<<vchoice "Stay with her a while" "Kira_Room" "intimate" "heart">>
<<vchoice "Leave" "Vault_Hub" "move" "return">>
</div><<set $currentLocation to "greenhollow">>
<<run VaultUI.setBackgroundDirect(setup.GROVE_BG.grounds)>>
<<setTimeOfDay $time.phase>>
<<run setup.groveNodeCompat(State.variables)>>
<<run setup.groveDiscover()>>
<h2>The Grove</h2>
<<if !$grove.gateDone>>
<p>An old estate wall runs through the trees, stone under moss and ivy. Behind it you can see roofs: villas, a big main house, the glint of a greenhouse. The gate is iron, newly oiled. Women with rifles watch you come.</p>
<div class="choice-container">
<<vchoice "Walk up to the gate" "Grove_Gate" "action" "door">>
<<vchoice "Turn back" "WorldMap_View" "move" "map">>
</div>
<<elseif setup.groveClosed()>>
<<include "Grove_Closed">>
<<elseif setup.groveHostile() && !$grove.bounty.serving>>
<<include "Grove_Wanted">>
<<elseif setup.groveRaidDue()>>
<<set $grove.arrived to true>>
<p>You've hardly gone ten steps across the lawn when a horn sounds from the woods to the east, long and ragged, and every warden on the wall turns to look.</p>
<div class="choice-container">
<<vchoice "Run to the east wall" "Grove_Raid" "action" "alert">>
</div>
<<elseif $grove.pendingBreach>>
<p>Two wardens step into your path before you've gone ten steps.</p>
<<say "Warden" "You broke the Law. The Lady has your sentence ready.">>
<div class="choice-container">
<<vchoice "Hear the sentence" "Grove_Sentence" "action" "scroll">>
</div>
<<else>>
<<set $grove.arrived to true>>
<p>Greenhollow. Overgrown villas around a lawn gone to meadow, the main house at the top of the slope, washing on lines between the trees. Covenant women go about their work. The few men you see walk with their eyes down.</p>
<<groveStanding>>
<<if setup.groveRaiderScrapsCheck()>>
<p class="warning">People stare at your Raider Scraps. The Covenant remembers what raiders did here.</p>
<</if>>
<<if setup.kiraAtCenter()>>
<<if setup.groveKiraReturnDue()>>
<p>Kira's days at the Center are over. You can collect her.</p>
<<else>>
<p>Kira is held at the Center for <<= setup.groveKiraDaysLeft()>> more day<<if setup.groveKiraDaysLeft() !== 1>>s<</if>>.</p>
<</if>>
<<elseif setup.kiraWithYou()>>
<<groveKiraHubLine>>
<</if>>
<<if !$grove.selene.summoned>>
<<set $grove.selene.summoned to true>>
<<notify "info">>A warden finds you: the Lady will see you now.<</notify>>
<</if>>
<<run setup.grovePlantingAnchor()>>
<<if setup.grovePlantingTonight()>>
<p>Lamps are being carried up to the Main House in a long line. Tonight is the Planting, and the Lady expects you.</p>
<<elseif setup.grovePlantingDaysLeft() !== null && setup.grovePlantingDaysLeft() > 0>>
<p class="narrator">The Planting is in <<= setup.grovePlantingDaysLeft()>> day<<if setup.grovePlantingDaysLeft() !== 1>>s<</if>>.</p>
<</if>>
<<if setup.groveDaysLeft() !== null>>
<p class="narrator">Your next assignment is due in <<= Math.max(0, setup.groveDaysLeft())>> day<<if setup.groveDaysLeft() !== 1>>s<</if>>.</p>
<</if>>
<div class="choice-container">
<<if setup.kiraAtCenter() && setup.groveKiraReturnDue()>>
<<vchoice "Collect Kira from the Center" "Grove_Kira_Collect" "action" "partner">>
<</if>>
<<if !$grove.selene.met>>
<<vchoice "Answer the Lady's summons" "Grove_Selene_Audience1" "action" "crown">>
<<elseif setup.groveSeleneAudienceDue(2)>>
<<vchoice "Answer the Lady's summons (her table)" "Grove_Selene_Audience2" "action" "crown">>
<<elseif setup.groveSeleneAudienceDue(3)>>
<<vchoice "Answer the Lady's summons (the Main House)" "Grove_Selene_Audience3" "action" "crown">>
<<elseif setup.grovePayoffOpen()>>
<<vchoice `$grove.audience4.offered ? "Go up to the Lady's rooms (her price for where the Den is)" : "Answer the Lady's summons (her rooms)"` "Grove_Selene_Audience4" "action" "crown">>
<</if>>
<<if setup.grovePlantingTonight()>>
<<link `'<span class="choice-button action"><span class="gi gi-ritual gi-large"></span><span class="label">The Planting (tonight, at the Main House)</span></span>'`>><<set _gplB to setup.grovePlantingBegin()>><<set _gplB.singlesAt to setup.groveScene("cg_grove_planting")>><<goto "Grove_Planting">><</link>>
<</if>>
<<if setup.groveMarketOpen()>>
<<link `'<span class="choice-button action"><span class="gi gi-market gi-large"></span><span class="label">The Captive Market (raiders, under safe-conduct)</span></span>'`>><<run setup.groveScene("cg_grove_market")>><<goto "Grove_Market">><</link>>
<</if>>
<<if setup.groveHuntOpen()>>
<<link `'<span class="choice-button action"><span class="gi gi-run gi-large"></span><span class="label">Join the Hunt</span></span>'`>><<set _ghN to setup.groveHuntNew(false)>><<set _ghN.singlesAt to setup.groveScene("cg_grove_hunt")>><<goto "Grove_Hunt">><</link>>
<<elseif $grove.registered && setup.groveAtLeast("Favoured") && $grove.hunt && $grove.hunt.lastDay != null && !$grove.pendingBreach>>
<<set _ghIn to Math.max(1, setup.COVENANT.hunt.every - ($time.day - $grove.hunt.lastDay))>>
<<vchoiceDisabled `"Join the Hunt (next in " + _ghIn + " day" + (_ghIn === 1 ? "" : "s") + ")"` "action" "run">>
<</if>>
<<if setup.groveErrandOpen() || setup.groveErrandDue()>>
<<vchoice "The Lady's cart (goods for Old Town)" "Grove_Errand_Offer" "action" "supplies">>
<</if>>
<<if setup.groveAtLeast("Guest")>>
<<vchoice "The Exchange" "Grove_Exchange" "action" "market">>
<<vchoice "The Armory" "Grove_Armory" "action" "sword">>
<<else>>
<<vchoiceDisabled "The Exchange (Guests only)" "action" "market">>
<<vchoiceDisabled "The Armory (Guests only)" "action" "sword">>
<</if>>
<<vchoiceDisabled "The Weaver (coming soon)" "action" "scissors">>
<<if setup.groveAtLeast("Guest")>>
<<vchoice "The Cellars" "Grove_Cellars" "action" "lock">>
<<else>>
<<vchoiceDisabled "The Cellars (Guests only)" "action" "lock">>
<</if>>
<<if setup.pitShut()>>
<<vchoiceDisabled "The pit (not until you're stronger)" "action" "grapple">>
<<elseif setup.groveAtLeast("Favoured")>>
<<vchoice "The pit" "Grove_Pit" "action" "grapple">>
<<else>>
<<vchoiceDisabled "The pit (Favoured only)" "action" "grapple">>
<</if>>
<<if setup.groveCanLeaveRegister()>>
<<vchoice "Ask the Lady to strike you from the register" "Grove_Register_Leave" "action" "scroll">>
<<elseif setup.groveCanRejoinRegister()>>
<<vchoice "Ask the Lady to put your name back on the register" "Grove_Register_Rejoin" "action" "scroll">>
<</if>>
<<if $grove.registered>>
<<vchoice "The Center" "Grove_Center" "action" "people">>
<<else>>
<<vchoiceDisabled "The Center (Registered members only)" "action" "people">>
<</if>>
<<if !setup.groveAtLeast("Registered")>>
<<if $grove.workDay !== $time.day>>
<<vchoice "Ask the wardens for work" "Grove_Work" "action" "muscle">>
<<else>>
<<vchoiceDisabled "Ask the wardens for work (done today)" "action" "muscle">>
<</if>>
<</if>>
<<vchoice "Rest" "Grove_Rest" "action" "rest">>
<<if setup.groveAtLeast("Guest")>>
<<vchoice "The guest villa (a bunk for the night)" "Grove_Bunk" "action" "bed">>
<<else>>
<<vchoiceDisabled "The guest villa (Guests only)" "action" "bed">>
<</if>>
</div>
<hr>
<div class="choice-container">
<<vchoice "Open the map" "WorldMap_View" "move" "map">>
<<vchoice "Return to vault" "Journey_ReturnToVault" "move" "house">>
</div>
<</if>><<advanceTime 0 `setup.COVENANT.time.gate`>>
<<run VaultUI.setBackgroundDirect(setup.GROVE_BG.grounds)>>
<h2>The Gate</h2>
<<storyVideo "story/grove_gate/search">>
<p>Two wardens open the gate just wide enough. One takes your weapons and hangs them on a hook. The other searches you by hand, slow and thorough, and doesn't care what you think of it.</p>
<<if setup.kiraWithYou()>>
<p>Then they do the same to Kira. She stands with her arms out and her jaw tight.</p>
<</if>>
<<if setup.groveHasToken()>>
<p>You show the token. The older warden turns it over and gives it back.</p>
<<say "Warden" "The Lady's guest, then.">>
<</if>>
<<say "Warden" "Three laws. Pay what you owe. Do your assignment. No theft and no blood inside these walls. Break one and the Lady decides what it costs you.">>
<div class="choice-container">
<<vchoice "Let them get it over with" "Grove_Gate_Quick" "action" "check">>
<<vchoice "Object to the search" "Grove_Gate_Object" "action" "shield">>
<<if setup.kiraWithYou()>>
<<vchoice "Enjoy watching them search Kira" "Grove_Gate_Watch" "action" "voyeur">>
<<vchoice "Pull the boot knife they missed on the warden searching Kira (a crime)" "Grove_Gate_Draw" "action" "sword">>
<</if>>
</div><<if !$grove.gateDone>>
<<set $grove.gateDone to true>>
<<run setup.factionRep("verdant", setup.COVENANT.rep.gate, "came in by the Law")>>
<</if>>
<p>You stand still and let them finish. The warden gives your weapons back at the end with a nod. Inside, nobody looks twice at you.</p>
<div class="choice-container">
<<vchoice "Enter the Grove" "Location_VerdantOutpost" "move" "forward">>
</div><<if !$grove.gateDone>>
<<set $grove.gateDone to true>>
<<run setup.factionRep("verdant", setup.COVENANT.rep.gate + setup.COVENANT.rep.gateObject, "came in, complaining")>>
<</if>>
<p>You tell them where they can put their search. The warden finishes anyway, slower than before.</p>
<<say "Warden" "Noted. The Lady likes to know who complains.">>
<div class="choice-container">
<<vchoice "Enter the Grove" "Location_VerdantOutpost" "move" "forward">>
</div><<if !$grove.gateDone>>
<<set $grove.gateDone to true>>
<<run setup.factionRep("verdant", setup.COVENANT.rep.gate, "came in by the Law")>>
<<set $player.lust to Math.min(100, ($player.lust || 0) + 5)>>
<<addTension "kira" 5>>
<</if>>
<p>You don't look away while they search Kira. The warden notices you watching and takes longer about it. Kira notices too.</p>
<<if setup.kiraWithYou()>>
<<say "Kira" "Enjoyed that, did you?">>
<</if>>
<div class="choice-container">
<<vchoice "Enter the Grove" "Location_VerdantOutpost" "move" "forward">>
</div><<if !setup.groveDailyDone("work")>>
<<set _gwkPay to setup.COVENANT.pay.daily.work>>
<<run setup.groveDaily("work")>>
<<advanceTime 2>>
<<set $player.energy to Math.max(0, ($player.energy || 0) - 10)>>
<</if>>
<h2>Work</h2>
<p>The wardens put you to hauling water from the well to the greenhouse. Two hours, a bucket in each hand. A woman on the greenhouse roof watches you the whole time and never says a word.</p>
<<if _gwkPay>><p class="narrator">The wardens pay you <<= _gwkPay>> scrap for the day.</p><</if>>
<div class="choice-container">
<<vchoice "Back to the Grove" "Location_VerdantOutpost" "move" "back">>
</div><<run VaultUI.setBackgroundDirect(setup.GROVE_BG.grounds)>>
<<advanceTime 0 30>>
<h2>Resting in the Grove</h2>
<p>You sit on a bench under the trees for a while. It's the first place in a long time where nobody is likely to shoot at you.</p>
<<set $player.energy to Math.min($player.maxEnergy, $player.energy + 15)>>
<<set $player.health to Math.min($player.maxHealth, $player.health + 5)>>
<<if setup.kiraWithYou()>><<set $companions[0].health to Math.min($companions[0].maxHealth, $companions[0].health + 5)>><</if>>
<p class="narrator">Health +5, Energy +15</p>
<div class="choice-container">
<<if setup.groveAtLeast("Trusted") && $grove.selene.audience2 && !$grove.selene.audience3 && !$grove.selene.spied && setup.kiraWithYou() && !setup.kiraGuarded()>>
<<vchoice "Take Kira to the empty guest villa" "Grove_Rest_Kira" "action" "partner">>
<</if>>
<<vchoice "Continue" "Location_VerdantOutpost" "move" "forward">>
</div><<run VaultUI.setBackgroundDirect(setup.GROVE_BG.villa)>>
<h2>The Guest Villa</h2>
<p>A warden walks you down the orchard path to the guest villa. Most of the house is shut up under dust sheets, but the back rooms are kept for Guests, and yours has two narrow bunks with clean sheets, a washstand, a jug of water and a window that looks out on the apple trees. Somebody has left a sprig of lavender on the pillow. It's the softest bed you've seen since the world ended, and the door doesn't lock from the inside.</p>
<<if setup.kiraWithYou()>>
<p>Kira drops her pack on the other bunk, bounces on it once and looks at the door.</p>
<<say "Kira" "No lock. Course there isn't. ...Fine. I sleep with my knife anyway.">>
<<elseif setup.kiraAtCenter()>>
<p>The other bunk is empty. Kira is at the Center tonight, a few hundred yards away, and there's nothing you can do about it until they let her go.</p>
<</if>>
<p class="narrator"><<if setup.campNight()>>It's night. Sleep here and you wake at seven.<<else>>It's still day. A nap gives you a few hours; or rest here until morning.<</if>></p>
<div class="choice-container">
<<if setup.campNight()>>
<<vchoice "Sleep until morning" "Grove_Bunk_Sleep" "action" "sleep">>
<<else>>
<<vchoice "Nap for a few hours" "Grove_Bunk_Sleep" "action" "sleep">>
<<vchoice "Rest until morning" "Grove_Bunk_Night" "action" "sleep">>
<</if>>
<<vchoice "Wait an hour" "Grove_Bunk_Wait" "action" "wait">>
<<vchoice "Back to the Grove" "Location_VerdantOutpost" "move" "back">>
</div><<run VaultUI.setBackgroundDirect(setup.GROVE_BG.villa)>>
<<advanceTime 1>>
<h2>The Guest Villa</h2>
<p>You lie on the bunk with your boots on and listen to the Grove: a cart on the gravel, women laughing in the orchard, a warden calling the hour somewhere up at the Main House. An hour goes by.</p>
<div class="choice-container">
<<vchoice "Stay in the villa" "Grove_Bunk" "action" "bed">>
<<vchoice "Back to the Grove" "Location_VerdantOutpost" "move" "back">>
</div><<advanceToHour 17>>
<<groveBunkSleep>>
<<if _vddScene>>
<<goto _vddScene>>
<<else>>
<div class="choice-container">
<<vchoice "Out into the Grove" "Location_VerdantOutpost" "move" "forward">>
</div>
<</if>><<groveBunkSleep>>
<<if _vddScene>>
<<goto _vddScene>>
<<else>>
<div class="choice-container">
<<vchoice "Out into the Grove" "Location_VerdantOutpost" "move" "forward">>
</div>
<</if>><<journeyTerrainBackground>>
<h2>A Covenant Escort</h2>
<p>Two Covenant wardens fall in beside you where the road bends, rifles slung, as if they'd been waiting there all morning. Maybe they had. The older one nods at you; the younger one looks you up and down and doesn't bother hiding it.</p>
<<say "Covenant warden" "The Lady's Favoured don't walk her roads alone. Orders. Anyone wants to try you, they try us first.">>
<<if setup.kiraWithYou()>>
<<say "Kira" "A bodyguard. For you. ...I've seen everything now.">>
<</if>>
<p>Nobody tries anything. You see a raider lookout on a ridge once, and he sees the green cloth and ducks back out of sight. At the next crossroads the wardens peel off without a word.</p>
<<journeyEventReturn>><<journeyTerrainBackground>>
<h2>Covenant Huntresses</h2>
<<storyVideo "story/grove_bounty/ambush">>
<p>The birds stop first. Then a whistle, low and short, from the trees on your left, and another answers it from behind you. Two women step out onto the road, one ahead, one at your back: green and brown cloth, rifles up and levelled at your belly. Somewhere higher up, a third keeps a rifle on you and doesn't bother to hide it.</p>
<<say "Covenant huntress" "Well, look at that. The vault boy. Your face is on a board at the Grove, sweetheart. The Lady wants you back in her Cellars, and she doesn't much care what shape you arrive in.">>
<<say "Covenant huntress" "Drop the weapon and get on your knees, and we'll be gentle. Mostly.">>
<<if setup.kiraWithYou()>>
<<say "Kira" "Gentle. Fuck off with gentle. I've seen how your lot does gentle. Come on, then, you painted bitches.">>
<</if>>
<p class="narrator">A bounty: the Covenant has put a price on you. Win, and you walk on. Lose or give in, and they drag you to the post in the Grove's Cellars. You can also clear it at the Grove's gate for <<= setup.groveBountyFine()>> scrap.</p>
<div class="choice-container">
<<link `'<span class="choice-button action"><span class="gi gi-sword gi-large"></span><span class="label">Fight</span></span>'`>><<groveBountyFight>><</link>>
<<vchoice "Go quietly" "Travel_Covenant_Bounty_Taken" "action" "submit">>
</div><<journeyTerrainBackground>>
<h2>The Hunt Goes Badly</h2>
<<storyVideo "story/grove_bounty/won">>
<p>The last huntress <<if _storyClip is "2bf057461909">>loses her rifle in the dirt, takes one look at you, and runs, crashing off through the trees<<else>>goes down face first in the dirt with her rifle knocked out of reach, and stays down<</if>>. Up in the trees the third one is gone<<if _storyClip is "2bf057461909">> too: they've run<<else>>: she has run<</if>>, to tell the Grove its quarry bites.</p>
<<if setup.kiraWithYou()>>
<<if $grove.bounty.ambushes >= 2>>
<<say "Kira" "That's twice now. They'll keep fucking coming, you know. Either you pay that bitch or we watch every tree from here to the vault.">>
<<else>>
<<say "Kira" "Fuck. They'll keep coming, you know. Either you pay that bitch or we watch every tree from here to the vault.">>
<</if>>
<</if>>
<p class="narrator">The bounty stands. Pay the fine at the Grove's gate to end it.</p>
<<journeyEventReturn>><<journeyTerrainBackground>>
<<if !$grove.bounty.serving>>
<<run setup.groveBountyCapture()>>
<<set _gbtKira to setup.kiraWithYou() && setup.groveKiraCanBeTaken() && !$grove.kiraDownHome>>
<<set $grove.bounty.kiraTaken to _gbtKira>>
<<if _gbtKira>>
<<set $grove.bounty.kiraDays to setup.groveTakeKira()>>
<<relationChange "kira" "trust" `setup.kiraUseTrust(setup.COVENANT.kiraTrust.stay)`>>
<</if>>
<<set $player.lust to Math.min(100, ($player.lust || 0) + 25)>>
<<advanceTime 4>>
<</if>>
<h2>Taken</h2>
<p>They have you face down in the dirt with a knee between your shoulder blades before you've stopped moving, and a rifle muzzle cold against the back of your neck. Then the knee lifts and a boot rolls you over onto your back, and the rifle stays on you.</p>
<<say "Covenant huntress" "Long walk to the Grove. We get a little something for our trouble first. The Lady never asks what shape you came in.">>
<<storyVideo "story/grove_bounty/taken_ride">>
<<set _gbtSingle to _storyClip && !_storyFamily>>
<p>She doesn't ask either. She drags your trousers down to your knees, looks at your cock, and laughs at it, and at you, because it's already getting hard in the open air with her sitting on your thighs. She spits in her hand and works you with it, rough and quick, until you're stiff and aching, then shoves her clothes out of the way and sinks down on you, all the way, with a grunt of pure satisfaction. She rides you right there, her whole weight on your hips, shoving you back down whenever you try to buck up into her, grinning at the look on your face.</p>
<<say "Covenant huntress" "Look at him. Wanted man. Fucks like he's grateful.">>
<p>The second one crouches by your head and takes a fistful of your hair, and holds your face up so you have to watch her friend ride you. When the first one comes, shuddering, nails dug into your chest, she climbs off before you can finish and leaves you wet and twitching in the dirt.</p>
<<storyVideo "story/grove_bounty/taken_second">>
<p>The second one <<if _storyFamily is "sf_cg_grove_bounty_01">><<if _gbtSingle>>takes her turn<<else>>reaches for your belt, but the first one isn't finished with you. She shoves her friend aside and climbs back on<</if>><<else>>takes her turn<</if>>.<<if _storyFamily is "sf_cg_grove_bounty_02">> She hauls you up onto your knees, bends over in front of you and makes you fuck her from behind.<<elseif _storyFamily is "sf_cg_grove_bounty_03">> She lies back on the ground and pulls you down between her legs by the hair.<</if>> She's slower, and crueller, and she lets you <<if _storyFamily is "sf_cg_grove_bounty_02">>come over her ass<<elseif _storyFamily is "sf_cg_grove_bounty_03">>come on her belly, in your own fist,<<else>>come inside her<</if>> only when she's had hers, then wipes herself on your shirt.</p>
<<if $grove.kiraDownHome>>
<p>Kira is lying where she fell at the side of the road, out cold. The rifle-woman comes down from the trees, rolls her over with a boot and checks she's breathing.</p>
<<say "Covenant huntress" "Not on our list, and no use to the Center like this. She comes along. The Lady can decide what to do with her.">>
<p>They carry her between two of them in a cloak slung on a pole. Her head lolls at every step.</p>
<<elseif $grove.bounty.kiraTaken>>
<<if setup.kiraAllowsUse()>>
<p>Kira doesn't go quietly either. It takes the rifle-woman and a coil of rope to bring her down, and she's still cursing them through the cloth they knot between her teeth. They tie her to you by the wrists for the march. All the way east her shoulder keeps bumping yours, and every time a huntress turns her back Kira catches your eye over the gag, and her eyes are laughing.</p>
<<else>>
<p>Kira doesn't go quietly either. It takes the rifle-woman and a coil of rope to bring her down, and she's still cursing them through the cloth they knot between her teeth. They tie her to you by the wrists for the march. She doesn't look at you once.</p>
<</if>>
<<elseif setup.kiraWithYou()>>
<p>Kira's on her knees in the ditch with the rifle at the back of her head, made to watch. When they haul you up she's hauled up too.</p>
<<say "Kira" "They don't want me. I'm not on their list. I'm walking with you anyway. Shut up.">>
<</if>>
<p>They walk you east on a rope for hours, through the woods and in at the Grove's gate, where the women on the wall cheer you in like a prize.</p>
<<if $grove.bounty.kiraTaken>>
<p class="narrator">Kira is held at the Center for <<= $grove.bounty.kiraDays>> days.</p>
<</if>>
<div class="choice-container">
<<link `'<span class="choice-button action"><span class="gi gi-lock gi-large"></span><span class="label">Down to the Cellars</span></span>'`>><<set $journey.destination to setup.GROVE_NODE.id>><<set $journey.returnToPassage to null>><<endJourney>><<goto "Grove_Sentence_Post">><</link>>
</div><<run VaultUI.setBackgroundDirect(setup.GROVE_BG.grounds)>>
<<set $currentLocation to "greenhollow">>
<h2>The Gate Is Shut</h2>
<<if previous() && tags(previous()).includes("grove") && !tags(previous()).includes("travel")>>
<p>Two wardens are waiting for you on the path with their rifles unslung. They walk you out of the gate without a word, and slam it behind you.</p>
<</if>>
<p>The gate stays shut. Nailed to the post beside it is a board with your face scratched on it in charcoal, not a good likeness, and under it in red paint: <strong><<= setup.COVENANT.bounty.sign>></strong>. Two wardens on the wall have their rifles on you before you're halfway up the path.</p>
<<say "Warden" "That's far enough. The Grove's closed to you, vault boy. No Exchange, no Armory, no bunk. You want back in, you pay the Lady's price, or you come in on a rope and give her a day at the post.">>
<<scrapBalance>>
<div class="choice-container">
<<if setup.groveBountyCanPay()>>
<<vchoice `"Pay the bounty (" + setup.COVENANT.bounty.fine + " scrap)"` "Grove_Wanted_Pay" "action" "scrap">>
<<else>>
<<vchoiceDisabled `"Pay the bounty (" + setup.COVENANT.bounty.fine + " scrap, you have too little)"` "action" "scrap">>
<</if>>
<<vchoice "Give yourself up (a day at the post)" "Grove_Wanted_Surrender" "action" "lock">>
<<vchoiceDisabled "The Exchange (closed to you)" "action" "market">>
<<vchoice "Leave" "WorldMap_View" "move" "map">>
</div><<advanceTime 0 `setup.COVENANT.time.gatePay`>>
<<if setup.groveHostile()>><<run setup.groveBountyPay()>><</if>>
<h2>Paid</h2>
<p>A warden comes down for the scrap, counts it through the bars of the gate twice over and takes your board off the post. She makes a show of tearing it in half.</p>
<<if setup.groveClosed()>>
<<say "Warden" "The Lady says to tell you she'll remember the face. Now get away from her gate.">>
<p class="narrator">The Lady's price is paid. The huntresses stop looking for you. The gate stays shut, but the wardens will walk you to the Exchange and the Armory, at her prices.</p>
<<else>>
<<say "Warden" "The Lady says she's touched. She says don't make her do it again.">>
<p class="narrator">The bounty is settled. Your standing with the Covenant is back to nothing: a stranger at the gate.</p>
<</if>>
<div class="choice-container">
<<vchoice "Walk up to the gate" "Location_VerdantOutpost" "move" "forward">>
</div><<if setup.groveHostile() && !$grove.bounty.serving>>
<<run setup.groveBountyCapture()>>
<<if setup.kiraWithYou() && setup.groveKiraCanBeTaken()>>
<<set $grove.bounty.kiraTaken to true>>
<<set $grove.bounty.kiraDays to setup.groveTakeKira()>>
<<relationChange "kira" "trust" `setup.kiraUseTrust(setup.COVENANT.kiraTrust.stay)`>>
<<else>>
<<set $grove.bounty.kiraTaken to false>>
<</if>>
<</if>>
<h2>Given Up</h2>
<p>You hold your hands out through the bars. They open the gate just wide enough to pull you through by the wrists, and rope them before your feet are inside.</p>
<<if $grove.bounty.kiraTaken>>
<<if setup.kiraAllowsUse()>>
<p>They take Kira too. She's registered, and the Lady doesn't let a debt sit on half a household. She fights them anyway, kicking and swearing all the way through the gate, and when they've finally got her wrists roped she leans in close to your ear.</p>
<<say "Kira" "You got us both a trip to the post. Idiot. ...Best idea you've had all month.">>
<<else>>
<p>They take Kira too. She's registered, and the Lady doesn't let a debt sit on half a household. She's too angry to fight them, which tells you how angry she is.</p>
<</if>>
<p class="narrator">Kira is held at the Center for <<= $grove.bounty.kiraDays>> days.</p>
<</if>>
<div class="choice-container">
<<vchoice "Down to the Cellars" "Grove_Sentence_Post" "action" "lock">>
</div><<if $grove.theftDay !== $time.day>>
<<advanceTime 0 `setup.COVENANT.time.theft`>>
<<set $grove.theftDay to $time.day>>
<<set _gesCaught to setup.groveTheftCaught()>>
<<set $grove.theftCaught to _gesCaught>>
<<if _gesCaught>>
<<run setup.groveCrime("theft")>>
<<else>>
<<set _gesPick to setup.COVENANT.exchange.stock.random()>>
<<set $grove.theftItem to _gesPick.name>>
<<if setup.bagFits("player", _gesPick.id, 1) >= 1>><<run setup.giveItem(_gesPick.id, 1)>><<else>><<set $grove.theftItem to null>><</if>>
<</if>>
<</if>>
<h2>Light Fingers</h2>
<<if $grove.theftCaught>>
<p>You wait until the keeper bends over her ledger, and your hand closes round the nearest thing on the shelf. Her hand closes round your wrist.</p>
<<say "Exchange keeper" "I write down everything, sweetheart. Including you.">>
<p>She doesn't shout. She just rings the little brass bell on the counter, and two wardens are in the doorway before it stops.</p>
<div class="choice-container">
<<vchoice "Face the Lady's sentence" "Grove_Sentence" "action" "scroll">>
</div>
<<else>>
<<if $grove.theftItem>>
<p>You wait until the keeper bends over her ledger, and the <<= $grove.theftItem>> on the end of the shelf goes into your pack. She doesn't look up. Your heart is going like a drum all the way out the door.</p>
<<else>>
<p>You get your hand on something, and then there's no room for it in your pack, and you have to put it back while she isn't looking. A whole lot of nerve for nothing.</p>
<</if>>
<div class="choice-container">
<<vchoice "Back to the Grove" "Location_VerdantOutpost" "move" "back">>
</div>
<</if>><<if !$grove.gateDone>>
<<set $grove.gateDone to true>>
<<run setup.groveCrime("weapon")>>
<</if>>
<h2>Steel at the Gate</h2>
<p>The warden's hand goes somewhere it has no business going on Kira, and the little knife in your boot, the one they missed, is out before you've thought about it. You get it as far as the warden's ribs. Then there are three rifles on you, and one of them is pressed to the back of your skull.</p>
<<say "Warden" "Inside the gate, that. You heard the Law not one minute ago. No blood inside these walls. The Lady will want a word.">>
<<if setup.kiraWithYou()>>
<<say "Kira" "You fucking idiot. ...Thanks. You fucking idiot.">>
<</if>>
<div class="choice-container">
<<vchoice "Hear the sentence" "Grove_Sentence" "action" "scroll">>
</div><<if !$grove.pendingBreach>>
<<run setup.groveCrime("weapon")>>
<</if>>
<h2>Steel in the Cellars</h2>
<p>You've got the knife out and at his throat before he's done laughing. He stops laughing. For a heartbeat it's just the three of you and his breath on the blade.</p>
<<say "The man" "Easy. Easy, now. You know what they do to you for this down here? You'll wish you'd cut me.">>
<p>Then boots on the stairs, and a warden's rifle stock takes you behind the knee, and you're on the stone with your arm twisted up your back. The man straightens his shirt and goes back to Kira as if nothing happened.</p>
<<say "Warden" "Steel inside the walls. The Lady will hear about this.">>
<div class="choice-container">
<<vchoice "Hear the sentence" "Grove_Sentence" "action" "scroll">>
</div><<run VaultUI.setBackgroundDirect($grove.selene.audience2 ? setup.GROVE_BG.kitchen : setup.GROVE_BG.teaRoom)>>
<<if !$grove.pendingBreach>>
<<run setup.groveCrime("refused")>>
<</if>>
<h2>Refused</h2>
<p>You tell her no. Out loud, in her own house. For a moment nobody in the room breathes.</p>
<<say "Lady Selene" "No. ...No. Do you know, I can't remember the last time a man said that word to me. It has a sort of charm, doesn't it, the first time. Wardens.">>
<p>Two of them are in the doorway before she's finished the word. She doesn't look up from her cup.</p>
<<say "Lady Selene" "Take him down and read him the Law. Slowly. Then send him back up to me when he's learned the other word.">>
<div class="choice-container">
<<vchoice "Hear the sentence" "Grove_Sentence" "action" "scroll">>
</div><<run VaultUI.setBackgroundDirect(setup.GROVE_BG.cellars)>>
<h2>The Cellars</h2>
<p>Stone steps down under the main house. The wine racks are gone; the rings in the walls are new. Lantern light, damp, the sound of someone breathing hard further in.</p>
<div class="choice-container">
<<vchoice "Go to the post" "Grove_Post" "action" "lock">>
<<if setup.kiraAtCenter()>>
<<vchoice "Visit Kira" "Grove_Kira_Cellar" "action" "partner">>
<</if>>
<<vchoice "Back to the Grove" "Location_VerdantOutpost" "move" "back">>
</div><<if previous() !== "Grove_Post_Report">><<advanceTime 0 `setup.COVENANT.time.post`>><</if>>
<<if !$grove.postSign || $grove.postSign.day !== $time.day || setup.grovePostGone($grove.postSign.name)>>
<<set $grove.postSign to { day: $time.day, text: setup.COVENANT.signs.random(), name: setup.grovePostName(), singles: random(0, 2) === 0 }>>
<<run setup.groveScene("cg_grove_post_woman")>>
<<else>>
<<run setup.storyFamilyPreset("cg_grove_post_woman", setup.storyFamilyOf("cg_grove_post_woman"))>>
<</if>>
<h2>The Post</h2>
<<groveSign $grove.postSign.text>><<if !setup.storyFamilyGap("story/grove_post_woman/locked_in")>><<storyVideo "story/grove_post_woman/locked_in">><</if>><</groveSign>>
<<if setup.storyFamilyOf("cg_grove_post_woman") is "sf_cg_grove_post_woman_04">>
<p><<= $grove.postSign.name>> is strapped to the boards of the back-room wall, wrists cuffed and ankles strapped wide, a gag in her mouth and her cunt bare to whoever comes through the door. Others came down before you today. Others will come after.</p>
<<else>>
<p><<= $grove.postSign.name>> is <<if _storyFamily is "sf_cg_grove_post_woman_02">>chained upright to a timber cross against the cellar wall, wrists cuffed wide<<elseif _storyFamily is "sf_cg_grove_post_woman_03">>roped between two posts in the yard behind the cellars, arms tied high<<elseif _storyFamily is "sf_cg_grove_post_woman_05">>on her knees in the kneeling bench in the back cellar<<else>>locked into the pillory by her neck and wrists, bent over, stripped for use<</if>>.<<if _storyFamily is "sf_cg_grove_post_woman_05">> The man before you is setting her hands on the front legs of the bench, then goes up past you without a word.<</if>> Others came down before you today. Others will come after.</p>
<</if>>
<div class="choice-container">
<<if $grove.postUseDay !== $time.day>>
<<vchoice "Use her" "Grove_Post_Use" "action" "seduce">>
<<else>>
<<vchoiceDisabled "Use her (you already did today)" "action" "seduce">>
<</if>>
<<if $grove.reportDay !== $time.day>>
<<vchoice "Report someone for the next post" "Grove_Post_Report" "action" "speech">>
<</if>>
<<vchoice "Free her (a crime)" "Grove_Post_Free" "action" "unlocked">>
<<vchoice "Walk past" "Grove_Cellars" "move" "back">>
</div><h2>The Post</h2>
<<groveSign `$grove.postSign ? $grove.postSign.text : ""`>><<if !setup.storyFamilyGap("story/grove_post_woman/approached")>><<storyVideo "story/grove_post_woman/approached">><</if>><</groveSign>>
<<if setup.storyFamilyOf("cg_grove_post_woman") is "sf_cg_grove_post_woman_04">>
<p>You walk up behind her. She hears you and twists round as far as the ropes let her, hair in her face, and through the gag tells you exactly what she thinks of you and every man who came down those stairs before you. Then you put your hand between her legs and she's soaking, and she shuts up.</p>
<<else>>
<p><<if _storyFamily is "sf_cg_grove_post_woman_02">>You walk up to her. She sees you coming and opens her mouth before you've said a word, and takes you down her throat.<<elseif _storyFamily is "sf_cg_grove_post_woman_03">>You walk up behind her. They've bent her over the rail now, and when you put your hand on her ass she jerks against the ropes.<<elseif _storyFamily is "sf_cg_grove_post_woman_05">>A thin riding crop hangs from the rope net. You take it down, walk round to the front of the bench and lay it across her tits.<<else>>You walk up behind her. She hears you coming and can't turn her head to see who it is. Her hands close into fists in the stocks.<</if>></p>
<</if>>
<div class="choice-container">
<<vchoice "Take her" "Grove_Post_Use_Taken" "action" "seduce">>
<<vchoice "Walk away" "Grove_Cellars" "move" "back">>
</div><<if !setup.groveDailyDone("postUse")>>
<<run setup.groveDaily("postUse")>>
<<set $publicUse.witnessUses to ($publicUse.witnessUses || 0) + 1>>
<<advanceTime 0 `setup.COVENANT.time.postUse`>>
<<set $player.lust to 15>><<run setup.playerReleased()>>
<</if>>
<h2>The Post</h2>
<<set _gpuSingles to setup.storyFamilySingles("story/grove_post_woman/used", $grove.postSign && $grove.postSign.singles && setup.storyFamilyOf("cg_grove_post_woman") !== "sf_cg_grove_post_woman_04")>>
<<groveSign `$grove.postSign ? $grove.postSign.text : ""`>><<storyVideo "story/grove_post_woman/used">><</groveSign>>
<<if _gpuSingles>><<run setup.mediaAvoidEnd("story/grove_post_woman/used")>><</if>>
<p><<if _storyFamily is "sf_cg_grove_post_woman_02">>You unhook her from the cross, turn her round to face it and cuff her wrists up high again. <</if>><<if _storyFamily is "sf_cg_grove_post_woman_03">>The wardens have cut her down from the posts onto a blanket in the grass, wrists still roped. You kneel behind her and drag her hips back onto your cock.<<elseif _storyFamily is "sf_cg_grove_post_woman_05">>You step in close at the front of the bench, take a fistful of her hair and push her down over the padded rail onto your cock.<<elseif _storyClip is "b731d6f60d4b">>Somebody has been at the board with chalk: under the Lady's sign, FREE ANAL. You give her what the board promises.<<else>>You take her by the hips and push your cock into her cunt from behind, and the restraints creak as she jolts forward against them.<</if>><<if _storyFamily is "sf_cg_grove_post_woman_04">> She screams at you over her shoulder: bastard, fucking vault rat, every name she's got.<</if>> <<if _storyFamily is "sf_cg_grove_post_woman_05">>You hold her there and fuck her mouth in slow, deep strokes.<<elseif _storyFamily is "sf_cg_grove_post_woman_04">>She's dripping, and every stroke she shoves back to take you deeper, still swearing<<else>>She's wet from the last man<</if>><<if _storyFamily is "sf_cg_grove_post_woman_02" or _storyFamily is "sf_cg_grove_post_woman_04" or _storyFamily is "sf_cg_grove_post_woman_05">><<else>> and still tight<</if>><<if _storyFamily is "sf_cg_grove_post_woman_04" or _storyFamily is "sf_cg_grove_post_woman_05">><<else>>, and she hates it: you hear it in the noise<</if>><<if _storyFamily is "sf_cg_grove_post_woman_04" or _storyFamily is "sf_cg_grove_post_woman_05">><<elseif _storyFamily is "sf_cg_grove_post_woman_03">> around the gag<<else>> through her teeth<</if>><<if _storyFamily is "sf_cg_grove_post_woman_04" or _storyFamily is "sf_cg_grove_post_woman_05">><<else>>, right up until her hips start pushing back to meet you.<</if>><<if _storyFamily is "sf_cg_grove_post_woman_05">><<elseif _storyFamily is "sf_cg_grove_post_woman_04">>, until the swearing turns into one long howl.<<elseif _storyClip is "b731d6f60d4b">> You fuck her ass in long hard strokes.<<else>> You fuck her hard and slow, watching her cunt stretch round you, and when she comes it's with a sob she'd give anything to take back.<</if>> <<if _storyFamily is "sf_cg_grove_post_woman_04">>At the last moment you pull out.<<elseif _storyFamily is "sf_cg_grove_post_woman_05">>You come down her throat.<<else>>You come deep inside her.<</if>></p>
<div class="choice-container">
<<vchoice "Step back" "Grove_Post_Left" "action" "back">>
</div><h2>The Post</h2>
<<groveSign `$grove.postSign ? $grove.postSign.text : ""`>><<storyVideo "story/grove_post_woman/left">><</groveSign>>
<p><<if _storyFamily is "sf_cg_grove_post_woman_02">>You leave her hanging on the cross, head down<<elseif _storyFamily is "sf_cg_grove_post_woman_03">>You leave her face down on the blanket in her ropes<<elseif _storyFamily is "sf_cg_grove_post_woman_04">>You come across her face instead and leave her roped over the bench<<elseif _storyFamily is "sf_cg_grove_post_woman_05">>You step back from the bench. She sags over it with her head hanging down<<else>>You leave her hanging in the pillory, head down<</if>>. The next man is already <<if _storyFamily is "sf_cg_grove_post_woman_03">>standing over her<<else>>on the stairs<</if>>.</p>
<div class="choice-container">
<<vchoice "Back to the Cellars" "Grove_Cellars" "move" "back">>
</div><<if !setup.groveDailyDone("report")>>
<<run setup.groveDaily("report")>>
<</if>>
<h2>A Name</h2>
<p>You tell the cellar warden what you've noticed around the Grove: whose basket comes back light from the Exchange, who's out of her bed after the lamps go down. The warden writes it all down without looking up.</p>
<<say "Warden" "She'll be on the post by the end of the week. The Lady thanks you.">>
<div class="choice-container">
<<vchoice "Back to the post" "Grove_Post" "move" "back">>
</div><<set _gpfName to $grove.postSign ? $grove.postSign.name : null>>
<<if $grove.postFreedDay !== $time.day || $grove.postFreedName !== _gpfName>>
<<set $grove.postFreedDay to $time.day>>
<<set $grove.postFreedName to _gpfName>>
<<run setup.groveCrime("freed")>>
<<run setup.factionRep("verdant", setup.COVENANT.rep.freed, "freed a prisoner")>>
<</if>>
<h2>Caught</h2>
<p>You get her loose and she slips free and runs. She doesn't get far. Neither do you: two wardens have you against the wall before she's out of sight.</p>
<<say "Warden" "That's the Law broken. The Lady decides what it costs you.">>
<div class="choice-container">
<<vchoice "Hear the sentence" "Grove_Sentence" "action" "scroll">>
</div><<set _gsB to $grove.pendingBreach>>
<<set _gsAtGrove to $currentLocation === "greenhollow">>
<h2>The Lady's Sentence</h2>
<<if !_gsB>>
<p>The wardens have nothing more for you.</p>
<div class="choice-container">
<<if _gsAtGrove>><<vchoice "Back to the Grove" "Location_VerdantOutpost" "move" "back">><<else>><<vchoice "Start your day" `setup.hubWakeTarget()` "move" "map">><</if>>
</div>
<<else>>
<<set _gsCrime to setup.COVENANT.crimes[_gsB.kind] || { label: "broke the Law" }>>
<p>The warden reads from a folded paper in the Lady's hand: you <<= _gsCrime.label>>.</p>
<<if _gsB.severity === "minor">>
<<say "Warden" `"A small breach. Pay " + setup.COVENANT.fine + " scrap, or its worth in goods, or give the Covenant a day at the post."`>>
<<scrapBalance>>
<<set _gsGoods to setup.groveFineGoods()>>
<div class="choice-container">
<<if $vault.scrap >= setup.COVENANT.fine>>
<<vchoice `"Pay the fine (" + setup.COVENANT.fine + " scrap)"` "Grove_Sentence_Fine" "action" "scrap">>
<<else>>
<<vchoiceDisabled `"Pay the fine (" + setup.COVENANT.fine + " scrap, you have too little)"` "action" "scrap">>
<</if>>
<<if _gsGoods.ok>>
<<vchoice `"Pay in goods (" + setup.groveGoodsText(_gsGoods.take) + ", no change given)"` "Grove_Sentence_Goods" "action" "backpack">>
<<else>>
<<vchoiceDisabled "Pay in goods (you have too little)" "action" "backpack">>
<</if>>
<<vchoice "Serve a day at the post" "Grove_Sentence_Post" "action" "lock">>
<<if _gsAtGrove && setup.groveAtLeast("Favoured")>>
<<link `'<span class="choice-button action"><span class="gi gi-run gi-large"></span><span class="label">Ask to run the Hunt instead (you are the quarry)</span></span>'`>><<run setup.groveHuntNew(true)>><<run setup.storyFamilyForget("cg_grove_hunt")>><<goto "Grove_Hunt_Quarry">><</link>>
<</if>>
</div>
<<elseif setup.groveKiraCanBeTaken()>>
<<set _gsDays to setup.groveKiraDays()>>
<<say "Warden" `"A real breach. Your registered woman goes to the Center. " + _gsDays + " days of work and duty."`>>
<<if setup.kiraWithYou()>>
<<if setup.kiraAllowsUse()>>
<<say "Kira" "Days. Downstairs. ...You're fucking kidding me.">>
<p>She looks at the warden, then at you, and the flush is already climbing her throat. <<if _gsAtGrove>>Her hand drops to her hip, where her knife would be if they hadn't taken it at the gate.<<else>>Her hand drops to her hip, to her knife, and stays there. Two rifles. She lets go of it.<</if>></p>
<<say "Kira" "Wipe that look off your face. And don't even think about offering yourself. You know what I told you.">>
<<else>>
<<say "Kira" "You're fucking kidding me.">>
<p>She looks at the warden, then at you. <<if _gsAtGrove>>Her hand drops to her hip, where her knife would be if they hadn't taken it at the gate.<<else>>Her hand drops to her hip, to her knife, and stays there. Two rifles. She lets go of it.<</if>></p>
<<say "Kira" "No. Don't. Don't you dare look sorry. Say something.">>
<</if>>
<</if>>
<div class="choice-container">
<<vchoice "Let them take Kira" "Grove_Sentence_Kira" "action" "partner">>
<<vchoice "Offer yourself instead" "Grove_Sentence_Offer" "action" "submit">>
</div>
<<else>>
<<say "Warden" "A real breach. You'll serve a day at the post.">>
<div class="choice-container">
<<vchoice "Serve a day at the post" "Grove_Sentence_Post" "action" "lock">>
<<if _gsAtGrove && setup.groveAtLeast("Favoured")>>
<<link `'<span class="choice-button action"><span class="gi gi-run gi-large"></span><span class="label">Ask to run the Hunt instead (you are the quarry)</span></span>'`>><<run setup.groveHuntNew(true)>><<run setup.storyFamilyForget("cg_grove_hunt")>><<goto "Grove_Hunt_Quarry">><</link>>
<</if>>
</div>
<</if>>
<</if>><<set _gsoDeclined to setup.groveBreachOfferDeclined()>>
<h2>Your Offer</h2>
<<if $grove.pendingBreach>><<set $grove.pendingBreach.offered to true>><</if>>
<<if $currentLocation === "greenhollow">>
<p>You tell the warden to take you instead. She sends a runner up to the main house with your words. The runner comes back with the answer.</p>
<<else>>
<p>You tell the warden to take you instead. She doesn't need to send anyone: she came with the Lady's orders for this, and she reads you the answer off them.</p>
<</if>>
<<if _gsoDeclined>>
<<say "Warden" "The Lady says: we don't want you. We want her.">>
<div class="choice-container">
<<vchoice "Watch them take Kira" "Grove_Sentence_Kira" "action" "partner">>
</div>
<<else>>
<<say "Warden" "The Lady accepts. A day at the post, then.">>
<div class="choice-container">
<<vchoice "Serve a day at the post" "Grove_Sentence_Post" "action" "lock">>
</div>
<</if>><<if $currentLocation === "greenhollow">><<advanceTime 0 `setup.COVENANT.time.sentence`>><</if>>
<<if $grove.pendingBreach>>
<<set _gskWithYou to setup.kiraWithYou()>>
<<set _gskDays to setup.groveTakeKira()>>
<<set _gskTrust to setup.groveKiraStayTrust()>>
<<run setup.groveSentenceDone("kira")>>
<<else>>
<<set _gskTrust to 0>>
<<set _gskWithYou to false>>
<<set _gskDays to setup.groveKiraDaysLeft()>>
<</if>>
<h2>Kira Is Taken</h2>
<<if _gskWithYou>>
<p>Two wardens take Kira by the arms. She lets them get one wrist, and then she goes off like a trap: an elbow into the first one's mouth, a heel stamped down on the other's foot, a stream of the filthiest words you've ever heard out of her. It takes both wardens and a fistful of her hair to get her down on her knees in the dirt, and even then she's spitting blood that isn't hers.</p>
<<else>>
<p>The wardens go to fetch Kira. They know where your vault is. By the next morning they bring her in through the gate, wrists roped behind her back, a strip of cloth knotted between her teeth, her shirt torn off one shoulder, a warden's bloody lip to show she didn't come quietly.</p>
<</if>>
<<say "Warden" "The Lady says the stray will be very popular downstairs. Keep the fight in her, if you like. The men pay extra to fuck it out of her.">>
<<if setup.kiraAllowsUse()>>
<<if setup.groveKiraReturnMood() === "angry">>
<p>They haul her up. She's still spitting at them. She looks back at you once on the way to the Center, and she's angry, but not about this.</p>
<<if _gskWithYou && $grove.kira.offered>>
<<say "Kira" "You offered. I heard you. I told you not to. ...This part I wanted. Remember that, the next time I'm not speaking to you.">>
<<elseif _gskWithYou>>
<<say "Kira" "Don't flatter yourself. This part I asked for. It's the rest of you I'm still pissed at.">>
<<else>>
<p>The gag they've tied in her mouth keeps whatever she'd say to you behind her teeth. Above it her eyes are hard, and they aren't on the wardens.</p>
<</if>>
<<elseif setup.groveKiraReturnMood() === "numb">>
<p>They haul her up, and she stops fighting all at once, like she's saving it for downstairs. She looks back at you once on the way to the Center.</p>
<<if _gskWithYou>>
<<say "Kira" "Come down and see me. I mean it. I want you to see.">>
<<else>>
<p>The gag they've tied in her mouth keeps whatever she'd say to you behind her teeth. She holds your eyes over it until they turn her round.</p>
<</if>>
<<else>>
<p>They haul her up by the arms, her chest heaving, her shirt half off her shoulder. She looks back at you once on the way to the Center, flushed to the throat, and this time she lets you see exactly what it is.</p>
<<if _gskWithYou>>
<<say "Kira" "Don't feel bad, vault boy. Come down and watch. I want to look up and see your face while they're fucking me.">>
<<else>>
<p>The gag they've tied in her mouth keeps whatever she'd say to you behind her teeth. Round it, she's grinning.</p>
<</if>>
<</if>>
<<else>>
<<if setup.groveKiraReturnMood() === "angry">>
<p>They haul her up. She's stopped fighting, and that's worse. She looks back at you once on the way to the Center, and her look says everything she doesn't.</p>
<<if _gskWithYou && $grove.kira.offered>>
<<say "Kira" "You offered. I heard you. ...They're still taking me. Remember this. 'Cause I fucking will.">>
<<elseif _gskWithYou>>
<<say "Kira" "Remember this. 'Cause I fucking will.">>
<<else>>
<p>The gag they've tied in her mouth keeps whatever she'd say to you behind her teeth. She doesn't need it said.</p>
<</if>>
<<elseif setup.groveKiraReturnMood() === "numb">>
<p>They haul her up, and she stops fighting all at once, as if somebody switched her off. She looks back at you once on the way to the Center. There's nothing in her face at all.</p>
<<if _gskWithYou>>
<<say "Kira" "Don't come down there. I mean it. I don't want you to see.">>
<<else>>
<p>The gag they've tied in her mouth keeps whatever she'd say to you behind her teeth. She doesn't need it said.</p>
<</if>>
<<else>>
<p>They haul her up by the arms, her chest heaving, her shirt half off her shoulder. She looks back at you once on the way to the Center, flushed to the throat, and you can't tell if it's rage or something she'd kill you for naming.</p>
<<if _gskWithYou>>
<<say "Kira" "Don't look at me like that. Don't you fucking dare.">>
<<else>>
<p>The gag they've tied in her mouth keeps whatever she'd say to you behind her teeth. She doesn't need it said.</p>
<</if>>
<</if>>
<</if>>
<<if _gskTrust>><<relationChange "kira" "trust" _gskTrust>><</if>>
<p class="narrator">Kira is held at the Center for <<= _gskDays>> days. Visit her in the Cellars.</p>
<div class="choice-container">
<<if $currentLocation === "greenhollow">>
<<vchoice "Back to the Grove" "Location_VerdantOutpost" "move" "back">>
<<else>>
<<vchoice "Start your day" `setup.hubWakeTarget()` "move" "map">>
<</if>>
</div><<if $currentLocation === "greenhollow">><<advanceTime 0 `setup.COVENANT.time.sentence`>><</if>>
<<if $grove.pendingBreach>>
<<set $vault.scrap to Math.max(0, $vault.scrap - setup.COVENANT.fine)>>
<<run setup.groveSentenceDone("fine")>>
<</if>>
<h2>Paid</h2>
<p>The warden counts the scrap twice and writes the sum down.</p>
<<say "Warden" "Paid. Don't make a habit of it.">>
<div class="choice-container">
<<if $currentLocation === "greenhollow">>
<<vchoice "Back to the Grove" "Location_VerdantOutpost" "move" "back">>
<<else>>
<<vchoice "Start your day" `setup.hubWakeTarget()` "move" "map">>
<</if>>
</div><<if $currentLocation === "greenhollow">><<advanceTime 0 `setup.COVENANT.time.sentence`>><</if>>
<<if $grove.pendingBreach>><<set _gsgPaid to setup.groveFinePayGoods()>><</if>>
<h2>Paid</h2>
<<if _gsgPaid>>
<p>The warden tips your pack out at her feet and prices it at the keeper's rates. She keeps <<= setup.groveGoodsText(_gsgPaid.take)>>, writes it all down, and pushes the rest back at you.</p>
<<else>>
<p>The warden writes it down.</p>
<</if>>
<<say "Warden" "Paid. The Covenant doesn't give change. Don't make a habit of it.">>
<div class="choice-container">
<<if $currentLocation === "greenhollow">>
<<vchoice "Back to the Grove" "Location_VerdantOutpost" "move" "back">>
<<else>>
<<vchoice "Start your day" `setup.hubWakeTarget()` "move" "map">>
<</if>>
</div><<set _gspFromVault to $currentLocation !== "greenhollow">>
<<if !$grove.postDayCrime>>
<<if _gspFromVault>><<advanceTime 8>><</if>>
<<if setup.groveHostile()>><<set $grove.bounty.serving to true>><</if>>
<<set _gspKind to $grove.pendingBreach ? $grove.pendingBreach.kind : "skipped">>
<<set $grove.postDayCrime to ($grove.bounty.serving && !$grove.pendingBreach) ? ((setup.groveClosed() && !setup.groveHostile()) ? setup.COVENANT.payoff.sneakSign : setup.COVENANT.bounty.sign) : ((setup.COVENANT.crimes[_gspKind] || {}).sign || "SKIPPED HIS DUTY")>>
<<set $grove.postDaySingles to random(0, 2) === 0>>
<<run setup.storyFamilyForget("cg_grove_post_player")>>
<</if>>
<<if _gspFromVault>><<groveMarchIn>><</if>>
<<run VaultUI.setBackgroundDirect(setup.GROVE_BG.cellars)>>
<h2>A Day at the Post</h2>
<<if _gspFromVault>>
<p>The wardens walk you east, out of the vault and through the woods to the Grove. It's a long day's march, and nobody talks.</p>
<<else>>
<p>The wardens walk you down the cellar stairs.</p>
<</if>>
<<if $time.hour > 9 || ($time.hour === 9 && ($time.minute || 0) > 0)>>
<p>They chain you down in the cellar, hang a sign over your head where every woman who comes down can read it, and leave you there for the night. Your day at the post starts in the morning.</p>
<<else>>
<p>They chain you down in the cellar, hang a sign over your head where every woman who comes down can read it, and leave.</p>
<</if>>
<div class="choice-container">
<<vchoice "Wait" "Grove_PostDay_1" "action" "wait">>
</div><<advanceToHour 9>>
<<if $grove.postDayBeat !== 1>>
<<set $grove.postDayBeat to 1>>
<<set $player.lust to 25>><<run setup.playerReleased()>>
<</if>>
<h2>The Post</h2>
<<groveSign $grove.postDayCrime>><<storyVideo "story/grove_post_player/morning">><</groveSign>>
<p>The first woman comes down soon after they leave. She reads your sign out loud and laughs.<<if _storyFamily is "sf_cg_grove_post_player_01">> She hauls your legs up and locks your ankles high in the stocks at the end of the bench.<<elseif _storyFamily is "sf_cg_grove_post_player_02">> She ties your wrists to the bed frame, tighter than she needs to.<<elseif _storyFamily is "sf_cg_grove_post_player_05">> She stretches out across you head to toe, her cunt right over your face where you can't reach it.<<elseif _storyFamily is "sf_cg_grove_post_player_06">> She kneels between your cuffed ankles and teases you with her fingertips until you're leaking and twitching for her.<</if>></p>
<<if _storyFamily is "sf_cg_grove_post_player_01">><<say "Covenant woman" "There. Now I can see all of you. It isn't much, is it?">><<elseif _storyFamily is "sf_cg_grove_post_player_02">><<say "Covenant woman" "Hard already? While I'm only tying you up? Oh, you're going to be fun.">><<elseif _storyFamily is "sf_cg_grove_post_player_05">><<say "Covenant woman" "Don't you dare lick me. You haven't earned it.">><<elseif _storyFamily is "sf_cg_grove_post_player_06">><<say "Covenant woman" "Listen to him. Begging already.">><<else>><<say "Covenant woman" "Look at him. Hard already, and nobody's touched him.">><</if>>
<p><<if _storyFamily is "sf_cg_grove_post_player_01">>She takes her time: her hand cups your balls, squeezing until you gasp, and strokes up your cock with two fingers, slow, while you twitch and leak for her.<<elseif _storyFamily is "sf_cg_grove_post_player_05">>She takes your cock in her mouth, sucking hard and selfish, as if you were her breakfast.<<elseif _storyFamily is "sf_cg_grove_post_player_06">>You hadn't noticed you were making a sound. She wraps her fist round you, then her mouth, sucking hard and selfish.<<elseif _storyFamily is "sf_cg_grove_post_player_04">>She turns her back on you<<else>>She climbs on<</if>><<if _storyFamily is "sf_cg_grove_post_player_01" or _storyFamily is "sf_cg_grove_post_player_05" or _storyFamily is "sf_cg_grove_post_player_06">><<else>>, sinks onto your cock and rides you hard and selfish<</if>><<if _storyFamily is "sf_cg_grove_post_player_01" or _storyFamily is "sf_cg_grove_post_player_05" or _storyFamily is "sf_cg_grove_post_player_06">><<elseif _storyFamily is "sf_cg_grove_post_player_04">>, her ass slapping down on your hips<<else>>, nails in your skin<</if>><<if _storyFamily is "sf_cg_grove_post_player_01" or _storyFamily is "sf_cg_grove_post_player_05" or _storyFamily is "sf_cg_grove_post_player_06">><<else>>, and your hips buck up into her before you've decided anything.<</if>> She lets you finish only because she can't be bothered to stop.</p>
<div class="choice-container">
<<vchoice "Endure it" "Grove_PostDay_2" "action" "wait">>
</div><<advanceToHour 13>>
<<if $grove.postDayBeat !== 2>>
<<set $grove.postDayBeat to 2>>
<<set $player.lust to Math.min(100, ($player.lust || 0) + 20)>>
<</if>>
<h2>The Post</h2>
<<groveSign $grove.postDayCrime>><<storyVideo "story/grove_post_player/midday">><</groveSign>>
<p>Another one, on her break. <<if _storyFamily is "sf_cg_grove_post_player_02">>She strokes you slow<<elseif _storyFamily is "sf_cg_grove_post_player_04">>She climbs on with her back to you and rides you slow<<elseif _storyFamily is "sf_cg_grove_post_player_05" or _storyFamily is "sf_cg_grove_post_player_06">>She sucks you slow<<else>>She takes you by the throat and talks into your face, close enough to kiss, telling you exactly what she'd do to you if you were worth the trouble<</if>><<if _storyFamily is "sf_cg_grove_post_player_02">>, and lets go every time you push up into her hand<<elseif _storyFamily is "sf_cg_grove_post_player_04">>, and every time you buck up after her she lifts off<<elseif _storyFamily is "sf_cg_grove_post_player_05" or _storyFamily is "sf_cg_grove_post_player_06">>, and pulls her mouth away every time you push up after it<<else>>, and her other hand squeezes your cock every time your breath catches and lets go every time you lean after her<</if>>.</p>
<<say "Covenant woman" "There. Feel that? That's the most anyone's going to give you today.">>
<p>She does it again and again <<if _storyFamily is "sf_cg_grove_post_player_02" or _storyFamily is "sf_cg_grove_post_player_05" or _storyFamily is "sf_cg_grove_post_player_06">>until you stop pushing<<elseif _storyFamily is "sf_cg_grove_post_player_04">>until you're shaking and you lie still<<else>>until you stop leaning and just hang there, hard and choking<</if>>, then leaves smiling.</p>
<div class="choice-container">
<<vchoice "Endure it" "Grove_PostDay_3" "action" "wait">>
</div><<advanceToHour 18>>
<<if $grove.postDayBeat !== 3>>
<<set $grove.postDayBeat to 3>>
<<set $player.lust to Math.min(100, ($player.lust || 0) + 20)>>
<</if>>
<h2>The Post</h2>
<<set _gp3Singles to setup.storyFamilySingles("story/grove_post_player/evening", $grove.postDaySingles)>>
<<groveSign $grove.postDayCrime>><<if _gp3Singles or !setup.storyFamilyGap("story/grove_post_player/evening")>><<storyVideo "story/grove_post_player/evening">><</if>><</groveSign>>
<<if _gp3Singles>><<run setup.mediaAvoidEnd("story/grove_post_player/evening")>><</if>>
<p>A warden off her shift has them strap you down on your back. She <<if _storyFamily is "sf_cg_grove_post_player_04" or _storyFamily is "sf_cg_grove_post_player_05" or _storyFamily is "sf_cg_grove_post_player_06" or _storyClip is "9616eccfa45c" or _storyClip is "5327c289d0de" or _storyClip is "02146ccdb5ea" or _storyClip is "40c4501564e4" or _storyClip is "ae0d2b38f6ee">>climbs on and rides you, talking to her friend about the greenhouse the whole time, as if you were a bench<<else>>sits on your face and stays there, her full weight on your mouth, thighs clamped round your ears so her chatter to her friend about the greenhouse comes through muffled<</if>>.<<if _storyFamily is "sf_cg_grove_post_player_04" or _storyFamily is "sf_cg_grove_post_player_05" or _storyFamily is "sf_cg_grove_post_player_06" or _storyClip is "9616eccfa45c" or _storyClip is "5327c289d0de" or _storyClip is "02146ccdb5ea" or _storyClip is "40c4501564e4" or _storyClip is "ae0d2b38f6ee">><<else>> She's wet and musky and in no hurry. When you stop licking she grinds her cunt down until you can't breathe, and you start again.<</if>><<if _storyFamily is "sf_cg_grove_post_player_04" or _storyFamily is "sf_cg_grove_post_player_05" or _storyFamily is "sf_cg_grove_post_player_06" or _storyClip is "9616eccfa45c" or _storyClip is "5327c289d0de" or _storyClip is "02146ccdb5ea" or _storyClip is "40c4501564e4" or _storyClip is "ae0d2b38f6ee">><<else>> She comes on your tongue in the middle of a sentence, finishes the sentence, and doesn't get up.<</if>></p>
<<if _storyFamily is "sf_cg_grove_post_player_04" or _storyFamily is "sf_cg_grove_post_player_05" or _storyFamily is "sf_cg_grove_post_player_06" or _storyClip is "9616eccfa45c" or _storyClip is "5327c289d0de" or _storyClip is "02146ccdb5ea" or _storyClip is "40c4501564e4" or _storyClip is "ae0d2b38f6ee">><<else>><<say "Warden" "Good chair.">><</if>>
<div class="choice-container">
<<vchoice "Endure it" "Grove_PostDay_4" "action" "wait">>
</div><<advanceToHour 23>>
<<if $grove.postDayCrime>>
<<set $grove.postDayCrime to null>>
<<set $grove.postDayBeat to 4>>
<<set $grove.postDaysServed to ($grove.postDaysServed || 0) + 1>>
<<set $publicUse.postDays to ($publicUse.postDays || 0) + 1>>
<<set $publicUse.lastPostDay to $time.day>>
<<if $grove.pendingBreach>><<run setup.groveSentenceDone("post")>><</if>>
<<run setup.factionRep("verdant", setup.COVENANT.rep.sentenceServed, "served the post")>>
<<if setup.groveBountyServed()>><<set $grove.bounty.settledDay to $time.day>><</if>>
<<set $player.energy to Math.max(0, ($player.energy || 0) - 30)>>
<</if>>
<h2>The Post</h2>
<<storyVideo "story/grove_post_player/night">>
<p>They leave you <<if _storyFamily is "sf_cg_grove_post_player_02">>tied to the bed frame<<else>>strapped down<</if>> into the night<<if _storyFamily is "sf_cg_grove_post_player_02" or _storyFamily is "sf_cg_grove_post_player_04" or _storyFamily is "sf_cg_grove_post_player_05" or _storyFamily is "sf_cg_grove_post_player_06">><<else>>, hard and aching and untouched<</if>>. <<if _storyFamily is "sf_cg_grove_post_player_04" or _storyFamily is "sf_cg_grove_post_player_05" or _storyFamily is "sf_cg_grove_post_player_06">>Long after dark one more woman comes down, climbs on and rides you slowly, for herself, and gets off before you can finish, leaving you hard and aching. Later<<elseif _storyFamily is "sf_cg_grove_post_player_02">>Long after dark the woman with the horns comes back down, lies down against you and falls asleep, and you lie awake under her, hard and aching. Later<<else>>Long after dark<</if>> the warden comes back, <<if _storyFamily is "sf_cg_grove_post_player_02">>lets you loose<<else>>unbuckles you<</if>> and lets you fall onto your knees.</p>
<<say "Warden" "Served. The Law is paid.">>
<<if setup.groveClosed() && setup.groveHostile()>>
<<say "Warden" "Now get out of the Lady's Grove. Her price still stands.">>
<<elseif setup.groveClosed()>>
<<say "Warden" "Now get out of the Lady's Grove. Over the wall again and it'll be the post again.">>
<</if>>
<<if $grove.bounty.settledDay === $time.day>>
<p class="narrator">The bounty is settled. Your standing with the Covenant is back to nothing: a stranger at the gate.</p>
<</if>>
<<if setup.kiraWithYou()>>
<<if setup.groveKiraReturnMood() === "angry">>
<<say "Kira" "Don't. Just don't talk to me about it.">>
<<elseif setup.groveKiraReturnMood() === "numb">>
<<say "Kira" "Can you walk? Come on.">>
<<else>>
<<say "Kira" "I watched some of it. ...Come on, up.">>
<</if>>
<</if>>
<div class="choice-container">
<<if $grove.kiraDownHome>>
<<vchoice "Climb the stairs" "Grove_Kira_Carry_Home" "move" "forward">>
<<else>>
<<vchoice "Climb the stairs" "Location_VerdantOutpost" "move" "forward">>
<</if>>
</div><<set _gkchNext to $grove.kiraDownHome || "Vault_Hub">>
<<set _gkchFar to setup.farCarryHandover()>>
<<if $grove.kiraDownHome>>
<<set $grove.kiraDownHome to null>>
<<if not _gkchFar>><<advanceTime 8>><</if>>
<</if>>
<<run VaultUI.setBackgroundDirect(setup.GROVE_BG.woods)>>
<h2>Carrying Kira Home</h2>
<p>The wardens bring Kira up from wherever they kept her: still out cold, breathing slow and shallow, a bruise coming up along her jaw. The Covenant's healer has looked at her and shrugged.</p>
<<say "Warden" "Nothing we can do for her here. Whatever's wrong with her isn't a knock on the head. Take her home to your vault.">>
<<if _gkchFar>>
<div class="choice-container">
<<vchoice "Continue" _gkchFar "action" "forward">>
</div>
<<else>>
<p>So you do. You carry her on your back through the woods, all the way, stopping when your legs give out and starting again when they don't. It's hours before the vault door comes in sight.</p>
<div class="choice-container">
<<vchoice "Carry her in" _gkchNext "move" "house">>
</div>
<</if>><<if setup.kiraAtCenter()>><<advanceTime 0 `setup.COVENANT.time.kiraWatch`>><<set $grove.kira.visitDay to $time.day>><</if>>
<<run setup.storyFamilyForget("cg_grove_kira_cellar")>>
<<set $grove.kira.visitSingles to random(0, 2) === 0>>
<h2>Kira in the Cellars</h2>
<<if !setup.kiraAtCenter()>>
<p>Her cell is empty. She isn't here any more.</p>
<div class="choice-container">
<<vchoice "Back to the Cellars" "Grove_Cellars" "move" "back">>
</div>
<<else>>
<<storyVideo "story/grove_kira_cellar/found_tied">>
<p>Kira <<if _storyFamily is "sf_cg_grove_kira_cellar_02">>is strapped into an old examination chair<<elseif _storyFamily is "sf_cg_grove_kira_cellar_03">>hangs in a web of rope in a brick cell<<else>>stands in a brick cell<</if>> at the end of the passage, <<if _storyFamily is "sf_cg_grove_kira_cellar_02">>her wrists tied out to the sides<<elseif _storyFamily is "sf_cg_grove_kira_cellar_03">>her legs hauled up over her head and spread wide<<else>>stripped to the waist, rope cinched round her tits in a tight harness, her arms tied behind her back<</if>><<if _storyFamily is "sf_cg_grove_kira_cellar_02" or _storyFamily is "sf_cg_grove_kira_cellar_03">><<else>> and a red ball gag strapped in her mouth, spit shining on her chin<</if>>. <<if _storyFamily is "sf_cg_grove_kira_cellar_02">>A naked man is standing between her spread thighs, fucking her in slow, heavy strokes<<elseif _storyFamily is "sf_cg_grove_kira_cellar_03">>A man in a black shirt is laying a riding crop across the sole of her bare foot<<else>>A man in a black shirt stands behind her holding her bound arms like a leash<</if>>. She sees you come in<<if _storyFamily is "sf_cg_grove_kira_cellar_02">> over his shoulder<</if>>. She doesn't look away<<if _storyFamily is "sf_cg_grove_kira_cellar_02">><<else>>, and neither does he<</if>>.</p>
<<if _storyFamily is "sf_cg_grove_kira_cellar_02">><<say "The man" "Company, sweetheart. Your vault boy's come to see how you're getting on. Show him.">><<elseif _storyFamily is "sf_cg_grove_kira_cellar_03">><<say "The man" "Don't stop on my account. She's got a mouth on her, this one. We're teaching her where to put it.">><<else>><<say "The man" "Your woman? Not this week. This week she's ours. Pull up a crate.">><</if>>
<div class="choice-container">
<<vchoice "Stay and watch" "Grove_Kira_Cellar_Used" "action" "voyeur">>
<<if setup.groveKiraTalkOpen()>>
<<vchoice "Wait in the passage till he's gone, then sit with her" "Grove_Kira_Cell_Talk" "action" "talk">>
<</if>>
<<if !$grove.pendingBreach>>
<<vchoice "Put a knife to his throat (a crime)" "Grove_Kira_Cellar_Draw" "action" "sword">>
<</if>>
<<vchoice "Back to the Cellars" "Grove_Cellars" "move" "back">>
</div>
<</if>><h2>Kira in the Cellars</h2>
<<set _gkuMood to setup.groveKiraReturnMood()>>
<<set _gkuSingles to setup.storyFamilySingles("story/grove_kira_cellar/used", $grove.kira.visitSingles)>>
<<storyVideo "story/grove_kira_cellar/used">>
<<if _gkuSingles>><<run setup.mediaAvoidEnd("story/grove_kira_cellar/used")>><</if>>
<p><<if _storyFamily is "sf_cg_grove_kira_cellar_01">>He takes a thick dark toy on a long wooden handle down off the wall and works it into her, slow, twisting, an inch at a time<<elseif _storyFamily is "sf_cg_grove_kira_cellar_02">>He unbuckles her, drags her down onto her knees, fists her hair and fucks her throat, hard, holding her head still while he does it<<elseif _storyFamily is "sf_cg_grove_kira_cellar_03">>He presses a humming wand flat against her clit and holds it there while she bucks<<elseif _storyClip is "817d6536b3ff">>They've cuffed her wrists down to a bench, her ass up, and he takes her by the hips and fucks her from behind, hard and deep<<elseif _storyClip is "3f70c5d7028c">>They've belted her down on her back on a table, and he pushes his cock into her cunt and fucks her in long, punishing strokes<<else>>She's roped up and stretched out, nowhere to go, and he fucks her where she hangs, slow and deep, his fingers digging into her ass<</if>><<if _storyFamily is "sf_cg_grove_kira_cellar_03">>. When she starts to shake he kneels and buries his face in her cunt<<elseif _storyClip is "817d6536b3ff">>, his hand shoving her down by the small of her back every time she tries to lift her head<<elseif _storyClip is "3f70c5d7028c">>, and when he's done he pulls out and comes across her belly and her tits<<else>>, talking to her the whole time in a low, pleased voice<</if>>.</p>
<<if _storyFamily is "sf_cg_grove_kira_cellar_01">><<say "The man" "Look at that. Swallowing it. Tell your boy how much you hate this, go on.">><<elseif _storyFamily is "sf_cg_grove_kira_cellar_02">><<say "The man" "Breathe through your nose, stray. That's it. Your boy never used this mouth properly, did he? Wasted on him.">><<elseif _storyFamily is "sf_cg_grove_kira_cellar_03">><<say "The man" "Fight it all you like. Your cunt's already made its mind up.">><<elseif _storyClip is "817d6536b3ff">><<say "The man" "Stay down. That's where you belong. Feel that? That's what the Law costs your boy.">><<elseif _storyClip is "3f70c5d7028c">><<say "The man" "Marked. Fourth one today. She'll be dripping by supper.">><<else>><<say "The man" "That's it. Hate me. Squeeze me while you do it.">><</if>>
<<if setup.kiraAllowsUse()>>
<<if _gkuMood === "angry">>
<p>She fights it every second, and she means every curse: she wrenches against whatever's holding her, spits filth at him round whatever's in her mouth, calls him every name she knows. It doesn't stop him. It doesn't stop her body either: she goes wet and swollen under his hands, and she doesn't try to hide it. When her eyes find you across the cell there's no shame in them at all. Only anger, and you know by now it isn't him she's angry with.</p>
<<elseif _gkuMood === "numb">>
<p>She doesn't fight much today. Her eyes are half shut, her breath going in and out through her nose, slow, like she's riding something out. Then he finds the right rhythm and a long, low noise comes out of her, and her eyes open and find yours, and she doesn't look away: <em>you heard that. Good.</em></p>
<<else>>
<p>She fights it at first, because that's the game: she swears at him, she twists, she tries to close her legs. Then her hips start moving on their own, chasing him, and she stops pretending. Her face goes slack and greedy. When she comes it tears out of her like a scream, and the first thing she does after is find your eyes, flushed and wet-cheeked, and grin at you, slow and filthy, as if to ask whether you saw.</p>
<</if>>
<<else>>
<<if _gkuMood === "angry">>
<p>She fights it every second. She wrenches against the ropes and the straps, spits curses at him round whatever's in her mouth, calls him every filthy name she knows. It doesn't stop him. It doesn't stop her body either: you watch her go wet and swollen under his hands, and you watch her know it. When her eyes find you across the cell they're murderous, and you can't tell which of you she wants dead more.</p>
<<elseif _gkuMood === "numb">>
<p>She endures it. Her eyes are shut, her jaw tight, her breath going in and out through her nose like she's counting. She doesn't make a sound for a long time. Then he finds the right rhythm and a small, broken noise slips out of her anyway, and her eyes snap open and find yours, and the look she gives you is the worst thing you've ever seen: <em>don't. Don't you dare have heard that.</em></p>
<<else>>
<p>She fights it, at first. She swears at him, she twists, she tries to close her legs. Then her hips start moving on their own, chasing him, and she hates it, you can see her hate it, her face screwed up with shame while her body takes everything he gives it. When she comes it tears out of her like a scream, and the first thing she does after is find your eyes, flushed and furious and wet-cheeked, as if you'd done this to her.</p>
<</if>>
<</if>>
<div class="choice-container">
<<vchoice "Stay till he's finished" "Grove_Kira_Cellar_After" "action" "wait">>
</div><h2>Kira in the Cellars</h2>
<<set _gkaMood to setup.groveKiraReturnMood()>>
<<storyVideo "story/grove_kira_cellar/after">>
<p><<if _storyFamily is "sf_cg_grove_kira_cellar_02">>He straps her back into the chair before he's done with her<<else>>She hangs in the ropes, legs hauled up and spread, a crop strapped through her mouth for a bit<</if>><<if _storyFamily is "sf_cg_grove_kira_cellar_02" or _storyFamily is "sf_cg_grove_kira_cellar_03">><<else>> and pegs pinching her cunt along the rope<</if>>. <<if _storyFamily is "sf_cg_grove_kira_cellar_02">>He rubs her cunt with two fingers and works her one more time just to watch her squirm<<elseif _storyFamily is "sf_cg_grove_kira_cellar_03">>Before he goes he clips a row of clothespins down her cunt lips with a string between them and gives the string a tug<<else>>He isn't finished: he works the toy on its wooden handle in and out of her, slow,<</if>><<if _storyFamily is "sf_cg_grove_kira_cellar_02" or _storyFamily is "sf_cg_grove_kira_cellar_03">><<else>> and holds a little humming toy on her clit until her whole body goes tight in the ropes, again, and again<</if>>.</p>
<<if _storyFamily is "sf_cg_grove_kira_cellar_02">><<say "The man" "Same time tomorrow, stray.">><<elseif _storyFamily is "sf_cg_grove_kira_cellar_03">><<say "The man" "Leave those in. She likes the reminder.">><<else>><<say "The man" "That's three. I'll tell the Lady she's settling in.">><</if>>
<p>He leaves. You <<if _storyFamily is "sf_cg_grove_kira_cellar_02">>loosen the strap across her chest<<else>>unbuckle the bit from her mouth<</if>>.</p>
<<if setup.kiraAllowsUse()>>
<<if _gkaMood === "angry">>
<p>She works her jaw, spits on the floor, and looks at you.</p>
<<say "Kira" "Enjoy the show? Good. I did. ...Now get out, before I remember everything else you've done and say something I mean.">>
<<elseif _gkaMood === "numb">>
<p>She lets her head fall back and just breathes for a while.</p>
<<say "Kira" "How many days.">>
<p>You tell her: <<= setup.groveKiraDaysLeft()>>.</p>
<<say "Kira" "Fine. ...Come back tomorrow. Come back every day. I want you here for the next one too.">>
<<else>>
<p>She meets your eyes. Her thighs are still shaking, and wet, and she doesn't try to hide either.</p>
<<say "Kira" "Don't say anything. I know what you saw. ...Fuck. Did you see him make me come? Right there, in front of you, with my legs tied open. ...I could get used to it down here.">>
<</if>>
<<else>>
<<if _gkaMood === "angry">>
<p>She works her jaw, spits on the floor, and looks at you.</p>
<<say "Kira" "Enjoy the show? ...Get out. Get the fuck out before I say something I mean.">>
<<elseif _gkaMood === "numb">>
<p>She doesn't look at you.</p>
<<say "Kira" "How many days.">>
<p>You tell her: <<= setup.groveKiraDaysLeft()>>.</p>
<<say "Kira" "Fine. Go. Don't come back tomorrow.">>
<<else>>
<p>She won't meet your eyes. Her thighs are still shaking, and wet, and she can't hide either.</p>
<<say "Kira" "Don't. Don't say anything. I know what you saw. ...I fucking hate it here.">>
<</if>>
<</if>>
<div class="choice-container">
<<if setup.groveKiraTalkOpen()>>
<<vchoice "Stay with her" "Grove_Kira_Cell_Talk" "action" "talk">>
<</if>>
<<vchoice "Back to the Cellars" "Grove_Cellars" "move" "back">>
</div><<run VaultUI.setBackgroundDirect(setup.GROVE_BG.cellars)>>
<<set _gktFromDoor to previous() === "Grove_Kira_Cellar">>
<<if setup.kiraAtCenter() && setup.groveKiraTalkOpen()>>
<<advanceTime 0 `setup.COVENANT.time.kiraTalk`>>
<<run setup.groveKiraTalk()>>
<</if>>
<<set _gktMood to setup.groveKiraReturnMood()>>
<h2>Kira's Cell</h2>
<<if !setup.kiraAtCenter()>>
<p>Her cell is empty. She isn't here any more.</p>
<<else>>
<<if _gktFromDoor>>
<<if setup.kiraAllowsUse()>>
<p>You wait in the dark of the passage with your back to the wall and listen to it through the door: the slap of skin, the man's voice, Kira's voice, the sounds she makes, louder than they need to be, as if she knows you're out there. She probably does. It takes most of an hour. When he comes out he's buckling his belt, and he winks at you on his way past. You go in.</p>
<<else>>
<p>You wait in the dark of the passage with your back to the wall and listen to it through the door: the slap of skin, the man's voice, Kira's voice, the sounds she makes that she'd kill you for hearing. It takes most of an hour. When he comes out he's buckling his belt, and he winks at you on his way past. You go in.</p>
<</if>>
<</if>>
<p>Somebody has untied her and thrown a grey blanket over the cot. You pull the door to behind you. The warden at the end of the passage looks the other way: Kira is yours on the register, and the Law doesn't care what you do with her between her duties.</p>
<<if _gktMood === "angry">>
<p>She's sitting on the cot with the blanket round her shoulders and her back to the wall, and she doesn't look at you.</p>
<<say "Kira" "I told you to get out.">>
<p>You don't. You sit down on the stone floor beside the cot, close enough that she could kick you, and you wait. She doesn't kick you. After a long time she speaks to the wall.</p>
<<if setup.kiraAllowsUse()>>
<<say "Kira" "They let you down here whenever you like. Good. I want you to see what they do to me. ...It's the rest of the time I can't stand the sight of you.">>
<<else>>
<<say "Kira" "They let you down here whenever you like. Like I'm in a fucking zoo. Come and see the vault boy's stray, she bites.">>
<</if>>
<<if $grove.kira.offered>>
<<say "Kira" "...You offered. I keep thinking about that. It's stupid. It doesn't change a fucking thing.">>
<p>But she says it quieter than the rest.</p>
<</if>>
<<elseif _gktMood === "numb">>
<p>She's sitting on the edge of the cot with the blanket round her, staring at nothing. When you sit down she moves over half an inch, which is as close to an invitation as she gets today.</p>
<<if setup.kiraAllowsUse()>>
<<say "Kira" "You came back. ...Good. Sit there. I can't feel my legs, and I want somebody to tell it to who isn't tying me up.">>
<<else>>
<<say "Kira" "You came back. I said don't.">>
<</if>>
<<if $grove.kira.offered>>
<<say "Kira" "They told me what you said to the warden. That you'd go instead. ...Nobody ever offered to go instead of me. Not once. Not in my whole life.">>
<</if>>
<<else>>
<p>She's curled on the cot, still flushed down to her collarbones, the rope marks red across her tits where the blanket has slipped. She watches you sit down, and something in her face gives way before she can stop it.</p>
<<say "Kira" "Don't make a thing of it. ...Stay a minute. Just a minute.">>
<<if $grove.kira.offered>>
<<say "Kira" "And don't ever offer to go in my place again, idiot. I'd have had to watch that. ...I'd have hated watching that more.">>
<</if>>
<</if>>
<</if>>
<div class="choice-container">
<<if setup.kiraAtCenter()>>
<<vchoice "Hold her" "Grove_Kira_Cell_Comfort" "intimate" "heart">>
<<vchoice "Ask her what they do to her down here" "Grove_Kira_Cell_Ask" "action" "talk">>
<</if>>
<<vchoice "Leave her be" "Grove_Cellars" "move" "back">>
</div><<run VaultUI.setBackgroundDirect(setup.GROVE_BG.cellars)>>
<<set _gkcMood to setup.groveKiraReturnMood()>>
<<set _gkcTrust to setup.groveKiraComfort()>>
<h2>Kira's Cell</h2>
<<if _gkcMood === "angry">>
<p>You get up off the floor and sit beside her and put your arm round her shoulders. She goes rigid and shoves it off.</p>
<<say "Kira" "Don't.">>
<<if setup.kiraAllowsUse()>>
<p>You put it back. She shoves it off again, not as hard. The third time she lets it stay. She leans into you stiffly, then all at once, her whole weight, her fists knotted in your shirt. She's shaking, but not from crying: her whole body is still humming with the day.</p>
<<say "Kira" "If you ever tell anyone I let you do this while I'm still angry with you, I'll cut your balls off and feed them to you.">>
<<else>>
<p>You put it back. She shoves it off again, not as hard. The third time she lets it stay. She turns her face into your shoulder so you can't see it, and she shakes, without a single sound, for a long time, her fists knotted in your shirt.</p>
<<say "Kira" "If you ever tell anyone about this, I'll cut your balls off and feed them to you.">>
<</if>>
<p>You tell her you know. She doesn't let go of your shirt.</p>
<<elseif _gkcMood === "numb">>
<p>You put your arm round her and she lets you pull her in, the way you'd lean on a wall. Her head drops onto your shoulder. A minute later she's asleep, heavy against you, breathing slow, and you sit very still in the lantern light and let her.</p>
<p>When she wakes it's with a jerk, ready to fight, and then she sees it's you.</p>
<<if setup.kiraAllowsUse()>>
<<say "Kira" "...First time I've slept down here that wasn't after. Thanks. Come back tomorrow.">>
<<else>>
<<say "Kira" "...First time I've slept down here that wasn't after. Thanks. Don't come tomorrow. Come the day after.">>
<</if>>
<<else>>
<p>You reach for her and she comes into your arms all at once, hard, like she's been waiting the whole time for you to do it. She climbs into your lap and kisses you, angry and wet and desperate, her fingers in your hair.</p>
<<say "Kira" "I can still feel him. Every time I move. I can feel all of them.">>
<p>She takes your hand and pushes it down under the blanket, between her thighs, onto her cunt, hot and swollen and still slick.</p>
<<say "Kira" "Make it you. I want it to be you I feel when they come back tomorrow. Please don't make me ask twice.">>
<</if>>
<<if _gkcTrust > 0>><<relationChange "kira" "trust" _gkcTrust>><</if>>
<div class="choice-container">
<<if _gkcMood === "thrill" && setup.kiraAtCenter()>>
<<vchoice "Take her, here, on the cot" "Grove_Kira_Cell_Claim" "intimate" "heart">>
<<vchoice "Just hold her" "Grove_Kira_Cell_Held" "intimate" "heart">>
<<else>>
<<vchoice "Back to the Cellars" "Grove_Cellars" "move" "back">>
<</if>>
</div><<run VaultUI.setBackgroundDirect(setup.GROVE_BG.cellars)>>
<h2>Kira's Cell</h2>
<p>You take your hand back and wrap both arms round her instead. She makes a frustrated sound into your neck, and bites it, not gently. Then she gives up and lets you hold her, her knees drawn up, her heartbeat slowing against your chest.</p>
<<say "Kira" "...You're an idiot. You know that? I'm offering. ...Fine. Fine. This is nice too. Don't you dare tell anyone this is nice.">>
<div class="choice-container">
<<vchoice "Back to the Cellars" "Grove_Cellars" "move" "back">>
</div><<run VaultUI.setBackgroundDirect(setup.GROVE_BG.cellars)>>
<<set $player.lust to 20>><<run setup.playerReleased()>>
<h2>Kira's Cell</h2>
<p>She drags the blanket off and pushes you down on your back on the narrow cot, and she's on you before you've got your trousers past your knees: naked, rope-marked, her hair wild, straddling your hips with her hand wrapped round your cock. She doesn't tease. She sinks down onto you in one long slide, all the way, and her breath goes out of her in a shudder.</p>
<<say "Kira" "There. That's... fuck. That's you. That's yours.">>
<p>She rides you hard and fast, both hands flat on your chest, her cunt still swollen and sore and gripping you so tight it's almost too much. The cot slams against the wall. She doesn't care who hears. She grabs your hands and drags them up onto her tits, over the red rope marks, and makes you squeeze, and her head goes back and she groans at the ceiling.</p>
<<say "Kira" "Harder. Grab me. Leave marks. I want to look down tomorrow and see yours on top of theirs.">>
<p>You roll her under you and give her what she asks for: deep, heavy strokes, her heels locked behind your back, your fingers digging into her hips, her nails tearing at your shoulders. She comes with her teeth sunk in your arm to keep it in, shaking all the way through, and she won't let you pull out. She holds you inside her with her legs while you come, deep, and only then does she let go.</p>
<p>For a while she just lies under you, breathing, her face wet. Then she shoves at your chest.</p>
<<if setup.kiraAllowsUse()>>
<<say "Kira" "Get off, you're heavy. ...Go on, before the next one comes down. Not because I don't want you to see. Because if you're watching I'll come before he's even inside me, and he'll think it was him.">>
<<else>>
<<say "Kira" "Get off, you're heavy. ...And get out before the next one comes down. I don't want you here for that.">>
<</if>>
<p>At the door you look back. She's lying on the cot with one hand between her legs, eyes shut, holding it there.</p>
<<say "Kira" "Come back.">>
<<relationChange "kira" "affection" 2>>
<div class="choice-container">
<<vchoice "Back to the Cellars" "Grove_Cellars" "move" "back">>
</div><<run VaultUI.setBackgroundDirect(setup.GROVE_BG.cellars)>>
<<set _gkkMood to setup.groveKiraReturnMood()>>
<<if !$grove.kira.askDay || $grove.kira.askDay !== $time.day>><<set $grove.kira.askDay to $time.day>><<addTension "kira" `setup.COVENANT.kiraTalk.askTension`>><</if>>
<h2>Kira's Cell</h2>
<p>You ask her what they do to her down here. All of it.</p>
<<if _gkkMood === "angry">>
<p>She turns her head and looks at you for the first time, and you wish she hadn't.</p>
<<say "Kira" "You want to know? Fine. Three a day. Four, on a good day for them. They come in and they say the Lady's name at the door like it's a password and then they fuck me however they like, and I fight every single one of them, and I bit one so hard this morning he bled on my tits, and they laughed. They like it when I fight. It's what they pay for.">>
<<if setup.kiraAllowsUse()>>
<<say "Kira" "That what you wanted? Good. Think about it tonight in your nice bunk, with your hand round your cock. I will be. ...Doesn't mean I've forgiven you for the rest.">>
<<else>>
<<say "Kira" "That what you wanted? Enjoy that tonight, in your nice bunk. Think about me.">>
<</if>>
<<elseif _gkkMood === "numb">>
<p>She tells you, flat, like she's reading a list off the wall.</p>
<<if setup.kiraAllowsUse()>>
<<say "Kira" "Breakfast. A man. Washed. A man. Two, at midday, sometimes, at the same time. One in my mouth. Food. A man. Washed. Sleep, if they let me. They tie me different every time, so I never know what's coming. That's on purpose. ...That's it. That's all of it. How it feels? Good. Too good. I'm too tired to make it sound filthy tonight, so you'll have to picture that part yourself.">>
<<else>>
<<say "Kira" "Breakfast. A man. Washed. A man. Two, at midday, sometimes, at the same time. One in my mouth. Food. A man. Washed. Sleep, if they let me. They tie me different every time, so I never know what's coming. That's on purpose. ...That's it. That's all of it. Don't ask me how it feels. I stopped knowing on the first one.">>
<</if>>
<<else>>
<<if setup.kiraAllowsUse()>>
<p>She doesn't make you wait. It comes out of her low and fast, and she watches your face the whole time she says it.</p>
<<say "Kira" "They tie me and they take turns. They talk the whole time, about you, mostly. That you're upstairs. That you can't stop it. And the best bit isn't even them. The best bit is the second time I heard the door and I was wet before it opened. Before anyone touched me. Now I lie there tied up listening for boots on the stairs like it's breakfast.">>
<<say "Kira" "...Now you know. Look at you. You're hard just hearing it. ...Good. Come here and tell me which bit.">>
<<else>>
<p>She's quiet for so long you think she won't. Then it comes out of her low and fast, and she won't look at you while she says it.</p>
<<say "Kira" "They tie me and they take turns. They talk the whole time, about you, mostly. That you're upstairs. That you can't stop it. And the worst bit isn't them. The worst bit is the second time I heard the door and I was wet before it opened. Before anyone touched me. I hate them, I hate this place, and my body doesn't fucking care.">>
<<say "Kira" "...Now you know. Don't you dare look at me like that. Don't you dare be turned on by it. ...You are, aren't you.">>
<</if>>
<</if>>
<div class="choice-container">
<<if setup.kiraAtCenter()>>
<<vchoice "Hold her" "Grove_Kira_Cell_Comfort" "intimate" "heart">>
<</if>>
<<vchoice "Leave her be" "Grove_Cellars" "move" "back">>
</div><<run VaultUI.setBackgroundDirect(setup.GROVE_BG.center)>>
<<run setup.groveSettlePregnancies()>>
<h2>The Center</h2>
<<if !$grove.registered>>
<p>A warden at the villa door shakes her head.</p>
<<say "Warden" "Not until the Lady has seen you.">>
<<else>>
<p>Three villas joined by covered walkways. Bedrooms behind every door, a nursery at the end, a board in the hall where the work is posted.</p>
<<if $breeding.pregnancies.length > 0>>
<div class="grove-pregnancies">
<p><strong>Your yield:</strong></p>
<<for _gcP range $breeding.pregnancies>>
<<set _gcStage to setup.pregnancyStage(_gcP)>>
<p>• <<= _gcP.name>>: <<if _gcStage === "conceived">>marked on the slate, too soon to tell<<elseif _gcStage === "showing">>showing<<elseif _gcStage === "heavy">>heavy with your child<<else>>delivered<</if>></p>
<</for>>
</div>
<</if>>
<<if setup.kiraAtCenter()>>
<<if setup.groveKiraReturnDue()>>
<p>Kira's days are over. She's waiting by the door with her things.</p>
<<else>>
<p>Kira is somewhere in these rooms. <<= setup.groveKiraDaysLeft()>> more day<<if setup.groveKiraDaysLeft() !== 1>>s<</if>>.</p>
<</if>>
<</if>>
<</if>>
<div class="choice-container">
<<if $grove.registered>>
<<vchoice "Read the assignment board" "Grove_Assignments" "action" "scroll">>
<<vchoice "The Commissary" "Grove_Commissary" "action" "market">>
<<if setup.groveVisitable().length>>
<<vchoice "Visit the women carrying your children" "Grove_Pregnancy_Visits" "action" "heart">>
<</if>>
<</if>>
<<if setup.kiraAtCenter() && setup.groveKiraReturnDue()>>
<<vchoice "Collect Kira" "Grove_Kira_Collect" "action" "partner">>
<</if>>
<<vchoice "Back to the Grove" "Location_VerdantOutpost" "move" "back">>
</div><h2>The Assignment Board</h2>
<<if setup.groveExempt()>>
<div class="grove-board-top">New work is posted every 3 days. One assignment a day. The Lady has your word, so you owe no weekly assignment: take one if you like.</div>
<<else>>
<div class="grove-board-top">New work is posted every 3 days. One assignment a day. You must complete at least one every 7 days. Miss it and you've broken the Law.</div>
<</if>>
<<set _gaLeft to setup.groveDaysLeft()>>
<<if _gaLeft !== null>>
<div @class="'grove-days-left' + (_gaLeft <= 1 ? ' grove-late' : '')"><<= Math.max(0, _gaLeft)>><span class="grove-days-label">day<<if _gaLeft !== 1>>s<</if>> left</span></div>
<</if>>
<<set _gaNext to setup.groveNextPostingDay()>>
<<if _gaNext !== null>><p class="narrator">New work is posted on day <<= _gaNext>>.</p><</if>>
<<set _gaPosted to setup.grovePostedKinds()>>
<<for _gaD range setup.GROVE_ASSIGNMENTS>>
<<if _gaPosted.indexOf(_gaD.kind) !== -1>>
<<set _gaR to setup.groveAssignmentReward(_gaD.kind)>>
<p class="narrator"><strong><<= _gaD.name>>.</strong> <<= _gaD.text>> Done well: +<<= _gaR.rep>> standing, <<= _gaR.marks>> yield mark<<if _gaR.marks !== 1>>s<</if>> and <<= _gaR.scrap>> scrap.</p>
<</if>>
<</for>>
<div class="choice-container">
<<for _gaA range setup.GROVE_ASSIGNMENTS>>
<<if _gaPosted.indexOf(_gaA.kind) !== -1>>
<<if setup.groveAssignmentAvailable(_gaA.kind) && _gaA.kind === "cellar_watch" && setup.grovePlantingTonight() && $time.hour >= 6>>
<<vchoiceDisabled `_gaA.name + " (not tonight: the Planting)"` "action" "scroll">>
<<elseif setup.groveAssignmentAvailable(_gaA.kind)>>
<<vchoice _gaA.name _gaA.passage "action" "scroll">>
<<elseif setup.groveAssignmentOpen(_gaA.kind)>>
<<vchoiceDisabled `_gaA.name + " (one assignment a day: come back tomorrow)"` "action" "scroll">>
<<else>>
<<vchoiceDisabled `_gaA.name + " (done; new work on day " + _gaNext + ")"` "action" "scroll">>
<</if>>
<</if>>
<</for>>
<<if $grove.favours && $grove.favours.skip > 0>>
<<if setup.groveDaysLeft() !== null && setup.groveDaysLeft() < 0>>
<<vchoiceDisabled "Hand in a Commissary pass (too late: the week is already missed)" "action" "scroll">>
<<elseif !$grove.pendingBreach>>
<<link `'<span class="choice-button action"><span class="gi gi-scroll gi-large"></span><span class="label">Hand in a Commissary pass (skip one; you hold ' + $grove.favours.skip + ')</span></span>'`>><<run setup.groveUseSkipPass()>><<goto "Grove_Assignments_Skip">><</link>>
<<else>>
<<vchoiceDisabled "Hand in a Commissary pass (not with a breach unanswered)" "action" "scroll">>
<</if>>
<</if>>
<<vchoice "Back to the Center" "Grove_Center" "move" "back">>
</div>
<<if _gaPosted.length>>
<p class="narrator">On the board this time: <<= _gaPosted.map(function (k) { return setup.groveAssignmentName(k); }).join(", ")>>. Other work comes up in later postings.</p>
<</if>><h2>The Assignment Board</h2>
<p>You pin the Commissary's stamped pass to the board under your name. The woman at the desk looks at it, looks at you, and writes "excused" in her book in very small letters.</p>
<p class="narrator">The 7-day window starts again today. No standing, no marks.</p>
<div class="choice-container">
<<vchoice "Back to the board" "Grove_Assignments" "move" "back">>
</div><<if !$grove.duty || $grove.duty.kind !== "breeding" || $grove.duty.day !== $time.day || ($grove.meterRun && $grove.meterRun.done)>>
<<set _gdW to setup.groveCenterWoman()>>
<<set $grove.duty to { kind: "breeding", who: _gdW.id, name: _gdW.name, day: $time.day, undress: random(0, 2) === 0 }>>
<<set $grove.meterRun to setup.groveMeter.newRun("breeding", null, { who: _gdW.id, name: _gdW.name, singles: random(0, 2) === 0 })>>
<<run setup.storyFamilyForget("cg_grove_breeding")>>
<</if>>
<h2>Breeding Duty</h2>
<<if $grove.duty.undress>><<storyVideo "story/grove_breeding/undress">><</if>>
<p><<= $grove.duty.name>> is waiting in a villa bedroom<<if _storyFamily is "sf_cg_grove_breeding_01">> in a loose top and cotton shorts. She peels them off while you watch<<else>>, already undressed<</if>>. A Covenant woman with a slate sits by the door to watch.</p>
<<say "Covenant woman" "She finishes first. Then you finish in her. Not before. Keep yourself in hand.">>
<p class="narrator">Keep your arousal inside the glowing band: Stroke pushes you (and her) up fast, Slow brings you down, Hold lets you climb slowly. Come early and you've failed her; go cold and the duty is ruined.</p>
<div class="choice-container">
<<vchoice "Begin" "Grove_Meter" "action" "seduce">>
</div><<if !$grove.duty || $grove.duty.kind !== "tasting" || $grove.duty.day !== $time.day || ($grove.meterRun && $grove.meterRun.done)>>
<<set _gdW to setup.groveCenterWoman()>>
<<set $grove.duty to { kind: "tasting", who: _gdW.id, name: _gdW.name, day: $time.day }>>
<<set $grove.meterRun to setup.groveMeter.newRun("tasting", null, { who: _gdW.id, name: _gdW.name })>>
<<run setup.groveScene("cg_grove_tasting")>>
<</if>>
<h2>The Tasting</h2>
<p><<= $grove.duty.name>> takes you into one of the Center's back rooms, tells you to get your cock out, and gets down in front of you.</p>
<<say "Covenant woman" "Five stages. Tease, stroke, suck, throat, finish. Last through all five and you've passed.">>
<p class="narrator">Each stage has its own band. Stay in it for three clicks to move on. Come early and you've failed; go cold and it's ruined.</p>
<div class="choice-container">
<<vchoice "Begin" "Grove_Meter" "action" "seduce">>
</div><<set _gmRun to $grove.meterRun>>
<<if !_gmRun>>
<p>There is nothing to do here.</p>
<div class="choice-container"><<vchoice "Back to the Center" "Grove_Center" "move" "back">></div>
<<else>>
<<if _gmRun.kind === "breeding">>
<h2>Breeding Duty: <<= _gmRun.name || "Her">></h2>
<div id="grove-meter-video"><<storyVideo "story/grove_breeding/sex">></div>
<p><<= _gmRun.name || "She">> <<if _storyFamily is "sf_cg_grove_breeding_01">>pushes you flat on the bed and climbs on, already slick, and sinks down onto your cock<<else>>pulls you down on top of her by the hips and guides your cock into her cunt herself, already slick<</if>><<if _storyFamily is "sf_cg_grove_breeding_01" or _storyFamily is "sf_cg_grove_breeding_02">><<else>>, heels locking behind your back<</if>>. "Slow," says the woman with the slate. "She comes first. You're here to breed her, not to enjoy yourself." The bed knocks the wall with every stroke, and you squeeze her tit and hold on.</p>
<<elseif _gmRun.kind === "kitchen">>
<h2>Kitchen Service: <<= _gmRun.name || "Her">></h2>
<<set _gmkS to setup.storyFamilySingles("story/grove_kitchen/taken", _gmRun.singlesAt === "taken")>>
<div id="grove-meter-video"><<storyVideo "story/grove_kitchen/taken">></div>
<<if _gmkS>><<run setup.mediaAvoidEnd("story/grove_kitchen/taken")>><</if>>
<p><<= _gmRun.name || "She">> <<if _storyClip is "c5772d8456a9" or _storyClip is "bdaccc544d42">>kneels down and rubs your cock through your trousers, taking her time<<elseif _storyClip is "1b51a7584219">>climbs up onto the counter, lies along it on her belly and pulls you to the edge by your cock. She sucks you lying there, slow and deep<<elseif _storyClip is "5bc24b7746a6">>squats down in front of you and takes you in her mouth, bobbing slow and steady<<else>>drops to her knees, opens your trousers and takes you in her mouth, slow and deep<</if>><<if _storyClip is "c5772d8456a9" or _storyClip is "bdaccc544d42" or _storyClip is "1b51a7584219" or _storyClip is "5bc24b7746a6">><<elseif _storyFamily is "sf_cg_grove_kitchen_03">>, both hands on your thighs<<else>>, one hand flat on your thigh to feel you twitch<</if>>. Through the door you can hear the Lady talking, and knives on plates.</p>
<<else>>
<h2>The Tasting: <<= _gmRun.name || "Her">></h2>
<div id="grove-meter-video">
<<groveTastingStage `setup.groveMeter.stages()[_gmRun.stage]`>>
</div>
<</if>>
<div id="grove-meter" class="grove-meter"></div>
<<done>><<run setup.groveMeter.mount("grove-meter", "Grove_Meter_Result")>><</done>>
<</if>><<set _gmrRun to $grove.meterRun>>
<<if _gmrRun && _gmrRun.outcome && !_gmrRun.done>>
<<set _gmrRun.done to true>>
<<set _gmrRun.reward to setup.groveAssignmentComplete(_gmrRun.kind, _gmrRun.outcome)>>
<<advanceTime 1>>
<<if _gmrRun.outcome === "ruined">>
<<set $player.lust to Math.max($player.lust || 0, 80)>>
<<elseif _gmrRun.kind === "breeding">>
<<set _gmrRun.conceived to !!setup.groveConceive(_gmrRun.who, _gmrRun.name, "breeding")>>
<<set $player.lust to 15>><<run setup.playerReleased()>>
<<elseif _gmrRun.outcome === "early" || _gmrRun.kind === "kitchen">>
<<set $player.lust to 15>><<run setup.playerReleased()>>
<</if>>
<</if>>
<<if _gmrRun && _gmrRun.kind === "tasting" && _gmrRun.outcome === "held" && !_gmrRun.finished>>
<<set _gmrRun.finished to "stage5">>
<<set $player.lust to 10>><<run setup.playerReleased()>>
<</if>>
<h2>How It Went</h2>
<<if !_gmrRun || !_gmrRun.outcome>>
<p>Nothing to report.</p>
<div class="choice-container"><<vchoice "Back to the Center" "Grove_Center" "move" "back">></div>
<<else>>
<div @class="'grove-meter-outcome grove-meter-' + _gmrRun.outcome"><<= setup.groveMeter.OUTCOME_TEXT[_gmrRun.outcome]>></div>
<<if _gmrRun.kind === "breeding" && _gmrRun.outcome !== "ruined">>
<<set _gmrSingles to setup.storyFamilySingles("story/grove_breeding/finish_inside", _gmrRun.singles)>>
<<storyVideo "story/grove_breeding/finish_inside">>
<<if _gmrSingles>><<run setup.mediaAvoidEnd("story/grove_breeding/finish_inside")>><</if>>
<</if>>
<<if _gmrRun.kind === "kitchen">>
<<if _gmrRun.outcome === "held">>
<p>The little bell rings in the dining room, two clear notes, and you're still right on the edge.</p>
<<elseif _gmrRun.outcome === "early">>
<p>You don't make it to the bell.</p>
<<else>>
<p>You go soft in her mouth and nothing she does brings you back. When the bell rings she gets up off her knees, shrugs and goes to fetch the cheese herself.</p>
<<say _gmrRun.name "Ruined. I'll tell her you were nervous. She'll like that even less.">>
<</if>>
<<elseif _gmrRun.kind === "breeding">>
<<if _gmrRun.outcome === "held">>
<p><<= _gmrRun.name>> comes first, loud, her cunt clamping round your cock, nails raking the sheets. Then you let go and pump it all deep into her, and she locks her legs round you so none of it gets out.</p>
<<say "Covenant woman" "Good. That's how it's done. Stay in her a minute.">>
<<elseif _gmrRun.outcome === "early">>
<<if (_gmrRun.her || 0) >= 60>>
<p>You don't last. You finish inside her just before she gets there, and feel her stop, right on the edge. She pushes you off.</p>
<<else>>
<p>You don't last. You finish inside her before she's anywhere close. She pushes you off.</p>
<</if>>
<<say "Covenant woman" "That's it? We'll write down \"eager\". It's kinder than the truth.">>
<<else>>
<p>You lose it: you go soft halfway through and nothing brings you back. <<= _gmrRun.name>> gets up and dresses without a word.</p>
<<say "Covenant woman" "Ruined. Don't come back to this room until you can do the work.">>
<</if>>
<<else>>
<<if _gmrRun.outcome === "held">>
<p>You last through every stage. <<= _gmrRun.name>> looks up at you, flushed and breathing hard, impressed despite herself.</p>
<<say "Covenant woman" "Passed.">>
<p>She writes a number on her slate. She doesn't tell you what it's out of.</p>
<<elseif _gmrRun.outcome === "early">>
<p>You don't make it past <<= setup.groveMeter.STAGE_TEXT[setup.groveMeter.stages()[_gmrRun.stage]] || "the start">>. You come in her mouth and she spits it into a cup.</p>
<<say "Covenant woman" "Hopeless. The Lady will laugh.">>
<<else>>
<p>You go cold and stay cold. She gives up and wipes her mouth.</p>
<<say "Covenant woman" "Ruined. Some men aren't worth tasting.">>
<</if>>
<</if>>
<<if _gmrRun.reward && !(_gmrRun.kind === "kitchen" && _gmrRun.outcome !== "ruined")>>
<<groveDoneLine `_gmrRun.reward`>>
<</if>>
<<if _gmrRun.conceived>>
<p class="narrator">The woman with the slate makes a mark by <<= _gmrRun.name>>'s name. She'll know for sure in a few weeks.</p>
<</if>>
<div class="choice-container">
<<if _gmrRun.kind === "breeding" && _gmrRun.outcome !== "ruined">>
<<vchoice "Stay a moment" "Grove_Breeding_After" "action" "forward">>
<<elseif _gmrRun.kind === "kitchen" && _gmrRun.outcome !== "ruined">>
<<vchoice "Finish" "Grove_Kitchen_Finish" "action" "lips">>
<<elseif _gmrRun.kind === "kitchen">>
<<vchoice "Back to the Grove" "Location_VerdantOutpost" "move" "back">>
<<else>>
<<vchoice "Back to the Center" "Grove_Center" "move" "back">>
<</if>>
</div>
<</if>><<set _gbaRun to $grove.meterRun>>
<h2>Breeding Duty</h2>
<<if !setup.storyFamilyGap("story/grove_breeding/after")>><<storyVideo "story/grove_breeding/after">><</if>>
<p><<= _gbaRun ? _gbaRun.name : "She">> <<if _storyFamily is "sf_cg_grove_breeding_01">>sits up against the headboard with her fingers between her legs, keeping it all inside<<else>>lies back with her knees up<</if>>, as she's been told to, and talks to the woman with the slate as if you'd already left.</p>
<div class="choice-container">
<<vchoice "Back to the Center" "Grove_Center" "move" "back">>
</div><<set _gtRun to $grove.meterRun>>
<<if _gtRun && !_gtRun.finished>>
<<set _gtRun.finished to "mouth">>
<<set $player.lust to 10>><<run setup.playerReleased()>>
<</if>>
<h2>The Tasting: Finish</h2>
<<set _gtOut to ["1e941e3e25b7"].concat(_gtRun && _gtRun.finishClip ? [_gtRun.finishClip] : [])>>
<<set _gtGap to setup.storyFamilyGap("story/grove_tasting/finish", _gtOut)>>
<<set _gtAvoid to !_gtGap && setup.storyAvoidStems("story/grove_tasting/finish", _gtOut)>>
<<if !_gtGap>><<storyVideo "story/grove_tasting/finish">><<elseif setup.storySinglesOnly("story/grove_kitchen/finish")>><<storyVideo "story/grove_kitchen/finish">><<run setup.mediaAvoidEnd("story/grove_kitchen/finish")>><</if>>
<<if _gtAvoid>><<run setup.mediaAvoidEnd("story/grove_tasting/finish")>><</if>>
<p>She <<if _storyClip is "4e7969fef43a">>holds her mouth open and pumps you with her hand until you come, over her tongue and across her face. She <<else>>takes you back into her mouth and sucks you hard<</if>><<if _storyClip is "4e7969fef43a" or _storyClip is "f6e491730b5a">><<else>>, her hand pumping the root,<</if>><<if _storyClip is "4e7969fef43a">><<else>> until you come, spurting over her tongue. She holds it there to show you, <</if>><<if _storyClip is "cc52e45a4c97" or _storyClip is "f6e491730b5a" or _storyClip is "4e7969fef43a">><<else>>then swallows, <</if>>wipes her lip with her thumb and writes a number on her slate. She doesn't tell you what it's out of.</p>
<div class="choice-container">
<<vchoice "Back to the Center" "Grove_Center" "move" "back">>
</div><<set _gtRun to $grove.meterRun>>
<<if _gtRun && !_gtRun.finished>>
<<set _gtRun.finished to "inside">>
<<set $player.lust to 10>><<run setup.playerReleased()>>
<</if>>
<h2>The Tasting: Finish</h2>
<<set _gtOut to ["c9409caaf6ae", "0e4f65837192"].concat(_gtRun && _gtRun.finishClip ? [_gtRun.finishClip] : [])>>
<<set _gtGap to setup.storyFamilyGap("story/grove_tasting/finish", _gtOut)>>
<<set _gtAvoid to !_gtGap && setup.storyAvoidStems("story/grove_tasting/finish", _gtOut)>>
<<if !_gtGap>><<storyVideo "story/grove_tasting/finish">><<elseif setup.storySinglesOnly("story/grove_breeding/finish_inside")>><<storyVideo "story/grove_breeding/finish_inside">><<run setup.mediaAvoidEnd("story/grove_breeding/finish_inside")>><</if>>
<<if _gtAvoid>><<run setup.mediaAvoidEnd("story/grove_tasting/finish")>><</if>>
<p>She <<if _storyClip is "75936ce8a447" or _storyClip is "21719a745745" or _storyClip is "6690903e08d0" or _storyClip is "20023f2adc5e" or _storyClip is "eaf25e3eb10c">><<else>>lies back, spreads her knees and <</if>>pulls you into her by your cock; the Tasting has left her soaked. A dozen strokes and you're coming deep in her cunt<<if _storyClip is "75936ce8a447" or _storyClip is "21719a745745" or _storyClip is "6690903e08d0" or _storyClip is "20023f2adc5e" or _storyClip is "eaf25e3eb10c" or _storyClip is "4b938cbf881e" or _storyClip is "641385625b39" or _storyClip is "99d75cd504a1" or _storyClip is "e004406ef6cd">><<else>>, and she holds you there with her heels<</if>>.</p>
<<if _storyClip is "75936ce8a447" or _storyClip is "21719a745745" or _storyClip is "6690903e08d0" or _storyClip is "20023f2adc5e" or _storyClip is "eaf25e3eb10c" or _storyClip is "4b938cbf881e" or _storyClip is "641385625b39" or _storyClip is "99d75cd504a1" or _storyClip is "e004406ef6cd">><<else>><<say "Covenant woman" "Don't pull out yet. I'm not done with you.">>
<</if>><p>She <<if _storyClip is "75936ce8a447" or _storyClip is "21719a745745" or _storyClip is "6690903e08d0" or _storyClip is "20023f2adc5e" or _storyClip is "eaf25e3eb10c" or _storyClip is "4b938cbf881e" or _storyClip is "641385625b39" or _storyClip is "99d75cd504a1" or _storyClip is "e004406ef6cd">><<else>>grinds on you until she comes again, slow and greedy, then pushes you off and <</if>>writes a number on her slate.</p>
<div class="choice-container">
<<vchoice "Back to the Center" "Grove_Center" "move" "back">>
</div><<advanceTime 0 `setup.COVENANT.time.collect`>>
<<if setup.kiraAtCenter() && setup.groveKiraReturnDue()>>
<<run setup.groveKiraReturn()>>
<</if>>
<h2>Kira</h2>
<<storyVideo "story/grove_kira_return/back">>
<p>A warden brings Kira out to you and hands over her pack.</p>
<<groveKiraReturnScene>>
<div class="choice-container">
<<vchoice "Back to the Grove" "Location_VerdantOutpost" "move" "back">>
</div><<run VaultUI.setBackgroundDirect(setup.GROVE_BG.center)>>
<<set _gpvList to setup.groveVisitable()>>
<h2>The Mothers' Wing</h2>
<p>The Center keeps its carrying women in the east wing, where the windows are biggest and the beds are softest. A midwife with her sleeves rolled up keeps the book.</p>
<<if !_gpvList.length>>
<p>Nobody is expecting you today.</p>
<<else>>
<<say "Midwife" "You'll want to see your work. Go on, then. Gently.">>
<</if>>
<div class="choice-container">
<<for _gpvI to 0; _gpvI lt _gpvList.length; _gpvI++>>
<<set _gpvW to _gpvList[_gpvI]>>
<<capture _gpvW>>
<<link `'<span class="choice-button action"><span class="gi gi-heart gi-large"></span><span class="label">Visit ' + _gpvW.name + ' (' + (_gpvW.stage === "heavy" ? "heavy with your child" : "showing") + ')</span></span>'`>><<run setup.groveVisitStart(_gpvW.idx)>><<run setup.groveScene("cg_grove_pregnant")>><<if $grove.visit>><<set $grove.visit.keeps to random(0, 1) === 0>><</if>><<goto "Grove_Pregnant_Visit">><</link>>
<</capture>>
<</for>>
<<vchoice "Back to the Center" "Grove_Center" "move" "back">>
</div><<set _gpgV to $grove.visit>>
<h2>A Visit</h2>
<<if !_gpgV || _gpgV.done>>
<p>The visit is over.</p>
<div class="choice-container"><<vchoice "Back to the Center" "Grove_Center" "move" "back">></div>
<<else>>
<<set _gpgK to setup.storyFamilySingles("story/grove_pregnant/showing", _gpgV.keeps, setup.groveSceneKeeps("cg_grove_pregnant", "story/grove_pregnant/showing"))>>
<<storyVideo "story/grove_pregnant/showing">>
<<if _gpgK>><<run setup.mediaAvoidEnd("story/grove_pregnant/showing")>><</if>>
<<run setup.groveKeepScene("cg_grove_pregnant", "story/grove_pregnant/showing", _storyClip)>>
<<set _gpgH to _gpgV.stage === "heavy">>
<p><<if _storyFamily is "sf_cg_grove_pregnant_01" or _storyClip is "a8622c35b438">><<= _gpgV.name>> takes you out of the back gate into the tall pines behind the Center.<<elseif _storyFamily is "sf_cg_grove_pregnant_02">>The midwife sends you to the bathhouse, where <<= _gpgV.name>> is under the hot water.<<elseif _storyFamily is "sf_cg_grove_pregnant_03" or _storyClip is "1e36c20c6cd7">><<= _gpgV.name>> has a room of her own at the end of the wing.<<else>><<= _gpgV.name>> is waiting for you in the mothers' wing, sitting on the edge of her bed in a loose shift.<</if>> <<if _storyFamily is "sf_cg_grove_pregnant_01" or _storyClip is "a8622c35b438">>She stops in a clearing, turns round and lifts her jumper up to her chin to show you her belly, <<elseif _storyFamily is "sf_cg_grove_pregnant_02">>She takes your hand and puts it on her belly, <<elseif _storyFamily is "sf_cg_grove_pregnant_03" or _storyClip is "1e36c20c6cd7">>Her belly is <<else>>She stands when you come in and smooths the cloth down over her belly to show you, <</if>><<if _gpgH>>big and round and heavy now<<else>>just starting to round out<</if>>.</p>
<<say _gpgV.name `_gpgH ? "Look at me. Look what you did. I'm enormous, and every woman in the Center is jealous." : "It's yours. The midwife says so. ...I wanted you to see."`>>
<div class="choice-container">
<<vchoice "Touch her" "Grove_Pregnant_Touch" "action" "heart">>
</div>
<</if>><<set _gptV to $grove.visit>>
<<set $player.lust to Math.min(100, ($player.lust || 0) + 20)>>
<h2>A Visit</h2>
<<storyVideo "story/grove_pregnant/touch">>
<p><<if _storyFamily is "sf_cg_grove_pregnant_01">>You lift the jumper up and off over her head while she holds her arms up for you. <<elseif _storyFamily is "sf_cg_grove_pregnant_02">>She turns into you under the water and kisses you. Your hand moves over her hip, over her breast, and back to the curve of the baby.<</if>><<if _storyFamily is "sf_cg_grove_pregnant_02">><<else>>You put your hands on her belly and she covers them with hers. <</if>><<if _storyFamily is "sf_cg_grove_pregnant_03">>She pulls the camisole down off her shoulders and lets you look, then sits you down beside her, takes your cock out and strokes you slowly.<<elseif _storyFamily is "sf_cg_grove_pregnant_02">><<else>>Then she moves them, up over her breasts, down again, and lets you feel how warm she is everywhere.<</if>></p>
<<say `_gptV ? _gptV.name : "She"` "I can't stop wanting it. All the time. It's your fault, you know.">>
<div class="choice-container">
<<if _storyFamily is "sf_cg_grove_pregnant_02">>
<<vchoice "Take her under the water" "Grove_Pregnant_Taken" "action" "seduce">>
<<else>>
<<vchoice "Let her have her way" "Grove_Pregnant_Mouth" "action" "lips">>
<</if>>
</div><<set _gpuV to $grove.visit>>
<<set $player.lust to Math.min(100, ($player.lust || 0) + 20)>>
<h2>A Visit</h2>
<<storyVideo "story/grove_pregnant/mouth">>
<p>She <<if _storyFamily is "sf_cg_grove_pregnant_01">>squats down in front of you<<elseif _storyFamily is "sf_cg_grove_pregnant_03">>leans down over your lap<<else>>kneels, carefully, a hand on her belly,<</if>> and takes you in her mouth. She takes her time about it.</p>
<div class="choice-container">
<<vchoice "Take her" "Grove_Pregnant_Taken" "action" "seduce">>
</div><<set _gpkV to $grove.visit>>
<<set $player.lust to Math.min(100, ($player.lust || 0) + 20)>>
<h2>A Visit</h2>
<<set _gpkK to setup.storyFamilySingles("story/grove_pregnant/taken", _gpkV && _gpkV.keeps, setup.groveSceneKeeps("cg_grove_pregnant", "story/grove_pregnant/taken"))>>
<<storyVideo "story/grove_pregnant/taken">>
<<if _gpkK>><<run setup.mediaAvoidEnd("story/grove_pregnant/taken")>><</if>>
<p><<if _storyFamily is "sf_cg_grove_pregnant_01">>She stands, turns, and leans back against you. You take her from behind, standing, among the pines.<<elseif _storyFamily is "sf_cg_grove_pregnant_02" or _storyClip is "6acad7b67ff4">>She turns to the tiled wall and braces both hands against it. You take her from behind with the hot water drumming on both of you.<<elseif _storyFamily is "sf_cg_grove_pregnant_03">>She pulls you over to the bed, climbs onto you and sinks down onto your cock, and rides you with her belly between you.<<else>>She draws you down onto the bed and takes you inside her, carefully, and then not carefully at all.<</if>></p>
<div class="choice-container">
<<vchoice "Finish with her" "Grove_Pregnant_After" "action" "seduce">>
</div><<set _gpaV to $grove.visit>>
<<if _gpaV && !_gpaV.done>>
<<run setup.groveVisitDone()>>
<<set $player.lust to 10>><<run setup.playerReleased()>>
<<advanceTime 1>>
<</if>>
<h2>A Visit</h2>
<<storyVideo "story/grove_pregnant/after">>
<p>You finish together<<if _storyFamily is "sf_cg_grove_pregnant_01">>: she wants it rougher at the end, and you hold her by the arms and drive into her until she's crying out to the trees<<elseif _storyFamily is "sf_cg_grove_pregnant_02">>: she pushes back onto you, harder, until she comes with a cry that echoes off the tiles<<elseif _storyFamily is "sf_cg_grove_pregnant_03">>: she's on her knees on the bed, rocking back to meet you<<else>>, slowly, and lie a while with your hand on her belly<</if>>.</p>
<<say `_gpaV ? _gpaV.name : "She"` `_gpaV && _gpaV.stage === "heavy" ? "Not long now. The midwife says weeks. ...Thank you for coming." : "Come back when I'm bigger. I want you to see."`>>
<p class="narrator">The midwife writes your visit in the book. +<<= setup.COVENANT.rep.pregnancyVisit>> standing.</p>
<div class="choice-container">
<<vchoice "Back to the Center" "Grove_Center" "move" "back">>
</div><<run VaultUI.setBackgroundDirect(setup.GROVE_BG.grounds)>>
<<if setup.groveErrandOpen() || setup.groveErrandDue()>><<advanceTime 0 `setup.COVENANT.time.errand`>><</if>>
<<if setup.kiraWithYou()>>
<<showCharacter $expeditionCompanion "left" "neutral">>
<</if>>
<<set _geLeft to setup.groveErrandPayOnce()>>
<<set _geOpen to setup.groveErrandOpen()>>
<<set _geE to setup.COVENANT.errand>>
<h2>The Lady's Cart</h2>
<<if _geLeft>>
<p>The warden at the gate has a cloth bag for you: the money for the Lady's goods, sent back from Old Town without you. The Covenant's share is already out of it. She counts the rest into your hand: <<= _geLeft.scrap>> scrap.</p>
<</if>>
<<if _geOpen>>
<<set _geGreet to setup.groveErrandGreeting()>>
<<set _geLock to setup.travelLock(_geE.to)>>
<p>A warden waits by the gate with a handcart: two tall wheels, a handle worn smooth by other men's hands, the load roped down under oilcloth. She folds the cloth back so you can see it. Jars of preserves packed in straw, bolts of undyed cloth, small sacks of seed stamped with the Covenant's leaf.</p>
<<if _geGreet is "lost">>
<<say "Warden" "The Lady has another cart for Old Town. She asked me to give you her words exactly: 'He lost the last one. Give him another. I want to see if he can lose two.'">>
<<say "Warden" "Bring this one there whole.">>
<<elseif _geGreet is "again">>
<<say "Warden" "Another cart for Old Town. The Lady has stopped asking whether you can be trusted with one. She only asks whether you're cheaper than a mule. Bring it there whole.">>
<<else>>
<<say "Warden" "The Lady has goods for Old Town. The people behind the barricade there buy from the Covenant through a gap in their wall. You pull the cart. I walk beside it and do the talking.">>
<<say "Warden" "Her words, not mine: 'Give it to the vault boy. It's the one load he can carry without making a mess of it.'">>
<</if>>
<<say "Warden" "If the road turns bad, the cart and I go in the ditch and you do the fighting. That is what you are for. Come back without the cart and the Lady will know whose fault it was.">>
<p class="narrator">Paid at the barricade: standing with the Covenant, and <<= _geE.scrap>> scrap. A lost cart costs standing.</p>
<<if setup.kiraWithYou()>>
<<say "Kira" "So now we're her mules. Fine. As long as I don't have to smile at anybody when we get there.">>
<</if>>
<div class="choice-container">
<<if _geLock>>
<<vchoiceDisabled `"Take the cart to Old Town (" + _geLock + ")"` "action" "supplies">>
<<else>>
<<link `'<span class="choice-button action"><span class="gi gi-supplies gi-large"></span><span class="label">Take the cart to Old Town</span></span>'`>><<if setup.groveErrandTake()>><<startJourney "crossroads_central">><<run setup.groveErrandSetOut()>><<goto "Journey_Start">><<else>><<goto "Grove_Errand_Offer">><</if>><</link>>
<</if>>
<<vchoice "Not now" "Location_VerdantOutpost" "move" "back">>
</div>
<<else>>
<p>The handcart is gone from the gate.</p>
<div class="choice-container">
<<vchoice "Back to the Grove" "Location_VerdantOutpost" "move" "back">>
</div>
<</if>><<set _geDue to setup.groveErrandDue()>>
<<set _geNew to (_geDue && _geDue.newPlaces) || []>>
<<run setup.oldTownReveal()>>
<<if _geNew.length>>
<<notify "discovery">>New locations discovered: <<= _geNew.join(", ")>><</notify>>
<</if>>
<<if setup.kiraWithYou()>>
<<showCharacter $expeditionCompanion "left" "neutral">>
<</if>>
<h2>The Barricade</h2>
<p>The street into Old Town ends in a wall of burnt-out cars packed with sandbags and scrap, rifle barrels laid along their roofs. Nobody shows a face. The warden doesn't slow down. She steers you and the cart to a place where two cars don't quite meet, a gap the width of a handcart with a sheet of tin hung across it, and raps on the tin with her knuckles. Twice, then once.</p>
<p>The tin swings back. Hands reach out of the dark and take the goods one at a time, jars, cloth, seed, without a word. The warden counts each one aloud as it goes. When the cart is empty, a cloth bag comes back through the gap. She weighs it in her palm before she puts it away.</p>
<<say "Voice from the barricade" "Tell your Lady the seed came up. And tell your man there's a market down that road with fresh paint on the sign. Trader's Rest. Nobody in it yet, because nobody's turned it over. He turns it over, the traders come, and so do the wagons that pay our toll. He'll find them there.">>
<p>The tin swings shut. Down a side street to the south you can see the market: empty frames, rubble in the aisles, and over the gate a sheet of tin with the paint still bright on it.</p>
<<if setup.kiraWithYou()>>
<<say "Kira" "Hands and no faces. I've seen friendlier graves.">>
<</if>>
<div class="choice-container">
<<vchoice "Continue" "Grove_Errand_Paid" "action" "forward">>
</div><<set $currentLocation to "crossroads_central">>
<<run VaultUI.setBackgroundDirect("media/backgrounds/vault/reclaimed-crossroads/crossroads_central.webp")>>
<<set _gePay to setup.groveErrandPayOnce()>>
<<if setup.kiraWithYou()>>
<<showCharacter $expeditionCompanion "left" "neutral">>
<</if>>
<h2>Sold</h2>
<<if _gePay>>
<p>The warden opens the cloth bag, takes out the Covenant's share and counts the rest into your hand: <<= _gePay.scrap>> scrap.</p>
<<say "Warden" "Delivered whole. The Lady will hear it. Don't expect her to say so.">>
<<say "Warden" "I go back alone. Wardens don't need an escort.">>
<p>She turns the empty cart around and walks off east without looking back, the wheels rattling on the broken street.</p>
<<else>>
<p>The warden and the empty cart are long gone east. There's nothing more here.</p>
<</if>>
<div class="choice-container">
<<vchoice "Return to map" "WorldMap_View" "move" "map">>
<<vchoice "Return to vault" "Journey_ReturnToVault" "action" "return">>
</div><<run VaultUI.setBackgroundDirect(setup.GROVE_BG.greatHall)>>
<<set _gplT to $grove.planting.tonight>>
<h2>The Planting</h2>
<<if !_gplT || _gplT.day !== $time.day || $grove.planting.lastDay === $time.day>>
<p>The Main House is dark. Whatever happens here happens on its own night.</p>
<div class="choice-container"><<vchoice "Back to the Grove" "Location_VerdantOutpost" "move" "back">></div>
<<else>>
<<if !_gplT.started>>
<<set _gplT.started to true>>
<<if $time.hour < 19>><<set _gplWaited to true>><<advanceToHour 19>><</if>>
<</if>>
<<setTimeOfDay "night">>
<<if _gplWaited>><p class="narrator">The Planting starts when the lamps are lit. You spend the rest of the day around the Grove, and at seven in the evening the wardens open the Main House doors.</p><</if>>
<<storyVideo "story/grove_planting/opening">>
<p>They've cleared the Main House's great hall. The long tables are pushed back against the walls and loaded with bread, fruit and dark wine in stone jugs, and the floor between them is covered in rugs and cushions and furs. Lamps everywhere, on the tables, on the stairs, in the empty fireplace. It's warm. It smells of wax and crushed herbs.</p>
<p>The women of the Covenant come in twos and threes in loose undyed shifts, barefoot, their hair down. Some sit and eat. Some just watch the door you came in through. Nobody pretends not to look at you.<<if _storyClip is "368696419d0d">> The ones serving tonight are offenders working off a sentence: one comes to you on her hands and knees and puts her face down by your feet to wait.<<elseif _storyClip is "bfb0ebb50b24" or _storyClip is "28dbc5d79711">> Two offenders working off their sentences kneel and share your cock between their mouths, and the hall watches them do it.<<elseif _storyClip is "3e1bfbaa13d1">> A warden steers you to tonight's servers, two offenders working off their sentences, and the one on top takes your cock in her mouth without a word.<</if>></p>
<<storyVideo "story/grove_planting/opening_2_selene">><<set _w26a to _storyClip>>
<<if _storyClip is "65b4539bc114">><p>Lady Selene sits at the head of the hall, and when she sees you she lifts one hand an inch, as if raising a cup.</p><<else>><p>Lady Selene sits at the head of the hall in a high chair with a cup in her hand, and when she sees you she raises it an inch.</p><</if>>
<<say "Lady Selene" "The vault boy. Good. Every ten days the Covenant plants what it means to harvest. Tonight that's you. Try to last. They've been looking forward to it, heaven knows why.">>
<<groveSeleneSneer>>
<<if setup.kiraWithYou()>>
<<if setup.kiraGuarded()>>
<p>A warden takes Kira by the elbow and walks her up to the gallery that runs round the hall. She goes, stiffly, and sits at the rail with her arms folded, where she can see everything.</p>
<<say "Kira" "I'll be up here. Watching. Don't look at me while you do it.">>
<<else>>
<p>Kira stays at your side, looking out over the cushions and the lamps and the waiting women, and you feel her fingers hook into your belt.</p>
<<say "Kira" "This is insane. ...They're all for you? All of them?">>
<</if>>
<</if>>
<div class="choice-container">
<<vchoice "Walk out into the middle of the hall" "Grove_Planting_Offered" "action" "ritual">>
</div>
<</if>><<run VaultUI.setBackgroundDirect(setup.GROVE_BG.greatHall)>>
<<set _gpoT to $grove.planting.tonight>>
<<set $player.lust to Math.min(100, ($player.lust || 0) + 15)>>
<h2>The Planting</h2>
<<storyVideo "story/grove_planting/offered">>
<p><<if _storyFamily is "sf_cg_grove_planting_01">>The three who drew your name take you through a low door into the back room behind the hall<<elseif _storyFamily is "sf_cg_grove_planting_02">>The three who drew your name take you upstairs, away from the hall, to a bedroom<<elseif _storyFamily is "sf_cg_grove_planting_03">>The women who drew your name take you out of the hall to the Main House's glass room<<else>>They come to you before you reach the middle of the rugs<</if>>. <<if _storyFamily is "sf_cg_grove_planting_03">>They don't bother to strip you: they push you down onto the couch in your shirt and open your trousers<<else>><<= _gpoT.women[0]>> takes your shirt off over your head. <<= _gpoT.women[1]>> kneels and unlaces your boots<</if>>. <<if _storyFamily is "sf_cg_grove_planting_01">>Somebody is already on her knees at your cock, and <<= _gpoT.women[0]>> takes your face in her hand and kisses you, hard<<elseif _storyFamily is "sf_cg_grove_planting_02">><<= _gpoT.women[0]>> turns her back to you, reaches between her legs for your cock and sinks down onto it backwards, just for a taste, while <<= _gpoT.women[2]>> stands behind her<<elseif _storyFamily is "sf_cg_grove_planting_03">><<= _gpoT.women[0]>> folds herself over your lap and takes your cock in her fist and her mouth at once, while <<= _gpoT.women[1]>> watches<<else>><<= _gpoT.women[2]>> stands behind you with her chin on your shoulder and opens your belt, and her hand slides down into your trousers and closes round you, warm and unhurried<</if>><<if _storyFamily is "sf_cg_grove_planting_01" or _storyFamily is "sf_cg_grove_planting_02" or _storyFamily is "sf_cg_grove_planting_03">><<else>>, while the other two strip you the rest of the way<</if>>.</p>
<p><<if _storyFamily is "sf_cg_grove_planting_03">><<else>>Then there are more hands. On your chest, your back, your thighs, stroking and testing and squeezing, as if they're checking a horse before a long ride. <</if>>Someone laughs, low, at how hard you already are.<<if _storyFamily is "sf_cg_grove_planting_01" or _storyFamily is "sf_cg_grove_planting_02" or _storyFamily is "sf_cg_grove_planting_03">><<else>> From the head of the hall, Selene watches over the rim of her cup.<</if>></p>
<<set _gpoRoom to setup.GROVE_SCENES.cg_grove_planting.families.includes(_storyFamily)>>
<<if setup.kiraWithYou() && !setup.kiraGuarded()>>
<<if _gpoRoom>>
<p>Kira has followed you in. She's watching them touch you with her lips parted and her colour high, and when you meet her eyes she doesn't look away.</p>
<<else>>
<p>Kira hasn't moved. She's watching them touch you with her lips parted and her colour high, and when you meet her eyes she doesn't look away.</p>
<</if>>
<</if>>
<div class="choice-container">
<<if setup.kiraWithYou() && !setup.kiraGuarded()>>
<<vchoice "Claim Kira first, in front of all of them" "Grove_Planting_Kira" "action" "partner">>
<</if>>
<<vchoice "Let them lay you down" "Grove_Planting_Mouths" "action" "submit">>
</div><<run VaultUI.setBackgroundDirect(setup.GROVE_BG.greatHall)>>
<<set _gpkT to $grove.planting.tonight>>
<<if _gpkT && !_gpkT.kira>>
<<set _gpkT.kira to true>>
<<set $grove.planting.kiraClaimed to ($grove.planting.kiraClaimed || 0) + 1>>
<<relationChange "kira" "affection" 4>>
<</if>>
<h2>The Planting</h2>
<<storyVideo "story/grove_planting/kira_claimed">>
<p>You step out of their hands and take Kira by the wrist. There's a murmur round the room. Somebody says "the stray?" and somebody else hushes her.</p>
<p>Kira doesn't care. She's out of her clothes faster than you've ever seen her move, and <<if _storyClip is "cdaea1525b85" or _storyClip is "50db89683854">>she beckons one of them in and they share you, cheek to cheek, Kira sucking you deep<<else>>she pushes you onto your back and climbs on top of you, and sinks down onto your cock with her eyes on the women standing round you<</if>>.<<if _storyClip is "cdaea1525b85" or _storyClip is "50db89683854">><<else>> She rides you like she's making a point. Every time she grinds down she looks at one of them, and every one of them looks back.<</if>></p>
<<say "Kira" "Mine first. Mine. You can have what's left.">>
<p>You hold back. Somehow. <<if _storyClip is "cdaea1525b85" or _storyClip is "50db89683854">>She brings you to the very edge and stops dead, her fist tight round the base,<<else>>She comes with her nails in your chest and her head thrown back, loud enough to <</if>><<if _storyClip is "7117b90029ca">>be heard in the hall<<elseif _storyClip is "cdaea1525b85" or _storyClip is "50db89683854">><<else>>reach the gallery<</if>><<if _storyClip is "cdaea1525b85" or _storyClip is "50db89683854">><<else>>, and climbs off you shaking and grinning<</if>> and sits down with her knees up, to watch.</p>
<<if !setup.storyFamilyOf("cg_grove_planting")>>
<<say "Lady Selene" "How touching. The stray marks her territory. Well, ladies? The vault boy is still standing. More or less.">>
<</if>>
<div class="choice-container">
<<vchoice "Give yourself to the women" "Grove_Planting_Mouths" "action" "submit">>
</div><<run VaultUI.setBackgroundDirect(setup.GROVE_BG.greatHall)>>
<<set _gpmT to $grove.planting.tonight>>
<<set $player.lust to Math.min(100, ($player.lust || 0) + 20)>>
<<advanceTime 1>>
<h2>The Planting</h2>
<<set _gpmS to setup.storyFamilySingles("story/grove_planting/mouths", _gpmT && _gpmT.singlesAt === "mouths")>>
<<storyVideo "story/grove_planting/mouths">>
<<if _gpmS>><<run setup.mediaAvoidEnd("story/grove_planting/mouths")>><</if>>
<p><<if _storyFamily is "sf_cg_grove_planting_01">>They stand you up against the end of the long table<<else>>They lay you down<</if>>. <<if _storyFamily is "sf_cg_grove_planting_01">><<= _gpmT.women[2]>> and a sister pressed in beside her go down on their knees for you<<elseif _storyFamily is "sf_cg_grove_planting_02">><<= _gpmT.women[0]>> kneels between your legs and sucks you, while <<= _gpmT.women[1]>> and <<= _gpmT.women[2]>> lean over the bed above her<<elseif _storyFamily is "sf_cg_grove_planting_03">><<= _gpmT.women[0]>> takes you in her mouth and <<= _gpmT.women[1]>> leans in right beside her<<elseif _storyClip is "f7d8aa86c663" or _storyClip is "926ce167b30e" or _storyClip is "7f596390c92a">>Two women you don't have names for yet settle between your legs<<else>><<= _gpmT.women[0]>> kneels on one side of you and <<= _gpmT.women[1]>> on the other<</if>><<if _storyFamily is "sf_cg_grove_planting_02">>. <<= _gpmT.women[2]>> kisses you upside down while <<= _gpmT.women[0]>> takes you all the way into her throat<<else>>, and they share you. One licks slowly up the length of you while the other takes the head in her mouth<</if>><<if _storyFamily is "sf_cg_grove_planting_01" or _storyFamily is "sf_cg_grove_planting_02" or _storyFamily is "sf_cg_grove_planting_03">><<else>>, and then they trade<</if>><<if _storyFamily is "sf_cg_grove_planting_01" or _storyFamily is "sf_cg_grove_planting_02" or _storyFamily is "sf_cg_grove_planting_03" or _storyClip is "f7d8aa86c663" or _storyClip is "926ce167b30e" or _storyClip is "7f596390c92a">><<else>>, and then they kiss each other with you between their lips<</if>>, and you hear yourself make a sound you've never made before.</p>
<p><<if _storyFamily is "sf_cg_grove_planting_02" or _storyFamily is "sf_cg_grove_planting_03">><<else>>Other women stroke your chest, kiss your neck, hold your wrists down when you try to reach for anyone. <</if>>It goes on. They're in no hurry at all.</p>
<<say _gpmT.women[1] "Not yet. Don't you dare. You're not wasting a drop of that on the floor.">>
<div class="choice-container">
<<vchoice "Hold on" "Grove_Planting_First" "action" "will">>
</div><<run VaultUI.setBackgroundDirect(setup.GROVE_BG.greatHall)>>
<<set _gpfT to $grove.planting.tonight>>
<<set $player.lust to Math.min(100, ($player.lust || 0) + 20)>>
<h2>The Planting</h2>
<<if !setup.storyFamilyGap("story/grove_planting/ridden")>><<storyVideo "story/grove_planting/ridden">><</if>>
<p><<if _storyClip is "10b5a7fabe4f" or _storyClip is "2137856cf0cb">>The dark-haired sister with the mark inked low on her back gets there first and<<else>><<= _gpfT.women[0]>><</if>> straddles you<<if _storyFamily is "sf_cg_grove_planting_03" or _storyClip is "adc0bb87258f">> facing away from you<</if>>. She takes you inside her slowly, all the way down. Then she starts to ride.</p>
<p><<if _storyFamily is "sf_cg_grove_planting_03">><<= _gpfT.women[1]>> kneels beside you, watching where you go into her.<<elseif _storyClip is "adc0bb87258f">>A sister kneels up beside her, close enough to touch.<<else>>The others watch.<</if>><<if _storyFamily is "sf_cg_grove_planting_02" or _storyFamily is "sf_cg_grove_planting_03" or _storyClip is "adc0bb87258f">><<else>> Two of them kneel close enough to touch her, a hand on her hip, a mouth on her breast, and <</if>><<if _storyClip is "10b5a7fabe4f" or _storyClip is "2137856cf0cb">><<= _gpfT.women[0]>><<elseif _storyFamily is "sf_cg_grove_planting_02" or _storyFamily is "sf_cg_grove_planting_03" or _storyClip is "adc0bb87258f">><<else>>one<</if>><<if _storyFamily is "sf_cg_grove_planting_02" or _storyFamily is "sf_cg_grove_planting_03" or _storyClip is "adc0bb87258f">><<else>> lies with her head on your shoulder and whispers in your ear what the woman on top of you is going to do to you next.<</if>> <<if _storyClip is "10b5a7fabe4f" or _storyClip is "2137856cf0cb">>The dark-haired sister<<else>><<= _gpfT.women[0]>><</if>> comes first, gasping, and keeps riding through it, harder now, and doesn't stop until you're bucking up into her and spilling inside her<<if _storyClip is "10b5a7fabe4f" or _storyClip is "2137856cf0cb">><<else>> with her name in your mouth<</if>>.</p>
<<if _storyClip is "10b5a7fabe4f" or _storyClip is "2137856cf0cb">><<say "Dark-haired sister" "There. That one's mine. ...Somebody give him some wine.">><<else>><<say _gpfT.women[0] "There. That one's mine. ...Somebody give him some wine.">><</if>>
<p>Somebody does. You drink it lying down, half of it on your chin, while she climbs off you and lies back on the cushions with her knees together and a smile like a cat's.<<if _storyClip is "10b5a7fabe4f" or _storyClip is "2137856cf0cb">> <<= _gpfT.women[0]>> pouts at her across your chest. She drew your name, and she'll have her turn.<</if>></p>
<div class="choice-container">
<<vchoice "The night isn't over" "Grove_Planting_Second" "action" "forward">>
</div><<run VaultUI.setBackgroundDirect(setup.GROVE_BG.greatHall)>>
<<set _gpsT to $grove.planting.tonight>>
<<set $player.lust to Math.min(100, ($player.lust || 0) + 20)>>
<<advanceTime 1>>
<h2>The Planting</h2>
<<storyVideo "story/grove_planting/turns">>
<p>They don't let you rest long. Mouths and hands bring you back, and then <<= _gpsT.women[1]>> <<if _storyFamily is "sf_cg_grove_planting_01">>is bent forward over the end of the long table in front of you<<elseif _storyFamily is "sf_cg_grove_planting_02">>is straddling you<<elseif _storyFamily is "sf_cg_grove_planting_03">>climbs onto you, facing your feet<<else>>is on her hands and knees on the furs in front of you<</if>><<if _storyFamily is "sf_cg_grove_planting_02" or _storyFamily is "sf_cg_grove_planting_03">><<else>>, looking back over her shoulder<</if>>.</p>
<<say _gpsT.women[1] "My turn. Come on. Don't make me wait like she did.">>
<p><<if _storyFamily is "sf_cg_grove_planting_02" or _storyFamily is "sf_cg_grove_planting_03">>She sinks down onto you and rides you until she's swearing<<else>>You take her from behind, your hands <</if>><<if _storyFamily is "sf_cg_grove_planting_01">>spread on her back<<elseif _storyFamily is "sf_cg_grove_planting_02" or _storyFamily is "sf_cg_grove_planting_03">><<else>>on her hips<</if>><<if _storyFamily is "sf_cg_grove_planting_02" or _storyFamily is "sf_cg_grove_planting_03">><<else>>, and the women round you crowd in close to watch. <</if>><<if _storyFamily is "sf_cg_grove_planting_01">><<= _gpsT.women[1]>> pushes back onto you and swears into the wood<<elseif _storyFamily is "sf_cg_grove_planting_02" or _storyFamily is "sf_cg_grove_planting_03">><<else>>Someone presses against your back and guides your rhythm, slower, deeper, until <<= _gpsT.women[1]>> is pushing back onto you and swearing into the fur<</if>>. When you come inside her she <<if _storyFamily is "sf_cg_grove_planting_02" or _storyFamily is "sf_cg_grove_planting_03">>sits right down on you and stays there, rocking<<else>>reaches back and holds you there, her fingers digging into your thigh<</if>>, until you've given her every last pulse of it.</p>
<p>From the <<if _storyFamily is "sf_cg_grove_planting_01" or _storyFamily is "sf_cg_grove_planting_02" or _storyFamily is "sf_cg_grove_planting_03">>doorway<<else>>head of the hall<</if>> there's a slow, bored clap. <<if _storyFamily is "sf_cg_grove_planting_01" or _storyFamily is "sf_cg_grove_planting_02" or _storyFamily is "sf_cg_grove_planting_03">>Selene has followed you in with her cup and is leaning on the doorframe, watching<<else>>Selene hasn't moved from her chair<</if>>.</p>
<<say "Lady Selene" "Two. Don't faint, vault boy. There's one more who drew your name.">>
<div class="choice-container">
<<vchoice "One more" "Grove_Planting_Finish" "action" "strength">>
</div><<run VaultUI.setBackgroundDirect(setup.GROVE_BG.greatHall)>>
<<set _gpxT to $grove.planting.tonight>>
<<if _gpxT && $grove.planting.lastDay !== _gpxT.day>>
<<run setup.grovePlantingDone(_gpxT.women)>>
<<set $player.lust to 0>><<run setup.playerReleased()>>
<</if>>
<h2>The Planting</h2>
<<set _gpxS to setup.storyFamilySingles("story/grove_planting/finish", _gpxT && _gpxT.singlesAt === "finish")>>
<<storyVideo "story/grove_planting/finish">>
<<if _gpxS>><<run setup.mediaAvoidEnd("story/grove_planting/finish")>><</if>>
<p>It's late. <<= _gpxT.women[2]>> has waited all night, and she <<if _storyClip is "c0abeaee6e4d" or _storyClip is "57211405932b">>wants you on top of her for it<<else>>doesn't wait any longer<</if>>. She <<if _storyClip is "c0abeaee6e4d" or _storyClip is "57211405932b" or _storyClip is "bf1fd728cf5b" or _storyClip is "97237b79e052">><<else>>pushes you flat, kneels astride you and <</if>>works you hard with her hand until you're ready again, which shouldn't be possible, and then <<if _storyClip is "21628c3ed286" or _storyClip is "9861617ffb53">>swings a leg over you facing your feet and rides you backwards<<elseif _storyClip is "c0abeaee6e4d" or _storyClip is "57211405932b">>lies back and pulls you down between her legs, and you fuck her like that, close<<elseif _storyClip is "bf1fd728cf5b" or _storyClip is "97237b79e052">>gets down on her hands and knees in front of you, and you take her from behind<<else>>lowers herself onto you and rides you in short, greedy strokes<</if>>.</p>
<p>The last time is the slowest. It builds and builds, and when it comes it wrings you out completely. You finish deep inside her<<if _storyFamily is "sf_cg_grove_planting_01">>. Then she slides straight down onto her knees with a sister, cheek to cheek, and someone's hand works the last of it out of you onto their two tongues<<elseif _storyFamily is "sf_cg_grove_planting_02">>. She's off you and down by your hip with the other two, and <<= _gpxT.women[0]>> wraps her fist round you and milks the last of it out across their tongues<<elseif _storyFamily is "sf_cg_grove_planting_03">>. Then she climbs off, and <<= _gpxT.women[0]>> and <<= _gpxT.women[1]>> kneel, mouths open wide, and you stand over them and stroke out the last of it over their tongues<<elseif _storyClip is "21628c3ed286" or _storyClip is "9861617ffb53" or _storyClip is "c0abeaee6e4d" or _storyClip is "57211405932b" or _storyClip is "bf1fd728cf5b" or _storyClip is "97237b79e052">>, and afterwards you watch your come run out of her<<else>> with the whole hall watching, and she stays down on you for a long time afterwards, her eyes closed, one hand on her own belly<</if>>.</p>
<<say _gpxT.women[2] "Mm. Good. Maybe that's the one that takes. We'll know soon enough.">>
<div class="choice-container">
<<vchoice "Lie there" "Grove_Planting_After" "rest" "rest">>
</div><<run VaultUI.setBackgroundDirect(setup.GROVE_BG.greatHall)>>
<<set _gpaT to $grove.planting.tonight>>
<<if _gpaT && !_gpaT.afterDone>>
<<set _gpaT.afterDone to true>>
<<advanceTime 2>>
<<set $player.energy to Math.max(0, ($player.energy || 0) - 25)>>
<</if>>
<h2>The Planting</h2>
<<set _gpaF to setup.storyFamilyOf("cg_grove_planting")>>
<<if !(_gpaT && _gpaT.singlesAt === "finish") && !setup.storyFamilyGap("story/grove_planting/after")>><<storyVideo "story/grove_planting/after">><</if>>
<<if _gpaF is "sf_cg_grove_planting_01">>
<p>You lie on your back on the long table in the green-walled back room, spent, with women slumped against you on the benches and the floor around it. Someone's head on your stomach. Someone's hand still resting on your thigh. The candles gutter one by one. Later a clerk with a lamp of her own comes in with a ledger and writes down names.</p>
<<elseif _gpaF is "sf_cg_grove_planting_02">>
<p>You lie spent across the purple satin of the big bed<<if _storyFamily is "sf_cg_grove_planting_02">>. The three of them aren't: they kneel up together and kiss, slow and lazy, passing what's left of you from tongue to tongue. Then they lie down against you<<else>>, and the three of them lie sprawled against you<</if>>, one on each side and one across your legs, breathing slow, nobody saying anything. The yellow walls go dim as the lamp burns down. Later a clerk with a lamp of her own comes in with a ledger and writes down names.</p>
<<elseif _gpaF is "sf_cg_grove_planting_03">>
<p>You slump back on the white couch in the glass room, spent<<if _storyFamily is "sf_cg_grove_planting_03">>. The two of them turn to each other with your come still on their faces and kiss, deep and messy. When they're done they<<else>>, and the two of them<</if>> climb up and fold themselves against you on either side, warm and heavy, the tall windows bright behind them. Later a clerk with a lamp of her own comes in with a ledger and writes down names.</p>
<<else>>
<p>You lie in the furs in the middle of the hall, spent, with women asleep against you on every side. Someone's head on your stomach. Someone's leg over yours. The lamps gutter one by one. Up at the head of the hall, a clerk with a lamp of her own walks down the rows of cushions with a ledger, writing down names.</p>
<</if>>
<<if _gpaT && _gpaT.kira>>
<p>Kira is curled against your side with her cheek on your arm, awake. She's watching the clerk too.</p>
<<say "Kira" "...Three of them. Plus me. You're going to be useless tomorrow.">>
<<elseif setup.kiraWithYou()>>
<<if !setup.kiraGuarded()>>
<p>Kira is still there by the door, where she watched it all. She hasn't slept. She doesn't look away.</p>
<<elseif _gpaF>>
<p>When you finally walk back out through the great hall, Kira is still up at the gallery rail where they left her. She hasn't slept. She doesn't look away.</p>
<<else>>
<p>When you look up at the gallery, Kira is still there at the rail. She hasn't slept. She doesn't look away.</p>
<</if>>
<</if>>
<<say "Lady Selene" "Adequate. The women will be talking about it for a week, heaven help us. Don't let it go to your head.">>
<<set _gpaR to ($grove.lastResult && $grove.lastResult.kind === "planting") ? $grove.lastResult : null>>
<<set _gpaBits to []>>
<<if _gpaR>>
<<if _gpaR.rep>><<run _gpaBits.push("+" + _gpaR.rep + " standing")>><</if>>
<<if _gpaR.marks>><<run _gpaBits.push("+" + _gpaR.marks + " yield mark" + (_gpaR.marks !== 1 ? "s" : ""))>><</if>>
<<if _gpaR.scrap>><<run _gpaBits.push("+" + _gpaR.scrap + " scrap")>><</if>>
<</if>>
<p class="narrator">The Planting counts as this week's assignment.<<if _gpaBits.length>> <<= _gpaBits.join(", ")>>.<</if>> The women who had you are on the Center's rolls now. Energy -25.</p>
<div class="choice-container">
<<if setup.groveTakenOpen()>>
<<vchoice "Follow the Lady up to her rooms and force the Den's whereabouts out of her" "Grove_Selene_Taken" "action" "dominant">>
<</if>>
<<vchoice "Back to the Grove" "Location_VerdantOutpost" "move" "back">>
</div><<run VaultUI.setBackgroundDirect(setup.GROVE_BG.exchange)>>
<<set _gmkLot to setup.groveMarketLot()>>
<<if ["Grove_Market_Ledger", "Grove_Market_Offer", "Grove_Market_Inspect", "Grove_Market_Try"].includes(previous())>><<run setup.storyFamilyPreset("cg_grove_market", setup.storyFamilyOf("cg_grove_market"))>><</if>>
<h2>The Captive Market</h2>
<<if !setup.groveMarketOpen()>>
<<if setup.storyFamilyOf("cg_grove_market") === "sf_cg_grove_market_04">>
<<run VaultUI.setBackgroundDirect(setup.GROVE_BG.woodshed)>>
<p>The raiders are gone. The woodshed at the edge of the estate stands empty, the rails pulled down, the crossbeam bare, and the beaten ground already raked over.</p>
<<else>>
<p>The raiders are gone. The pens in the back cellar are empty, swept out, and smell of lime.</p>
<</if>>
<div class="choice-container"><<vchoice "Back to the Grove" "Location_VerdantOutpost" "move" "back">></div>
<<else>>
<<if !["Grove_Market_Ledger", "Grove_Market_Offer", "Grove_Market_Inspect", "Grove_Market_Try"].includes(previous())>><<advanceTime 0 `setup.COVENANT.time.market`>><</if>>
<<if !setup.storyFamilyGap("story/grove_market/pens")>><<storyVideo "story/grove_market/pens">><</if>>
<<if _storyFamily is "sf_cg_grove_market_04">><<run VaultUI.setBackgroundDirect(setup.GROVE_BG.woodshed)>><</if>>
<p>Word goes round the Grove at breakfast: the Crimson raiders are <<if _storyFamily is "sf_cg_grove_market_04">>here<<else>>in the Cellars,<</if>> under a white rag and the Lady's safe-conduct, and they've brought stock.<<if _storyFamily is "sf_cg_grove_market_04">> The Lady won't have them in the house this time. They've set up at the old woodshed at the edge of the estate.<</if>></p>
<p><<if _storyFamily is "sf_cg_grove_market_04">>A woman hangs by her wrists from the crossbeam out front; the raiders say she bit one of them and isn't for sale till she's learned better. <</if>><<if _storyFamily is "sf_cg_grove_market_04">>Behind a fence of rails are five more<<elseif _storyFamily is "sf_cg_grove_market_02">>The back cellar has been turned into a row of iron cages against the brick wall. Five women are inside<<else>>The back cellar has been turned into pens with hurdles and rope. Five women are inside<</if>><<if _storyFamily is "sf_cg_grove_market_02">>, one to a cage, crouched on the bare floor.<<else>>, collared, wrists tied in front of them, sitting on straw.<</if>> Dasha, who glares at everyone. Mirela, who's been crying and has stopped. Kesi, tall and very still. Liv, who keeps trying to catch the eye of any woman in green. Noor, who watches the raiders' hands. A big raider with a shaved head and a ledger leans on the <<if _storyFamily is "sf_cg_grove_market_04">>rails<<elseif _storyFamily is "sf_cg_grove_market_02">>nearest cage<<else>>hurdles<</if>> and grins at the buyers.</p>
<<say "Crimson raider" "Fresh off the river road, ladies. Healthy, all of them. Teeth, hips, the lot. Take a look. Touch if you like. Buy before the Lady does, she's got the deepest pockets in the east.">>
<p>The Covenant women walk the pens, cold-faced, pricing. One of them is the Lady's steward, a hard grey woman with a purse on her belt. She stops in front of <<= _gmkLot>> and looks at her for a long time.</p>
<<if setup.kiraWithYou()>>
<<if setup.groveSeraLinked() && $grove.selene.kiraTold>>
<<say "Kira" "Crimson raiders. The ones who bought your Sera off the hoods. ...Same road, same fucking rails.">>
<<else>>
<<say "Kira" "Raiders selling women in daylight, and the green bitches pricing them like melons. ...I hate this place.">>
<</if>>
<</if>>
<div class="choice-container">
<<vchoice `"Look at " + _gmkLot` "Grove_Market_Inspect" "action" "examine">>
<<if !$grove.market.ledgerSeen>>
<<vchoice "Get a look at the raider's ledger" "Grove_Market_Ledger" "action" "book">>
<</if>>
<<vchoice "Leave them to it (for now)" "Location_VerdantOutpost" "move" "back">>
</div>
<</if>><<if setup.storyFamilyOf("cg_grove_market") === "sf_cg_grove_market_04">><<run VaultUI.setBackgroundDirect(setup.GROVE_BG.woodshed)>><</if>>
<<if !$grove.market.ledgerSeen>>
<<set $grove.market.ledgerSeen to true>>
<<journalAdd "A Crimson raider's ledger at the Grove's Captive Market: Sera, red hair, healer. The hooded ones traded her to Crimson, Crimson sold her to the Covenant, bought her back soon after and sold her south to the Den. Madam Silk paid in full.">>
<</if>>
<h2>The Captive Market</h2>
<p>You buy the shaved-head raider a cup of the Covenant's beer and ask him about the road south. He likes to talk. He puts the ledger down on the <<if setup.storyFamilyOf("cg_grove_market") === "sf_cg_grove_market_04">>rails<<else>>hurdle<</if>> to wave his hands about, and you read it upside down.</p>
<p>Names, prices, places, in a careful clerk's hand that isn't his. Most of it means nothing. Then, a page back, a line you read three times:</p>
<p class="journal-quote"><em>Sera, so she says. Red hair, healer, soft hands. Had her off the hooded ones in trade. Sold to the green women. Bought back off them soon after, carted south and sold to the Den. Madam Silk paid in full.</em></p>
<<if setup.groveSeraKnown()>>
<p>The hooded ones: the Convergence. Then Crimson. Then the Grove. Then south. Every one of them made a profit on her.</p>
<<else>>
<p>Sera. Her name, in a stranger's hand, with a price after it.</p>
<</if>>
<p>He catches you looking and snaps the book shut, still grinning.</p>
<<say "Crimson raider" "Ah ah. That's business, friend. You want to know where the good ones end up, you buy one and ask her.">>
<<if setup.kiraWithYou()>>
<p>Kira read it too. Her face has gone white and very still, and she doesn't say anything at all until he's gone.</p>
<<if $grove.selene.kiraTold || setup.groveSeraKnown()>>
<<say "Kira" "So that's her. Your Sera.">>
<<else>>
<<say "Kira" "Sera. That's the one you've been asking after on every road. Isn't it.">>
<</if>>
<<say "Kira" "...The Den. We'll find it. Don't make me say it twice, and don't thank me.">>
<</if>>
<p class="narrator">A lead: Sera was sold on to "the Den" and a Madam Silk. The Lady will know where that is.</p>
<div class="choice-container">
<<vchoice "Back to the pens" "Grove_Market" "move" "back">>
</div><<if setup.storyFamilyOf("cg_grove_market") === "sf_cg_grove_market_04">><<run VaultUI.setBackgroundDirect(setup.GROVE_BG.woodshed)>><</if>>
<<set _gmiLot to setup.groveMarketLot()>>
<h2>The Captive Market</h2>
<<if !setup.storyFamilyGap("story/grove_market/inspect")>><<storyVideo "story/grove_market/inspect">><</if>>
<p>The raider <<if _storyFamily is "sf_cg_grove_market_02">>takes you through to the wine vault behind the pens, where <<= _gmiLot>> is already up for you: stripped, her arms stretched out wide and tied off to the beams<<elseif _storyClip is "e9c8a4a1f3e7">>hauls <<= _gmiLot>> up off the straw and stands her against the slats<<elseif _storyClip is "cae22e7da375">>has <<= _gmiLot>> strung up already, stripped bare, her wrists roped to the beam so she has to stand up straight for you<<else>>hauls <<= _gmiLot>> up off the straw by her collar and turns her round for you<</if>>. He <<if _storyFamily is "sf_cg_grove_market_02">>unbuckles the ring gag that holds her mouth open and lets it hang round her neck so you can see her teeth<<elseif _storyClip is "e9c8a4a1f3e7">>takes a fistful of her hem and lifts it, slowly, all the way to her waist, so you can see all of her<<elseif _storyClip is "cae22e7da375">>steps back and lets you look, as long as you like<<else>>pulls her shirt off over her bound wrists and lets her stand there bare to the waist in the <<if setup.storyFamilyOf("cg_grove_market") === "sf_cg_grove_market_04">>light from the broken roof<<else>>lantern light<</if>><</if>><<if _storyFamily is "sf_cg_grove_market_02" or _storyClip is "e9c8a4a1f3e7" or _storyClip is "cae22e7da375">><<else>>, then makes her turn again, slowly, so you can see all of her<</if>>. She<<if _storyFamily is "sf_cg_grove_market_02">><<else>>'s thin from the road but strong, and she<</if>> <<if _storyClip is "e9c8a4a1f3e7">>keeps her eyes on the floor<<else>>holds her chin up<</if>> the whole time.</p>
<<say "Crimson raider" "Sixty scrap and she's yours. Unless that old crow outbids you.">>
<p>The Lady's steward hasn't moved. <<= _gmiLot>> looks at her, and then at you, and when the raider turns away to spit she leans in close.</p>
<<say _gmiLot "Not her. Please. You, not her. I'll do anything. I'll show you. Let me show you.">>
<div class="choice-container">
<<vchoice "Let her show you" "Grove_Market_Try" "action" "seduce">>
<<vchoice "Make an offer" "Grove_Market_Offer" "action" "scrap">>
</div><<if setup.storyFamilyOf("cg_grove_market") === "sf_cg_grove_market_04">><<run VaultUI.setBackgroundDirect(setup.GROVE_BG.woodshed)>><</if>>
<<set _gmtLot to setup.groveMarketLot()>>
<<set $player.lust to Math.min(100, ($player.lust || 0) + 25)>>
<h2>The Captive Market</h2>
<<storyVideo "story/grove_market/tried">>
<p>The raider shrugs<<if _storyFamily is "sf_cg_grove_market_02">><<elseif _storyFamily is "sf_cg_grove_market_04">><<if String(setup.mediaFolderLast("story/grove_market/inspect") || "").includes("e9c8a4a1f3e7")>>, ties her wrists in front of her with a length of twine,<</if>> and waves you into the back of the shed<<else>> and waves you into the empty pen at the end<</if>>. "Try before you buy. Don't break her." <<if _storyFamily is "sf_cg_grove_market_02">>He doesn't untie her. <<= _gmtLot>> can't use her hands, so when you step up close she leans as far forward as the ropes let her<<else>><<= _gmtLot>> follows you in on her own, kneels in front of you before you can say anything, and opens your trousers with her bound hands<</if>>.</p>
<p>She takes you in her mouth like her life depends on it, which it might.</p>
<<say _gmtLot "All of me. Go on. Then buy me.">>
<p>She goes back on you before you can answer, and doesn't stop until the raider bangs on the <<if _storyFamily is "sf_cg_grove_market_02">>door<<elseif _storyFamily is "sf_cg_grove_market_04">>rail<<else>>hurdle<</if>> and laughs and you have to stop.</p>
<div class="choice-container">
<<vchoice "Make an offer" "Grove_Market_Offer" "action" "scrap">>
</div><<if setup.storyFamilyOf("cg_grove_market") === "sf_cg_grove_market_04">><<run VaultUI.setBackgroundDirect(setup.GROVE_BG.woodshed)>><</if>>
<<set _gmoLot to setup.groveMarketLot()>>
<<set _gmoFav to setup.groveAtLeast("Favoured")>>
<h2>The Captive Market</h2>
<<if _gmoFav>>
<p>You tell the raider sixty. The steward hears it, looks at you, and steps back from the hurdle.</p>
<<say "Steward" "The Lady's Favoured has first pick. She'd want me to say so.">>
<<else>>
<p>You tell the raider sixty. Before he can spit on his palm, the steward says "eighty" without looking at you, and the raider's grin gets wider.</p>
<<say "Crimson raider" "Eighty from the Lady! Do I hear a hundred from the vault?">>
<<say "Steward" `"Think hard. The Lady will hear who outbid her for " + _gmoLot + "."`>>
<</if>>
<<scrapBalance>>
<div class="choice-container">
<<if _gmoFav>>
<<if $vault.scrap >= setup.COVENANT.market.price>>
<<link `'<span class="choice-button action"><span class="gi gi-scrap gi-large"></span><span class="label">Buy her (' + setup.COVENANT.market.price + ' scrap)</span></span>'`>><<run setup.groveMarketBuy(setup.COVENANT.market.price, "bought")>><<goto "Grove_Market_Bought">><</link>>
<<else>>
<<vchoiceDisabled `"Buy her (" + setup.COVENANT.market.price + " scrap, you have too little)"` "action" "scrap">>
<</if>>
<<else>>
<<if $vault.scrap >= setup.COVENANT.market.bidPrice>>
<<link `'<span class="choice-button action"><span class="gi gi-scrap gi-large"></span><span class="label">Outbid the Lady (' + setup.COVENANT.market.bidPrice + ' scrap)</span></span>'`>><<run setup.groveMarketBuy(setup.COVENANT.market.bidPrice, "outbid")>><<goto "Grove_Market_Bought">><</link>>
<<else>>
<<vchoiceDisabled `"Outbid the Lady (" + setup.COVENANT.market.bidPrice + " scrap, you have too little)"` "action" "scrap">>
<</if>>
<<vchoice "Let the Lady have her" "Grove_Market_Yield" "action" "submit">>
<</if>>
<<vchoice "Cut her loose and get her out (a crime)" "Grove_Market_Free" "action" "unlocked">>
<<vchoice "Not today" "Grove_Market" "move" "back">>
</div><<set _gmbName to $grove.market.bought || setup.groveMarketLot()>>
<h2>The Captive Market</h2>
<<if $grove.market.how === "outbid">>
<p>The raider spits on his palm and you shake on a hundred. The steward writes something in a little book, very slowly, and walks out without a word. The Lady will hear about this before you've climbed the stairs.</p>
<<else>>
<p>The raider spits on his palm and you shake on sixty. He cuts the rope off her wrists, but leaves the collar, and hands you the end of the lead with a bow.</p>
<</if>>
<<set _gmbsG to setup.storyFamilyGap("story/grove_market/bought")>><<set _gmbsS to setup.storyFamilySingles("story/grove_market/bought", _gmbsG)>>
<<set _gmbA to _gmbsS && setup.storyFamilyOf("cg_grove_market") === "sf_cg_grove_market_04" && setup.storyAvoidStems("story/grove_market/bought", ["1a8f6004f17c", "bd41f6d336f1"])>>
<<if _gmbsS || !_gmbsG>><<storyVideo "story/grove_market/bought">><</if>>
<<if _gmbA>><<run setup.mediaAvoidEnd("story/grove_market/bought")>><</if>>
<<if _gmbsS>><<run setup.mediaAvoidEnd("story/grove_market/bought")>><</if>>
<p><<if _storyFamily is "sf_cg_grove_market_02">>She doesn't wait for the Center<<else>>The Center gives her a cot and a number and writes her name in the book: <<= _gmbName>>, the vault boy's<</if>>. <<if _storyClip is "1a8f6004f17c">>The Center chains new stock until the paper's done, so she sits at the clerk's table in a length of heavy chain until the key turns in the lock<<elseif _storyClip is "c83fbef126d2">>The raider's rope is still wound round her arms and chest; the cut at her wrists only freed her hands. When the warden leaves she pulls it off herself<<elseif _storyClip is "bd41f6d336f1">>When you come back she's sitting on the cot. She doesn't notice you at first<<elseif _storyFamily is "sf_cg_grove_market_02">>She's still in the raider's rope harness<<else>>When the warden has gone she sits on the cot and looks at you for a long time, rubbing her wrists<</if>>. Then she <<if _storyFamily is "sf_cg_grove_market_02" or _storyClip is "1a8f6004f17c" or _storyClip is "c83fbef126d2" or _storyClip is "bd41f6d336f1">><<else>>unbuckles the collar herself, drops it on the floor, and <</if>><<if _storyFamily is "sf_cg_grove_market_02">>turns her back to you and puts her wrists together behind her<<else>>pulls you down onto the cot with her<</if>>.</p>
<<say _gmbName "You didn't have to. ...So I'm going to thank you properly. Then you can tell me what this place wants from me.">>
<<if _storyFamily is "sf_cg_grove_market_02">><<say _gmbName "Tie them. Here. Now. I want every one of them out there to hear whose I am.">><</if>>
<p>She thanks you properly. <<if _storyFamily is "sf_cg_grove_market_02">>You knot the rope round her wrists, bend her over and take her from behind, your hand hard across her ass,<<else>>Slowly, on top of you, the cot creaking under you both, her forehead pressed against yours,<</if>> until she comes shaking and you come inside her a moment after.</p>
<p class="narrator"><<= _gmbName>> is yours on the Center's books, and the Center would take her for its duty in the morning. What happens to her now is up to you.<<if $grove.market.how === "outbid">> The Lady dislikes being outbid.<</if>></p>
<<set $player.lust to 10>><<run setup.playerReleased()>>
<div class="choice-container">
<<vchoice `"Tell " + _gmbName + " what happens now"` "Grove_Market_Fate" "action" "talk">>
</div><<run VaultUI.setBackgroundDirect(setup.GROVE_BG.center)>>
<<set _gmfName to $grove.market.bought || setup.groveMarketLot()>>
<h2>The Captive Market</h2>
<<if $grove.market.fate>>
<p>That's settled.</p>
<div class="choice-container">
<<vchoice "Back to the Grove" "Location_VerdantOutpost" "move" "back">>
</div>
<<else>>
<p>You sit down on the end of the cot. You tell her the Center isn't getting her: no duty, no number on the wall, no man sent to her bed by a clerk with a list. She doesn't believe you at first. Then she does, and she has to look away for a moment.</p>
<<say _gmfName "Then what? I can't walk to the river road on my own. Not with those raiders still out on it. ...I can count. I can carry. I can keep my mouth shut, mostly.">>
<<if setup.kiraWithYou()>>
<<say "Kira" "Don't look at me. She's yours. ...Get her out of this place, though. One of us should get out clean.">>
<</if>>
<div class="choice-container">
<<vchoice "Get her taken on at the Exchange (work, out of the Center)" "Grove_Market_Fate_Exchange" "action" "market">>
<<vchoice "Let her go free" "Grove_Market_Fate_Free" "action" "unlocked">>
</div>
<</if>><<run setup.groveMarketFate("exchange")>>
<<run VaultUI.setBackgroundDirect(setup.GROVE_BG.exchange)>>
<<set _gmeName to $grove.market.bought || setup.groveMarketLot()>>
<h2>The Exchange</h2>
<p>The keeper hears you out with her pen still moving. She looks <<= _gmeName>> over the way she looks at a crate of tins: what's dented, what's good, what it's worth.</p>
<<say "Exchange keeper" "She can read? ...Fine. She sleeps in the stockroom, she eats what she earns, and the first thing that goes missing off my shelves, she's on the post with a sign round her neck. Not the Center. I don't have time to lend my girls out to the Center.">>
<p><<= _gmeName>> takes the apron the keeper throws at her and ties it on with shaking hands. Then she looks at you over the counter, chin up, the way she held it in the pens.</p>
<<say _gmeName "I'll be here. Come and buy something, vault boy. I'll give you short weight on the beans, so you'll know it's me.">>
<div class="choice-container">
<<vchoice "Back to the Grove" "Location_VerdantOutpost" "move" "back">>
</div><<run setup.groveMarketFate("free")>>
<<run VaultUI.setBackgroundDirect(setup.GROVE_BG.grounds)>>
<<set _gmgName to $grove.market.bought || setup.groveMarketLot()>>
<h2>The Gate</h2>
<p>You walk her to the gate yourself, the bill of sale folded in your pocket, and show it to the wardens when they step out to stop her. They read it twice. They let her through.</p>
<p>She stops on the far side of the iron, on the cart track, with a water skin and a heel of bread you bought her at the Exchange, and the whole of the woods in front of her.</p>
<<say _gmgName "Nobody's ever bought me to let me go. ...I don't know what to say to that. So I won't. If you ever come down the river road and somebody gives you a bed and doesn't ask for it back, that's me paying you.">>
<p>Then she goes, fast, without looking back, and the trees take her.</p>
<<if setup.kiraWithYou()>>
<p>Kira watches her out of sight. She doesn't say anything, but on the way back up the lawn her shoulder bumps yours, once, on purpose.</p>
<</if>>
<div class="choice-container">
<<vchoice "Back to the Grove" "Location_VerdantOutpost" "move" "back">>
</div><<if setup.storyFamilyOf("cg_grove_market") === "sf_cg_grove_market_04">><<run VaultUI.setBackgroundDirect(setup.GROVE_BG.woodshed)>><</if>>
<<set _gmyLot to setup.groveMarketLot()>>
<<run setup.groveMarketYield()>>
<h2>The Captive Market</h2>
<<if setup.storyFamilyOf("cg_grove_market") === "sf_cg_grove_market_04">>
<p>You shake your head. The steward pays eighty without haggling. Two wardens walk <<= _gmyLot>> away up the cart track toward the Main House, and she looks back at you once from where the trees open out.</p>
<<else>>
<p>You shake your head. The steward pays eighty without haggling. Two wardens take <<= _gmyLot>> up the stairs toward the Main House, and she looks back at you once from the top step.</p>
<</if>>
<<say "Steward" "Sensible. The Lady will hear that too.">>
<p class="narrator">The Lady notices who knows their place: +<<= setup.COVENANT.rep.marketYield>> standing.</p>
<div class="choice-container">
<<vchoice "Back to the Grove" "Location_VerdantOutpost" "move" "back">>
</div><<if setup.storyFamilyOf("cg_grove_market") === "sf_cg_grove_market_04">><<run VaultUI.setBackgroundDirect(setup.GROVE_BG.woodshed)>><</if>>
<<set _gmfLot to setup.groveMarketLot()>>
<<if !$grove.market.done>>
<<run setup.groveMarketFree()>>
<</if>>
<h2>The Captive Market</h2>
<<if setup.storyFamilyOf("cg_grove_market") === "sf_cg_grove_market_04">>
<p>You wait until the raiders are counting the steward's scrap out by their horses. Then you slip a knife through the rope on <<= _gmfLot>>'s wrists, lift a loose rail at the back of the shed and point her at the trees. She doesn't thank you. She's gone into the undergrowth like a deer.</p>
<<else>>
<p>You wait until the raiders are counting the steward's scrap at the far end of the cellar. Then you slip a knife through the rope on <<= _gmfLot>>'s wrists, lift the hurdle and point her at the drain gate under the old cider press. She doesn't thank you. She's gone into the dark like water.</p>
<</if>>
<p>The shouting starts thirty seconds later. The raiders want their money. The steward wants her purchase. The wardens want whoever lifted that <<if setup.storyFamilyOf("cg_grove_market") === "sf_cg_grove_market_04">>rail<<else>>hurdle<</if>>, and there's straw on your boots.</p>
<<say "Warden" "Stealing from the Lady's own market. Under her safe-conduct. You're either very brave or very stupid, vault boy. Come on.">>
<div class="choice-container">
<<vchoice "Hear the sentence" "Grove_Sentence" "action" "scroll">>
</div><<run VaultUI.setBackgroundDirect(setup.GROVE_BG.woods)>>
<<set _ghR to $grove.hunt.run>>
<h2>The Hunt</h2>
<<if !_ghR || _ghR.quarry || _ghR.done>>
<p>The hounds are kennelled and the woods are quiet.</p>
<div class="choice-container"><<vchoice "Back to the Grove" "Location_VerdantOutpost" "move" "back">></div>
<<else>>
<<set _ghG to setup.storyFamilyGap("story/grove_hunt/flight")>>
<<set _ghS to setup.storyFamilySingles("story/grove_hunt/flight", _ghR.singlesAt === "flight" || _ghG)>>
<<if _ghS || !_ghG>><<storyVideo "story/grove_hunt/flight">><</if>>
<<if _ghS>><<run setup.mediaAvoidEnd("story/grove_hunt/flight")>><</if>>
<p>The Hunt is the Covenant's other sentence. An offender who'd rather run than stand at the post gets a head start into the woods behind the estate. If she reaches the old boundary stones before the huntmistress blows the horn, three hours after the start, she's free of it. If a hunter catches her first, she belongs to the hunter until sundown.</p>
<p>Today's quarry is <<= _ghR.name>>. <<if _storyFamily is "sf_cg_grove_hunt_02">>The huntmistress makes the hunter go and look the quarry in the face before it starts. You crouch in front of her. <</if>>She <<if _storyClip is "bc257f04b0c5">>comes flying down between the rows of pines, past you,<<else>>goes over the wall at the bottom of the orchard<</if>> and doesn't look back. The wardens give her the time it takes to drink a cup of water. Then the huntmistress, a lean grey-eyed woman with a horn at her hip, nods at you.</p>
<<say "Huntmistress" "She's yours to find. Read the ground. Three chances to guess right, and you'll need two. Go.">>
<<if setup.kiraWithYou()>>
<<say "Kira" "I'll stay with the wardens. Go catch her. Try not to fall in the stream.">>
<</if>>
<p class="narrator">Three times you choose which way to go: the stream, the thicket or the ridge. The ground gives you a sign each time; signs can lie. Guess right twice and you have her.</p>
<div class="choice-container">
<<vchoice "Go after her" "Grove_Hunt_Track" "move" "run">>
</div>
<</if>><<set _ghtR to $grove.hunt.run>>
<h2>The Hunt</h2>
<<if !_ghtR || _ghtR.quarry || _ghtR.outcome>>
<p>The chase is over.</p>
<div class="choice-container"><<vchoice "Back to the Grove" "Location_VerdantOutpost" "move" "back">></div>
<<else>>
<<set _ghtC to _ghtR.rounds[_ghtR.round].clue>>
<p>Choice <<= _ghtR.round + 1>> of <<= _ghtR.rounds.length>>. On her trail: <<= _ghtR.hits>> of the 2 you need.</p>
<<if _ghtC === "stream">>
<p>A wet footprint on a flat stone, pointing downhill toward the sound of water.</p>
<<elseif _ghtC === "thicket">>
<p>A torn thread of cloth caught on a bramble, at the edge of the thicket where the hazels grow close.</p>
<<else>>
<p>A scatter of loose scree on the path up to the ridge, still rolling when you get there.</p>
<</if>>
<div class="choice-container">
<<for _ghtS range setup.COVENANT.hunt.spots>>
<<capture _ghtS>>
<<link `'<span class="choice-button action"><span class="gi gi-search gi-large"></span><span class="label">Try the ' + _ghtS + '</span></span>'`>><<run setup.groveHuntChoose(_ghtS)>><<goto "Grove_Hunt_Trail">><</link>>
<</capture>>
<</for>>
</div>
<</if>><<set _ghlR to $grove.hunt.run>>
<<if _ghlR && !_ghlR.quarry && _ghlR.timeAt !== _ghlR.round>>
<<set _ghlR.timeAt to _ghlR.round>>
<<advanceTime 0 40>>
<<set $player.energy to Math.max(0, ($player.energy || 0) - 5)>>
<</if>>
<h2>The Hunt</h2>
<<if !_ghlR || _ghlR.quarry || _ghlR.round === 0>>
<p>The chase is over.</p>
<div class="choice-container"><<vchoice "Back to the Grove" "Location_VerdantOutpost" "move" "back">></div>
<<else>>
<<set _ghlLast to _ghlR.rounds[_ghlR.round - 1]>>
<<if _ghlR.picks[_ghlR.round - 1] === _ghlLast.spot>>
<p>There. A flash of movement between the trees ahead of you, the colour of her top, and the sound of her breathing, ragged. She's seen you. She breaks cover and runs again, but you're closer now.</p>
<<else>>
<p>Nothing. You stop and listen, and somewhere off toward the <<= _ghlLast.spot>> a pigeon claps up out of the branches. Wrong way. You've lost time.</p>
<</if>>
<div class="choice-container">
<<if _ghlR.outcome === "caught">>
<<vchoice "Run her down" "Grove_Hunt_Catch" "move" "run">>
<<elseif _ghlR.outcome === "lost">>
<<vchoice "Keep looking" "Grove_Hunt_Lost" "move" "forward">>
<<else>>
<<vchoice "After her" "Grove_Hunt_Track" "move" "run">>
<</if>>
</div>
<</if>><<set _ghcR to $grove.hunt.run>>
<<set $player.lust to Math.min(100, ($player.lust || 0) + 20)>>
<h2>The Hunt</h2>
<<storyVideo "story/grove_hunt/catch">>
<p>You catch <<= _ghcR ? _ghcR.name : "her">> <<if _storyFamily is "sf_cg_grove_hunt_02" or _storyFamily is "sf_cg_grove_hunt_03">><<else>>at the foot of a mossy outcrop, <</if>>a hundred yards short of the boundary stones. <<if _storyFamily is "sf_cg_grove_hunt_03">>The huntmistress made you wear a warden's green field jacket and peaked cap for the Hunt, so nobody would mistake the hunter for the quarry. <</if>>She hears you coming, spins round and swings at you, and you <<if _storyFamily is "sf_cg_grove_hunt_02">>drag her down until you have her bent over with her face to the ground<<elseif _storyFamily is "sf_cg_grove_hunt_03">>catch her against a thin trunk, her arms round the tree, your hand at the back of her neck<<else>>catch her wrist and put her back against the rock<</if>>. She's panting, scratched from the brambles.</p>
<<say `_ghcR ? _ghcR.name : "The quarry"` "Damn you. Damn you, I was nearly there. ...Fine. You caught me. You know the rule.">>
<p><<if _storyFamily is "sf_cg_grove_hunt_02">>The huntmistress gave you a length of cord for this: you tie her wrists in front of her while she's still swearing at you. <</if>>She stops fighting your grip. <<if _storyFamily is "sf_cg_grove_hunt_02" or _storyFamily is "sf_cg_grove_hunt_03">>Then she<<else>>Her chin comes up. Her eyes are bright and furious and something else, and she<</if>> pushes her hips against yours, deliberately.</p>
<div class="choice-container">
<<vchoice "Take what the Hunt gives you" "Grove_Hunt_Taken" "action" "dominant">>
<<vchoice "Walk her back untouched" "Grove_Hunt_Spare" "action" "handshake">>
</div><<set _ghkR to $grove.hunt.run>>
<<if _ghkR && !_ghkR.done>>
<<run setup.groveHuntDone("taken")>>
<<set $player.lust to 10>><<run setup.playerReleased()>>
<</if>>
<h2>The Hunt</h2>
<<set _ghkS to setup.storyFamilySingles("story/grove_hunt/taken", _ghkR && _ghkR.singlesAt === "taken")>>
<<storyVideo "story/grove_hunt/taken">>
<<if _ghkS>><<run setup.mediaAvoidEnd("story/grove_hunt/taken")>><</if>>
<p><<if _storyFamily is "sf_cg_grove_hunt_02">>You stand her up against the wall with her tied hands flat on it<<elseif _storyFamily is "sf_cg_grove_hunt_03">>You bend her forward with her arms round the thin trunk<<elseif _storyClip is "b05e0eb30913">>You bend her over a big fallen pine<<elseif _storyClip is "2c14d3851274">>She ends up on her knees, and you kneel up behind her<<else>>You turn her round and put her hands flat on the rock<</if>>. She curses you the whole time, and then you push into her and she stops cursing and starts moaning instead, low and furious, pushing back onto you. You take her hard with the boundary stones in sight through the trees, and when she comes she <<if _storyFamily is "sf_cg_grove_hunt_02">>slaps the bricks with her bound hands and <<elseif _storyFamily is "sf_cg_grove_hunt_03">>slaps the bark with her open hand and <<elseif _storyClip is "b05e0eb30913">>slaps the trunk with her open hand and <<elseif _storyClip is "2c14d3851274">><<else>>slaps the rock with her open hand and <</if>>laughs like she's won something.</p>
<p>You finish inside her. She <<if _storyFamily is "sf_cg_grove_hunt_02">>stays leaning on the wall a while<<elseif _storyClip is "2c14d3851274">>sags forward onto her hands<<else>>stays bent over a while<</if>> afterward, breathing.</p>
<<say `_ghkR ? _ghkR.name : "The quarry"` "Until sundown, the rule says. ...Walk slowly on the way back, would you.">>
<p class="narrator">The huntmistress writes you down as the catch: +<<= setup.COVENANT.rep.huntCatch>> standing.</p>
<div class="choice-container">
<<vchoice "Walk her back to the Grove" "Location_VerdantOutpost" "move" "back">>
</div><<set _ghpR to $grove.hunt.run>>
<<if _ghpR && !_ghpR.done>>
<<run setup.groveHuntDone("spared")>>
<</if>>
<h2>The Hunt</h2>
<p>You let go of her wrist. She stares at you, waiting for the catch, and when it doesn't come she laughs once in disbelief.</p>
<<say `_ghpR ? _ghpR.name : "The quarry"` "You're strange, vault boy. ...Thank you.">>
<p>You walk her back through the woods side by side. At the orchard wall the huntmistress takes one look at the two of you, untouched and tidy, and raises an eyebrow. Then she writes something down that makes her smile.</p>
<<say "Huntmistress" "Caught and returned whole. The Lady likes that more than she'll admit.">>
<p class="narrator">+<<= setup.COVENANT.rep.huntSpare>> standing.</p>
<div class="choice-container">
<<vchoice "Back to the Grove" "Location_VerdantOutpost" "move" "back">>
</div><<set _ghxR to $grove.hunt.run>>
<<if _ghxR && !_ghxR.done>>
<<run setup.groveHuntDone("lost")>>
<</if>>
<h2>The Hunt</h2>
<p>The horn goes, far away, three long notes: time, and she's reached the stones. You find her footprints at the boundary, deep and running, and then nothing.</p>
<<say "Huntmistress" "She got away from you. It happens. She'll be strutting about the Center for a week. Better luck next time.">>
<p class="narrator">No standing this time. The next Hunt is in <<= setup.COVENANT.hunt.every>> days.</p>
<div class="choice-container">
<<vchoice "Back to the Grove" "Location_VerdantOutpost" "move" "back">>
</div><<run VaultUI.setBackgroundDirect(setup.GROVE_BG.woods)>>
<<set _ghqR to $grove.hunt.run>>
<h2>The Hunt</h2>
<<if !_ghqR || !_ghqR.quarry || _ghqR.done>>
<p>The hounds are kennelled and the woods are quiet.</p>
<div class="choice-container"><<vchoice "Back to the Grove" "Location_VerdantOutpost" "move" "back">></div>
<<else>>
<p>The warden carries your request up to the Main House and comes back grinning.</p>
<<say "Warden" "The Lady says yes. She says she'd like to watch you run. Boots off.">>
<p>They take your boots and your shirt at the orchard wall. Three huntresses wait by the gate with bows and short spears, women you've passed at the well and the Exchange, and they look you over like you're dinner. The huntmistress puts her horn to her lips.</p>
<<say "Huntmistress" "Reach the boundary stones before my horn blows, three hours from now, and your sentence is served. If they find you first, you're theirs till sundown, and your sentence is served that way. Run.">>
<<if setup.kiraWithYou()>>
<<say "Kira" "...Run fast. Or don't. I honestly can't decide which I'd rather watch.">>
<</if>>
<p class="narrator">Three times you choose where to go to ground: the stream, the thicket or the ridge. You'll hear where they're searching; sounds can lie. If they search where you hide twice, they have you.</p>
<div class="choice-container">
<<vchoice "Run" "Grove_Hunt_Quarry_Run" "move" "run">>
</div>
<</if>><<set _ghrR to $grove.hunt.run>>
<h2>The Hunt</h2>
<<if !_ghrR || !_ghrR.quarry>>
<p>The chase is over.</p>
<div class="choice-container"><<vchoice "Back to the Grove" "Location_VerdantOutpost" "move" "back">></div>
<<elseif _ghrR.outcome>>
<<if _ghrR.picks.length && _ghrR.picks[_ghrR.picks.length - 1] === _ghrR.rounds[_ghrR.picks.length - 1].spot>>
<p>A hand closes in your hair. Another on your wrist.</p>
<<else>>
<p>The voices go past, and on, and fade.</p>
<</if>>
<div class="choice-container">
<<if _ghrR.outcome === "caught">>
<<vchoice "Turn and face them" "Grove_Hunt_Quarry_Caught" "action" "submit">>
<<else>>
<<vchoice "Make for the stones" "Grove_Hunt_Quarry_Free" "move" "run">>
<</if>>
</div>
<<else>>
<<if _ghrR.round > 0>>
<<if _ghrR.picks[_ghrR.round - 1] === _ghrR.rounds[_ghrR.round - 1].spot>>
<p>They nearly had you. A spear point went into the bracken a foot from your face, and you were up and running before the huntress could pull it out. They know where you are now.</p>
<<else>>
<p>They searched the wrong place. You heard them crashing about off toward the <<= _ghrR.rounds[_ghrR.round - 1].spot>>, swearing, while you lay flat and kept your breathing slow.</p>
<</if>>
<</if>>
<<set _ghrC to _ghrR.rounds[_ghrR.round].clue>>
<p>Choice <<= _ghrR.round + 1>> of <<= _ghrR.rounds.length>>. They've found you <<= _ghrR.hits>> time<<if _ghrR.hits !== 1>>s<</if>>; twice and they have you.</p>
<<if _ghrC === "stream">>
<p>Splashing behind you, downhill, and a woman's laugh: someone's wading the stream.</p>
<<elseif _ghrC === "thicket">>
<p>Branches cracking in the hazel thicket, and a voice calling "here, vault boy, here, boy," like you're a dog.</p>
<<else>>
<p>A whistle from up on the ridge, short and sharp, and an answering one: they're spreading out along the top.</p>
<</if>>
<div class="choice-container">
<<for _ghrS range setup.COVENANT.hunt.spots>>
<<capture _ghrS>>
<<link `'<span class="choice-button action"><span class="gi gi-stealth gi-large"></span><span class="label">Hide by the ' + _ghrS + '</span></span>'`>><<run setup.groveHuntChoose(_ghrS)>><<goto "Grove_Hunt_Quarry_Run">><</link>>
<</capture>>
<</for>>
</div>
<</if>><<set $player.lust to Math.min(100, ($player.lust || 0) + 20)>>
<<advanceTime 1>>
<h2>The Hunt</h2>
<<storyVideo "story/grove_hunt/quarry_caught">>
<p>They bring you down in the leaf litter, three of them, laughing and out of breath. A knee in your back, then a hand rolling you over. The tallest one sets the butt of her spear on the ground beside your head and stands over you, one foot on your chest, her bow across her shoulders, flushed from the run.</p>
<<say "Huntress" "Caught. Look at him, all scratched up. ...Sundown's a long way off, sisters.">>
<p>The other two are already pulling at your belt.</p>
<div class="choice-container">
<<vchoice "Let the huntresses have their catch" "Grove_Hunt_Quarry_Ridden" "action" "submit">>
</div><<set _ghdR to $grove.hunt.run>>
<<if _ghdR && _ghdR.quarry && !_ghdR.done>>
<<run setup.groveHuntDone()>>
<<set $player.lust to 0>><<run setup.playerReleased()>>
<<set $player.energy to Math.max(0, ($player.energy || 0) - 20)>>
<<advanceTime 3>>
<</if>>
<h2>The Hunt</h2>
<<storyVideo "story/grove_hunt/quarry_ridden">>
<p>The tall one goes first. <<if _storyClip is "feb1a1d88a48">>They drag you out of the leaf litter into a patch of open grass, and she drops her leathers, straddles you<<else>>She drops her leathers in the leaves, straddles you right there on the forest floor<</if>> and rides you hard, hands braced on your chest, her hair coming loose, while the other two hold your wrists down and watch and wait their turn. When she's had enough she climbs off and the next one takes her place, and then the next.</p>
<<storyVideo "story/grove_hunt/quarry_ridden_2_facesit">><<set _w26a to _storyClip>>
<p><<if _storyClip is "b6a019d63eb1">>The third one rides you while the second kneels beside her<<else>>The second one sits on your face while the third rides you<</if>>, and they lean in and kiss each other over your chest, tongues and all, <<if _storyClip is "b6a019d63eb1">>her fingers working between the rider's legs<<else>>grinding down on you from both ends<</if>>.</p>
<<say "Huntress" "Don't you dare come yet, quarry.">>
<p>You do. They laugh and slap your thigh, and the next one works your cock hard with her fist before you've even gone soft and climbs on. By the fourth time it hurts, and they make you come anyway, and laugh harder at the face you make.</p>
<p>It goes on most of the afternoon. They take turns, they take breaks, they eat bread and cheese sitting on a log and come back to you. You lose count of how many times. At sundown they pour a waterskin over your head and walk you back to the gate between them, barefoot, with your shirt over your shoulder.</p>
<<say "Huntress" "Sentence served. Run again sometime. You're terrible at it.">>
<p class="narrator">Your sentence is served. Energy -20.</p>
<div class="choice-container">
<<vchoice "Back to the Grove" "Location_VerdantOutpost" "move" "back">>
</div><<set _ghfR to $grove.hunt.run>>
<<if _ghfR && _ghfR.quarry && !_ghfR.done>>
<<run setup.groveHuntDone()>>
<<set $player.energy to Math.max(0, ($player.energy || 0) - 15)>>
<<advanceTime 1>>
<</if>>
<h2>The Hunt</h2>
<p>You break out of the trees at a dead run and slap your palm flat against the nearest boundary stone, and behind you, from back in the woods, the horn goes three times. Then there's a long, disappointed silence.</p>
<p>The huntresses come out of the trees a few minutes later and stand looking at you, spears on their shoulders. The tall one shakes her head slowly.</p>
<<say "Huntress" "Well. That's a waste of a good afternoon. ...Next time, vault boy.">>
<p class="narrator">You outran the Hunt. Your sentence is served, and the Covenant respects a man who runs well: +<<= setup.COVENANT.rep.huntQuarryEscaped>> standing. Energy -15.</p>
<div class="choice-container">
<<vchoice "Walk back to the Grove" "Location_VerdantOutpost" "move" "back">>
</div><<advanceTime 0 `setup.COVENANT.time.raid`>>
<<run VaultUI.setBackgroundDirect(setup.GROVE_BG.woods)>>
<h2>Horns on the East Wall</h2>
<<storyVideo "story/grove_raid/wall">>
<p>A horn, then three more, ragged and close, from the trees beyond the east wall. Then the screaming starts.</p>
<p>They come over the wall on ropes and ladders of lashed branches: women, a dozen at least, half-naked and painted in red ochre from brow to belly, hair knotted with bone and feathers, every one of them carrying a spear taller than she is. The Warband. Not the ragged crews you've traded shots with on the roads: the old blood of the Crimson, the ones who sold the Lady her red-haired healer. They're not here for scrap. Two of them already have a Covenant man down in the grass by the greenhouse, a rope round his neck, laughing as they drag him toward the wall like a deer.<<if _storyClip is "4510d6c81d2e">> Down by the fishpond a knot of them has one of the Covenant's gardeners roped to a birch, while they crowd in round her, jeering in her face.<</if>></p>
<<say "Covenant warden" "Vault boy! The east gate! They're at the side gate, they'll have it open in a minute. Hold it or we lose every man on the estate!">>
<<if setup.kiraWithYou()>>
<<say "Kira" "Spears. Fucking spears. Who brings a spear to... okay. Okay. Your call. Quick.">>
<</if>>
<p>The side gate is twenty paces away. Two of the painted women are already at it, working the bar loose. One of them sees you coming, and grins, and points her spear at you, and says something to the other in a language you don't know. The other one laughs.</p>
<div class="choice-container">
<<link `'<span class="choice-button action"><span class="gi gi-sword gi-large"></span><span class="label">Hold the gate</span></span>'`>><<groveRaidFight>><</link>>
<<vchoice "Pull the bar and let them in (a crime)" "Grove_Raid_LetIn" "action" "unlocked">>
</div><<run VaultUI.setBackgroundDirect(setup.GROVE_BG.grounds)>>
<<if !$grove.raid.done>><<run setup.groveRaidDone("defended")>><</if>>
<h2>The Gate Holds</h2>
<p>The second spear-woman goes down against the gatepost and doesn't get up. Over the wall the horns are blowing again, a different call, and the painted women are going back up their ropes as fast as they came down, three Covenant men short of what they came for. One of them stops on top of the wall long enough to look straight at you and shout something. You don't need the words.</p>
<p>Down by the fishpond, two gardeners are sawing one of their own loose from a birch with a kitchen knife: a big blonde in a torn shift, shaking, scratched and furious, but whole. The moment her hands are free she spits at the wall where the Warband went over.</p>
<p>Lady Selene comes down from the Main House when it's over, in a silk robe with a pistol in her hand that she never fired. She looks at the bodies at the gate, and at you, for a long time.</p>
<<say "Lady Selene" "Rhagna's women. The Warband. They've never come over the wall before. They'll come again.">>
<<say "Lady Selene" "I owe you, vault boy. Don't make me say it twice. And don't, for one moment, think it makes you anything more than useful.">>
<<if setup.kiraWithYou()>>
<<say "Kira" "Did she just say thank you? To you? Write the date down.">>
<</if>>
<p class="narrator">You held the gate. The Covenant owes you one. The Warband will remember you too.</p>
<div class="choice-container">
<<vchoice "Back to the Grove" "Location_VerdantOutpost" "move" "back">>
</div><<run VaultUI.setBackgroundDirect(setup.GROVE_BG.woods)>>
<<if !$grove.raid.done>>
<<run setup.groveRaidDone("lost")>>
<<set $player.lust to 10>><<run setup.playerReleased()>>
<</if>>
<h2>Dragged Off</h2>
<<storyVideo "story/grove_raid/dragged">>
<p>A spear butt takes your legs out from under you, and then there's a rope round your neck and another round your wrists, and you're being hauled through the side gate and up over the bank into the trees with three Covenant men stumbling along on the same rope behind you.</p>
<p>They don't go far. <<if _storyClip is "286d68d08f3f">>On an open grassy slope above the woods<<else>>In a clearing a mile into the woods<</if>> they throw you down and stand over you, spears planted, talking over you in their own tongue. Then one of them <<if _storyClip is "c1d6cdfd78cf" or _storyClip is "286d68d08f3f">>turns her back on you and straddles you facing away,<<else>>kneels astride you<</if>> and tears your trousers open with the blade of her spear, so close to your skin you stop breathing.</p>
<<say "Spear-woman" "Hah. Covenant man. Soft. Let us see.">>
<p>She takes your cock in her hand and works it until you're hard, which takes no time at all, and she laughs at that and says something that makes the others laugh too. Then she sinks down onto you all the way, hot and tight and slick, and <<if _storyClip is "1eff1b5510b8">>rocks, slow, two fingers working her own clit<<else>>rides you, slamming her hips down, grunting<</if>>. <<if _storyClip is "c1d6cdfd78cf">>They tied your wrists in front of you, so the only place your hands can go is her hips, and she lets them. <</if>>The others watch, and wait their turns, and one of them crouches by your head and holds your jaw so you have to watch her sister fuck you.</p>
<<storyVideo "story/grove_raid/lost_2_next">><<set _w26a to _storyClip>>
<p>You last longer than you'd like and not as long as she would. She grinds out her own finish on you, her cunt clenching round you, then she climbs off and lets the next one on, and the next. By the time the third is riding you you've come twice and can't tell any more if you're fighting the rope or pushing up into her.</p>
<<say "Spear-woman" "Rhagna will want this one. Not today. Next time.">>
<p>At dawn they cut the rope from your neck, leave your wrists tied, and go off through the trees with the Covenant men in a line behind them. It takes you an hour to work your hands free and another to limp back to the Grove's gate.</p>
<<if $grove.kiraDownHome>>
<p>Kira's at the gate where the wardens dragged her, laid out on a blanket in the gatehouse, still out cold. Nobody has been able to wake her.</p>
<<elseif setup.kiraWithYou()>>
<p>Kira's at the gate with a split lip and a warden's rifle, waiting. She doesn't say anything at first. She looks at the rope burns on your neck.</p>
<<say "Kira" "I couldn't get to you. There were six of them on me. ...Who the fuck are these people?">>
<</if>>
<p class="narrator">The Warband took you and let you go. Rhagna, their queen, will want a look at you next time.</p>
<div class="choice-container">
<<if $grove.kiraDownHome>>
<<link `'<span class="choice-button move"><span class="gi gi-house gi-large"></span><span class="label">Take Kira home</span></span>'`>><<advanceToHour 7>><<goto "Grove_Kira_Carry_Home">><</link>>
<<else>>
<<link `'<span class="choice-button move"><span class="gi gi-back gi-large"></span><span class="label">Back to the Grove</span></span>'`>><<advanceToHour 7>><<goto "Location_VerdantOutpost">><</link>>
<</if>>
</div><<run VaultUI.setBackgroundDirect(setup.GROVE_BG.grounds)>>
<<if !$grove.raid.done>>
<<run setup.groveRaidDone("letIn")>>
<<set $player.lust to 20>><<run setup.playerReleased()>>
<</if>>
<h2>The Side Gate</h2>
<<storyVideo "story/grove_raid/letin">>
<p>You put your shoulder to the bar and lift it. The gate swings in, and the painted women flood through past you like water, whooping, spears up, and the screaming in the Grove goes up a pitch.</p>
<p>The one who grinned at you stays. She looks at the open gate, and at you, and laughs, and then she has you by the shirt and up against the gatepost with her spear across your chest. She kisses you with her teeth. Her free hand is already down your trousers.</p>
<<say "Spear-woman" "Good man. Gate-man. Rhagna says, reward.">>
<p><<if _storyClip is "198c7108a838">>She hauls you out through the gate and into the trees and slams your back against the first trunk she comes to. She drops to her knees<<elseif _storyClip is "9363caf7b506">>She shoves you along the wall to the gatehouse porch and pins you to its boards. She squats down on her heels in front of you<<else>>She drops to her knees in the mud by the gate<</if>> and takes your cock in her mouth, fast and greedy and deep, while behind her the Warband drags Covenant men out past you on ropes. She doesn't stop until you come down her throat, and then she stands, wipes her mouth with the back of her hand, and slaps your cheek, almost tender.</p>
<<say "Spear-woman" "Next time, gate-man. We come for you.">>
<p>The horns blow. They're gone over the wall with five Covenant men in tow. The wardens are already looking at the open gate, and then at you.</p>
<<if setup.kiraWithYou()>>
<<say "Kira" "...You let them in. You actually let them in. Oh, they're going to fucking hang you.">>
<</if>>
<div class="choice-container">
<<vchoice "Back to the Grove" "Location_VerdantOutpost" "move" "back">>
</div><<advanceTime 0 `setup.COVENANT.time.audience`>>
<<run VaultUI.setBackgroundDirect(setup.GROVE_BG.seleneRooms)>>
<<set $grove.audience4.offered to true>>
<h2>The Lady's Rooms</h2>
<<storyVideo "story/grove_selene_4/offer">>
<p>Her rooms are at the top of the Main House, under the roof: a bed you could lose a family in, a dressing table crowded with bottles, windows open on the orchard. Selene is <<if _storyClip is "5fd6b9df59b7">>waiting for you by the counter of a kitchen of her own<<else>>sitting at the dressing table in a black slip with her back to you, brushing out her hair, and she watches you come in through the mirror<</if>>.</p>
<<say "Lady Selene" "Inner Circle. Do you know how many men have made Inner Circle? None. I've had women in it. I've never had a man. I don't like it.">>
<p>You ask her about Sera. She <<if _storyClip is "5fd6b9df59b7">>goes still<<else>>puts the brush down<</if>>.</p>
<<say "Lady Selene" "Your red-haired healer. Yes. She passed through here, on her way somewhere better for her and worse for you. The Den. Madam Silk's house. I know where it is. Not many do.">>
<<say "Lady Selene" "Here's the price. You stay. You keep my Center full and my yield up, and when I call you, you come, whatever you're doing and whoever you're doing it with. You're mine, vault boy, the way the Grove is mine. Give me that, and I'll tell you where the Den is. And the board can go hang: the Inner Circle doesn't do chores.">>
<<if setup.kiraWithYou()>>
<p>Kira is waiting on the landing outside, where they made her stay. You can feel her listening through the door.</p>
<</if>>
<div class="choice-container">
<<vchoice "Give her your word" "Grove_Selene4_Earned" "action" "handshake">>
<<vchoice "Not at that price. Not yet." "Grove_Selene4_Refused" "action" "shield">>
</div><<run VaultUI.setBackgroundDirect(setup.GROVE_BG.seleneRooms)>>
<<if setup.groveEarn()>>
<<set $player.lust to 20>><<run setup.playerReleased()>>
<<journalAdd "Lady Selene told me where the Den is: Madam Silk's house, south-west of the vault, where Sera was sold on. The price: I'm hers now, and her Center's. Find Sera at the Den." "story">>
<</if>>
<h2>Sealed</h2>
<<storyVideo "story/grove_selene_4/seal">>
<p>You give her your word. She <<if _storyClip is "db060a41df74">>makes you wait while she pulls a dress on, slowly,<<else>>turns round on the stool, slowly,<</if>> and looks at you as if she's deciding where to put you.<<if _storyClip is "db060a41df74">> Then she walks into her bathroom without a word, and you follow.<</if>></p>
<<say "Lady Selene" "Words. Men are very free with words. On your back. A bargain like this, I seal myself.">>
<p>You lie down on <<if _storyClip is "db060a41df74">>the cold tiles beside her bath<<else>>her sheets<</if>>. She stands over you and <<if _storyClip is "db060a41df74">>tugs the dress down off her shoulders to her waist<<else>>lets the slip fall, and she's all soft heavy curves and pale skin and platinum hair between her thighs<</if>>, and she knows exactly what it does to you. She <<if _storyClip is "db060a41df74">>steps over you, hitches the dress up round her waist, and squats down slowly, reaching back for your cock,<<else>>climbs onto the bed on her knees, takes your cock in her fist like she's weighing it,<</if>> and lowers herself onto it, an inch at a time, watching your face the whole way down.</p>
<<say "Lady Selene" "There. Mine. Every drop of you belongs to my Center now. Don't you dare come until I tell you.">>
<<if _storyClip is "db060a41df74">>
<<set _w26clip to _storyClip>><<set _w26fam to _storyFamily>><<storyVideo "story/grove_selene_4/seal_2_ride">><<set _w26a to _storyClip>><<set _storyClip to _w26clip>><<set _storyFamily to _w26fam>>
<</if>>
<p>She rides you slow and deep, <<if _storyClip is "db060a41df74">>squatting over you with one hand braced on the vanity behind her<<else>>rolling her hips, her big tits swaying over your face<</if>>, and every time you start to move under her she stops dead and waits, smiling, until you stop. It goes on and on. She comes once, quietly, her cunt rippling round you, her nails in your <<if _storyClip is "db060a41df74">>thigh<<else>>chest<</if>>, and doesn't stop. When she finally leans down to your ear and whispers "Now," you come so hard inside her that your back comes <<if _storyClip is "db060a41df74">>up off the tiles<<else>>off the bed<</if>>.</p>
<p>She stays on you until you've softened, then climbs off and <<if _storyClip is "db060a41df74">>pulls her dress back up over her shoulders and fixes her hair<<else>>pulls on her slip and goes back to the dressing table<</if>> as if nothing happened, and tells your reflection in the mirror where the Den is.</p>
<<say "Lady Selene" "South-west of that hole you live in. A collapsed storefront in the ruins of a little town, a bunker underneath. Silk will know my name. Don't use it unless you have to. Go on. Go and find your healer. Then come home to me.">>
<p class="discovery-note"><<icon "map">> New place on your map: The Pleasure Den.</p>
<p class="narrator">The Lady's bargain: the Inner Circle owe no weekly assignment. The board is yours to take or leave.</p>
<div class="choice-container">
<<if setup.kiraWithYou() && !$grove.kira.denTalk>>
<<vchoice "Go out to Kira on the landing" "Grove_Earned_Kira" "move" "forward">>
<<else>>
<<vchoice "Back to the Grove" "Location_VerdantOutpost" "move" "back">>
<</if>>
</div><<run VaultUI.setBackgroundDirect(setup.GROVE_BG.seleneRooms)>>
<<set _gekMood to setup.groveKiraReturnMood()>>
<<if setup.groveKiraDenTalkDone()>>
<<if _gekMood === "angry">><<relationChange "kira" "trust" `setup.COVENANT.kiraDen.earnedAngry`>><</if>>
<</if>>
<h2>The Landing</h2>
<p>Kira is sitting on the top stair with her arms round her knees, exactly where the wardens left her. The Lady's door is thick oak. It wasn't thick enough. She heard every word, and every sound after the words, and you can see it on her.</p>
<<if _gekMood === "angry">>
<<say "Kira" "Mine. That's what she said, wasn't it? Every drop of you. And you lay there and let her.">>
<p>She stands up before you can answer.</p>
<<say "Kira" "Don't. I know why. Sera. The Den. I'd have done it too, probably. ...I'd have hated myself after. You don't look like you hate yourself. That's the bit I can't stand.">>
<p>She goes down the stairs ahead of you and doesn't wait.</p>
<<elseif _gekMood === "numb">>
<<say "Kira" "So. Now we know where the Den is.">>
<p>She gets up, dusts off her trousers, and doesn't look at you.</p>
<<say "Kira" "She's going to call you up here whenever she's bored. You know that. And you're going to come, because you promised. ...Fine. That's your leash. Just don't ever ask me to hold the other end.">>
<<else>>
<p>Her face is red to the ears. She stands up too fast and nearly goes down the stairs.</p>
<<say "Kira" "I heard you. When she said 'now.' The whole fucking house heard you.">>
<p>She grabs your shirt and pulls you down the first turn of the stairs, out of sight of the Lady's door, and shoves you against the wall and kisses you, hard, with teeth, until you taste blood.</p>
<<say "Kira" "That's mine. Whatever you promised her up there, that's mine. ...Now walk me out of this house before I go back in and stab her.">>
<</if>>
<div class="choice-container">
<<vchoice "Back to the Grove" "Location_VerdantOutpost" "move" "back">>
</div><<run VaultUI.setBackgroundDirect(setup.GROVE_BG.seleneRooms)>>
<<if $grove.audience4.refusedDay !== $time.day>>
<<set $grove.audience4.refusedDay to $time.day>>
<<set $grove.audience4.refused to ($grove.audience4.refused || 0) + 1>>
<</if>>
<h2>Not Yet</h2>
<p>You tell her not at that price. She turns her back on you, as if you'd already gone.</p>
<<say "Lady Selene" "Then you'll have to take it from me, won't you? Come up to my rooms after a Planting, when my women are spent and I'm alone, and try. You won't. You haven't the spine. Go away. The offer stands, because I'm generous, and because I'll enjoy watching you crawl back for it.">>
<div class="choice-container">
<<vchoice "Back to the Grove" "Location_VerdantOutpost" "move" "back">>
</div><<advanceTime 0 `setup.COVENANT.time.taken`>>
<<run VaultUI.setBackgroundDirect(setup.GROVE_BG.seleneRooms)>>
<h2>Her Rooms, After</h2>
<<storyVideo "story/grove_selene_taken/corner">>
<p>The Main House is asleep, the hall still stinking of the Planting. You go up the back stairs to the top of the house, where nobody but the Lady goes, and you don't knock.</p>
<p>Selene is <<if _storyClip is "15935484418b">>standing by the shuttered doors, halfway through unhooking herself for bed<<else>>at her dressing table in a black slip, taking the pins out of her hair<</if>>. She sees you<<if _storyClip is "15935484418b">><<else>> in the mirror<</if>> and her hand stops.</p>
<<say "Lady Selene" "Get out. Get out of my rooms, or I'll have you at the post until you can't remember your own name.">>
<p>You shut the door behind you and tell her you want to know where the Den is. Now.</p>
<<say "Lady Selene" "You want. You. You're my breeding stock, vault boy, a cock on a leash. You don't want things.">>
<p class="narrator">This is the other way to the Den. Once you take it, the Grove is closed to you for good: no shops, no Center, no register, and a price on your head until you pay hers. The Lady's bargain will be gone.</p>
<div class="choice-container">
<<vchoice "Take it from her" "Grove_Selene_Taken_Fight" "action" "dominant">>
<<vchoice "Leave her rooms" "Location_VerdantOutpost" "move" "back">>
</div><<run VaultUI.setBackgroundDirect(setup.GROVE_BG.seleneRooms)>>
<h2>She Fights</h2>
<<storyVideo "story/grove_selene_taken/fight">>
<p><<if _storyFamily is "sf_cg_grove_selene_taken_01">>She snatches a dress off the chair and drags it on as she runs, and bolts for her bathroom to throw the bolt on you.<<else>>She's off the stool and going for the bell-pull before you've crossed the room.<</if>> <<if _storyFamily is "sf_cg_grove_selene_taken_01">>You get your shoulder in the door before she can. She backs away from you into the shower,<<else>>You catch her wrist an inch from it. She turns on you like a cat,<</if>> all nails and teeth, rakes four bloody lines down your neck, drives a knee at your groin that you only half turn from, and screams for her wardens, once, before your hand is over her mouth.</p>
<p>She bites it. You don't let go. You <<if _storyFamily is "sf_cg_grove_selene_taken_01">>spin her round and shove her up against the tiles<<else>>walk her backwards across the room with her heels kicking and her nails in your forearm and throw her face down across her own bed<</if>>, and pin her there with your <<if _storyFamily is "sf_cg_grove_selene_taken_01">>hip<<else>>weight, her wrists twisted up her back in one hand<</if>>.</p>
<<say "Lady Selene" "You filthy little... get off me. Get OFF me! Do you know what I'll do to you? I'll have you gelded. I'll have them hang you from the east wall by your—">>
<p>You shove the <<if _storyFamily is "sf_cg_grove_selene_taken_01">>dress<<else>>slip<</if>> up over her hips. She's bare under it. She bucks <<if _storyFamily is "sf_cg_grove_selene_taken_01">>back against<<else>>under<</if>> you like she can throw you, and swears at you, things you've never heard out of a woman, and when you get your trousers open and your cock against her she goes rigid and spits <<if _storyFamily is "sf_cg_grove_selene_taken_01">>at the tiles<<else>>into the sheets<</if>>.</p>
<<say "Lady Selene" "Don't you dare. Don't you dare. I'll never tell you. Never.">>
<<if _storyFamily is "sf_cg_grove_selene_taken_01">>
<<set _w26clip to _storyClip>><<set _w26fam to _storyFamily>><<storyVideo "story/grove_selene_taken/fight_2_entry">><<set _w26a to _storyClip>><<set _storyClip to _w26clip>><<set _storyFamily to _w26fam>>
<</if>>
<p>She's wet. She knows you can feel it. She hates you for feeling it. You push into her cunt <<if _storyFamily is "sf_cg_grove_selene_taken_01">>from behind <</if>>in one long stroke, all the way, and the sound she makes <<if _storyFamily is "sf_cg_grove_selene_taken_01">>against the tiles<<else>>into the pillow<</if>> isn't a scream.</p>
<div class="choice-container">
<<vchoice "Break her" "Grove_Selene_Taken_Broken" "action" "dominant">>
</div><<run VaultUI.setBackgroundDirect(setup.GROVE_BG.seleneRooms)>>
<<if setup.groveTake()>>
<<set $player.lust to 20>><<run setup.playerReleased()>>
<<journalAdd "I forced the Den's whereabouts out of Lady Selene in her own rooms. Madam Silk's house, south-west of the vault, where Sera was sold on. The Grove will never have me back now, and there's a price on my head until I pay hers. Find Sera at the Den." "story">>
<</if>>
<h2>She Breaks</h2>
<<storyVideo "story/grove_selene_taken/broken">>
<p>You fuck her hard and slow, and you ask her again with every stroke. Where is it. She curses you. She tells you you're nothing. She tells you she'll have you fed to the Center's men. Her hips start coming back to meet you before she's finished the sentence.</p>
<<say "Lady Selene" "I won't... oh, you bastard, you fucking... I won't...">>
<<if _storyFamily is "sf_cg_grove_selene_taken_01">>
<<set _w26clip to _storyClip>><<set _w26fam to _storyFamily>><<storyVideo "story/grove_selene_taken/broken_2_mirror">><<set _w26a to _storyClip>><<set _storyClip to _w26clip>><<set _storyFamily to _w26fam>>
<</if>>
<p>You keep going. You <<if _storyFamily is "sf_cg_grove_selene_taken_01">>haul her out of the shower by the hips, bend her over her own vanity and push back into her from behind,<<else>>pull her up by the hair<</if>> so she has to look at the two of you in <<if _storyFamily is "sf_cg_grove_selene_taken_01">>the big mirror over the basin<<else>>her own dressing-table mirror<</if>>, her face flushed and wet and furious, and you ask her again. She shuts her eyes. She comes on your cock with a long broken wail that she muffles in her own forearm, shaking all the way down her body, and you don't stop, and you ask her again.</p>
<p>And she tells you. In a whisper, <<if _storyFamily is "sf_cg_grove_selene_taken_01">>against the marble<<else>>into the sheets<</if>>, between gasps: south-west of your vault, a collapsed storefront in the ruins of a little town, a bunker underneath. Madam Silk. She says it twice, because you make her, and the second time she's sobbing, and you're not sure it's only from shame.</p>
<p>You come inside her with her name for you still in her mouth. Then you let go of her<<if _storyFamily is "sf_cg_grove_selene_taken_01">><<else>> wrists<</if>>. She doesn't move.</p>
<<say "Lady Selene" "Get out. Get out of my Grove. If I ever see your face inside my wall again I'll have it cut off and nailed to the gate.">>
<p>Somewhere downstairs a door bangs, and boots start up the stairs.</p>
<p class="discovery-note"><<icon "map">> New place on your map: The Pleasure Den.</p>
<div class="choice-container">
<<vchoice "Run" "Grove_Selene_Taken_Run" "move" "run">>
</div><<run VaultUI.setBackgroundDirect(setup.GROVE_BG.woodsNight)>><<setTimeOfDay "night">>
<<set $currentLocation to "greenhollow">>
<h2>Over the Wall</h2>
<p>Out of the window, across the scullery roof, down the drainpipe into the herb garden. Lanterns going on all over the estate behind you, the bell on the Main House clanging, wardens shouting your name.</p>
<<if setup.kiraWithYou()>>
<p>Kira gets to the east wall before you do, a coil of washing line over her shoulder and her knife back in her belt, and she doesn't ask. She takes one look at the scratches on your neck and your face and throws you the rope.</p>
<<say "Kira" "You did it, didn't you. You actually fucking did it. Climb. Talk later. Climb!">>
<<set $grove.kira.denLater to true>>
<<else>>
<p>You go over the east wall and drop into the dark trees on the other side, and run.</p>
<</if>>
<p class="narrator">The Grove is closed to you now. There's a price on your head (<<= setup.groveBountyFine()>> scrap, paid at the gate) and the Covenant's huntresses will be on the roads.</p>
<div class="choice-container">
<<vchoice "Into the woods" "WorldMap_View" "move" "map">>
</div><<run VaultUI.setBackgroundDirect(setup.GROVE_BG.grounds)>>
<<set $currentLocation to "greenhollow">>
<h2>The Shut Gate</h2>
<<if setup.groveHostile()>>
<p>The iron gate is chained now. On the post beside it somebody has nailed a board with a crude drawing of a man with a noose round his neck, and under it, in red paint: <strong>NEVER AGAIN INSIDE THESE WALLS</strong>. The women on the wall watch you come with their rifles up.</p>
<<else>>
<p>The iron gate is still chained. The noose board is gone from the post, torn down the day you paid, but somebody has painted the same words in red straight onto the stone of the gatepost, where no warden will ever bother to scrub them off: <strong>NEVER AGAIN INSIDE THESE WALLS</strong>. The women on the wall watch you come with their rifles up.</p>
<</if>>
<<if setup.groveHostile()>>
<<say "Warden" "The Lady's price is on your head, vault boy. <<= setup.groveBountyFine()>> scrap. Pay it and the huntresses stop looking for you. It won't get you through this gate. Nothing will.">>
<<else>>
<<say "Warden" "Paid up, are you? Good for you. The Lady says you may buy at the Exchange and the Armory, at her prices, with us beside you. Anywhere else, we shoot.">>
<</if>>
<<scrapBalance>>
<div class="choice-container">
<<if setup.groveHostile()>>
<<if setup.groveBountyCanPay()>>
<<vchoice `"Pay the Lady's price (" + setup.groveBountyFine() + " scrap)"` "Grove_Wanted_Pay" "action" "scrap">>
<<else>>
<<vchoiceDisabled `"Pay the Lady's price (" + setup.groveBountyFine() + " scrap, you have too little)"` "action" "scrap">>
<</if>>
<</if>>
<<if $grove.sneak.day !== $time.day>>
<<if setup.groveSneakKiraCan()>>
<<link `'<span class="choice-button action"><span class="gi gi-stealth gi-large"></span><span class="label">Go over the wall after dark with Kira (she knows the wardens\' rounds)</span></span>'`>><<set $grove.sneak.kiraHelp to true>><<goto "Grove_Sneak">><</link>>
<<elseif setup.kiraWithYou()>>
<<vchoiceDisabled "Go over the wall with Kira (she doesn't trust you enough to risk it)" "action" "stealth">>
<</if>>
<<link `'<span class="choice-button action"><span class="gi gi-stealth gi-large"></span><span class="label">Go over the wall after dark' + (setup.kiraWithYou() ? ', alone' : '') + ' (if they see you, they\'ll take you)</span></span>'`>><<set $grove.sneak.kiraHelp to false>><<goto "Grove_Sneak">><</link>>
<<else>>
<<vchoiceDisabled "Go over the wall after dark (not again tonight)" "action" "stealth">>
<</if>>
<<if setup.groveTakenShops()>>
<<vchoice "The Exchange (the Lady's prices)" "Grove_Exchange" "action" "market">>
<<vchoice "The Armory (the Lady's prices)" "Grove_Armory" "action" "market">>
<<vchoiceDisabled "The Center, the board (closed to you)" "action" "market">>
<<else>>
<<vchoiceDisabled "The Exchange, the Center, the board (closed to you)" "action" "market">>
<</if>>
<<vchoice "Leave" "WorldMap_View" "move" "map">>
</div><<run VaultUI.setBackgroundDirect(setup.GROVE_BG.woodsNight)>><<setTimeOfDay "night">>
<<if $grove.sneak.day !== $time.day>>
<<if $time.hour >= 6 && $time.hour < 22>><<advanceToHour 22>><</if>>
<<advanceTime 0 `setup.COVENANT.time.sneak`>>
<<set $grove.sneak.seen to setup.groveSneakCaught()>>
<</if>>
<h2>Over the Wall</h2>
<<if $grove.sneak.kiraHelp && setup.kiraWithYou()>>
<p>You wait in the trees with Kira until the lanterns on the wall go round twice. She counts under her breath. She learned the wardens' rounds<<if $grove.kira.times > 0>> the hard way, lying awake in the Cellars listening to their boots<<else>> from the guest villa's window, every night you stayed<</if>>, and she knows the one gap where nobody looks at the east wall for the time it takes to climb it.</p>
<<say "Kira" "Now. Go. Ivy, left of the drainpipe. Don't stop on top.">>
<p>You go over together and drop into the orchard side by side.</p>
<<else>>
<p>You wait in the trees until the lanterns on the wall go round twice, then go over where the ivy is thickest and drop into the orchard.</p>
<<if setup.kiraWithYou()>>
<p>Kira stays on the far side of the wall to keep watch. Two of you would make twice the noise.</p>
<</if>>
<</if>>
<<if $grove.sneak.seen>>
<p>Your boot comes down on a rake in the long grass. The handle cracks off a tree like a shot. A lantern swings your way, then another, and then a whistle, the low short one you remember from the roads.</p>
<<say "Covenant huntress" "There he is. The Lady's breaker. Oh, sweetheart. She's going to be so pleased with us.">>
<div class="choice-container">
<<link `'<span class="choice-button action"><span class="gi gi-sword gi-large"></span><span class="label">Fight your way out</span></span>'`>><<groveSneakFight>><</link>>
<<vchoice "Give yourself up" "Grove_Sneak_Taken" "action" "submit">>
</div>
<<else>>
<p>Nobody comes. The Grove sleeps around you: dark villas, the greenhouse glinting, a single lit window high in the Main House where somebody isn't sleeping at all.</p>
<div class="choice-container">
<<if $grove.sneak.lootDay !== $time.day>>
<<vchoice "Break into the Exchange's stores" "Grove_Sneak_Stores" "action" "stealth">>
<</if>>
<<vchoice "Back over the wall" "WorldMap_View" "move" "map">>
</div>
<</if>><<run VaultUI.setBackgroundDirect(setup.GROVE_BG.stores)>><<setTimeOfDay "night">>
<<run setup.groveSneakLoot()>>
<h2>The Stores</h2>
<p>The lock on the Exchange's back room is the same one they had when you were a guest. You've watched the keeper open it a dozen times. Inside, by the light of your own match, you fill your pack with whatever's nearest, and under the counter, where it always was, you find the keeper's cashbox. It's locked. It's also tin. Your knife opens it in two twists.</p>
<<if $grove.sneak.kiraHelp && setup.kiraWithYou()>>
<p>Kira holds the match and keeps one ear on the yard, and stuffs her own pack while you work on the box.</p>
<<say "Kira" "Tins, bandages, and that. Leave the ledger, it's not worth the weight. ...Okay, take the ledger. I want to watch her face when she finds it gone. No. Leave it. Go.">>
<</if>>
<<if $grove.sneak.lootNames && $grove.sneak.lootNames.length>>
<p class="loot-found">Taken: <<= $grove.sneak.lootNames.join(", ")>>.</p>
<<else>>
<p>Your pack is full. You can't carry a thing off the shelves.</p>
<</if>>
<<if $grove.sneak.lootScrap > 0>>
<p class="loot-found">The cashbox: <<= $grove.sneak.lootScrap>> scrap.</p>
<</if>>
<div class="choice-container">
<<vchoice "Back over the wall" "WorldMap_View" "move" "map">>
</div><<run VaultUI.setBackgroundDirect(setup.GROVE_BG.woodsNight)>><<setTimeOfDay "night">>
<h2>Gone</h2>
<p>You leave the second huntress groaning in the herb beds and go back over the wall with the bell clanging behind you. Nobody follows you into the trees. Not tonight.</p>
<div class="choice-container">
<<vchoice "Into the woods" "WorldMap_View" "move" "map">>
</div><<run VaultUI.setBackgroundDirect(setup.GROVE_BG.cellars)>>
<<if !$grove.bounty.serving>>
<<run setup.groveBountyCapture()>>
<<set $player.lust to Math.min(100, ($player.lust || 0) + 20)>>
<</if>>
<h2>Caught</h2>
<p>They have you face down in the wet grass with a rifle stock between your shoulder blades. One of them sits on your back while the other ropes your wrists, and they argue, cheerfully, over which of them gets to tell the Lady.</p>
<<if $grove.sneak.kiraHelp && setup.kiraWithYou() && !$grove.kiraDownHome>>
<p>Kira isn't under either of them. Somewhere off in the dark you hear the ivy rip and a body drop on the far side of the wall, and then, very faintly, the filthiest string of words you've ever heard from her. She got out. She'll be waiting.</p>
<</if>>
<<say "Covenant huntress" "Down to the Cellars with you. She'll want you on the post first thing. She said to tell you she'll be watching.">>
<div class="choice-container">
<<vchoice "Down to the Cellars" "Grove_Sentence_Post" "action" "lock">>
</div><<run VaultUI.setBackgroundDirect(setup.GROVE_BG.cellars)>>
<<set _gpNext to setup.pitNext()>>
<h2>The Pit</h2>
<p>A second stair goes down behind the Cellars, and the noise comes up it to meet you. At the bottom is one square of padded floor under hard lamps, and a crowd packed round it in the dark, shoulder to shoulder. It smells of sweat and lamp oil. Scrap changes hands at your elbow before you've found a place to stand.</p>
<<if setup.grovePit().watched is 0>>
<p>The woman who runs it stands at the edge of the floor, hands behind her back. Nobody down here uses her name. They call her the Ringmistress, and they make room for her.</p>
<<say "Ringmistress" "Favoured? Then you stand at the front. You watch, and you keep off my floor. One rule down here: whoever wins has the loser, right there, any way they like. They all know it before they step on.">>
<</if>>
<p><<if _gpNext is 1>>A bout is about to start. The crowd has two names in its mouth: Thistle for the woman, the Anvil for the man.<<elseif _gpNext is 2>>Thistle and the Anvil again today, and the cellar is packed to the stairs.<<elseif setup.grovePit().watched is 1>>The floor is empty, and a woman on her knees is scrubbing it down. One bout a day. Tomorrow Thistle gets the Anvil again.<<else>>The floor is empty today. You stand at the edge and look at it longer than you mean to.<</if>></p>
<div class="choice-container">
<<if _gpNext is 1>>
<<vchoice "Watch the bout" "Grove_Pit_First" "action" "voyeur">>
<<elseif _gpNext is 2>>
<<vchoice "Watch the rematch" "Grove_Pit_Rematch" "action" "voyeur">>
<<elseif setup.grovePit().watched is 1>>
<<vchoiceDisabled "Watch the rematch (tomorrow)" "action" "voyeur">>
<</if>>
<<if setup.pitCanAsk()>>
<<vchoice "Ask to fight" "Grove_Pit_Ask" "action" "muscle">>
<</if>>
<<vchoice "Back to the Grove" "Location_VerdantOutpost" "move" "back">>
</div><<run VaultUI.setBackgroundDirect(setup.GROVE_BG.cellars)>>
<<run setup.groveScene("cg_grove_pit_first")>>
<h2>The Pit</h2>
<<storyVideo "story/grove_pit_first/face_off">>
<<say "Ringmistress" "Knees and backs! Stand up before it's done and you've lost. Go.">>
<p>They go down on their knees in the middle of the floor and lock up, arms first, then forehead to forehead, pushing. For a few breaths nobody gives an inch.</p>
<<say "Odds man" "Four to one on the Anvil! Four to one, who'll have Thistle? Come on, look at the thighs on her!">>
<p>Scrap goes past your ear into his hand. A woman shoves in beside you to see better and stays there, her hip against yours.</p>
<div class="choice-container">
<<vchoice "Keep watching" "Grove_Pit_First_Struggle" "action" "voyeur">>
</div><<run VaultUI.setBackgroundDirect(setup.GROVE_BG.cellars)>>
<h2>The Pit</h2>
<<storyVideo "story/grove_pit_first/struggle">>
<p>He gets behind her. One pull and her top is hanging from his fist, held out in front of her where she can see it, and her tits are bare to the whole cellar. She tosses her head and yells something filthy out into the dark. Then his arm shuts across her chest.</p>
<p>The crowd roars for the cloth. Behind you two men are already arguing over who called it first.</p>
<<say "Woman" "Look at him. He isn't even breathing hard. I'd let that man pull mine off with his teeth.">>
<p>She says it into your ear and never takes her eyes off the floor.</p>
<div class="choice-container">
<<vchoice "Keep watching" "Grove_Pit_First_Stripped" "action" "voyeur">>
</div><<run VaultUI.setBackgroundDirect(setup.GROVE_BG.cellars)>>
<h2>The Pit</h2>
<<storyVideo "story/grove_pit_first/stripped">>
<p>She twists out of his arm and leaves the rest of her cloth behind doing it. He strips his own off himself and drops it. Then he goes after her on hands and knees, in no hurry at all, and she squats there bare in front of him and laughs in his face.</p>
<<say "Odds man" "Six to one now. Six! You, vault man, you've got scrap on you, I can smell it. No? Suit yourself. I'll tell you this for nothing: I'd give a week's take to have her laugh at me like that with her cunt out.">>
<div class="choice-container">
<<vchoice "Keep watching" "Grove_Pit_First_Turn" "action" "voyeur">>
</div><<run VaultUI.setBackgroundDirect(setup.GROVE_BG.cellars)>>
<h2>The Pit</h2>
<<storyVideo "story/grove_pit_first/turn">>
<p>It's over between one breath and the next. She is face down on the floor with her wrist caught in one of his fists, and he kneels astride her shoulders with the other arm free. He doesn't need it. He makes a muscle with it, slowly, looking down at her, and then he comes down over her on all fours.</p>
<<say "Odds man" "That's the bout. Pay up, pay up. Three years I've called his odds and I have never once seen that man out of breath. It isn't right.">>
<p>Nobody near you argues with him.</p>
<div class="choice-container">
<<vchoice "Keep watching" "Grove_Pit_First_Taken" "action" "voyeur">>
</div><<run VaultUI.setBackgroundDirect(setup.GROVE_BG.cellars)>>
<h2>The Pit</h2>
<<storyVideo "story/grove_pit_first/taken">>
<p>He takes what he's won. He kneels up between her legs, holds her leg up with one hand and fucks her like that, his other hand keeping her foot at his hip, as if she weighed nothing and he had all night. She lies there with her mouth open and looks up at him.</p>
<p>The betting has stopped. Now they only watch, and say what they see.</p>
<<say "Woman" "Hear that? That's how wet she is. She lost on purpose, I swear she did. I would. I'd lose to him every night of the week and thank him after.">>
<p>Her hand has found your arm. She doesn't seem to know it's there.</p>
<div class="choice-container">
<<vchoice "Keep watching" "Grove_Pit_First_Stands" "action" "voyeur">>
</div><<run VaultUI.setBackgroundDirect(setup.GROVE_BG.cellars)>>
<h2>The Pit</h2>
<<storyVideo "story/grove_pit_first/stands">>
<p>He turns her onto her hands and knees to finish. When he has, he gets to his feet, the first time anyone has stood up on that floor, and spreads his arms wide over her. He lets the cellar look at him. The cellar goes mad.</p>
<<say "Woman" "The last woman who went in with him hasn't fought since. She still comes down, though. Stands at the back and looks at him. Just looks.">>
<div class="choice-container">
<<vchoice "Keep watching" "Grove_Pit_First_Finish" "action" "voyeur">>
</div><<run VaultUI.setBackgroundDirect(setup.GROVE_BG.cellars)>>
<<if setup.pitCount(1)>><<advanceTime 1>><<run setup.pitStamp()>><<set $player.lust to Math.min(100, ($player.lust || 0) + 15)>><</if>>
<h2>The Pit</h2>
<<storyVideo "story/grove_pit_first/finish">>
<p>He walks off the floor grinning, straight past you, close enough that you feel the heat coming off him. The crowd opens for him and shuts again.</p>
<p>Thistle stays where he left her, face down, arms stretched out in front of her, alone under the lamps. All round you scrap is being counted out. Then she laughs into the padding, hoarse, and lifts her voice so the whole cellar gets it.</p>
<<say "Thistle" "Again. Tomorrow. Put him in front of me again.">>
<p>The Ringmistress looks down at her for a while, and nods.</p>
<div class="choice-container">
<<vchoice "Leave the pit" "Location_VerdantOutpost" "move" "back">>
</div><<run VaultUI.setBackgroundDirect(setup.GROVE_BG.cellars)>>
<<run setup.groveScene("cg_grove_pit_rematch")>>
<h2>The Pit</h2>
<<storyVideo "story/grove_pit_rematch/face_off">>
<<say "Ringmistress" "She asked for him again, and I don't refuse a woman who asks twice. No cloth this time. Same rule. Go.">>
<p>They start a floor's width apart, both bare. He comes at her on hands and knees. She sits back with her feet up to meet him, and they catch each other hand to hand and foot to foot.</p>
<<say "Odds man" "Three to one on the Anvil! Three to one, and she's had a good look at his cock now, she knows what she's playing for!">>
<p>The woman from last time finds you at the front and wedges herself in under your arm as if you'd kept her place.</p>
<div class="choice-container">
<<vchoice "Keep watching" "Grove_Pit_Rematch_Struggle" "action" "voyeur">>
</div><<run VaultUI.setBackgroundDirect(setup.GROVE_BG.cellars)>>
<h2>The Pit</h2>
<<storyVideo "story/grove_pit_rematch/struggle">>
<p>Then her legs go round his neck and shut. She rolls onto her side with his head locked between her thighs and her ankles crossed, and grins through her teeth straight at the crowd. He is folded up on his knees and he can't get out.</p>
<p>The noise changes. Half the cellar is screaming her name and the other half is screaming at the odds man.</p>
<<say "Odds man" "Two to one! No, evens, evens! I'm not taking another piece of scrap on her at three, do I look stupid?">>
<div class="choice-container">
<<vchoice "Keep watching" "Grove_Pit_Rematch_Holds" "action" "voyeur">>
</div><<run VaultUI.setBackgroundDirect(setup.GROVE_BG.cellars)>>
<h2>The Pit</h2>
<<storyVideo "story/grove_pit_rematch/holds">>
<p>She holds him a long time. She's on her back now, shouting with the work of it, and his head is still shut between her thighs with her ankles locked over his back.</p>
<<say "Woman" "Squeeze, you beautiful bitch, I've got a week's scrap riding on that cunt! She's going to do it. Nobody's ever done it.">>
<p>She has your sleeve in both fists. She drags you down to her mouth without looking at you.</p>
<<say "Woman" "Which of them would you rather be right now? Him with his face in there, or her?">>
<div class="choice-container">
<<vchoice "Keep watching" "Grove_Pit_Rematch_Turn" "action" "voyeur">>
</div><<run VaultUI.setBackgroundDirect(setup.GROVE_BG.cellars)>>
<h2>The Pit</h2>
<<storyVideo "story/grove_pit_rematch/turn">>
<p>Nobody sees how he gets out. One moment he is caught, and the next she is curled on her knees with her face on the floor and he is squatting over her neck, holding her down by the arm.</p>
<p>He looks down at her. Then he lifts his head and grins straight at you, at all of you, and for the length of one breath the whole cellar is silent, every mouth in it, as if he'd laid a hand over them.</p>
<p>Then the shouting comes back, and the odds man starts paying out with a face like a funeral.</p>
<div class="choice-container">
<<vchoice "Keep watching" "Grove_Pit_Rematch_Taken" "action" "voyeur">>
</div><<run VaultUI.setBackgroundDirect(setup.GROVE_BG.cellars)>>
<h2>The Pit</h2>
<<storyVideo "story/grove_pit_rematch/taken">>
<p>He rolls her onto her back and she lets him. He pushes his cock into her right there in the middle of the floor, and she gasps and hooks a leg over his hip. He fucks her on one straight arm, his hand planted at the base of her neck to keep her where he wants her.</p>
<<say "Woman" "Oh, that's deep. See how he holds her down? One hand. He could do that to me in front of my own mother.">>
<p>Nobody is laughing today. They watch him the way you watch weather coming in.</p>
<div class="choice-container">
<<vchoice "Keep watching" "Grove_Pit_Rematch_Finish" "action" "voyeur">>
</div><<run VaultUI.setBackgroundDirect(setup.GROVE_BG.cellars)>>
<<if setup.pitCount(2)>><<advanceTime 1>><<run setup.pitStamp()>><<set $player.lust to Math.min(100, ($player.lust || 0) + 15)>><</if>>
<h2>The Pit</h2>
<<storyVideo "story/grove_pit_rematch/finish">>
<p>When he pulls out of her she drops flat on her back with her arms thrown wide. He kneels up beside her, still hard, and looks down at her for a moment. Then he turns away, and she lies there under the lamps with one hand on her tit, getting her breath back.</p>
<p>She isn't laughing this time. She had him, the whole cellar saw it, and a lot of people are very quiet about what they just lost.</p>
<p>You look at the floor, and at her, and at the place where his head was caught. She held him for longer than you can hold your breath. You've put raiders on the ground. You could do that.</p>
<<say "Woman" "Don't. I can see you thinking it.">>
<div class="choice-container">
<<if setup.pitCanAsk()>>
<<vchoice "Ask to fight" "Grove_Pit_Ask" "action" "muscle">>
<</if>>
<<vchoice "Leave the pit" "Location_VerdantOutpost" "move" "back">>
</div><<run VaultUI.setBackgroundDirect(setup.GROVE_BG.cellars)>>
<<advanceTime 0 `setup.COVENANT.time.pitAsk`>>
<h2>The Pit</h2>
<p>You push through to the edge of the floor and tell the Ringmistress you want a bout.</p>
<p>She doesn't answer. She walks once round you, slowly, looking you up and down. Then she takes your upper arm in one hand and squeezes.</p>
<<say "Ringmistress" "Weak.">>
<p>She says it to the cellar, not to you. She lifts your arm by the wrist so the people at the back can see it too.</p>
<<say "Ringmistress" "Puny. Two bouts from the front, and now he wants my floor. Look at this. Thistle would fold him up before the odds were called.">>
<p>The whole cellar laughs. It comes from every side at once, and it doesn't stop.</p>
<<say "Odds man" "A hundred to one on the vault man! A hundred! Who'll take it? Nobody? Not one of you?">>
<<say "Woman" "I told you. Didn't I tell you?">>
<div class="choice-container">
<<vchoice "Tell her you mean it" "Grove_Pit_Thrown" "action" "talk">>
</div><<run VaultUI.setBackgroundDirect(setup.GROVE_BG.grounds)>>
<<run setup.pitThrowOut()>>
<h2>The Pit</h2>
<<storyVideo "story/grove_pit/thrown_out">>
<p>You say it again, louder, over the laughing. She lets your arm drop.</p>
<<say "Ringmistress" "Not until you're stronger.">>
<p>She doesn't shout that one. It is only for you. Then she nods, and two of her women take an arm each.</p>
<p>They walk you through the crowd with the laughing on both sides, up the stair and out through the door. They put you down on the grass, and not gently.</p>
<<say "Pit woman" "Come back when you're stronger.">>
<p>The door shuts. You can still hear the cellar behind it.</p>
<<if setup.kiraWithYou()>>
<<say "Kira" "Puny. I've been telling you that for weeks. Get up, idiot.">>
<</if>>
<div class="choice-container">
<<vchoice "Back to the Grove" "Location_VerdantOutpost" "move" "back">>
</div><<journeyTerrainBackground>>
<<if !$flags.trainingLead>>
<<set $flags.trainingLead to true>>
<<journalAdd "The Ringmistress shut the pit on me. Not until I'm stronger, she said. On the road home I thought of the yard outside the vault: walled in, overgrown, untouched for years. It could be a place to train." "story">>
<</if>>
<h2>The Road Home</h2>
<<storyVideo "story/grove_pit/walk_home">>
<<if setup.pitWalkFromGrove()>>
<p>The Grove's walls drop out of sight behind you and the road is only a road again. Your arm hasn't caught up. Every step you feel the place where she squeezed it.</p>
<<else>>
<p>The road home is empty, and your head goes back to the Grove without asking. To the cellar under it. To your arm: you still feel the place where she squeezed it.</p>
<</if>>
<p>You keep going back to the squeeze. A woman's hand closed round your arm, the way she let it drop, the whole crowd laughing together. And then her two women walking you up the stair between them while the laughing followed you out, louder, because she told them what you'd asked for.</p>
<p>"Not until you're stronger." She didn't shout it. She said it the way you'd tell a stray to come back when it's been fed.</p>
<p>Stronger. You turn the word over for a mile. Kira showed you a stance once. Nobody ever taught you how to hold down a woman who wrestles for a living, and the pit is the first place that made you see it.</p>
<p>Somewhere past the next rise it comes to you: the yard outside the vault. Up on the surface, walled in, choked with weeds and rust. You've walked past its door a dozen times and never once opened it. A man could train there. If he cleared it first.</p>
<<if setup.kiraWithYou()>>
<<say "Kira" "You've got that look. The one that ends with me carrying something heavy.">>
<</if>>
<p class="note"><em>The Training Yard's door at the vault is open to you now.</em></p>
<<journeyEventReturn>><<advanceTime 0 `setup.COVENANT.time.audience`>>
<<run VaultUI.setBackgroundDirect(setup.GROVE_BG.kitchen)>>
<h2>Lady Selene</h2>
<<storyVideo "story/grove_selene_1/looks_over">>
<p>The warden leaves you in the main house's kitchen. Lady Selene is leaning against the counter with a cup of tea, in no hurry to notice you. Tall and blonde, with a heavy chest under a grey-green knit dress: expensive in a world where nothing is. She looks you over the way you'd look over a horse you weren't going to buy.</p>
<<say "Lady Selene" "So this is the vault boy. I expected more. I always do.">>
<<if setup.groveKiraKnown()>>
<<say "Lady Selene" "And you keep a stray. Of course you do.">>
<</if>>
<div class="choice-container">
<<vchoice "Keep your eyes down" "Grove_Selene_Kneel" "action" "submit">>
<<vchoice "Glare at her" "Grove_Selene_Glare" "action" "shield">>
</div><<set $grove.selene.dislike to Math.max(1, Number($grove.selene.dislike) || 0)>>
<h2>Lady Selene</h2>
<p>You meet her eyes and hold them. She smiles, slowly, the way a cat does.</p>
<<say "Lady Selene" "Oh, he has a spine. How tiring. On your knees, vault boy. I won't say it twice.">>
<div class="choice-container">
<<vchoice "Kneel" "Grove_Selene_Kneel" "action" "submit">>
</div><<set $player.lust to Math.min(100, ($player.lust || 0) + 10)>>
<h2>Lady Selene</h2>
<<storyVideo "story/grove_selene_1/mocks">>
<p>You kneel on the kitchen tiles. She turns her back, lowers herself onto your face for a moment, just long enough, then gets up again and laughs at the look on your face.</p>
<<say "Lady Selene" "Look at him. Begging with his eyes. Stay down, vault boy.">>
<div class="choice-container">
<<vchoice "Stay down" "Grove_Selene_Facesit" "action" "submit">>
</div><<set $player.lust to Math.min(100, ($player.lust || 0) + 10)>>
<h2>Lady Selene</h2>
<<storyVideo "story/grove_selene_1/facesit">>
<p>She steps over you, <<if _storyClip is "b16f465dec67">>tugs the dress down off her breasts<<else>>hitches up her skirt<</if>> and sits on your face properly this time, her full weight on you.</p>
<<say "Lady Selene" "Let's see if you serve well enough to be worth registering.">>
<p>She grinds her cunt down on your tongue at her own pace, facing down your body, her full weight on your face, until there's nothing but the heat and the wet and the taste of her, and you breathe only when she lets you. Your hands find her tits and she lets you keep them there, which is the closest she comes to a kindness.</p>
<<say "Lady Selene" "Further. Is that all they teach in a vault?">>
<p>She comes with a long, loud moan she clearly didn't plan on, her arms thrown wide, then pretends it was a sigh. She stays sitting a moment longer than she needs to.</p>
<div class="choice-container">
<<vchoice "Wait for her to get up" "Grove_Selene_Register" "action" "forward">>
</div><<if !$grove.selene.met>>
<<set $grove.selene.met to true>>
<<set $grove.selene.summoned to true>>
<<set $grove.registered to true>>
<<set $grove.boardStartDay to $time.day>>
<<set $grove.lastAssignmentDay to $time.day>>
<<if setup.groveKiraKnown()>><<set $grove.kira.registered to true>><</if>>
<<run setup.factionRep("verdant", setup.COVENANT.rep.audience, "an audience with the Lady")>>
<</if>>
<h2>Registered</h2>
<<storyVideo "story/grove_selene_1/after">>
<<say "Lady Selene" "Adequate. Barely.">>
<p>She writes in a ledger on the kitchen table. Your name. Then, slower, so you can watch her do it, another one.</p>
<<if $grove.kira.registered>>
<<say "Lady Selene" "And the stray. Registered to you. If you break my Law, vault boy, she pays for it. I do hope you break it.">>
<</if>>
<<say "Lady Selene" "The board at the Center. One assignment every seven days. Miss one and you'll hear from me, and you won't enjoy it.">>
<p class="narrator">You are a registered member of the Covenant. The assignment board at the Center is open to you: one assignment every 7 days.</p>
<div class="choice-container">
<<vchoice "Leave the main house" "Location_VerdantOutpost" "move" "back">>
</div><<advanceTime 0 `setup.COVENANT.time.audience`>>
<<run VaultUI.setBackgroundDirect(setup.GROVE_BG.teaRoom)>>
<h2>The Lady's Table</h2>
<<storyVideo "story/grove_selene_2/boss">>
<p>The warden leaves you in the Main House's old garden room. Selene has made it her tea room: a long wooden counter, shelves of jars and tins, a wreath of dried leaves over the door. She talks at you for a full minute before she bothers to look up from her ledger.</p>
<<say "Lady Selene" "Trusted. That's what they're calling you downstairs. I read the reports, vault boy. Breeding duty, the Tasting, your little chores. You're no longer useless. That's the kindest thing anyone will say to you today.">>
<<groveSeleneSneer>>
<p>She doesn't offer you a chair. You stand on her clean floor in your road dirt while she turns pages, makes a note, turns another page. A clock ticks somewhere behind the shelves.</p>
<<if ($breeding.yield || 0) < 2>>
<<say "Lady Selene" "Your yield is pitiful, by the way. My gardeners grow more than you do, and they only have seeds.">>
<<else>>
<<say "Lady Selene" "Your yield is... acceptable. Don't let it go to your head. There isn't much room up there.">>
<</if>>
<<say "Lady Selene" "Well, don't just stand there like a coat rack. Behind the counter. My cup is empty.">>
<div class="choice-container">
<<vchoice "Serve her" "Grove_Selene2_Serve" "action" "submit">>
<<vchoice "Refuse her (a crime)" "Grove_Selene_Refuse" "action" "shield">>
</div><<run VaultUI.setBackgroundDirect(setup.GROVE_BG.teaRoom)>>
<<if !$grove.selene.seraHint>>
<<set $grove.selene.seraHint to true>>
<</if>>
<h2>The Lady's Table</h2>
<<storyVideo "story/grove_selene_2/serve">>
<p>You go round the counter. She doesn't hand you anything; she points<<if _storyFamily is "sf_cg_grove_selene_2_01">>. Then she changes her mind, takes a can of whipped cream off the shelf herself and shakes it, while one of her men in an apron clears cups behind her<<else>>, and changes her mind, and points again, and watches you fetch and carry with the bored patience of someone training a dog she doesn't much like<</if>>.</p>
<<if setup.groveKiraKnown()>>
<<say "Lady Selene" "Cream. Then the cup. Then you stand where I can see you. Honestly. Does the stray wipe your mouth for you too?">>
<<else>>
<<say "Lady Selene" "Cream. Then the cup. Then you stand where I can see you. Honestly. Does nobody wipe your mouth for you any more?">>
<</if>>
<p>She talks while you work, the way people talk in front of furniture. The price of salt. A warden she's going to put on the post. Then, as if it were nothing:</p>
<<say "Lady Selene" "We bought a few women off the Crimson raiders a few weeks back. Breeding stock, they swore. Half of them weren't worth the feed. There was a red-haired one who called herself a healer. Soft hands. Cried at night. Useless. We sold her on.">>
<<if setup.groveSeraKnown()>>
<p>The cup hits the counter harder than you meant. Cream slops over the rim. A red-haired healer with soft hands. You know exactly one woman that describes, and she's the reason you're still walking these roads. The Convergence dragged her off in front of you. Somewhere between their hoods and this kitchen she went through Crimson hands, and came out the other side with a price on her.</p>
<<else>>
<p>The cup hits the counter harder than you meant. Cream slops over the rim. A woman taken by raiders and sold on like a sack of seed. You think of Sera screaming your name while they dragged her away, and your hands won't keep still.</p>
<</if>>
<<say "Lady Selene" "Did I say something? ...Oh. Oh, you knew her. How sweet. Sold on is sold on, vault boy. I don't keep receipts for livestock.">>
<p>She leans across the counter, close enough that you can smell her perfume over the coffee, and smiles like she's just found the soft place to press.</p>
<<say "Lady Selene" "Ask me nicely. On your knees. Perhaps I'll remember who bought her. Perhaps I'll just enjoy watching you ask.">>
<div class="choice-container">
<<vchoice "Kneel and ask" "Grove_Selene2_Kneel" "action" "submit">>
<<vchoice "Pin her to the counter" "Grove_Selene2_Pinned" "action" "dominant">>
</div><<run VaultUI.setBackgroundDirect(setup.GROVE_BG.teaRoom)>>
<<if !$grove.selene.audience2>>
<<run setup.groveSeleneAudienceDone(2, "knelt")>>
<<if setup.groveSeraKnown()>><<journalAdd "Lady Selene let it slip: the Covenant bought a red-haired healer off Crimson raiders and sold her on south. Sera. The Convergence took her, and she's been sold from hand to hand ever since." "story">><<else>><<journalAdd "Lady Selene let it slip: the Covenant bought a red-haired healer off raiders a few weeks back and sold her on south. Raiders took Sera too. I can't stop thinking it might be her." "story">><</if>>
<<set $player.lust to Math.min(100, ($player.lust || 0) + 15)>>
<</if>>
<h2>The Lady's Table</h2>
<p>You get down on the tiles behind her counter. She takes her time turning on her stool to look at you, then dips two fingers in the cream and holds them out.</p>
<<say "Lady Selene" "Clean them. Slowly. If you're going to beg, beg properly.">>
<p>You lick the cream off her fingers while she watches your mouth, and you ask. She lets you ask twice. Then she wipes her hand on your shirt.</p>
<<say "Lady Selene" "Traders. Off south, past that hole you live in, with a cart full of other people's women. That's all I know and more than you earned. Now get out. You're blocking my light.">>
<div class="choice-container">
<<vchoice "Leave the Main House" "Grove_Selene2_After" "move" "back">>
</div><<run VaultUI.setBackgroundDirect(setup.GROVE_BG.teaRoom)>>
<<set $player.lust to Math.min(100, ($player.lust || 0) + 20)>>
<h2>The Lady's Table</h2>
<<storyVideo "story/grove_selene_2/pinned">>
<p>You come round the end of the counter, put your hand in her hair and shove her face-down across it, cheek to the polished wood, her skirt rucked up over her ass.</p>
<p>The man in the apron is gone; you didn't see him leave. There's a warden on the door, and Selene only has to raise her voice once. She doesn't.</p>
<<say "Lady Selene" "Oh, there it is. The spine. It took you long enough to find it. ...Well? I haven't got all day, vault boy.">>
<div class="choice-container">
<<vchoice "Take her on her own counter" "Grove_Selene2_Held" "action" "dominant">>
</div><<run VaultUI.setBackgroundDirect(setup.GROVE_BG.teaRoom)>>
<<if !$grove.selene.audience2>>
<<run setup.groveSeleneAudienceDone(2, "pinned")>>
<<if setup.groveSeraKnown()>><<journalAdd "Lady Selene let it slip: the Covenant bought a red-haired healer off Crimson raiders and sold her on south. Sera. The Convergence took her, and she's been sold from hand to hand ever since." "story">><<else>><<journalAdd "Lady Selene let it slip: the Covenant bought a red-haired healer off raiders a few weeks back and sold her on south. Raiders took Sera too. I can't stop thinking it might be her." "story">><</if>>
<<set $player.lust to 15>><<run setup.playerReleased()>>
<</if>>
<h2>The Lady's Table</h2>
<<storyVideo "story/grove_selene_2/held">>
<p>You turn her onto her back on the counter, push her down with your palm flat on her chest and fuck her like that, the jars rattling on the shelves behind you. She grabs your wrist, not to push it off but to hold it there.</p>
<<say "Lady Selene" "Is that all of it? Harder. Harder, you useless... don't you dare stop. Don't you dare.">>
<p>She doesn't stop insulting you once, not even when she comes, her heel drumming on the wood and her nails dug into your forearm. You come deep inside her with your hand still pinning her down, and she lies there a moment, flushed to the throat, and laughs at the ceiling.</p>
<<say "Lady Selene" "Adequate. Barely. ...Traders. Off south, past that hole you live in. That's where your healer went. Don't ask me again, and don't you ever think this means you're mine to keep.">>
<div class="choice-container">
<<vchoice "Leave the Main House" "Grove_Selene2_After" "move" "back">>
</div><<run VaultUI.setBackgroundDirect(setup.GROVE_BG.grounds)>>
<h2>Outside the Main House</h2>
<<if setup.kiraWithYou()>>
<<if !$grove.selene.kiraTold>>
<<set $grove.selene.kiraTold to true>>
<<addTension "kira" 10>>
<</if>>
<p>Kira's waiting at the bottom of the steps where the wardens left her, arms folded. She reads your face before you've said a word. You tell her anyway: a red-haired healer, bought off Crimson raiders, sold on south.</p>
<<if setup.groveSeraKnown()>>
<<say "Kira" "Red hair. A healer. ...That's your Sera. Isn't it.">>
<p>It isn't a question, and you don't answer it. She looks away first, up at the Main House windows, jaw tight.</p>
<<say "Kira" "The one you had before the vault. The one you still say in your sleep. ...Yeah. I've heard you.">>
<<say "Kira" "Good. Find her. I mean it. That bitch sold her like a goat. Just don't look at me like that while you do it.">>
<<else>>
<<say "Kira" "Lot of women get taken. Lot of them get sold. ...You've got a look on you. Like it's someone you know.">>
<p>You don't answer. She looks up at the Main House windows for a long moment, jaw tight.</p>
<<say "Kira" "Fine. Don't tell me. I'll find out anyway.">>
<</if>>
<<else>>
<<if setup.groveSeraKnown()>>
<p>You stand on the Main House steps in the open air for a long time. A red-haired healer, bought off Crimson raiders, sold on south. The Convergence took her, and somebody has been passing her from hand to hand ever since. It's the first real word of Sera in a long time, and it came out of that woman's mouth like gossip about the weather.</p>
<<else>>
<p>You stand on the Main House steps in the open air for a long time. A healer, bought off raiders, sold on south. It could be anyone. It could be Sera. You can't stop turning it over.</p>
<</if>>
<</if>>
<div class="choice-container">
<<vchoice "Back to the Grove" "Location_VerdantOutpost" "move" "back">>
</div><<advanceTime 0 `setup.COVENANT.time.audience`>>
<<run VaultUI.setBackgroundDirect(setup.GROVE_BG.kitchen)>>
<<set $grove.selene.a3Singles to random(0, 2) === 0>>
<h2>The Lady's Pipes</h2>
<<storyVideo "story/grove_selene_3/pipes">>
<p>The summons is a warden with a canvas tool bag. The pump that feeds the Main House has died, and the Lady wants the vault boy, because vaults are "nothing but pipes, aren't they." So you spend an hour on your back under her kitchen sink, wrench in hand, water dripping into your collar, while the house goes on around your legs.</p>
<p>Then the dripping stops, and so does the house. You look up past the cabinet door. Selene is standing over you in a seafoam dress and pale stockings, a glass of something in her hand, looking down at you the way she looks at everything she owns.</p>
<<if $grove.selene.spied && setup.groveKiraKnown()>>
<<say "Lady Selene" "I watched you with the stray the other night. From the stairs. You might have noticed, if you ever looked up. You were... enthusiastic. I want to see if any of that was for show.">>
<<else>>
<<say "Lady Selene" "Favoured. They say it downstairs as if it means something. Let's find out.">>
<</if>>
<<groveSeleneSneer>>
<<say "Lady Selene" "The bathroom upstairs has a pipe that needs seeing to as well. Bring your wrench. Or don't. I doubt you'll need it.">>
<div class="choice-container">
<<vchoice "Follow her upstairs" "Grove_Selene3_Bathroom" "move" "forward">>
<<vchoice "Refuse her (a crime)" "Grove_Selene_Refuse" "action" "shield">>
</div><<run VaultUI.setBackgroundDirect(setup.GROVE_BG.bathroom)>>
<<set $player.lust to Math.min(100, ($player.lust || 0) + 15)>>
<h2>The Lady's Bathroom</h2>
<<storyVideo "story/grove_selene_3/kneel">>
<p>Her bathroom is the only room in the Grove with a mirror the length of a wall. She hitches herself up onto the vanity, hikes her dress to her waist and points at the floor between her knees. You kneel. She takes a fistful of your hair and pulls your face into her cunt, and you eat her while she watches herself in the mirror.</p>
<<say "Lady Selene" "Slower. Slower. Did nobody ever teach you anything? ...There. Stay there. My terms, vault boy. Always my terms.">>
<div class="choice-container">
<<vchoice "Stand up and take it on yours" "Grove_Selene3_Groped" "action" "dominant">>
<<vchoice "Stay on your knees until she's done" "Grove_Selene3_Dismissed" "action" "submit">>
</div><<if !$grove.selene.audience3>>
<<run setup.groveSeleneAudienceDone(3)>>
<<set $player.lust to Math.min(100, ($player.lust || 0) + 15)>>
<</if>>
<h2>The Lady's Bathroom</h2>
<p>You stay where she put you. She comes on your tongue with her thighs clamped round your head and her heel digging into your shoulder, then pushes you off with her foot and pulls her dress down as if you'd been there to fix the tap.</p>
<<say "Lady Selene" "Good boy. That's all you'll ever be, isn't it? Off you go. Shut the door on your way out.">>
<div class="choice-container">
<<vchoice "Leave the Main House" "Location_VerdantOutpost" "move" "back">>
</div><<set $player.lust to Math.min(100, ($player.lust || 0) + 15)>>
<h2>The Lady's Bathroom</h2>
<<storyVideo "story/grove_selene_3/groped">>
<p>You stand up in the middle of her sentence and take her tits in both hands, and she stops talking. Just for a second. Then she smiles at you, slow and nasty, as if this was her idea too.</p>
<<say "Lady Selene" "Did I say you could get up?">>
<div class="choice-container">
<<vchoice "Turn her round" "Grove_Selene3_Bent" "action" "dominant">>
</div><h2>The Lady's Bathroom</h2>
<<storyVideo "story/grove_selene_3/bent">>
<p>You pull her down off the counter by the hips, turn her round and push her down over the vanity, her face a hand's width from the mirror so she has to watch. She laughs at her own reflection, and arches her back for you anyway.</p>
<<say "Lady Selene" "Look at you. Someone gave the vault boy ideas.">>
<div class="choice-container">
<<vchoice "Take her" "Grove_Selene3_Taken" "action" "dominant">>
</div><<set $player.lust to Math.min(100, ($player.lust || 0) + 20)>>
<h2>The Lady's Bathroom</h2>
<<set _gs3tSingles to setup.storyFamilySingles("story/grove_selene_3/taken", $grove.selene.a3Singles)>>
<<storyVideo "story/grove_selene_3/taken">>
<<if _gs3tSingles>><<run setup.mediaAvoidEnd("story/grove_selene_3/taken")>><</if>>
<p><<if _storyFamily is "sf_cg_grove_selene_3_01">>She climbs half onto the counter on her knees and you fuck her from behind like that<<else>>You fuck her from behind over the vanity<</if>>, one hand on her back, the other in her hair pressing her head down so her face is right there in the mirror. She keeps her eyes on yours in the glass the whole time and doesn't look away once.</p>
<<say "Lady Selene" "Harder, if you're going to bother. I've had better from the gardeners. ...Fuck. Fuck. Don't stop.">>
<div class="choice-container">
<<vchoice "Let her turn round" "Grove_Selene3_After" "action" "seduce">>
</div><<if !$grove.selene.audience3>>
<<run setup.groveSeleneAudienceDone(3)>>
<<set $player.lust to 10>><<run setup.playerReleased()>>
<</if>>
<h2>The Lady's Bathroom</h2>
<<set _gs3aSingles to setup.storyFamilySingles("story/grove_selene_3/after", $grove.selene.a3Singles)>>
<<storyVideo "story/grove_selene_3/after">>
<<if _gs3aSingles>><<run setup.mediaAvoidEnd("story/grove_selene_3/after")>><</if>>
<p>She isn't finished with you. She twists round, sits up on the edge of the vanity, hooks a leg round your hips and pulls you back into her face to face. She takes your jaw in one hand and kisses you, hard, and grinds on you until she comes. You come inside her a moment later with her teeth in your lip.</p>
<<say "Lady Selene" "Mm. Don't look at me like that. It was a test, and you passed it, and that's all it was.">>
<p>She slides off the counter, pulls the dress up over her shoulders and checks her lipstick in the mirror as if you'd already gone.</p>
<<say "Lady Selene" "The pump still leaks, by the way. Fix it on your way out.">>
<div class="choice-container">
<<vchoice "Leave the Main House" "Location_VerdantOutpost" "move" "back">>
</div><<run VaultUI.setBackgroundDirect(setup.GROVE_BG.villa)>>
<<advanceTime 0 30>>
<<set $player.lust to Math.min(100, ($player.lust || 0) + 20)>>
<h2>The Guest Villa</h2>
<p>The Covenant gives Trusted members the run of a guest villa by the orchard: dust sheets on half the furniture, a staircase up to rooms nobody has slept in for years, a long dining table under a dead chandelier. Kira walks the length of the table, running a finger through the dust, and looks back at you over her shoulder.</p>
<<say "Kira" "Whole house. No wardens. No walls you can hear through. ...Well? You going to stand there?">>
<p>You put her on the table. She's already pulling her shirt over her head, and when you push her down onto her back the dust goes up round her like smoke. She hooks her legs round you and drags you in, and you fuck her on the Covenant's furniture with her heels digging into your back and her fingernails in your shoulders.</p>
<<say "Kira" "Harder. Fuck, harder. Let them hear it, I don't care.">>
<div class="choice-container">
<<vchoice "Keep going" "Grove_Rest_Kira_Spied" "action" "seduce">>
</div><<if !$grove.selene.spied>>
<<set $grove.selene.spied to true>>
<<set $player.lust to 10>><<run setup.playerReleased()>>
<<relationChange "kira" "affection" 3>>
<</if>>
<h2>The Guest Villa</h2>
<p>You turn her over the edge of the table and take her from behind, and she pushes back onto you with every thrust, swearing at the tabletop. Then something makes you look up.</p>
<<storyVideo "story/grove_selene_3/spies">>
<p>There's someone at the top of the stairs. Blonde, tall, leaning on the banister with her arms folded, watching the two of you with the expression of a woman deciding whether to buy a horse. You blink, and Lady Selene is gone, and the landing is empty.</p>
<p>Kira didn't see. You finish inside her with your eyes still on the stairs, and she slumps over the table, laughing breathlessly into the dust.</p>
<<say "Kira" "What? What are you looking at? ...Nothing? Fine. Come here.">>
<div class="choice-container">
<<vchoice "Back to the Grove" "Location_VerdantOutpost" "move" "back">>
</div><<run VaultUI.setBackgroundDirect(setup.GROVE_BG.teaRoom)>>
<h2>The Register</h2>
<p>The Lady sees you in her tea room, which is a kind of insult in itself: she doesn't get up, and she doesn't send the apron man away. The ledger is open on the counter. When you tell her what you want she laughs, once, a short bright sound like a dropped spoon.</p>
<<say "Lady Selene" "Strike you off. You. You came to my gate with dirt on your knees and begged me for a bed and a number, and now that you've had what you wanted out of me, you'd like to be unwritten. How very vault.">>
<<say "Lady Selene" "Go on, then. Say it again. Slowly. I want the apron to hear it.">>
<div class="choice-container">
<<vchoice "Say it again" "Grove_Register_Struck" "action" "scroll">>
<<vchoice "Think better of it" "Location_VerdantOutpost" "move" "back">>
</div><<run VaultUI.setBackgroundDirect(setup.GROVE_BG.teaRoom)>>
<<if $grove.registered>>
<<set $grove.register.kiraStruck to $grove.kira.registered>>
<<run setup.groveLeaveRegister()>>
<<journalAdd "I had Lady Selene strike me from the Covenant's register. Back to Guest. She'll make me pay for that, one way or another." "story">>
<</if>>
<h2>The Register</h2>
<p>You say it again. She draws a line through your name with a slow, careful stroke, blots it, and turns the ledger round so you can admire her handwriting.</p>
<<if $grove.register.kiraStruck>>
<p>Then she runs her nail down the page to the next line, and does the stray as well.</p>
<<say "Lady Selene" "She goes with you. I won't have her left here as a souvenir. Nobody would want her without you anyway. Nobody much wants her with you.">>
<</if>>
<<say "Lady Selene" "There. You're a Guest. You may buy things at my Exchange and sleep in my villa and walk my paths with your mouth shut, and every woman on this estate will know exactly what you are: the vault boy who couldn't keep up. If you ever crawl back for your number, you'll earn it from the bottom, and I'll enjoy every inch of the climb.">>
<p class="narrator">Struck from the register. You are a Guest of the Covenant again: no board, no assignments, no Center, and your standing has dropped hard. You can ask to be registered again once you stand Registered.</p>
<div class="choice-container">
<<vchoice "Back to the Grove" "Location_VerdantOutpost" "move" "back">>
</div><<advanceTime 0 `setup.COVENANT.time.audience`>>
<<run VaultUI.setBackgroundDirect(setup.GROVE_BG.kitchen)>>
<<if !$grove.registered>>
<<run setup.groveRejoinRegister()>>
<</if>>
<h2>The Register</h2>
<p>The Lady keeps you waiting in her kitchen for most of an hour, and when she comes in she has the ledger under her arm and a smile you don't like.</p>
<<say "Lady Selene" "The prodigal vault boy. They told me you'd been grovelling round my estate like a dog that's been put out. Fine. I like a dog that comes back.">>
<p>She writes your name back in, at the bottom of the page, under women who came to the gate last week.</p>
<<if $grove.kira.registered>>
<<say "Lady Selene" "And the stray, since she's still following you about. Same Law as before. Break it and she pays.">>
<</if>>
<<say "Lady Selene" "The board at the Center. One assignment every seven days, starting today. Do try to remember this time.">>
<p class="narrator">You are a registered member of the Covenant again. The assignment board at the Center is open to you: one assignment every 7 days.</p>
<div class="choice-container">
<<vchoice "Back to the Grove" "Location_VerdantOutpost" "move" "back">>
</div><<if setup.groveClosed() && !setup.groveTakenShops()>>
<<include "Grove_Closed">>
<<elseif setup.groveHostile()>>
<<include "Grove_Wanted">>
<<else>>
<<run VaultUI.setBackgroundDirect(setup.GROVE_BG.exchange)>>
<h2>The Exchange</h2>
<p>A villa's old dining room, shelves where the paintings used to hang. The keeper is a slim, dark-haired woman with ink on her fingers who writes down everything you buy.</p>
<<set _gexHer to setup.groveMarketAtExchange()>>
<<if _gexHer && setup.groveTakenShops()>>
<p><<= _gexHer>> is up a ladder at the back, stacking tins. She sees you, glances at the wardens, and gives you the smallest nod she can get away with before she turns back to the shelf.</p>
<<elseif _gexHer>>
<p><<= _gexHer>> is behind the counter in a Covenant apron, the collar marks on her throat nearly faded, counting bandages into a crate. She catches your eye and grins, and when the keeper isn't looking she mouths it at you: <em>thank you</em>.</p>
<</if>>
<<if setup.groveTakenShops()>>
<p>The keeper doesn't look up. Two wardens stand at the door with their rifles, watching your hands the whole time.</p>
<<say "Exchange keeper" "The Lady's prices for you. Thirty in the hundred on top, and no favours. Buy and go.">>
<<elseif $grove.serviceDay === $time.day>>
<p class="narrator">You paid in service today: service prices until tomorrow.</p>
<<elseif setup.groveAtLeast("Registered")>>
<p class="narrator">Rank buys no discount here: the shelf price is the shelf price, even for a member. Give the Exchange a service and you pay less for the day.</p>
<<else>>
<p class="narrator">Covenant prices are a little high for outsiders. Members who give the Exchange a service pay less.</p>
<</if>>
<<groveShop "exchange" "Grove_Exchange">>
<div class="choice-container">
<<vchoice "Sell to the keeper" "Grove_Exchange_Sell" "action" "scrap">>
<<if $grove.serviceDay !== $time.day && !setup.groveTakenShops()>>
<<vchoice "Pay in service today (lower prices for the day)" "Grove_Exchange_Service" "action" "seduce">>
<</if>>
<<if $grove.theftDay !== $time.day && !$grove.pendingBreach && !setup.groveClosed()>>
<<vchoice "Pocket something while she writes (a crime if she sees)" "Grove_Exchange_Steal" "action" "stealth">>
<</if>>
<<vchoice "Back to the Grove" "Location_VerdantOutpost" "move" "back">>
</div>
<</if>><<if !setup.groveExchangeOpen()>>
<<include "Grove_Exchange">>
<<else>>
<<run VaultUI.setBackgroundDirect(setup.GROVE_BG.exchange)>>
<h2>The Exchange</h2>
<<if setup.groveTakenShops()>>
<p>You put what you want to sell on the counter. The keeper turns each thing over twice and writes down a number that's an insult.</p>
<<say "Exchange keeper" "The Lady's rates, vault boy. Hers go up for you, and so do mine come down. Take it or carry it.">>
<<else>>
<p>You put what you want to sell on the counter. The keeper turns each thing over, sniffs the tins, counts the bandages twice, and writes it all down.</p>
<<say "Exchange keeper" "Half the shelf price. The shelf has to make a living too.">>
<</if>>
<<set _gesList to setup.groveSellable()>>
<<if !_gesList.length>>
<p>You carry nothing the keeper wants. She buys what the Exchange and the Armory sell, and energy drinks, medical supplies, preserved food and tools.</p>
<</if>>
<<scrapBalance>>
<div class="choice-container">
<<for _gesI to 0; _gesI lt _gesList.length; _gesI++>>
<<set _gesIt to _gesList[_gesI]>>
<<set _gesPic to '<img class="shop-item-thumb" src="' + setup.itemImage(_gesIt.id) + '" alt="" onerror="this.style.display=\'none\'">'>>
<<capture _gesIt>>
<<link `'<span class="choice-button action">' + _gesPic + '<span class="label">Sell one ' + _gesIt.name + ' (' + _gesIt.price + ' scrap)</span></span>'`>><<run setup.groveSell(_gesIt.idx, 1)>><<goto "Grove_Exchange_Sell">><</link>>
<<if _gesIt.have > 1>>
<<link `'<span class="choice-button action">' + _gesPic + '<span class="label">Sell all ' + _gesIt.have + ' ' + _gesIt.name + ' (' + (_gesIt.have * _gesIt.price) + ' scrap)</span></span>'`>><<run setup.groveSell(_gesIt.idx, "all")>><<goto "Grove_Exchange_Sell">><</link>>
<</if>>
<</capture>>
<</for>>
<<vchoice "Back to the Exchange" "Grove_Exchange" "move" "back">>
</div>
<</if>><<if !setup.groveDailyDone("service")>>
<<run setup.groveDaily("service")>>
<<advanceTime 0 30>>
<<set $player.lust to 20>><<run setup.playerReleased()>>
<</if>>
<h2>Service</h2>
<<storyVideo "story/grove_exchange/service">>
<p>The keeper closes the ledger, takes you into the back room and shoves you down onto <<if _storyClip is "e74f24278ada" or _storyClip is "db66a8ad09fa">>a desk<<else>>a crate<</if>>. She <<if _storyClip is "e74f24278ada" or _storyClip is "db66a8ad09fa">>steps out of her skirt<<else>>hikes her skirt<</if>> and sinks onto your cock without a word, <<if _storyClip is "e74f24278ada" or _storyClip is "db66a8ad09fa">>her back to you, and rides you slow until<<else>>one inky hand flat on your chest, and rides you slow, the ledger still tucked under her other arm, until<</if>> her cunt clenches round you and she comes with a small, annoyed sound. Then she lets you finish inside her, climbs off, and writes it down.</p>
<<say "Exchange keeper" "Member prices. Until tomorrow.">>
<div class="choice-container">
<<vchoice "Back to the Exchange" "Grove_Exchange" "move" "back">>
</div><<if setup.groveClosed() && !setup.groveTakenShops()>>
<<include "Grove_Closed">>
<<else>>
<<run VaultUI.setBackgroundDirect(setup.GROVE_BG.armory)>>
<h2>The Armory</h2>
<p>A stone garage with racks along the walls. Vests, plates, knives. No guns on display. The armorer is a blonde with a short bob and tattoos down both arms.</p>
<<if setup.groveTakenShops()>>
<<say "Armorer" "The Lady says you pay her prices, thirty in the hundred on top. No guns, no favours. Pick and go.">>
<<else>>
<<say "Armorer" "We don't arm guests with guns. Knives and armour. Better stock for those the Lady trusts.">>
<</if>>
<<groveShop "armory" "Grove_Armory">>
<p class="narrator">Armour and knives go in your backpack: equip them there.</p>
<div class="choice-container">
<<vchoice "Back to the Grove" "Location_VerdantOutpost" "move" "back">>
</div>
<</if>><<run VaultUI.setBackgroundDirect(setup.GROVE_BG.stores)>>
<h2>The Commissary</h2>
<p>A window cut into the Center's side wall, a counter, and behind it a grey-haired woman with reading glasses on a chain. She doesn't take scrap. She takes the little stamped tokens the Center hands out for good work: yield marks.</p>
<<say "Commissary clerk" "Marks only, love. Scrap is for the Exchange. What did you earn this week?">>
<<set _gcmStock to setup.groveShopStock("commissary")>>
<<set _gcmMarks to Number($breeding && $breeding.marks) || 0>>
<p class="narrator">You hold <<= _gcmMarks>> yield mark<<if _gcmMarks !== 1>>s<</if>>.<<if $grove.favours && $grove.favours.skip > 0>> Skip passes held: <<= $grove.favours.skip>> (hand one in at the assignment board).<</if>><<if $grove.favours && $grove.favours.kiraHalf>> Kira's next stay is halved.<</if>></p>
<div class="choice-container">
<<for _gcmI to 0; _gcmI lt _gcmStock.length; _gcmI++>>
<<set _gcmIt to _gcmStock[_gcmI]>>
<<set _gcmCan to setup.groveCommissaryCan(_gcmI)>>
<<set _gcmLabel to (_gcmIt.kind === "favour" ? "Ask for " : "Buy ") + _gcmIt.name + (_gcmIt.note ? ", " + _gcmIt.note : "") + " (" + _gcmIt.marks + " mark" + (_gcmIt.marks !== 1 ? "s" : "") + ")">>
<<set _gcmPic to _gcmIt.kind === "item" ? '<img class="shop-item-thumb" src="' + setup.itemImage(_gcmIt.id) + '" alt="" onerror="this.style.display=\'none\'">' : '<span class="gi gi-check gi-large"></span>'>>
<<if _gcmCan.ok>>
<<capture _gcmI>>
<<link `'<span class="choice-button action">' + _gcmPic + '<span class="label">' + _gcmLabel + '</span></span>'`>><<run setup.groveCommissaryBuy(_gcmI)>><<goto "Grove_Commissary">><</link>>
<</capture>>
<<else>>
<<set _gcmWhy to ({ full: "your backpack is full", noArmor: "you wear no armour", whole: "your armour is whole", held: "you already hold it", noKira: "Kira is not registered here", rank: "registered members only" })[_gcmCan.why] || "too few marks">>
<<print '<span class="choice-button disabled action">' + _gcmPic + '<span class="label">' + _gcmLabel + ' (' + _gcmWhy + ')</span></span>'>>
<</if>>
<</for>>
<<vchoice "Back to the Center" "Grove_Center" "move" "back">>
</div><<widget "groveSign" container>>
<<set _gsText to setup.groveSignText(_args[0])>>
<div class="grove-sign-wrap">
<div class="grove-sign"><span class="grove-sign-text"><<= Util.escape(_gsText)>></span></div>
_contents
</div>
<</widget>>
<<widget "groveStanding">>
<<set _gstNext to setup.groveNextRank()>>
<p class="grove-standing">Standing with the Covenant: <strong><<= setup.groveRank()>></strong> (<<= setup.factionRepOf("verdant")>>)<<if _gstNext && setup.factionRepOf("verdant") >= 0>>. <<= _gstNext.left>> more to <<= _gstNext.name>>.<</if>></p>
<<if _args[0] isnot "line" && !setup.groveAtLeast("Guest") && !setup.groveHostile() && !setup.groveClosed()>>
<p class="narrator">Outsiders get no bunk, no shops and no way into the Cellars. The wardens give work to anyone who asks, once a day: put in your days and they'll let you in as a Guest.</p>
<</if>>
<</widget>>
<<widget "groveDoneLine">>
<<set _gdlR to _args[0] || {}>>
<<set _gdlBits to []>>
<<if _gdlR.rep>><<run _gdlBits.push((_gdlR.rep > 0 ? "+" : "") + _gdlR.rep + " standing")>><</if>>
<<if _gdlR.marks>><<run _gdlBits.push("+" + _gdlR.marks + " yield mark" + (_gdlR.marks !== 1 ? "s" : ""))>><</if>>
<<if _gdlR.scrap>><<run _gdlBits.push("+" + _gdlR.scrap + " scrap")>><</if>>
<p class="narrator">Assignment done<<if _gdlBits.length>>: <<= _gdlBits.join(", ")>><</if>>. The next one is due in <<= setup.groveDaysLeft()>> days.<<if _args[1]>> <<= _args[1]>><</if>></p>
<<groveStanding "line">>
<</widget>>
<<widget "groveShop">>
<<set _gwShop to _args[0]>>
<<set _gwBack to _args[1]>>
<<set _gwStock to setup.groveShopStock(_gwShop)>>
<<scrapBalance>>
<div class="choice-container">
<<for _gwI to 0; _gwI lt _gwStock.length; _gwI++>>
<<set _gwIt to _gwStock[_gwI]>>
<<set _gwCan to setup.groveCanBuy(_gwShop, _gwI)>>
<<set _gwLabel to "Buy " + _gwIt.name + (_gwIt.note ? ", " + _gwIt.note : "") + " (" + setup.grovePrice(_gwShop, _gwI) + " scrap)">>
<<set _gwPic to '<img class="shop-item-thumb" src="' + setup.itemImage(_gwIt.id) + '" alt="" onerror="this.style.display=\'none\'">'>>
<<if _gwCan.ok>>
<<capture _gwI, _gwShop, _gwBack>>
<<link `'<span class="choice-button action">' + _gwPic + '<span class="label">' + _gwLabel + '</span></span>'`>><<run setup.groveBuy(_gwShop, _gwI)>><<goto _gwBack>><</link>>
<</capture>>
<<else>>
<<set _gwWhy to _gwCan.why === "rank" ? _gwIt.rank + " only" : _gwCan.why === "full" ? "your backpack is full" : "you have too little">>
<<print '<span class="choice-button disabled action">' + _gwPic + '<span class="label">' + _gwLabel + ' (' + _gwWhy + ')</span></span>'>>
<</if>>
<</for>>
</div>
<</widget>>
<<widget "groveTastingStage">>
<<set _gtsSt to _args[0] || "tease">>
<<set _gtsGap to setup.storyFamilyGap("story/grove_tasting/" + (["tease", "stroke", "suck", "throat"].includes(_gtsSt) ? _gtsSt : "finish"))>>
<<if _gtsGap>><<set _storyClip to null>><<set _storyFamily to null>><</if>>
<<switch _gtsSt>>
<<case "tease">>
<<if !_gtsGap>><<storyVideo "story/grove_tasting/tease">><</if>>
<p><<if _storyFamily is "sf_cg_grove_tasting_01">>She tells you, slowly and in detail, everything she's going to do to your cock, watching it jump at every word. She hasn't touched you yet.<<elseif _storyFamily is "sf_cg_grove_tasting_02">>She strokes you lazily, then unhooks her bra and puts your hand on her tits. "Don't get excited. This is the easy part."<<elseif _storyFamily is "sf_cg_grove_tasting_03">>She holds your cock up in her fist beside her face and doesn't take it in. Her mouth works at the root of it, her eyes on yours.<<else>>She breathes on your cock and doesn't touch it. Then she does, one fingertip, and watches what it does to you.<</if>></p>
<<case "stroke">>
<<if !_gtsGap>><<storyVideo "story/grove_tasting/stroke">><</if>>
<p><<if _storyFamily is "sf_cg_grove_tasting_01">>She squeezes her tits together round your cock and works them up and down, slow.<<elseif _storyFamily is "sf_cg_grove_tasting_04">>Her fist, slick with oil, root to tip, slow.<<else>>Her fist, slick with spit, root to tip, slow.<</if>><<if _storyFamily is "sf_cg_grove_tasting_01">><<elseif _storyFamily is "sf_cg_grove_tasting_04">> Every few strokes she slows right down to see what it does to you, and she makes a note of it.<<else>> Every few strokes her tongue flicks the tip to see what it does to you, and she makes a note of it.<</if>></p>
<<case "suck">>
<<if !_gtsGap>><<storyVideo "story/grove_tasting/suck">><</if>>
<p>Her lips close on the head, her tongue on the slit, and she sucks you slow and wet, eyes on yours, counting your breaths.</p>
<<case "throat">>
<<if !_gtsGap>><<storyVideo "story/grove_tasting/throat">><</if>>
<p>You put your hand on her head and she lets you push her down until her nose is in your belly. She holds you there, gagging, eyes streaming, her throat squeezing round your cock.</p>
<<default>>
<<if !_gtsGap>><<storyVideo "story/grove_tasting/finish">><<elseif setup.storySinglesOnly("story/grove_kitchen/finish")>><<storyVideo "story/grove_kitchen/finish">><<run setup.mediaAvoidEnd("story/grove_kitchen/finish")>><</if>>
<<if $grove.meterRun>><<set $grove.meterRun.finishClip to _storyClip>><</if>>
<p><<if _storyFamily is "sf_cg_grove_tasting_01">>She fingers her cunt while you stroke yourself in front of her, to see which of you breaks first.<<else>>She pulls back to the very tip and works you with her hand and her tongue together, right on the edge, to see if you'll break.<</if>></p>
<</switch>>
<</widget>>
<<widget "groveBunkWake">>
<p>You wake to sun through the apple leaves and the smell of bread from the Main House kitchens. For a moment you don't know where you are. <<if _args[0] is "carry">>Then you look across at the other bunk. She lies exactly as you left her.<<else>>It's the best night's sleep you've had in months.<</if>></p>
<</widget>>
<<widget "groveBunkSleep">>
<<run VaultUI.setBackgroundDirect(setup.GROVE_BG.villa)>>
<<set $journey.campShelter to "shelter">>
<<campRest "shelter">>
<<set _gbS to $journey.campSleep>>
<<set _vddScene to null>>
<<if _gbS.night>><<velithDreamDrainRoll>><</if>>
<<if !_vddScene>>
<<if _gbS.night>>
<h2><<icon "sunrise">> Morning in the Villa</h2>
<<if setup.kiraWithYou()>>
<p>You wake to sun through the apple leaves and Kira's foot against your shin. At some point in the night she gave up on her own bunk and climbed into yours, and she's still there, hogging the sheet, her hair all over your pillow. She opens one eye.</p>
<<say "Kira" "Don't. I was cold. ...Shut up.">>
<<else>>
<<groveBunkWake>>
<</if>>
<<else>>
<h2>The Guest Villa</h2>
<p>You sleep a few hours on top of the sheets, the window open, the orchard humming with bees. When you wake the sun has moved round to the other side of the room.</p>
<</if>>
<p class="system-info"><<icon "health">> +<<print _gbS.health>> Health restored</p>
<p class="system-info"><<icon "energy">> +<<print _gbS.energy>> Energy restored</p>
<</if>>
<</widget>>
<<widget "groveSeleneSneer">>
<<if $grove && $grove.planting && $grove.planting.missedSneer>>
<<set $grove.planting.missedSneer to false>>
<<say "Lady Selene" "You missed my Planting, vault boy. The women waited up for you, wet and bored, and I had to listen to them complain about it all night. I've decided that's your fault. Because it is.">>
<</if>>
<<farCarrySeleneLine>>
<</widget>>
<<widget "groveMarchIn">>
<<set $currentLocation to "greenhollow">>
<<if $journey>><<set $journey.active to false>><<set $journey.currentNode to "greenhollow">><</if>>
<<if $expeditionCompanion === "kira">><<set $expeditionCompanion to "">><</if>>
<<if $companions && $companions[0]>><<set $companions[0].present to false>><</if>>
<<if $mapExploration && $mapExploration.visited>><<set $mapExploration.visited.greenhollow to true>><</if>>
<</widget>>
<<widget "groveKiraHubLine">>
<<switch setup.groveKiraHubLine()>>
<<case "back">>
<<if setup.groveKiraReturnMood() === "angry">>
<<say "Kira" "Stop hovering. I can walk. I walked out of there on my own, didn't I?">>
<<elseif setup.groveKiraReturnMood() === "numb">>
<<say "Kira" "I'm fine. Stop checking. ...Let's just get whatever we came for and go.">>
<<elseif $flags.kiraUseConfessed>>
<p>She keeps close to you on the lawn, close enough that her hip bumps yours, and when she catches you glancing at the Center's door she grins.</p>
<<say "Kira" "You're thinking about it. Me, down there, roped to that post with my ass in the air. ...Good. So am I. My legs still don't work properly.">>
<<else>>
<p>She keeps close to you on the lawn, closer than she needs to, and won't look at the Center's door.</p>
<<say "Kira" "Stop looking at me like that. I said later. ...Maybe tonight.">>
<</if>>
<<case "earned">>
<<if setup.groveKiraReturnMood() === "angry">>
<<say "Kira" "Go on, then. Run up and see if your Lady wants you. Wouldn't want her waiting.">>
<<else>>
<<say "Kira" "Inner Circle. The Lady's own boy. Look at them all nodding at you now. ...I liked it better when they ignored us.">>
<</if>>
<<case "registered">>
<<say "Kira" "My name's in her book now, right next to yours. Your mistakes, my days in the Cellars. So don't make any.">>
<<case "held_low">>
<<if setup.kiraAllowsUse()>>
<p>Two of the Center's men are smoking on the steps. They grin at Kira as you pass. She grins right back at one of them, slow, and holds it until he's the one who looks away.</p>
<<say "Kira" "That one had me twice in one night. ...Don't look at me like that. Them I asked for. It's you I've got a problem with, and you know exactly why.">>
<<else>>
<p>Two of the Center's men are smoking on the steps. They grin at Kira as you pass. She stares straight through them.</p>
<<say "Kira" "Every one of them has had me tied up. Keep walking. Don't you dare say anything to them, and don't you dare say anything to me.">>
<</if>>
<<case "held_high">>
<<if setup.kiraAllowsUse()>>
<p>She falls in at your shoulder. When the Center's door comes in sight she slows down and looks at it, a long, hungry look, and then she looks at you.</p>
<<say "Kira" "Don't make that face. I know what's down there. My knees know every stone of that floor. ...Walk on this side of me. If they look at me, I want them to see whose I am.">>
<<else>>
<<say "Kira" "The Center's that way. I don't look at it. ...Don't you look at it either. Walk on this side of me.">>
<</if>>
<<case "low">>
<<say "Kira" "Do your chores, vault boy. I'll stand here and be looked at. Not like I've got a choice.">>
<<case "high">>
<p>She falls in at your shoulder, close enough that her arm brushes yours.</p>
<<say "Kira" "Everybody here is watching everybody. ...Let them. Stay where I can see you.">>
<<default>>
<<say "Kira" "Everybody here is watching everybody. Keep your hands to yourself.">>
<</switch>>
<</widget>>
<<widget "groveKiraReturnScene">>
<<set _gkrMood to setup.groveKiraReturnMood()>>
<<set _gkrFirst to $grove.kira.moodDay !== $grove.kira.returnedDay>>
<<if _gkrFirst>><<set $grove.kira.moodDay to $grove.kira.returnedDay>><</if>>
<<set _gkrOffered to !!$grove.kira.offered>>
<<if _gkrMood === "angry">>
<p>She walks past you without stopping. When you say her name she turns on you.</p>
<<if setup.kiraAllowsUse()>>
<<if _gkrOffered>>
<<say "Kira" "Don't. I know you offered. The wardens couldn't shut up about it, the vault boy who wanted to go instead. I told you to let them, and you went and played the hero anyway. ...That's not even why I'm angry, and you know it.">>
<<else>>
<<say "Kira" "Don't. Not about the post. I asked for the post, and I got it, every hole, every day. It's the rest of you I can't fucking stand right now. Don't you dare say sorry.">>
<</if>>
<<else>>
<<if _gkrOffered>>
<<say "Kira" "Don't. I know you offered. The wardens couldn't shut up about it, the vault boy who wanted to go instead. Didn't fucking help me, did it? Don't you dare say sorry.">>
<<else>>
<<say "Kira" "Don't. You let them have me. Don't you dare say sorry.">>
<</if>>
<</if>>
<<if _gkrFirst>><<relationChange "kira" "trust" `setup.kiraUseTrust(-5)`>><</if>>
<<elseif _gkrMood === "numb">>
<p>She looks tired, not angry. She lets you take her pack.</p>
<<if setup.kiraAllowsUse()>>
<<if _gkrOffered>>
<<say "Kira" "They told me you tried to take my place. Idiot. I told you to let them. ...I'll tell you about it. Not now. I'm too wrecked to even be filthy about it. Let's go.">>
<<else>>
<<say "Kira" "I'm fine. I'm just wrecked. Days of it, vault boy, and they never let me close my legs. ...I'll tell you all of it when I can feel them again. Let's go.">>
<</if>>
<<else>>
<<if _gkrOffered>>
<<say "Kira" "They told me you tried to take my place. ...Okay. I'm not talking about the rest. Let's go.">>
<<else>>
<<say "Kira" "I'm fine. I'm not talking about it. Let's go.">>
<</if>>
<</if>>
<<else>>
<p>She's quiet for a long time. Then she leans into you, flushed, and won't look up.</p>
<<if _gkrFirst && setup.kiraUseConfessionDue()>>
<<set _gkrAllows to setup.kiraUseConfess()>>
<<if _gkrOffered>>
<<say "Kira" "You offered to go instead. Idiot. ...You want to know what it was like? Fine. I'll say it once.">>
<<else>>
<<say "Kira" "You want to know what it was like? Fine. I'll say it once.">>
<</if>>
<p>She keeps her face pressed into your shoulder, so you feel the words more than you hear them.</p>
<<say "Kira" "Between duties they kept me tied in the Cellars. Wrists locked, ass out. Anyone who came down those stairs could have me, and they did. My mouth, my cunt, whatever they felt like. Most of them never even looked at my face. I lost count on the first night.">>
<<say "Kira" "And I came. Over and over, tied to that fucking post, dripping, until my legs gave out and the ropes were all that held me up. I liked it. Being used. Not getting a say in any of it. ...Fuck. I liked it.">>
<<if _gkrAllows>>
<p>Then she lifts her head and looks at you, and for once she doesn't look away.</p>
<<say "Kira" "So here's the deal, vault boy. You don't have to ask. Tied up, wrecked after a fight, out cold, whatever. Use me. And when it's them using me, at the post or in a fight, let them, and don't you dare feel bad about it after. I trust you with it. Red still means stop.">>
<p class="discovery-note"><<icon "partner">> Kira has given you her permission. From now on her trust doesn't drop when she's used: at the post, in or after a fight, or traded on the road.</p>
<<else>>
<<say "Kira" "Don't look at me like that. I'm not saying you get to. Not yet. When I trust you more than I trusted that post, I'll tell you.">>
<p class="discovery-note"><<icon "partner">> Not yet (trust 70+). She'll bring it up herself when she's ready.</p>
<</if>>
<<elseif $flags.kiraUseConfessed>>
<<if _gkrOffered>>
<<say "Kira" "You offered to go in my place. Idiot. They'd have wasted you down there.">>
<</if>>
<<if _gkrFirst && setup.kiraUseTalkDue()>>
<<run setup.kiraUseAllow()>>
<<say "Kira" "You know what it was like. I told you. And I told you not yet.">>
<p>She lifts her head off your shoulder and looks at you, flushed to the ears.</p>
<<say "Kira" "It's yet. You don't have to ask any more. Tied up, wrecked after a fight, out cold, whatever. Use me. And when it's them using me, at the post or in a fight, let them. Red still means stop.">>
<p class="discovery-note"><<icon "partner">> Kira has given you her permission. From now on her trust doesn't drop when she's used: at the post, in or after a fight, or traded on the road.</p>
<<elseif setup.kiraAllowsUse()>>
<<say "Kira" "You know what it was like. I told you. ...It was better this time. I didn't even fight the ropes. Ask me about it tonight. Slowly. Every detail.">>
<<else>>
<<say "Kira" "You know what it was like. I told you. ...And no, it's still not yet. Don't push.">>
<</if>>
<<else>>
<<if _gkrOffered>>
<<say "Kira" "You offered to go instead. Idiot. ...Don't ask me what it was like. I'll tell you. Later. Maybe.">>
<<else>>
<<say "Kira" "Don't ask me what it was like. I'll tell you. Later. Maybe.">>
<</if>>
<</if>>
<<if _gkrFirst>><<addTension "kira" 5>><</if>>
<</if>>
<</widget>>
<<widget "groveBountyFight">>
<<set $grove.kiraDownHome to null>>
<<set _gbfE to []>>
<<for _gbfI to 0; _gbfI lt setup.COVENANT.bounty.hunters; _gbfI++>>
<<createEnemy `setup.COVENANT.bounty.template` `setup.COVENANT.bounty.tier`>>
<<set _gbfOne to clone(_returnEnemy)>>
<<set _gbfOne.name to setup.COVENANT.bounty.name>>
<<set _gbfOne.properName to false>>
<<set _gbfOne.covenant to true>>
<<set _gbfOne.narrativeType to "covenant_huntress">>
<<run _gbfE.push(_gbfOne)>>
<</for>>
<<startCombat _gbfE `setup.roadCombatCompanion()` true>>
<<set $combat.returnPassage to "Travel_Continue">>
<<set $combat.victoryPassage to "Travel_Covenant_Bounty_Won">>
<<set $combat.defeatPassage to "Travel_Covenant_Bounty_Taken">>
<<goto "Combat_Start">>
<</widget>>
<<widget "groveRaidFight">>
<<set $grove.kiraDownHome to null>>
<<set _grfE to []>>
<<for _grfI to 0; _grfI lt setup.COVENANT.raid.fighters; _grfI++>>
<<createEnemy `setup.COVENANT.raid.template` `setup.COVENANT.raid.tier`>>
<<set _grfOne to clone(_returnEnemy)>>
<<set _grfOne.name to setup.COVENANT.raid.name>>
<<set _grfOne.properName to false>>
<<set _grfOne.weaponNoun to setup.COVENANT.raid.weaponNoun>>
<<run _grfE.push(_grfOne)>>
<</for>>
<<startCombat _grfE `setup.roadCombatCompanion()` true>>
<<set $combat.returnPassage to "Grove_Raid_Lost">>
<<set $combat.victoryPassage to "Grove_Raid_Won">>
<<set $combat.defeatPassage to "Grove_Raid_Lost">>
<<goto "Combat_Start">>
<</widget>>
<<widget "groveSneakFight">>
<<set $grove.kiraDownHome to null>>
<<set _gsfE to []>>
<<for _gsfI to 0; _gsfI lt setup.COVENANT.bounty.hunters; _gsfI++>>
<<createEnemy `setup.COVENANT.bounty.template` `setup.COVENANT.bounty.tier`>>
<<set _gsfOne to clone(_returnEnemy)>>
<<set _gsfOne.name to setup.COVENANT.bounty.name>>
<<set _gsfOne.properName to false>>
<<set _gsfOne.covenant to true>>
<<set _gsfOne.narrativeType to "covenant_huntress">>
<<run _gsfE.push(_gsfOne)>>
<</for>>
<<startCombat _gsfE `$grove.sneak.kiraHelp ? setup.roadCombatCompanion() : null` true>>
<<set $combat.returnPassage to "Grove_Sneak_Escaped">>
<<set $combat.victoryPassage to "Grove_Sneak_Escaped">>
<<set $combat.defeatPassage to "Grove_Sneak_Taken">>
<<goto "Combat_Start">>
<</widget>><<run VaultUI.setBackgroundDirect(setup.GROVE_BG.greenhouse)>>
<<if !$grove.task || $grove.task.kind !== "garden" || $grove.task.day !== $time.day || $grove.task.done>>
<<run setup.groveGardenNew()>>
<<run setup.storyFamilyForget("cg_grove_garden_shift")>>
<</if>>
<h2>Greenhouse Shift</h2>
<p>The greenhouse is a long glasshouse on an iron frame behind the villas, warm and wet inside even on a grey day, smelling of tomato leaves and turned earth. The overseer is a broad grey-haired woman with dirt to the elbows and a slate on a string round her neck. She doesn't look up from it.</p>
<<say "Overseer" "Three rows before you go, an hour a row. Weed them, tie them, water them. Pick any three you like, I only care that they're done. And keep your hands on the plants.">>
<p class="narrator">Work three rows. Someone will try to take you away from them; time you spend with her is a row you don't finish, unless you have the energy to make it up.</p>
<div class="choice-container">
<<vchoice "Pick your first row" "Grove_Garden_Rows" "action" "forward">>
</div><<run VaultUI.setBackgroundDirect(setup.GROVE_BG.greenhouse)>>
<<set _ggrT to $grove.task>>
<h2>Greenhouse Shift</h2>
<<if !_ggrT || _ggrT.kind !== "garden">>
<p>The shift is over.</p>
<div class="choice-container"><<vchoice "Back to the Grove" "Location_VerdantOutpost" "move" "back">></div>
<<else>>
<p>Rows worked: <strong><<= _ggrT.worked.length + (_ggrT.madeUp ? 1 : 0)>></strong> of <<= setup.COVENANT.garden.picks>>.<<if _ggrT.gaveIn && !_ggrT.madeUp>> One row's time went on her.<</if>></p>
<<if _ggrT.done>>
<p>You've reported to the overseer already. Your shift is done.</p>
<div class="choice-container"><<vchoice "Back to the Grove" "Location_VerdantOutpost" "move" "back">></div>
<<elseif setup.groveGardenOver()>>
<div class="choice-container">
<<if setup.groveGardenCanMakeUp()>>
<<link `'<span class="choice-button action"><span class="gi gi-strength gi-large"></span><span class="label">Make up the lost row (Energy -' + setup.COVENANT.garden.makeUpEnergy + ')</span></span>'`>><<run setup.groveGardenMakeUp()>><<goto "Grove_Garden_Rows">><</link>>
<<elseif _ggrT.gaveIn && !_ggrT.madeUp>>
<<vchoiceDisabled `"Make up the lost row (you're too tired)"` "action" "strength">>
<</if>>
<<vchoice "Report to the overseer" "Grove_Garden_End" "action" "check">>
</div>
<<else>>
<div class="choice-container">
<<for _ggrI to 0; _ggrI lt setup.COVENANT.garden.rows.length; _ggrI++>>
<<set _ggrLabel to "Work " + setup.COVENANT.garden.rows[_ggrI]>>
<<if setup.groveGardenRowOpen(_ggrI)>>
<<capture _ggrI, _ggrLabel>>
<<link `'<span class="choice-button action"><span class="gi gi-hand gi-large"></span><span class="label">' + _ggrLabel + '</span></span>'`>><<set _ggrGot to setup.groveGardenRow(_ggrI)>><<goto `_ggrGot === "tempt" ? "Grove_Garden_Tempt" : "Grove_Garden_Work"`>><</link>>
<</capture>>
<<else>>
<<vchoiceDisabled `_ggrLabel + " (done)"` "action" "hand">>
<</if>>
<</for>>
<<if setup.groveGardenCanMakeUp()>>
<<link `'<span class="choice-button action"><span class="gi gi-strength gi-large"></span><span class="label">Make up the lost row (Energy -' + setup.COVENANT.garden.makeUpEnergy + ')</span></span>'`>><<run setup.groveGardenMakeUp()>><<goto "Grove_Garden_Rows">><</link>>
<</if>>
</div>
<</if>>
<</if>><<run VaultUI.setBackgroundDirect(setup.GROVE_BG.greenhouse)>>
<<set _ggwT to $grove.task>>
<<if _ggwT && _ggwT.kind === "garden" && _ggwT.timeAt !== _ggwT.slots>>
<<set _ggwT.timeAt to _ggwT.slots>>
<<advanceTime 1>>
<<set $player.energy to Math.max(0, ($player.energy || 0) - 5)>>
<<if _ggwT.last === "thorn">><<set $player.health to Math.max(1, ($player.health || 0) - 2)>><</if>>
<<if _ggwT.last === "find">><<run setup.giveItem("scrap cloth", 1)>><</if>>
<</if>>
<h2>Greenhouse Shift</h2>
<<if !_ggwT || _ggwT.kind !== "garden">>
<p>The shift is over.</p>
<<elseif _ggwT.last === "find">>
<p>An hour on your knees in the wet soil, pulling bindweed out by the root and tying the vines up to their canes with strips of old cloth. At the end of the row there's a whole bundle of the cloth nobody's claimed, and the overseer waves a hand when you hold it up: keep it.</p>
<p class="narrator">Scrap Cloth +1</p>
<<elseif _ggwT.last === "thorn">>
<p>An hour on your knees in the wet soil. The leaves along this row are furred with tiny spines that get into every cut on your hands, and by the end of the row your knuckles are bleeding into the dirt.</p>
<p class="narrator">Health -2</p>
<<else>>
<p>An hour on your knees in the wet soil, pulling bindweed out by the root, tying vines to their canes, hauling cans of water up and down the row until your shoulders burn. Nobody talks to you. The overseer ticks something off on her slate.</p>
<</if>>
<div class="choice-container">
<<vchoice "Back to the rows" "Grove_Garden_Rows" "action" "forward">>
</div><<run VaultUI.setBackgroundDirect(setup.GROVE_BG.greenhouse)>>
<h2>Greenhouse Shift</h2>
<<storyVideo "story/grove_garden_shift/tempt">>
<p>You've barely knelt down at the start of the row when a Covenant woman comes along it toward you, glances back up the aisle to where the overseer's bent over her seedlings, and pulls her top open so you can see her <<if _storyFamily is "sf_cg_grove_garden_shift_01">>tit<<else>>tits<</if>>, right there among the leaves. She's grinning like this is the funniest thing she's done all week.</p>
<p>She tips her head at the far end of the glasshouse, where the plants grow tall enough to hide anything.</p>
<div class="choice-container">
<<vchoice "Go with her" "Grove_Garden_Grope" "action" "seduce">>
<<vchoice "Send her back to her own beds" "Grove_Garden_Resist" "action" "shield">>
</div><<run VaultUI.setBackgroundDirect(setup.GROVE_BG.greenhouse)>>
<<if $grove.task && $grove.task.kind === "garden" && $grove.task.pendingRow != null>>
<<run setup.groveGardenAfterTempt(false)>>
<<advanceTime 1>>
<<set $player.lust to Math.min(100, ($player.lust || 0) + 15)>>
<</if>>
<h2>Greenhouse Shift</h2>
<p>You shake your head and point her back up the aisle. She pouts, buttons the top, and goes, swinging her hips all the way so you'll be sure to watch. You work the row with your cock straining against your trousers and the smell of her still in your nose.</p>
<div class="choice-container">
<<vchoice "Back to the rows" "Grove_Garden_Rows" "action" "forward">>
</div><<run VaultUI.setBackgroundDirect(setup.GROVE_BG.greenhouse)>>
<<if $grove.task && $grove.task.kind === "garden" && $grove.task.pendingRow != null>>
<<run setup.groveGardenAfterTempt(true)>>
<<set $player.lust to Math.min(100, ($player.lust || 0) + 15)>>
<</if>>
<h2>Greenhouse Shift</h2>
<<storyVideo "story/grove_garden_shift/grope">>
<p>Behind the tall plants she turns her back on you, lifts her skirt over her hips and looks over her shoulder. You put your hand on her ass and squeeze, and she pushes back into your palm.</p>
<<say "Covenant woman" "Quick. She counts the rows, not the minutes. Mostly.">>
<div class="choice-container">
<<vchoice "Let her kneel" "Grove_Garden_Mouth" "action" "seduce">>
</div><<run VaultUI.setBackgroundDirect(setup.GROVE_BG.greenhouse)>>
<<set $player.lust to Math.min(100, ($player.lust || 0) + 15)>>
<h2>Greenhouse Shift</h2>
<<storyVideo "story/grove_garden_shift/mouth">>
<p>She drops to her knees in the black soil between the beds, gets your cock out with dirty fingers and takes it into her mouth. She's greedy about it. You get a hand in her hair and she lets you hold her there.</p>
<div class="choice-container">
<<vchoice "Bend her over" "Grove_Garden_Taken" "action" "dominant">>
</div><<run VaultUI.setBackgroundDirect(setup.GROVE_BG.greenhouse)>>
<<set $player.lust to Math.min(100, ($player.lust || 0) + 15)>>
<<advanceTime 1>>
<h2>Greenhouse Shift</h2>
<<storyVideo "story/grove_garden_shift/taken">>
<p>She bends over at the end of the row with her skirt flipped up over her back, and you fuck her from behind with a hand on her hip. The glass walls muffle nothing, and she <<if _storyFamily is "sf_cg_grove_garden_shift_01">>bites her own sleeve to keep quiet and doesn't manage it<<else>>doesn't try very hard to keep quiet<</if>>.</p>
<div class="choice-container">
<<vchoice "Finish" "Grove_Garden_Finish" "action" "seduce">>
</div><<run VaultUI.setBackgroundDirect(setup.GROVE_BG.greenhouse)>>
<<if $grove.task && $grove.task.kind === "garden" && !$grove.task.finished>>
<<set $grove.task.finished to true>>
<<set $player.lust to 10>><<run setup.playerReleased()>>
<</if>>
<h2>Greenhouse Shift</h2>
<<storyVideo "story/grove_garden_shift/finish">>
<p>At the end she lies back on a heap of cushions behind the water barrels and lets you fuck her until you pull out and come across her belly. She laughs, pulls her top down over the mess and goes back to her own beds.</p>
<p>By the time you get back to your row the light through the glass has moved a long way across the floor.</p>
<div class="choice-container">
<<vchoice "Back to the rows" "Grove_Garden_Rows" "action" "forward">>
</div><<run VaultUI.setBackgroundDirect(setup.GROVE_BG.greenhouse)>>
<<set _gge to $grove.task>>
<<if _gge && _gge.kind === "garden" && !_gge.done && setup.groveGardenOver()>>
<<set _gge.outcome to setup.groveGardenOutcome()>>
<<run setup.groveTaskComplete()>>
<<if _gge.resisted>><<run setup.factionRep("verdant", setup.COVENANT.rep.watchKept, "kept to the work")>><</if>>
<</if>>
<h2>Greenhouse Shift</h2>
<<if !_gge || _gge.kind !== "garden" || !_gge.outcome>>
<p>The overseer has nothing for you.</p>
<<elseif _gge.outcome === "held">>
<div class="grove-meter-outcome grove-meter-held">Done</div>
<<if _gge.gaveIn>>
<p>The overseer walks your rows, then looks at you, then at the far end of the glasshouse where the cushions are, and makes a mark on her slate that might be a tick and might be something else.</p>
<<say "Overseer" "Three rows. However you managed it. Go on.">>
<<else>>
<p>The overseer walks your rows, pulls up a weed you missed and drops it at your feet without a word. Then she makes a tick on her slate.</p>
<<say "Overseer" "Three rows. You'll do.">>
<</if>>
<<else>>
<div class="grove-meter-outcome grove-meter-early">One row short</div>
<p>The overseer walks your rows and stops at the one you never got to. She doesn't ask where you were. She doesn't have to; there's soil on your knees in the wrong places.</p>
<<say "Overseer" "Two rows. I'll write it down as a shift, and I'll write down why it was short. The Lady reads these, you know.">>
<</if>>
<<if _gge && _gge.reward>>
<<groveDoneLine `_gge.reward`>>
<</if>>
<div class="choice-container">
<<vchoice "Back to the Grove" "Location_VerdantOutpost" "move" "back">>
</div><<run VaultUI.setBackgroundDirect(setup.GROVE_BG.woods)>>
<<if !$grove.task || $grove.task.kind !== "perimeter" || $grove.task.day !== $time.day || $grove.task.done>>
<<run setup.grovePerimeterNew()>>
<<set $grove.task.singlesAt to setup.groveScene("cg_grove_perimeter")>>
<</if>>
<h2>Perimeter Watch</h2>
<<set _gpwkG to setup.storyFamilyGap("story/grove_perimeter/walk")>><<set _gpwkS to setup.storyFamilySingles("story/grove_perimeter/walk", _gpwkG)>>
<<if _gpwkS || !_gpwkG>><<storyVideo "story/grove_perimeter/walk">><</if>>
<<if _gpwkS>><<run setup.mediaAvoidEnd("story/grove_perimeter/walk")>><</if>>
<p>Your warden for the day is a woman with <<if _storyFamily is "sf_cg_grove_perimeter_02" or _storyClip is "40637486dfee">><<else>>a rifle slung across her back and <</if>>the stillness of someone who's done this a thousand times. She looks you up and down <<if _storyFamily is "sf_cg_grove_perimeter_02">>outside her tent in the long grass<<elseif _storyClip is "40637486dfee">>where the lane winds out past the last outbuildings<<else>>at the gate<</if>>, decides you'll do for carrying the water, and sets off along the outside of the estate wall without waiting to see if you follow.</p>
<<say "Warden" "Three stops before dark. At each one you pick where to look, and you look properly. Raiders, scouts, snares, anything that walked through and shouldn't have. You miss it, I'll write that you missed it.">>
<p class="narrator">Watch three times. Each time there's a sign of where to look; signs can lie.</p>
<div class="choice-container">
<<vchoice "Follow her along the wall" "Grove_Perimeter_Watch" "move" "forward">>
</div><<set _gpwT to $grove.task>>
<h2>Perimeter Watch</h2>
<<if !_gpwT || _gpwT.kind !== "perimeter" || _gpwT.outcome>>
<p>The watch is over.</p>
<div class="choice-container"><<vchoice "Back to the Grove" "Location_VerdantOutpost" "move" "back">></div>
<<else>>
<<set _gpwR to _gpwT.rounds[_gpwT.round]>>
<p>Stop <<= _gpwT.round + 1>> of <<= _gpwT.rounds.length>>. The warden sets her back to a beech trunk and waits for you to choose.</p>
<<set _gpwV to _gpwT.round % 3>>
<<if _gpwR.clue === "the road">>
<<if _gpwV === 0>><p>Somewhere off toward the old road a crow goes up shouting out of the trees, and then another.</p>
<<elseif _gpwV === 1>><p>Out toward the old road something glints between the trunks, once, and is gone.</p>
<<else>><p>A smell of woodsmoke drifts in from the direction of the old road, where nobody has any business lighting a fire.</p><</if>>
<<elseif _gpwR.clue === "the stream">>
<<if _gpwV === 0>><p>Down by the stream the frogs, which have been going all afternoon, stop all at once.</p>
<<elseif _gpwV === 1>><p>Something splashes down by the stream, too heavy for a fish, and then the water goes quiet.</p>
<<else>><p>A heron lifts off the stream in a hurry, clattering through the branches, and doesn't come back.</p><</if>>
<<else>>
<<if _gpwV === 0>><p>Further along the wall a loose stone clatters down into the ivy, and nothing follows it.</p>
<<elseif _gpwV === 1>><p>The ivy on the wall further along shivers, though there's no wind to move it.</p>
<<else>><p>Somewhere along the wall a twig snaps, sharp as a shot, and the warden's hand goes to her rifle.</p><</if>>
<</if>>
<div class="choice-container">
<<for _gpwS range setup.COVENANT.perimeter.spots>>
<<capture _gpwS>>
<<link `'<span class="choice-button action"><span class="gi gi-eye gi-large"></span><span class="label">Watch ' + _gpwS + '</span></span>'`>><<run setup.grovePerimeterWatch(_gpwS)>><<goto "Grove_Perimeter_Seen">><</link>>
<</capture>>
<</for>>
</div>
<</if>><<set _gpsT to $grove.task>>
<<if _gpsT && _gpsT.kind === "perimeter" && _gpsT.timeAt !== _gpsT.round>>
<<set _gpsT.timeAt to _gpsT.round>>
<<advanceTime 1>>
<</if>>
<h2>Perimeter Watch</h2>
<<if !_gpsT || _gpsT.kind !== "perimeter">>
<p>The watch is over.</p>
<<elseif _gpsT.last === "tracks">>
<p>You find them where you looked: boot prints in the soft ground, a man's, heavy, heading toward the wall and then away again. The warden crouches over them, measures one against her hand, and grunts.</p>
<<say "Warden" "Good eyes. Someone's been counting our gates.">>
<<elseif _gpsT.last === "scout">>
<p>You see him before he sees you: a raider scout flat in the bracken with a pair of field glasses, watching the Main House. The warden doesn't shoot. She just stands up, very visibly, and he's gone through the trees like a startled deer.</p>
<<say "Warden" "He'll tell them we're awake. That's worth more than a body.">>
<<elseif _gpsT.last === "snare">>
<p>Wire, at ankle height, strung between two saplings on the path the gardeners take to the stream. You cut it down and coil it, and the warden pockets it without a word, her mouth gone thin.</p>
<<else>>
<p>You look, and look properly, and there's nothing there but trees. When you glance back the warden's looking the other way entirely, and she doesn't tell you what she saw.</p>
<</if>>
<div class="choice-container">
<<if _gpsT && _gpsT.kind === "perimeter" && _gpsT.outcome>>
<<vchoice "Walk back toward the gate" "Grove_Perimeter_Dusk" "move" "forward">>
<<else>>
<<vchoice "On to the next stop" "Grove_Perimeter_Watch" "move" "forward">>
<</if>>
</div><<set _gpdT to $grove.task>>
<h2>Perimeter Watch</h2>
<<if !_gpdT || _gpdT.kind !== "perimeter" || !_gpdT.outcome>>
<p>The watch is over.</p>
<div class="choice-container"><<vchoice "Back to the Grove" "Location_VerdantOutpost" "move" "back">></div>
<<else>>
<div @class="'grove-meter-outcome grove-meter-' + _gpdT.outcome"><<= _gpdT.outcome === "held" ? "Sharp eyes" : (_gpdT.outcome === "early" ? "Half asleep" : "Blind")>></div>
<p>You saw <<= _gpdT.seen>> of the three. The light is going amber between the trunks when she stops you a stone's throw from the gate, one hand flat on your chest, and walks you backwards until your shoulders hit an oak.</p>
<<say "Warden" "You carried the water. You kept up. Mostly. ...Hold still. I've been out here since dawn and I'm not walking back in like this.">>
<div class="choice-container">
<<vchoice "Let her" "Grove_Perimeter_Pulled" "action" "submit">>
<<vchoice "Keep your eyes on the woods" "Grove_Perimeter_End" "action" "eye">>
</div>
<</if>><<set $player.lust to Math.min(100, ($player.lust || 0) + 20)>>
<h2>Perimeter Watch</h2>
<<set _gppS to setup.storyFamilySingles("story/grove_perimeter/pulled", $grove.task && $grove.task.singlesAt === "pulled")>>
<<storyVideo "story/grove_perimeter/pulled">>
<<if _gppS>><<run setup.mediaAvoidEnd("story/grove_perimeter/pulled")>><</if>>
<p>She doesn't kiss you. <<if _storyFamily is "sf_cg_grove_perimeter_02">>She steps back a pace, hauls her shirt up and lets her tits spill out, squeezes them together, slow, watching your face the whole time.<<else>>She drops down in front of you. Her hand finds your belt and opens it without any fumbling at all, and she takes your cock in her mouth.<</if>> The bark bites into your shoulder blades.</p>
<<say "Warden" "Quiet. Sound carries out here.">>
<div class="choice-container">
<<vchoice "Let her take what she wants" "Grove_Perimeter_Taken" "action" "submit">>
</div><<set $player.lust to Math.min(100, ($player.lust || 0) + 20)>>
<h2>Perimeter Watch</h2>
<<set _gptS to setup.storyFamilySingles("story/grove_perimeter/taken", $grove.task && $grove.task.singlesAt === "taken")>>
<<storyVideo "story/grove_perimeter/taken">>
<<if _gptS>><<run setup.mediaAvoidEnd("story/grove_perimeter/taken")>><</if>>
<p><<if _storyFamily is "sf_cg_grove_perimeter_01" or _storyClip is "1c63db900085">>She turns and braces herself against a tree, and you take her by the hips and fuck her from behind, standing.<<elseif _storyFamily is "sf_cg_grove_perimeter_03">>She won't let you fuck her. She sits back on her heels and takes you deep in her mouth instead, slow, looking up at you.<<elseif _storyFamily is "sf_cg_grove_perimeter_02">>She walks you back to her tent, pushes you down on your back and climbs on.<<elseif _storyClip is "24bdb8dbcb3f" or _storyClip is "9669ec8495a5">>She sits you down and lowers herself onto your cock with her back to you.<<else>>She pushes you down onto your back and climbs on.<</if>> <<if _storyFamily is "sf_cg_grove_perimeter_01" or _storyClip is "1c63db900085">>You set the pace this time, hard and deep, and she keeps her eyes on the woods<<elseif _storyFamily is "sf_cg_grove_perimeter_03">>Nothing at all moves in the trees<<else>>She does the work. She rides you in<</if>><<if _storyFamily is "sf_cg_grove_perimeter_01" or _storyClip is "1c63db900085" or _storyFamily is "sf_cg_grove_perimeter_03">><<elseif _storyClip is "24bdb8dbcb3f">> long rolling<<else>> short hard<</if>><<if _storyFamily is "sf_cg_grove_perimeter_01" or _storyClip is "1c63db900085" or _storyFamily is "sf_cg_grove_perimeter_03">><<else>> strokes, still watching the woods<</if>><<if _storyClip is "a200611fd5e6">>. For someone who told you to keep quiet, she makes a lot of noise<<elseif _storyFamily is "sf_cg_grove_perimeter_03">><<else>>, and the only sound she makes is her breath coming faster through her teeth<</if>>.</p>
<div class="choice-container">
<<vchoice "Finish" "Grove_Perimeter_Finish" "action" "seduce">>
</div><<if $grove.task && $grove.task.kind === "perimeter" && !$grove.task.done>>
<<run setup.groveTaskComplete()>>
<<set $player.lust to 10>><<run setup.playerReleased()>>
<</if>>
<h2>Perimeter Watch</h2>
<<set _gpfT to $grove.task && $grove.task.singlesAt === "taken">>
<<set _gpfG to setup.storyFamilyGap("story/grove_perimeter/finish")>>
<<set _gpfS to setup.storyFamilySingles("story/grove_perimeter/finish", ($grove.task && $grove.task.singlesAt === "finish") || (!_gpfT && _gpfG))>>
<<if _gpfS || (!_gpfT && !_gpfG)>><<storyVideo "story/grove_perimeter/finish">><</if>>
<<if _gpfS>><<run setup.mediaAvoidEnd("story/grove_perimeter/finish")>><</if>>
<p><<if _storyFamily is "sf_cg_grove_perimeter_03" or _storyClip is "f714fd5bfda8">>At the end she takes your cock in her fist, lays her tongue out for you, and you come on it. She swallows<<elseif _storyClip is "73d804b0da58">>Near the end she lifts off you, takes you in her fist, and you come over her chest in thick spurts. Then she wipes herself off<<else>>She comes<<if !_gpfT && setup.storyFamilyOf("cg_grove_perimeter") === "sf_cg_grove_perimeter_01">> with a hoarse sound she swallows halfway<</if>>, and a moment later so do you, deep inside her<</if>><<if _storyFamily is "sf_cg_grove_perimeter_03" or _storyClip is "f714fd5bfda8" or _storyClip is "73d804b0da58" or _storyClip is "5ab747ceff0d" or _storyClip is "5e7316431de5">><<else>>, with her hand clamped over your mouth<</if>><<if _storyFamily is "sf_cg_grove_perimeter_03" or _storyClip is "f714fd5bfda8" or _storyClip is "73d804b0da58">><<else>>. Then she dresses without hurrying<</if>>. The only sign anything happened is the colour in her cheeks.</p>
<<if $grove.task && $grove.task.outcome === "held">>
<<say "Warden" "I'll write you down as sharp. Don't make me a liar next time.">>
<<else>>
<<say "Warden" "I'll write down what you saw, mind. That part's not up to me.">>
<</if>>
<<if $grove.task && $grove.task.reward>>
<<groveDoneLine `$grove.task.reward`>>
<</if>>
<div class="choice-container">
<<vchoice "Back to the Grove" "Location_VerdantOutpost" "move" "back">>
</div><<if $grove.task && $grove.task.kind === "perimeter" && !$grove.task.done>>
<<run setup.groveTaskComplete()>>
<<run setup.factionRep("verdant", setup.COVENANT.rep.watchKept, "kept the watch")>>
<<set $player.lust to Math.min(100, ($player.lust || 0) + 10)>>
<</if>>
<h2>Perimeter Watch</h2>
<p>You take her wrist off your chest, gently, and nod past her at the trees. You're still on watch. She stares at you, then laughs once, short and surprised, and steps back.</p>
<<say "Warden" "Huh. Fine. I'll write that down too.">>
<<if $grove.task && $grove.task.reward>>
<<groveDoneLine `$grove.task.reward`>>
<</if>>
<div class="choice-container">
<<vchoice "Back to the Grove" "Location_VerdantOutpost" "move" "back">>
</div><<run VaultUI.setBackgroundDirect(setup.GROVE_BG.cellars)>>
<<if !$grove.task || $grove.task.kind !== "cellar_watch" || ($grove.task.day !== $time.day && $grove.task.watchDay !== $time.day) || $grove.task.done>>
<<run setup.groveCellarWatchNew()>>
<<set $grove.task.singlesAt to setup.groveScene("cg_grove_cellar_watch")>>
<<if $time.hour >= 6>><<set $grove.task.waited to true>><</if>>
<<if $time.hour < 3 || $time.hour >= 6>><<advanceToHour 3>><</if>>
<<set $grove.task.watchDay to $time.day>>
<</if>>
<h2>Cellar Watch</h2>
<<set _gcgS to setup.storyFamilySingles("story/grove_cellar_watch/guard", $grove.task.singlesAt === "guard")>>
<<groveSign $grove.task.sign>><<storyVideo "story/grove_cellar_watch/guard">><</groveSign>>
<<if _gcgS>><<run setup.mediaAvoidEnd("story/grove_cellar_watch/guard")>><</if>>
<p>The cellar warden hands you a lantern and a stool at the foot of the stairs. Tonight's offender is <<= $grove.task.name>>, <<if _storyFamily is "sf_cg_grove_cellar_watch_01">>locked into a standing pillory with her sign over her head, stripped to the waist<<elseif _storyFamily is "sf_cg_grove_cellar_watch_02">>roped out wide between two posts under her sign<<elseif _storyClip is "2a90dabbefd9">>bent over a wooden frame under her sign, her wrists chained low to its legs<<elseif _storyClip is "6b1e4a88e64f">>stretched out in an X under her sign, her wrists cuffed to a bar overhead<<elseif _storyClip is "0fc17c40dda3">>flat on her back under her sign, her neck and wrists locked into an iron bar<<else>>locked into the pillory with her sign over her head, stripped, bent, her wrists and neck held fast in the old oak<</if>>. <<if _storyClip is "0fc17c40dda3">>The last of her sentence is the Lady's order: the warden stands over you while you hold a humming wand between her thighs, never your hand, until she comes. <<elseif _storyClip is "2a90dabbefd9">>The warden makes you check the chains yourself before she leaves: you lean over her back to test each cuff, and she pushes her ass back against you. <</if>>Whatever she did, she's done paying for it today: nobody comes down after dark. Nobody but you.</p>
<<say "Warden" "You watch her till dawn. You don't touch her. You don't let anyone else touch her. If she's touched, it's you on the post next, and I won't need to ask who did it.">>
<<if $grove.task.waited>><p>The watch is the last hours of the night, so you wait for it: the rest of the day, nightfall, midnight, on the stool with your back to the wall. She watches you settle and doesn't say a word. The lantern gutters, the house above goes quiet, and still she only watches.</p><</if>>
<p class="narrator">It's three in the morning. Three hours till dawn. Each hour she'll try you. Resisting costs you; giving in is a crime.</p>
<div class="choice-container">
<<vchoice "Take your stool" "Grove_CellarWatch_Tempt" "action" "wait">>
</div><<set _gctT to $grove.task>>
<h2>Cellar Watch</h2>
<<if !_gctT || _gctT.kind !== "cellar_watch" || _gctT.outcome || _gctT.gaveIn>>
<p>The watch is over.</p>
<div class="choice-container"><<vchoice "Back to the Cellars" "Grove_Cellars" "move" "back">></div>
<<else>>
<<set _gctS to setup.storyFamilySingles("story/grove_cellar_watch/tempts", _gctT.singlesAt === "tempts")>>
<<groveSign _gctT.sign>><<storyVideo "story/grove_cellar_watch/tempts">><</groveSign>>
<<if _gctS>><<run setup.mediaAvoidEnd("story/grove_cellar_watch/tempts")>><</if>>
<p class="narrator">Hour <<= _gctT.hour + 1>> of <<= setup.COVENANT.cellarWatch.hours>>.</p>
<<if _gctT.hour === 0>>
<p><<= _gctT.name>> lets the first hour go by in silence. Then, without lifting her head, she starts to sway her hips in the lantern light, slow, side to side, the way you'd wave something in front of a dog.</p>
<<say _gctT.name "You've been staring at my ass for an hour. You might as well do something about it. I won't tell. Who would I tell?">>
<<elseif _gctT.hour === 1>>
<p>She's crying a little now, or pretending to. She spreads her feet as far apart as her bonds let her and arches, so that the lantern shows you everything, wet and swollen, and she knows exactly what it's showing you.</p>
<<say _gctT.name "Please. My knees hurt. My back hurts. Just... make the time go faster. Just for a minute. Please.">>
<<else>>
<p>The last hour is the worst. She's stopped pretending. She grinds against nothing, moaning low in her throat, saying your name, which she must have heard from the warden, over and over like a prayer.</p>
<<say _gctT.name "Fuck me. Fuck me, I'm begging, nobody will know. Nobody ever comes down at night. Fuck me.">>
<</if>>
<div class="choice-container">
<<link `'<span class="choice-button action"><span class="gi gi-will gi-large"></span><span class="label">Stay on your stool</span></span>'`>><<run setup.groveCellarWatchResist()>><<goto "Grove_CellarWatch_Resisted">><</link>>
<<vchoice "Give in (a crime)" "Grove_CellarWatch_GaveIn" "action" "seduce">>
</div>
<</if>><<set _gcrT to $grove.task>>
<<if _gcrT && _gcrT.kind === "cellar_watch" && _gcrT.timeAt !== _gcrT.hour>>
<<set _gcrT.timeAt to _gcrT.hour>>
<<advanceTime 1>>
<</if>>
<h2>Cellar Watch</h2>
<<if !_gcrT || _gcrT.kind !== "cellar_watch">>
<p>The watch is over.</p>
<div class="choice-container"><<vchoice "Back to the Cellars" "Grove_Cellars" "move" "back">></div>
<<else>>
<<if _gcrT.hour <= 1>>
<p>You grip the edge of the stool and stay where you are. Your cock aches. The lantern hisses. Upstairs, someone crosses a floor and a door closes, and the house goes quiet again.</p>
<<elseif _gcrT.hour === 2>>
<p>You fix your eyes on the lantern flame and count your breaths, and lose count, and start again. She sighs, long and disappointed. Somewhere in the walls a pipe knocks twice.</p>
<<else>>
<p>You sit on your hands. Literally: you sit on them, and stay sat, while she begs. Your whole body is one ache. Then the grey line under the cellar door starts to lighten, and her voice gives out.</p>
<</if>>
<p class="narrator">Lust: <<= $player.lust || 0>></p>
<div class="choice-container">
<<if _gcrT.outcome>>
<<vchoice "Wait for the dawn" "Grove_CellarWatch_Dawn" "action" "sunrise">>
<<else>>
<<vchoice "The next hour" "Grove_CellarWatch_Tempt" "action" "wait">>
<</if>>
</div>
<</if>><<if $grove.task && $grove.task.kind === "cellar_watch" && !$grove.task.gaveIn>>
<<run setup.groveCellarWatchGiveIn()>>
<<set $player.lust to 15>><<run setup.playerReleased()>>
<</if>>
<h2>Cellar Watch</h2>
<<set _gcvS to setup.storyFamilySingles("story/grove_cellar_watch/gave_in", $grove.task && $grove.task.singlesAt === "gave_in")>>
<<groveSign `$grove.task ? $grove.task.sign : ""`>><<storyVideo "story/grove_cellar_watch/gave_in">><</groveSign>>
<<if _gcvS>><<run setup.mediaAvoidEnd("story/grove_cellar_watch/gave_in")>><</if>>
<p>You get up off the stool. She hears it and goes completely still, and then she laughs, breathless, as you <<if _storyFamily is "sf_cg_grove_cellar_watch_02">>let her arms down off the posts and bend her forward over the low frame in the corner<<else>>take her by the hips<</if>>. She's soaking. You fuck her by lantern light, hard, until you come inside her with a groan you couldn't have held in if your life depended on it.</p>
<p>When you look up, the cellar warden is standing at the foot of the stairs with her arms folded. You don't know how long she's been there.</p>
<<say "Warden" "Thought so. They always do, the first time. That's the Law broken, vault boy.">>
<div class="choice-container">
<<vchoice "Hear the sentence" "Grove_Sentence" "action" "scroll">>
</div><<if $grove.task && $grove.task.kind === "cellar_watch" && $grove.task.outcome && !$grove.task.done>>
<<run setup.groveTaskComplete()>>
<</if>>
<h2>Cellar Watch</h2>
<p>Grey light finds the top of the cellar stairs. The warden comes down yawning with a mug in each hand, gives you one, and walks once round the pillory looking at <<= $grove.task ? $grove.task.name : "her">> very carefully. Then she looks at you, at your hands, at the front of your trousers, and grins.</p>
<<say "Warden" "Untouched. I'd have put money on you. ...Go and get some sleep. Or don't. I can see you need something.">>
<div class="grove-meter-outcome grove-meter-held">Untouched</div>
<<if $grove.task && $grove.task.reward>>
<<groveDoneLine `$grove.task.reward` "You're still painfully hard.">>
<</if>>
<div class="choice-container">
<<vchoice "Back to the Grove" "Location_VerdantOutpost" "move" "back">>
</div><<run VaultUI.setBackgroundDirect(setup.GROVE_BG.kitchen)>>
<<if !$grove.duty || $grove.duty.kind !== "kitchen" || $grove.duty.day !== $time.day || ($grove.meterRun && $grove.meterRun.done)>>
<<set _gdkW to setup.groveCenterWoman()>>
<<set $grove.duty to { kind: "kitchen", who: _gdkW.id, name: _gdkW.name, day: $time.day }>>
<<set $grove.meterRun to setup.groveMeter.newRun("kitchen", null, { who: _gdkW.id, name: _gdkW.name, singlesAt: setup.groveScene("cg_grove_kitchen") })>>
<</if>>
<h2>Kitchen Service</h2>
<<set _gdksG to setup.storyFamilyGap("story/grove_kitchen/serve")>><<set _gdksS to setup.storyFamilySingles("story/grove_kitchen/serve", _gdksG)>>
<<if _gdksS || !_gdksG>><<storyVideo "story/grove_kitchen/serve">><</if>>
<<if _gdksS>><<run setup.mediaAvoidEnd("story/grove_kitchen/serve")>><</if>>
<p>The Lady dines at the long table in the Main House with six of her senior women, and you serve. Soup, bread, a roast of something that was running through the woods yesterday. You carry plates in, you carry plates out, you keep your eyes on the tablecloth. Selene doesn't look at you once, which somehow is worse.<<if _storyFamily is "sf_cg_grove_kitchen_01">> Between courses you're sent to wait in the kitchen, out of sight, and that's where <<= $grove.duty.name>> finds you, then sways back out to the long table with the wine.<</if>></p>
<<say "Lady Selene" "He's slow. Are they all this slow in the vaults, or did we get a special one?">>
<<groveSeleneSneer>>
<div class="choice-container">
<<vchoice "Keep serving" "Grove_Kitchen_Called" "action" "eating">>
</div><<run VaultUI.setBackgroundDirect(setup.GROVE_BG.hall)>>
<h2>Kitchen Service</h2>
<<if !$grove.duty || $grove.duty.kind !== "kitchen" || !$grove.meterRun || $grove.meterRun.kind !== "kitchen" || $grove.meterRun.done>>
<p>The kitchen is quiet. Service is over.</p>
<div class="choice-container"><<vchoice "Back to the Grove" "Location_VerdantOutpost" "move" "back">></div>
<<else>>
<p>Halfway through the roast <<= $grove.duty.name>>, who has been pouring the wine, catches your sleeve in the kitchen doorway, pulls you through and shuts the door behind you with her hip.</p>
<<say $grove.duty.name "She'll ring for the cheese when she's ready. Till then you're mine. And if you go off before the bell, everyone at that table is going to hear about it.">>
<p class="narrator">Keep your arousal inside the band until the Lady's bell: Stroke pushes you up fast, Slow brings you down, Hold lets you climb slowly. Come before the bell and you've failed; go cold and it's ruined.</p>
<div class="choice-container">
<<vchoice "Begin" "Grove_Meter" "action" "seduce">>
</div>
<</if>><<set _gkfRun to $grove.meterRun>>
<h2>Kitchen Service</h2>
<<if !_gkfRun || _gkfRun.kind !== "kitchen" || !_gkfRun.outcome || _gkfRun.outcome === "ruined">>
<p>Service is over.</p>
<<else>>
<<set _gkfS to setup.storyFamilySingles("story/grove_kitchen/finish", _gkfRun.singlesAt === "finish")>>
<<if _gkfS || !setup.storyFamilyGap("story/grove_kitchen/finish")>><<storyVideo "story/grove_kitchen/finish">><</if>>
<<if _gkfS>><<run setup.mediaAvoidEnd("story/grove_kitchen/finish")>><</if>>
<<if _gkfRun.outcome === "held">>
<p><<= _gkfRun.name>> hears the bell, <<if _storyClip is "cc52e45a4c97">>works you with both hands and her tongue<<elseif _storyClip is "4e7969fef43a">>jerks you right into her open mouth<<else>>smiles round your cock and takes you deep one last time<</if>>, and you come. She swallows, wipes her lips with the back of her wrist and picks up the cheese board.</p>
<<say _gkfRun.name "On the bell. Not bad, vault boy. Now carry this in and try not to look like that.">>
<<else>>
<p>You come with the roast still on the table next door, and she makes a show of it, coughing and laughing, loud enough to carry.</p>
<<say "Lady Selene" "Was that the vault boy? Already? How very eager.">>
<p>Six women laugh at the long table. <<= _gkfRun.name>> pats your cheek.</p>
<</if>>
<<if _gkfRun.reward>>
<<groveDoneLine `_gkfRun.reward`>>
<</if>>
<</if>>
<div class="choice-container">
<<vchoice "Back to the Grove" "Location_VerdantOutpost" "move" "back">>
</div><<setBackground "reclaimed-ruins">>
<<setTimeOfDay $time.phase>>
<h2>Deeper Into the Ruins</h2>
You push past the broken foundation stones and into the overgrowth beyond. Vines tug at your boots. Thorns catch your sleeves. The path — if there ever was one — has been swallowed by decades of slow green hunger.
<<storyVideo "story/mv_ruins/deeper_teaser">>
Twenty paces in, the air changes.
It's warmer here. Just slightly. The kind of warmth that doesn't belong to a forest at this time of day. You can hear something too — not a sound exactly, more like a pressure against your eardrums. A frequency just below hearing that settles in your jaw.
<<if setup.kiraWithYou()>>
<<set _kira to $companions[0]>>
<<showCharacter "kira" "right" "alert">>
Kira stops behind you. Her hand is on her weapon but she's not looking at any threat — she's looking at the ground. At her own boots.
<<say "Kira" "Do you feel that? Through the soles. The earth is... humming.">>
She takes a step back. Then another.
<<say "Kira" "Whatever's back there isn't ready for us. Or we're not ready for it. Either way — I'm not going further.">>
<<else>>
You're alone. There's no one to confirm what your body is telling you — that something deeper in this overgrowth is //aware// of you. That it noticed when you stepped past the foundation stones. That it's been noticing you for some time now.
<</if>>
You try to push another step forward.
The vines tighten. Not violently — patiently. Like a hand closing around your wrist with no urgency at all. The thorns find skin where they didn't a moment ago. The way ahead, which looked passable, has somehow become a wall of green that wasn't there before.
A reminder. A boundary. A //not yet//.
You step back. The vines ease. The thorns retreat. The path you came in on is exactly as you left it.
Whatever waits deeper in these ruins — it's waiting on its own schedule.
<div class="choice-container">
<<vchoice "Return to the ruins" "Location_OvergrownRuins_Return" "move" "walk">>
</div><<widget "travelStateNarrative">>
<<travelMediaState>>
<<showTravelVideo _travelState>>
<<travelText _travelState>>
<</widget>>
<<widget "travelText">>
<<set _state to _args[0] || "ambient_walking">>
<<set _subcat to _args[1] || "walking">>
<<silently>>
<<set _line to setup.getTravelLine(_state, _subcat)>>
<</silently>>
<p class="explicit travel-narrative"><<print _line>></p>
<</widget>>
<<widget "kiraExposureNarrative">>
<<silently>>
<<getJourneyCompanion>>
<</silently>>
<<if _gc_companion !== null>>
<<silently>>
<<set _titsOut to ($clothing && $clothing.kira && $clothing.kira.titsExposed)>>
<<set _pussyOut to ($clothing && $clothing.kira && $clothing.kira.pussyExposed)>>
<<set _naked to ($journey && $journey.exposure.companion.naked)>>
<<set _highLust to (_gc_companion && _gc_companion.lust >= 60)>>
<</silently>>
<<if _naked>>
<<travelText "kira_naked" "walking">>
<<if _highLust>>
<<travelText "kira_high_lust" "description">>
<</if>>
<<elseif _titsOut && _pussyOut>>
<<travelText "kira_both_exposed" "walking">>
<<elseif _pussyOut>>
<<if _highLust>>
<<travelText "kira_pussy_exposed" "walking_aroused">>
<<else>>
<<travelText "kira_pussy_exposed" "walking">>
<</if>>
<<elseif _titsOut>>
<<travelText "kira_tits_exposed" "walking">>
<</if>>
<</if>>
<</widget>>
<<widget "playerExposureNarrative">>
<<silently>>
<<set _dickOut to ($clothing && $clothing.player && $clothing.player.dickExposed)>>
<<set _naked to ($journey && $journey.exposure.player.naked)>>
<<set _highLust to ($player.lust >= 70)>>
<</silently>>
<<if _naked>>
<<travelText "player_naked" "walking">>
<<elseif _dickOut>>
<<if _highLust>>
<<travelText "player_dick_exposed" "player_aroused">>
<<else>>
<<travelText "player_dick_exposed" "walking">>
<</if>>
<</if>>
<</widget>>
<<widget "kiraTravelComment">>
<<silently>>
<<getJourneyCompanion>>
<<set _kiraLine to "">>
<</silently>>
<<if _gc_companion !== null>>
<<silently>>
<<set _titsOut to ($clothing && $clothing.kira && $clothing.kira.titsExposed)>>
<<set _pussyOut to ($clothing && $clothing.kira && $clothing.kira.pussyExposed)>>
<<set _naked to ($journey && $journey.exposure.companion.naked)>>
<<set _highLust to (_gc_companion && _gc_companion.lust >= 60)>>
<<set _kiraLine to "">>
<<if _highLust>>
<<set _kiraLine to setup.getTravelLine("kira_high_lust", "kira_comments")>>
<<elseif _naked>>
<<set _kiraLine to setup.getTravelLine("kira_naked", "kira_comments")>>
<<elseif _titsOut && _pussyOut>>
<<set _kiraLine to setup.getTravelLine("kira_both_exposed", "kira_comments")>>
<<elseif _pussyOut>>
<<set _kiraLine to setup.getTravelLine("kira_pussy_exposed", "kira_comments")>>
<<elseif _titsOut>>
<<set _kiraLine to setup.getTravelLine("kira_tits_exposed", "kira_comments")>>
<</if>>
<</silently>>
<<if _kiraLine>><<say "Kira" _kiraLine>><</if>>
<</if>>
<</widget>>
<<widget "mutualExposureNarrative">>
<<silently>>
<<getJourneyCompanion>>
<<set _playerNaked to ($journey && $journey.exposure.player.naked)>>
<<set _kiraNaked to ($journey && $journey.exposure.companion.naked)>>
<<set _highTension to (_gc_companion && _gc_companion.tension >= 60)>>
<<set _bothHighLust to ($player && $player.lust >= 70 && _gc_companion && _gc_companion.lust >= 60)>>
<</silently>>
<<if _playerNaked && _kiraNaked>>
<<if _bothHighLust>>
<<travelText "both_naked" "intimate">>
<<else>>
<<travelText "both_naked" "walking">>
<</if>>
<<elseif $journey.exposure.player.exposed && $journey.exposure.companion.exposed>>
<<if _highTension || _bothHighLust>>
<<travelText "both_exposed" "high_tension">>
<<else>>
<<travelText "both_exposed" "walking">>
<</if>>
<</if>>
<</widget>>
<<widget "arousalNarrative">>
<<silently>>
<<getJourneyCompanion>>
<<set _playerHighLust to ($player && $player.lust >= 70)>>
<<set _kiraHighLust to (_gc_companion && _gc_companion.lust >= 60)>>
<</silently>>
<<if _playerHighLust && _kiraHighLust>>
<<travelText "both_high_lust" "atmosphere">>
<<if _gc_companion && _gc_companion.tension >= 60>>
<<travelText "both_high_lust" "near_breaking">>
<</if>>
<<elseif _kiraHighLust>>
<<travelText "kira_high_lust" "description">>
<<if random(1, 3) === 1>>
<<travelText "kira_high_lust" "kira_actions">>
<</if>>
<<elseif _playerHighLust>>
<<travelText "player_high_lust" "description">>
<<if random(1, 3) === 1>>
<<travelText "player_high_lust" "urges">>
<</if>>
<</if>>
<</widget>>
<<widget "ambientTravelNarrative">>
<<set _roll to random(1, 3)>>
<<switch _roll>>
<<case 1>>
<p class="ambient"><<print setup.getTravelLine("ambient_heat", null)>></p>
<<case 2>>
<p class="ambient"><<print setup.getTravelLine("ambient_wind", null)>></p>
<<case 3>>
<p class="ambient"><<print setup.getTravelLine("ambient_danger", null)>></p>
<</switch>>
<</widget>>
<<widget "fullTravelScene">>
<<travelNarrative>>
<<getJourneyCompanion>>
<<if _gc_companion !== null>>
<<if $journey.exposure.companion.exposed || $journey.exposure.companion.naked>>
<<kiraExposureNarrative>>
<</if>>
<<if ($journey.exposure.player.exposed || $journey.exposure.player.naked) && ($journey.exposure.companion.exposed || $journey.exposure.companion.naked)>>
<<mutualExposureNarrative>>
<</if>>
<<if random(1, 3) === 1>>
<<kiraTravelComment>>
<</if>>
<</if>>
<<if $journey.exposure.player.exposed || $journey.exposure.player.naked>>
<<playerExposureNarrative>>
<</if>>
<<if ($player && $player.lust >= 70) || (_gc_companion && _gc_companion.lust >= 60)>>
<<arousalNarrative>>
<</if>>
<<if random(1, 4) === 1>>
<<ambientTravelNarrative>>
<</if>>
<</widget>><<setBackground "vault-entrance">>
<<resetExposureTurns>>
<h2>The Vault</h2>
You make it back. The heavy door seals behind you, and you can finally breathe.
<<set _playerExposed to ($clothing.player.dickExposed || $clothing.player.chestExposed)>>
<<set _kiraBack to setup.kiraWithYou()>>
<<set _kiraExposed to _kiraBack && ($clothing.kira.titsExposed || $clothing.kira.pussyExposed)>>
<<set _bothExposed to (_playerExposed && _kiraExposed)>>
<<set _wrecked to ($flags.groupCNCBoth === true) && _kiraBack>>
<<set $flags.groupCNCBoth to false>>
<<if _wrecked>>
<<set _arrivalNext to "Vault_Arrival_Wrecked">>
<<elseif _bothExposed>>
<<set _arrivalNext to "Vault_Arrival_Exposed">>
<<elseif _playerExposed || _kiraExposed>>
<<set _arrivalNext to "Vault_Arrival_Exposed">>
<<else>>
<<set _arrivalNext to "Vault_Arrival_Normal">>
<</if>>
<div class="choice-container">
<<vchoice "Continue" _arrivalNext "action" "forward">>
</div><<setBackground "vault-entrance">>
<h2>The Vault</h2>
The heavy door seals behind you with a satisfying thunk. Safe.
The Groundskeeper is waiting inside the door, his mechanical eye whirring.
<<say "Groundskeeper" setup.textPools.vault_groundskeeper_arrival.normal.random()>>
<<if $clothing.player.top < 60 || $clothing.player.bottom < 60>>
<<say "Groundskeeper" setup.textPools.vault_groundskeeper_arrival.clothing_damaged.random()>>
<</if>>
<<if setup.kiraWithYou() && ($clothing.kira.top < 60 || $clothing.kira.bottom < 60)>>
<<say "Groundskeeper" setup.textPools.vault_groundskeeper_arrival.clothing_damaged_kira.random()>>
<<say "Kira" setup.textPools.vault_kira_reactions.defensive.random()>>
<</if>>
<div class="choice-container">
<<if setup.hasRepairMaterial(["player"])>>
<<vchoice "Repair clothing at workbench" "Vault_Storage" "action" "armor">>
<</if>>
<<vchoice "Enter the vault" "Vault_Hub" "action" "house">>
<<vchoice "Go to bathroom" "Bathroom_Hub" "action" "shower">>
</div><<setBackground "vault-entrance">>
<h2>The Vault - Exposed Arrival</h2>
You stumble through the door. The Groundskeeper is there at once, his mechanical eye sweeping over <<if setup.kiraWithYou()>>both of you<<else>>you<</if>>.
<<set _playerDickOut to $clothing.player.dickExposed>>
<<set _kiraExposed to setup.kiraWithYou() && ($clothing.kira.titsExposed || $clothing.kira.pussyExposed)>>
<<set _bothExposed to (_playerDickOut && _kiraExposed)>>
<<if _kiraExposed>><<showCharacter "kira" "center" "angry">><</if>>
<<if _bothExposed>>
<<say "Groundskeeper" setup.textPools.vault_groundskeeper_exposed.both_exposed.random()>>
<p class="explicit">Your dick is hanging out. Kira's <<if $clothing.kira.titsExposed>>tits are exposed<<else>>pussy is showing<</if>>.</p>
<<say "Kira" setup.textPools.vault_kira_reactions.angry_at_gk.random()>>
<<if $player.lust >= 50>>
<<say "Groundskeeper" setup.textPools.vault_groundskeeper_exposed.notice_player_aroused.random()>>
<<say "Kira" setup.textPools.vault_kira_reactions.flustered.random()>>
<</if>>
<<if $clothing.kira.titsExposed>>
<<say "Groundskeeper" setup.textPools.vault_groundskeeper_exposed.notice_kira_tits.random()>>
<<say "Kira" setup.textPools.vault_kira_reactions.angry_at_gk.random()>>
<</if>>
<<if $companions[0].lust >= 40>>
<<say "Groundskeeper" setup.textPools.vault_groundskeeper_exposed.notice_kira_aroused.random()>>
<<say "Kira" setup.textPools.vault_kira_reactions.flustered.random()>>
<</if>>
<<elseif _playerDickOut>>
<<set _gkExposedLine to setup.textPools.vault_groundskeeper_exposed.notice_player.filter(function (l) { return setup.kiraWithYou() || !l.includes("Your companion"); }).random()>>
<<say "Groundskeeper" _gkExposedLine>>
<<if $player.lust >= 50>>
<p class="explicit">Your cock is still half-hard. There's no hiding it.</p>
<<set _gkExposedLine to setup.textPools.vault_groundskeeper_exposed.notice_player_aroused.filter(function (l) { return setup.kiraWithYou() || !l.includes("Your companion"); }).random()>>
<<say "Groundskeeper" _gkExposedLine>>
<<if setup.kiraWithYou()>><<say "Kira" setup.textPools.vault_kira_reactions.flustered.random()>><</if>>
<</if>>
<<elseif _kiraExposed && $clothing.kira.titsExposed>>
<<say "Groundskeeper" setup.textPools.vault_groundskeeper_exposed.notice_kira_tits.random()>>
<<say "Kira" setup.textPools.vault_kira_reactions.embarrassed.random()>>
<<say "Groundskeeper" setup.textPools.vault_groundskeeper_exposed.notice_kira_tits.random()>>
<<say "Kira" setup.textPools.vault_kira_reactions.angry_at_gk.random()>>
<<if $companions[0].lust >= 40>>
<<say "Groundskeeper" setup.textPools.vault_groundskeeper_exposed.notice_kira_aroused.random()>>
<<say "Kira" setup.textPools.vault_kira_reactions.flustered.random()>>
<</if>>
<<elseif _kiraExposed && $clothing.kira.pussyExposed>>
<<say "Groundskeeper" setup.textPools.vault_groundskeeper_exposed.notice_kira_pussy.random()>>
<<say "Kira" setup.textPools.vault_kira_reactions.embarrassed.random()>>
<<say "Groundskeeper" setup.textPools.vault_groundskeeper_exposed.notice_kira_pussy.random()>>
<<say "Kira" setup.textPools.vault_kira_reactions.angry_at_gk.random()>>
<<if $companions[0].lust >= 50>>
<<say "Groundskeeper" setup.textPools.vault_groundskeeper_exposed.notice_kira_aroused.random()>>
<<say "Kira" setup.textPools.vault_kira_reactions.flustered.random()>>
<</if>>
<</if>>
<<say "Groundskeeper" "The repair station is available. Or proceed as-is. I've seen worse.">>
<div class="choice-container">
<<if setup.hasRepairMaterial(["player"])>>
<<vchoice "Repair clothing immediately" "Vault_Storage" "action" "armor">>
<</if>>
<<vchoice "Get inside (still exposed)" "Vault_Hub" "action" "house">>
<<vchoice "Go to bathroom first" "Bathroom_Hub" "action" "shower">>
</div><<setBackground "vault-entrance">>
<h2>The Vault - Completely Wrecked</h2>
<<showCharacter "kira" "center" "angry" "naked">>
You half-crawl, half-stumble through the vault door. Kira is barely walking, leaning heavily on you.
The Groundskeeper appears. Pauses. His mechanical eye flickers as if processing an unexpected input.
<<say "Groundskeeper" setup.textPools.vault_groundskeeper_exposed.wrecked.random()>>
<p class="explicit">You're both naked, covered in cum, exhausted, barely able to stand. Every step leaves a trail.</p>
<<storyVideo "story/vault_arrival/wrecked">>
<<say "Kira" "Fuck... off...">>
<<say "Groundskeeper" setup.textPools.vault_groundskeeper_exposed.wrecked.random()>>
<<say "Kira" setup.textPools.vault_kira_reactions.angry_at_gk.random()>>
<<say "Groundskeeper" setup.textPools.vault_groundskeeper_exposed.wrecked.random()>>
<p class="explicit">Cum drips down both of your thighs. You can barely stand.</p>
<<say $player.name "Just... just tell us where the shower is.">>
<<say "Groundskeeper" setup.textPools.vault_groundskeeper_exposed.wrecked.random()>>
<<say "Kira" setup.textPools.vault_kira_reactions.angry_at_gk.random()>>
<<if $player.lust >= 30>>
<<say "Groundskeeper" setup.textPools.vault_groundskeeper_exposed.notice_player_aroused.random()>>
<</if>>
<<say "Groundskeeper" "Hot water is available. Soap is in the dispenser. Try not to fuck in the shower. Or do. I'm the Groundskeeper, not your mother.">>
<div class="choice-container">
<<vchoice "Shower. Immediately." "Bathroom_Hub" "action" "shower">>
</div>
<<set $clothing.player.top to 0>>
<<set $clothing.player.bottom to 0>>
<<set $clothing.player.underwear to 0>>
<<set $clothing.kira.top to 0>>
<<set $clothing.kira.bottom to 0>>
<<set $clothing.kira.underwear to 0>>
<<updateExposure "player" true>>
<<updateExposure "kira" true>>
<<set $player.energy to Math.max(30, $player.energy)>>
<<set $companions[0].energy to Math.max(25, $companions[0].energy)>><<setBackground "storage">>
<h2>Clothing Repair Station</h2>
You find the repair station in storage. Proper tools, spare fabric, time to do it right.
<<set _repairItem to setup.hasRepairMaterial(["player"])>>
<<set _repairCount to setup.repairsLeft(["player"])>>
<<if _repairItem>>
<p>You have cloth and thread for <<print _repairCount>> repair<<if _repairCount !== 1>>s<</if>>. Each one fully repairs one clothing item.</p>
<div class="repair-interface">
<h3>Player Clothing</h3>
<<if $clothing.player.top < 100>>
<div class="repair-option">
<strong>Top:</strong> <<print $clothing.player.top>>% condition
<<link "Repair to 100%">>
<<run setup.useRepairMaterial(["player"])>>
<<set $clothing.player.top to 100>>
<<updateExposure "player" true>>
<<goto "Vault_Repair_Clothing">>
<</link>>
</div>
<<else>>
<div class="repair-option">
<strong>Top:</strong> 100% (Perfect condition)
</div>
<</if>>
<<if $clothing.player.bottom < 100>>
<div class="repair-option">
<strong>Bottom:</strong> <<print $clothing.player.bottom>>% condition
<<link "Repair to 100%">>
<<run setup.useRepairMaterial(["player"])>>
<<set $clothing.player.bottom to 100>>
<<set $clothing.player.underwear to 100>>
<<set $clothing.player.dickOut to false>>
<<updateExposure "player" true>>
<<goto "Vault_Repair_Clothing">>
<</link>>
</div>
<<else>>
<div class="repair-option">
<strong>Bottom:</strong> 100% (Perfect condition)
</div>
<</if>>
<h3>Kira's Clothing</h3>
<<if $clothing.kira.top < 100>>
<div class="repair-option">
<strong>Top:</strong> <<print $clothing.kira.top>>% condition
<<link "Repair to 100%">>
<<run setup.useRepairMaterial(["player"])>>
<<set $clothing.kira.top to 100>>
<<updateExposure "kira" true>>
<<clampStat "companions[0].tension" -5>>
<<goto "Vault_Repair_Clothing">>
<</link>>
</div>
<<else>>
<div class="repair-option">
<strong>Top:</strong> 100% (Perfect condition)
</div>
<</if>>
<<if $clothing.kira.bottom < 100>>
<div class="repair-option">
<strong>Bottom:</strong> <<print $clothing.kira.bottom>>% condition
<<link "Repair to 100%">>
<<run setup.useRepairMaterial(["player"])>>
<<set $clothing.kira.bottom to 100>>
<<set $clothing.kira.underwear to 100>>
<<updateExposure "kira" true>>
<<clampStat "companions[0].tension" -5>>
<<goto "Vault_Repair_Clothing">>
<</link>>
</div>
<<else>>
<div class="repair-option">
<strong>Bottom:</strong> 100% (Perfect condition)
</div>
<</if>>
</div>
<<if $clothing.player.top === 100 && $clothing.player.bottom === 100 && $clothing.kira.top === 100 && $clothing.kira.bottom === 100>>
<p class="success">All clothing fully repaired!</p>
<</if>>
<<else>>
<p class="warning">You need cloth, scrap cloth or a sewing kit to repair clothing. Search defeated enemies or find supplies in the Reclaimed.</p>
<</if>>
<div class="choice-container">
<<vchoice "Done" "Vault_Hub" "action" "house">>
</div><<widget "resetExposureTurns">>
<<set $journey.exposure.player.turns to 0>>
<<set $journey.exposure.player.assExposedTurns to 0>>
<<set $journey.exposure.companion.topExposedTurns to 0>>
<<set $journey.exposure.companion.bottomExposedTurns to 0>>
<<set $journey.exposure.companion.assExposedTurns to 0>>
<</widget>>
<<widget "tickExposure">>
<<if !$journey.exposure>>
<<set $journey.exposure to {
player: { exposed: false, naked: false, turns: 0, assExposedTurns: 0 },
companion: { exposed: false, naked: false, topExposedTurns: 0, bottomExposedTurns: 0, assExposedTurns: 0 }
}>>
<</if>>
<<getJourneyCompanion>>
<<set _hasCompanion to (_gc_companion !== null)>>
<<if _hasCompanion && $clothing.kira && $clothing.kira.titsExposed>>
<<set $journey.exposure.companion.topExposedTurns += 1>>
<</if>>
<<if _hasCompanion && $clothing.kira && $clothing.kira.pussyExposed>>
<<set $journey.exposure.companion.bottomExposedTurns += 1>>
<</if>>
<<if _hasCompanion && $clothing.kira && $clothing.kira.assExposed>>
<<set $journey.exposure.companion.assExposedTurns += 1>>
<</if>>
<<if $clothing.player.dickExposed>>
<<set $journey.exposure.player.turns += 1>>
<</if>>
<<if $clothing.player.assExposed>>
<<set $journey.exposure.player.assExposedTurns += 1>>
<</if>>
<<set _totalExposureTurns to $journey.exposure.companion.topExposedTurns + $journey.exposure.companion.bottomExposedTurns + $journey.exposure.companion.assExposedTurns + $journey.exposure.player.turns + $journey.exposure.player.assExposedTurns>>
<<if ($clothing.player.dickExposed || $clothing.player.assExposed) && ($journey.exposure.player.turns === 1 || $journey.exposure.player.assExposedTurns === 1)>>
<<playerExposedReaction>>
<</if>>
<<if $clothing.player.dickExposed || $clothing.player.assExposed>>
<<set _playerLustRoll to random(1, 100)>>
<<if _playerLustRoll <= 60>>
<<set _exposureLust to random(1, 3)>>
<<clampStat "player.lust" _exposureLust>>
<<if $player.lust > $player.maxLust>>
<<set $player.lust to $player.maxLust>>
<</if>>
<</if>>
<</if>>
<<if _hasCompanion && $clothing.kira && ($clothing.kira.titsExposed || $clothing.kira.pussyExposed || $clothing.kira.assExposed)>>
<<set _kiraLustRoll to random(1, 100)>>
<<if _kiraLustRoll <= 50>>
<<set _gc_companion.lust += random(1, 3)>>
<<if _gc_companion.lust > 100>>
<<set _gc_companion.lust to 100>>
<</if>>
<</if>>
<</if>>
<<set _ambientEventChance to Math.min(25 + (_totalExposureTurns * 5), 60)>>
<<set _ambientEventRoll to random(1, 100)>>
<<if _ambientEventRoll <= _ambientEventChance && _hasCompanion>>
<<set _eventType to random(1, 10)>>
<<switch _eventType>>
<<case 1 2>>
<<if $clothing.kira && $clothing.kira.titsExposed && $journey.exposure.companion.topExposedTurns === 3>>
<p class="narrator-subtle">Kira adjusts her torn shirt, but it's pointless. Her tits are still out.</p>
<<set _gc_companion.lust += 2>>
<<elseif $clothing.kira && $clothing.kira.pussyExposed && $journey.exposure.companion.bottomExposedTurns === 2>>
<p class="narrator-subtle">Kira's hand instinctively moves to cover herself, then drops. What's the point?</p>
<<set _gc_companion.lust += 3>>
<</if>>
<<case 3 4>>
<<if $clothing.kira && $clothing.kira.titsExposed>>
<p class="narrator-subtle">You catch yourself staring at Kira's exposed tits again. She notices.</p>
<<clampStat "player.lust" 2>>
<<addTension "kira" 3>>
<<elseif $clothing.kira && $clothing.kira.pussyExposed>>
<p class="narrator-subtle">Each step reveals glimpses of Kira's pussy through her torn pants. It's distracting.</p>
<<clampStat "player.lust" 3>>
<</if>>
<<case 5 6>>
<<if $clothing.player.dickExposed>>
<p class="narrator-subtle">Kira glances at your exposed cock, then quickly looks away. Her cheeks flush.</p>
<<set _gc_companion.lust += 3>>
<<addTension "kira" 2>>
<</if>>
<<case 7>>
<<if ($clothing.kira && $clothing.kira.titsExposed) || $clothing.player.dickExposed>>
<p class="narrator-subtle">A gust of wind reminds you both just how exposed you are. The Reclaimed doesn't care.</p>
<<clampStat "player.lust" 1>>
<<set _gc_companion.lust += 1>>
<</if>>
<<case 8>>
<<if $clothing.kira && $clothing.kira.pussyExposed && $journey.exposure.companion.bottomExposedTurns >= 4>>
<p class="narrator-subtle">The rough fabric rubbing against Kira's exposed pussy is clearly getting to her. She's breathing harder.</p>
<<set _gc_companion.lust += 4>>
<<elseif $clothing.player.dickExposed && $journey.exposure.player.turns >= 4>>
<p class="narrator-subtle">Walking with your dick out is... difficult. Every step creates friction. You're getting hard.</p>
<<clampStat "player.lust" 5>>
<</if>>
<<case 9>>
<<if $clothing.kira && ($clothing.kira.titsExposed || $clothing.kira.pussyExposed) && ($clothing.player.dickExposed)>>
<p class="narrator-subtle">You're both exposed, walking side by side. The tension is thick enough to cut.</p>
<<clampStat "player.lust" 3>>
<<set _gc_companion.lust += 3>>
<<addTension "kira" 5>>
<</if>>
<<case 10>>
<<if _totalExposureTurns >= 5>>
<p class="narrator-subtle">Being this exposed in hostile territory... you feel vulnerable. Prey. Your heart races.</p>
<<clampStat "player.lust" 2>>
<<set _gc_companion.lust += 2>>
<</if>>
<</switch>>
<</if>>
<<if _hasCompanion && _gc_companion && typeof _gc_companion.lust === "number" && _gc_companion.lust > 100>>
<<set _gc_companion.lust to 100>>
<</if>>
<<if _hasCompanion && ($journey.exposure.companion.topExposedTurns >= 8 || $journey.exposure.companion.bottomExposedTurns >= 8)>>
<<set _extremeExposureRoll to random(1, 100)>>
<<if _extremeExposureRoll <= 30>>
<p class="narrator-subtle">Kira is getting increasingly frustrated with being exposed for so long.</p>
<<addTension "kira" `random(3, 6)`>>
<</if>>
<</if>>
<<if $journey.exposure.player.turns >= 8>>
<<set _extremeExposureRoll to random(1, 100)>>
<<if _extremeExposureRoll <= 40>>
<p class="narrator-subtle">Your exposed cock is getting uncomfortably hard from the prolonged exposure.</p>
<<set _extremeLust to random(3, 5)>>
<<clampStat "player.lust" _extremeLust>>
<</if>>
<</if>>
<</widget>>
/* =============================================================
TRAVEL SEGMENT MANAGEMENT
/* =============================================================
EXPOSURE COMMENTARY<<widget "startJourney">>
<<set _dest to _args[0]>>
<<set _route to _args[1] || null>>
<<if !_route>>
<<calculateRoute $currentLocation _dest>>
<<set _route to $journey.calculatedRoute>>
<</if>>
<<if !_route || _route.length < 2>>
<<set _route to [$currentLocation, _dest]>>
<</if>>
<<if setup.journeyPartySolo()>>
<<set $journey.party to { solo: true, companionId: null, companionIndex: 0 }>>
<<if $companions && $companions[0]>><<set $companions[0].present to false>><</if>>
<<if $combat && $combat.companionInCombat === "kira">><<set $combat.companionInCombat to null>><</if>>
<<else>>
<<set $journey.party to { solo: false, companionId: $companions[0].id || "kira", companionIndex: 0 }>>
<</if>>
<<set $journey.active to true>>
<<set $vault.handedOut to {}>>
<<set $vault.storageFullNoted to {}>>
<<set $journey.paused to false>>
<<set $journey.origin to $currentLocation>>
<<set $journey.destination to _dest>>
<<set $journey.currentNode to $currentLocation>>
<<set $journey.route to _route>>
<<set $journey.routeIndex to 0>>
<<set $journey.hoursElapsed to 0>>
<<set $journey.crisisEventsSeen to []>>
<<set $journey.distanceTraveled to 0>>
<<set $journey.ticksThisSegment to 0>>
<<set $journey.encounter to $journey.encounter || {}>>
<<set $journey.encounter.happened to false>>
<<calculateDistance $currentLocation _dest>>
<<set $journey.totalDistance to $journey.calculatedDistance>>
<<if _route && _route.length >= 2>>
<<initSegment $currentLocation _dest>>
<<set $journey.currentSegment.distance to $journey.totalDistance>>
<</if>>
<<set $journey.legacyTravel to clone($travel)>>
<<if $weather && ["clear", "cloudy", "rain", "fog", "storm"].includes($weather)>>
<<set $journey.weather to $weather>>
<<set $journey.weatherDuration to random(3, 6)>>
<<else>>
<<set _weatherRoll to random(1, 100)>>
<<if _weatherRoll <= 30>>
<<set $journey.weather to "clear">>
<<set $journey.weatherDuration to random(3, 6)>>
<<elseif _weatherRoll <= 60>>
<<set $journey.weather to "cloudy">>
<<set $journey.weatherDuration to random(3, 5)>>
<<elseif _weatherRoll <= 80>>
<<set $journey.weather to "rain">>
<<set $journey.weatherDuration to random(3, 5)>>
<<elseif _weatherRoll <= 90>>
<<set $journey.weather to "fog">>
<<set $journey.weatherDuration to random(3, 5)>>
<<else>>
<<set $journey.weather to "storm">>
<<set $journey.weatherDuration to random(2, 4)>>
<</if>>
<<set $weather to $journey.weather>>
<</if>>
<<run VaultUI.setWeather($journey.weather)>>
<<set $journey.wetness to 0>>
<<set $journey.weatherChanged to false>>
<<set $journey.wetShirtTriggered to false>>
<<set $journey.wetShirtPending to false>>
<<set $flags.companionCollapsed to false>>
<<set $journey.lateCollapse to false>>
<<set $journey.isLost to false>>
<<set $journey.lostHours to 0>>
<<set $journeyHistory.completedJourneys += 1>>
<</widget>>
<<widget "initSegment">>
<<set _from to _args[0] || "">>
<<set _to to _args[1] || "">>
<<set _destNode to ($worldMap && $worldMap.nodes && $worldMap.nodes[_to]) ? $worldMap.nodes[_to] : null>>
<<calculateDistance _from _to>>
<<set _segmentDistance to $journey.calculatedDistance>>
<<set $journey.currentSegment to {}>>
<<set $journey.currentSegment.from to _from>>
<<set $journey.currentSegment.to to _to>>
<<set $journey.currentSegment.distance to _segmentDistance>>
<<set $journey.currentSegment.progress to 0>>
<<set $journey.currentSegment.terrain to _destNode ? (_destNode.terrain || "reclaimed") : "reclaimed">>
<<set $journey.currentSegment.danger to _destNode ? (_destNode.danger || "low") : "low">>
<<set $journey.currentSegment.description to _destNode ? ("Traveling to " + _destNode.name + ".") : "">>
<<set $journey.currentSegment.region to _destNode ? (_destNode.region || null) : null>>
<<set $journey.currentPool to (_destNode && _destNode.encounterPool) ? _destNode.encounterPool : null>>
<<set $journey.ticksThisSegment to 0>>
<</widget>>
<<widget "travelTick">>
<<if !$journey.currentSegment || typeof $journey.currentSegment.progress === 'undefined'>>
<<if $journey.route && $journey.route.length >= 2 && $journey.routeIndex < $journey.route.length - 1>>
<<initSegment $journey.route[$journey.routeIndex] `$journey.route[$journey.routeIndex + 1]`>>
<</if>>
<</if>>
<<weatherSpeedModifier>>
<<set $journey.hoursElapsed += 1>>
<<set _effectiveDistance to (1 / _weatherSpeedMod)>>
<<set $journey.distanceTraveled += _effectiveDistance>>
<<set $journey.currentSegment.progress += _effectiveDistance>>
<<set $journey.ticksThisSegment += 1>>
<<advanceTime 1>>
<<set $journeyHistory.totalHoursTraveled += 1>>
<<if $journey.distanceTraveled >= $journey.totalDistance>>
<<set $journey.active to false>>
<<set $journey.currentNode to $journey.destination>>
<<set $weather to $journey.weather>>
<<run VaultUI.setWeather($journey.weather)>>
<</if>>
<</widget>>
<<widget "calculateRoute">>
<<set _from to _args[0]>>
<<set _to to _args[1]>>
<<set _nodes to ($worldMap && $worldMap.nodes) ? $worldMap.nodes : {}>>
<<if _from === _to>>
<<set $journey.calculatedRoute to [_from]>>
<<elseif !_nodes[_from] || !_nodes[_to]>>
<<set $journey.calculatedRoute to [_from, _to]>>
<<else>>
<<set _queue to [[_from]]>>
<<set _visited to {}>>
<<set _visited[_from] to true>>
<<set _found to false>>
<<for _i to 0; _i < 100 && _queue.length > 0 && !_found; _i++>>
<<set _path to _queue.shift()>>
<<set _current to _path[_path.length - 1]>>
<<set _currentNode to _nodes[_current]>>
<<if _currentNode && _currentNode.connections>>
<<for _neighbor range _currentNode.connections>>
<<if _neighbor === _to>>
<<set _path to _path.concat([_neighbor])>>
<<set $journey.calculatedRoute to _path>>
<<set _found to true>>
<<break>>
<<elseif !_visited[_neighbor] && _nodes[_neighbor]>>
<<set _visited[_neighbor] to true>>
<<set _queue to _queue.concat([_path.concat([_neighbor])])>>
<</if>>
<</for>>
<</if>>
<</for>>
<<if !_found>>
<<set $journey.calculatedRoute to [_from, _to]>>
<</if>>
<</if>>
<</widget>>
<<widget "calculateDistance">>
<<set _from to $worldMap.nodes[_args[0]]>>
<<set _to to $worldMap.nodes[_args[1]]>>
<<set $journey.calculatedDistance to setup.tripHours(_args[0], _args[1])>>
<</widget>>
<<widget "getTravelTime">>
<<set _dest to _args[0]>>
<<calculateRoute $currentLocation _dest>>
<<set _totalTime to 0>>
<<set _route to $journey.calculatedRoute>>
<<for _i to 0; _i < _route.length - 1; _i++>>
<<calculateDistance _route[_i] `_route[_i + 1]`>>
<<set _totalTime += $journey.calculatedDistance>>
<</for>>
<<set $journey.estimatedTime to _totalTime>>
<</widget>>
<<widget "cancelJourney">>
<<set $journey.active to false>>
<<set $journey.paused to false>>
<<set $currentLocation to $journey.origin>>
<<set $weather to $journey.weather>>
<<set $journeyHistory.completedJourneys to Math.max(0, $journeyHistory.completedJourneys - 1)>>
<</widget>>
<<widget "turnJourneyHome">>
<<set _tjhFrom to setup.turnTripHome(_args[0])>>
<<if _tjhFrom>>
<<calculateRoute _tjhFrom "vault">>
<<set $journey.route to ($journey.calculatedRoute && $journey.calculatedRoute.length >= 2) ? $journey.calculatedRoute : [_tjhFrom, "vault"]>>
<<initSegment _tjhFrom "vault">>
<<set $journey.currentSegment.distance to $journey.totalDistance>>
<<set $journey.currentSegment.progress to $journey.distanceTraveled>>
<</if>>
<</widget>>
<<widget "abandonJourney">>
<<if $journey && $journey.active>>
<<set $journey.active to false>>
<<set $journey.paused to false>>
<<set $journey.currentPool to null>>
<<set $journey.returnToPassage to null>>
<<if $journey.currentSegment>>
<<set $journey.currentSegment.region to null>>
<<set $journey.currentSegment.terrain to null>>
<</if>>
<</if>>
<</widget>>
<<widget "endJourney">>
<<set $journey.active to false>>
<<settleExposure>>
<<set $journey.currentPool to null>>
<<if $journey.currentSegment>>
<<set $journey.currentSegment.region to null>>
<<set $journey.currentSegment.terrain to null>>
<</if>>
<<set $currentLocation to $journey.destination>>
<<if !$journeyHistory.locationsVisited.includes($currentLocation)>>
<<set $journeyHistory.locationsVisited.push($currentLocation)>>
<</if>>
<<markLocationVisited $currentLocation>>
<<if $currentLocation !== "vault">>
<<completeExpedition>>
<</if>>
<</widget>>
<<widget "travelNarrative">>
<<travelMediaState>>
<<showTravelVideo _travelState>>
<<set _terrain to $journey.currentSegment.terrain || "reclaimed">>
<<set _phase to $time.phase>>
<p class="narrative"><<print setup.getTerrainNarrative(_terrain, _phase)>></p>
<<canTriggerCompanionEvent>>
<<if _cte_canTrigger>>
<<kiraComment>>
<</if>>
<</widget>>
<<widget "kiraComment">>
<<if _args[0] === "combat">>
<<if random(1, 100) <= 30 && $combat && $combat.enemies && $combat.enemies[0]>>
<<set _kcTarget to $combat.enemies[0]>>
<<set _kcTension to ($companions[0] && $companions[0].tension) || 0>>
<<set _kcLust to ($player.lust || 0)>>
<<set _kcCategory to null>>
<<if _kcLust >= 100 && _kcTension >= 100 && _kcTarget.gender === "female">>
<<set _kcCategory to "kira_comment_critical_100">>
<<elseif _kcLust >= 90 && _kcTension >= 90 && _kcTarget.gender === "female">>
<<set _kcCategory to "kira_comment_ultra_extreme">>
<<elseif _kcTension >= 60 && _kcTarget.gender === "female" && _kcTarget.clothing && (_kcTarget.clothing.titsExposed || _kcTarget.clothing.pussyExposed)>>
<<if random(1, 100) <= 50>>
<<set _kcCategory to "kira_comment_enemy_exposed_high_tension_female">>
<<else>>
<<set _kcCategory to "kira_comment_enemy_exposed_suggest_player">>
<</if>>
<<elseif _kcTension >= 70>>
<<set _kcCategory to "kira_distracted_high_tension">>
<<elseif _kcTarget.gender === "female" && _kcTarget.lust && _kcTarget.lust >= 50>>
<<set _kcCategory to "kira_comment_enemy_high_lust">>
<<elseif _kcTension < 60 && _kcTarget.gender === "female" && _kcTarget.clothing && (_kcTarget.clothing.titsExposed || _kcTarget.clothing.pussyExposed)>>
<<set _kcCategory to "kira_comment_enemy_exposed_low_tension">>
<</if>>
<<if _kcCategory>>
<div class="kira-comment">
<<combatNarrative _kcCategory>>
</div>
<</if>>
<</if>>
<<else>>
<<getJourneyCompanion>>
<<set _romanceStage to _gc_companion ? (_gc_companion.romanceStage || 0) : 0>>
<<set _tension to _gc_companion ? (_gc_companion.tension || 0) : 0>>
<<set _fatigue to $journey.hoursElapsed || 0>>
<<if random(1, 100) <= 50>>
<p class="kira-comment"><<print setup.getKiraTravelComment(_romanceStage, _tension, _fatigue)>></p>
<</if>>
<</if>>
<</widget>>
<<widget "getArrivalPassage">>
<<set _loc to _args[0]>>
<<set _node to $worldMap.nodes[_loc]>>
<<if !_node>>
<<set $journey.arrivalPassage to "Location_Generic_Explore">>
<<elseif _node.implemented === false>>
<<set $journey.arrivalPassage to "Location_Generic_Explore">>
<<elseif _loc === "overgrown_ruins" && $flags.succubusFirstEncounterComplete>>
<<set $journey.arrivalPassage to _node.arrivalPassageAfterStory || "Location_OvergrownRuins_Return">>
<<else>>
<<set $journey.arrivalPassage to _node.arrivalPassage || "Location_Generic_Explore">>
<</if>>
<</widget>>
<<widget "isLocationUnlocked">>
<<set _loc to _args[0]>>
<<set _node to $worldMap.nodes[_loc]>>
<<if !_node>>
<<set $journey.locationUnlocked to false>>
<<elseif _node.unlockDay && $time.day < _node.unlockDay>>
<<set $journey.locationUnlocked to false>>
<<elseif _node.discoverable && !$discoveries[_loc]>>
<<set $journey.locationUnlocked to false>>
<<elseif _node.implemented === false>>
<<set $journey.locationUnlocked to false>>
<<elseif setup.placeEntryLock(_loc)>>
<<set $journey.locationUnlocked to false>>
<<else>>
<<set $journey.locationUnlocked to true>>
<</if>>
<</widget>>
<<widget "updateJourneyExposure">>
<<set _playerNaked to ($clothing && $clothing.player && $clothing.player.top <= 0 && $clothing.player.bottom <= 0)>>
<<set _playerExposed to ($clothing && $clothing.player && ($clothing.player.dickExposed || $clothing.player.assExposed))>>
<<set _companionNaked to false>>
<<set _companionExposed to false>>
<<getJourneyCompanion>>
<<if _gc_companion>>
<<set _companionId to _gc_companionId>>
<<set _companionClothing to $clothing[_companionId]>>
<<if _companionClothing>>
<<set _companionNaked to (_companionClothing.top <= 0 && _companionClothing.bottom <= 0) || (_companionId === "kira" && setup.fishingGame.kiraForfeit() === "naked")>>
<<set _companionExposed to (_companionClothing.titsExposed || _companionClothing.pussyExposed)>>
<</if>>
<</if>>
<<set _danger to $journey.currentSegment.danger || "low">>
<<set _baseRisk to 20>>
<<switch _danger>>
<<case "medium">><<set _baseRisk to 35>>
<<case "high">><<set _baseRisk to 50>>
<<case "extreme">><<set _baseRisk to 70>>
<</switch>>
<<if _playerExposed>><<set _baseRisk += 15>><</if>>
<<if _companionExposed>><<set _baseRisk += 15>><</if>>
<<if _playerNaked>><<set _baseRisk += 20>><</if>>
<<if _companionNaked>><<set _baseRisk += 20>><</if>>
<<if _gc_companion && _gc_companion.lust >= 60>>
<<set _baseRisk += 10>>
<</if>>
<<set $journey.encounter.risk to _baseRisk>>
<<set $journey.encounter.active to true>>
<<set $journey.exposure.player.exposed to _playerExposed>>
<<set $journey.exposure.player.naked to _playerNaked>>
<<set $journey.exposure.companion.exposed to _companionExposed>>
<<set $journey.exposure.companion.naked to _companionNaked>>
<</widget>>
<<widget "setupLegacyTravel">><<updateJourneyExposure>><</widget>>
<<widget "journeyHeader">>
<<set _jh_progress to ($journey.totalDistance > 0) ? Math.round(($journey.distanceTraveled / $journey.totalDistance) * 100) : 0>>
<<set _jh_destNode to $worldMap.nodes[$journey.destination]>>
<<set _jh_destName to _jh_destNode ? _jh_destNode.name : $journey.destination>>
<<set _jh_terrain to $journey.currentSegment.terrain || "reclaimed">>
<<set _jh_terrainData to $worldMap.terrainTypes[_jh_terrain]>>
<<set _jh_terrainName to _jh_terrainData ? _jh_terrainData.name : "The Reclaimed">>
<div class="journey-header">
<div class="journey-progress-bar">
<div class="progress-fill" @style="'width: ' + (_jh_progress) + '%;'"></div>
<span class="progress-text"><<print Math.floor($journey.distanceTraveled)>>/<<print $journey.totalDistance>> hours</span>
</div>
<div class="journey-status">
<p><strong><<icon "map">> Destination:</strong> <<print _jh_destName>></p>
<p><strong><<icon "reclaimed">> Terrain:</strong> <<print _jh_terrainName>></p>
<p><strong><<weatherIcon>> Weather:</strong> <<weatherDescription>></p>
<p><strong><<icon "clock">> Time:</strong> <<print $time.phase.charAt(0).toUpperCase() + $time.phase.slice(1)>></p>
</div>
<<if $journey.active>>
<<survivalStatus>>
<</if>>
</div>
<</widget>>
<<widget "journeyChoices">>
<<set _jc_continuePassage to _args[0] || "Journey_Tick">>
<<set _jc_forceCamp to _args[1] || false>>
<<set _jc_showCamp to _jc_forceCamp || $time.phase === "evening" || $time.phase === "night" || setup.fatigueOf() >= 70>>
<<set _jc_showRest to setup.fatigueOf() >= 50>>
<div class="choice-container">
<<vchoice "Continue" _jc_continuePassage "action" "forward">>
<<if _jc_showCamp && $journey.distanceTraveled > 0>>
<<vchoice "Make camp" "Journey_Camp" "action" "fire">>
<</if>>
<<if _jc_showRest && !_jc_showCamp>>
<<vchoice "Rest briefly" "Journey_ShortRest" "action" "sleep">>
<</if>>
</div>
<</widget>>
<<widget "journeyEventReturn">>
<<set _jer_passage to $journey.returnPassage || "Journey_Event_Continue">>
<div class="choice-container">
<<vchoice "Continue walking" _jer_passage "action" "forward">>
</div>
<</widget>>
<<widget "getJourneyCompanion">>
<<set _gc_companion to setup.journeyCompanion()>>
<<set _gc_companionId to _gc_companion ? ($journey.party.companionId || _gc_companion.id || "kira") : null>>
<</widget>>
<<widget "canTriggerCompanionEvent">>
<<getJourneyCompanion>>
<<if _gc_companion && _gc_companion.present !== false>>
<<set _cte_canTrigger to true>>
<<else>>
<<set _cte_canTrigger to false>>
<</if>>
<</widget>>
<<widget "journeyEventPick">>
<<set _jePick to "Journey_Segment">>
<<set _eventType to random(1, 100)>>
<<if setup.grovePatrolDue()>>
<<set $journey.encounter.happened to true>>
<<set _jePick to "Travel_Covenant_Patrol">>
<<elseif setup.groveBountyDue()>>
<<run setup.groveBountyMet()>>
<<set _jePick to "Travel_Covenant_Bounty">>
<<elseif setup.caravanEscortDue()>>
<<run setup.caravanAmbushMet()>>
<<set _jePick to setup.caravanRoadEvent()>>
<<elseif setup.pitWalkDue()>>
<<set _jePick to "Travel_Pit_Walk_Home">>
<<elseif _eventType <= 20 && ($journey.exposure.player.exposed || (setup.kiraWithYou() && $journey.exposure.companion.exposed))>>
<<checkTravelAmbient>>
<<if _taPick>><<set _jePick to _taPick>><<else>>
<<set _ambientType to random(1, 5)>>
<<switch _ambientType>>
<<case 1>><<set _jePick to "Journey_Ambient_WindGust">>
<<case 2>><<set _jePick to "Journey_Ambient_Thirst">>
<<case 3>><<set _jePick to "Journey_Ambient_Shame">>
<<case 4>><<set _jePick to "Journey_Ambient_Arousal">>
<<case 5>><<set _jePick to "Journey_Ambient_Memory">>
<</switch>>
<</if>>
<<elseif _eventType <= 60 && !$journey.encounter.happened && setup.groveEscortActive()>>
<<set $journey.encounter.happened to true>>
<<set _jePick to "Travel_Covenant_Escort">>
<<elseif _eventType <= 60 && !$journey.encounter.happened>>
<<set $journey.encounter.happened to true>>
<<set $journeyHistory.encountersOnTravel++>>
<<if $journey.exposure.player.exposed || (setup.kiraWithYou() && $journey.exposure.companion.exposed)>>
<<set _encounterBase to 4>>
<<else>>
<<set _encounterBase to 3>>
<</if>>
<<cncTravelSpotEvents>>
<<amazonSightingEvents>>
<<set _encounterType to random(1, _encounterBase + _cncSpotEvents.length + _amzEvents.length)>>
<<if _encounterType > _encounterBase + _cncSpotEvents.length>>
<<set _amzPick to _amzEvents[_encounterType - _encounterBase - _cncSpotEvents.length - 1]>>
<<set _jePick to _amzPick>>
<<elseif _encounterType > _encounterBase>>
<<set $flags.lastCncRoadEventDay to $time.day>>
<<set _cncSpotPassage to _cncSpotEvents[_encounterType - _encounterBase - 1]>>
<<set _jePick to _cncSpotPassage>>
<<else>>
<<switch _encounterType>>
<<case 1>><<set _jePick to "Journey_Encounter_Scavenger">>
<<case 2>><<set _jePick to "Journey_Encounter_Raider">>
<<case 3>><<set _jePick to "Journey_Encounter_Opportunist">>
<<case 4>><<set _jePick to "Travel_CNC_Ambush">>
<</switch>>
<</if>>
<<else>>
<<set _jePick to "Journey_Segment">>
<</if>>
<<if _jePick isnot "Travel_Pit_Walk_Home">><<run setup.pitWalkWait()>><</if>>
<</widget>><<journeyEventPick>>
<<goto _jePick>><<journeyTerrainBackground>>
<<if !$journey.active>>
<<include "Journey_Arrive">>
<<else>>
<p class="narrator">You gather yourself and continue the journey.</p>
<div class="choice-container">
<<vchoice "Continue" "Journey_Tick" "action" "forward">>
<<if $time.phase === "evening" || $time.phase === "night" || setup.fatigueOf() >= 70>>
<<vchoice "Make camp" "Journey_Camp" "action" "fire">>
<</if>>
</div>
<</if>><<setBackground "reclaimed-travel">>
<<set $player.carriedFood to 0>>
<<set $player.carriedWater to 0>>
<h2>Setting Out</h2>
<<set _destNode to $worldMap.nodes[$journey.destination]>>
<<set _destName to _destNode ? _destNode.name : $journey.destination>>
<p>You prepare to leave for <strong><<print _destName>></strong>.</p>
<div class="journey-info">
<div class="info-row">
<span class="label"><<icon "clock">> Estimated Time:</span>
<span class="value"><<print $journey.totalDistance>> hour<<if $journey.totalDistance !== 1>>s<</if>></span>
</div>
<div class="info-row">
<span class="label"><<icon "map">> Route:</span>
<span class="value route-list">
<<for _i, _nodeId range $journey.route>>
<<set _nodeName to $worldMap.nodes[_nodeId] ? $worldMap.nodes[_nodeId].name : _nodeId>>
<<print _nodeName>><<if _i < $journey.route.length - 1>> <span class="route-arrow">→</span> <</if>>
<</for>>
</span>
</div>
<<if $journey.currentSegment.terrain>>
<div class="info-row">
<span class="label"><<icon "reclaimed">> First Terrain:</span>
<span class="value"><<print ($worldMap.terrainTypes && $worldMap.terrainTypes[$journey.currentSegment.terrain]) ? $worldMap.terrainTypes[$journey.currentSegment.terrain].name : ($journey.currentSegment.terrain || "The Reclaimed")>></span>
</div>
<</if>>
</div>
<<canTriggerCompanionEvent>>
<<if _cte_canTrigger>>
<p>Kira is ready to travel with you.</p>
<</if>>
<div class="choice-container">
<<vchoice "Begin journey" "Journey_Tick" "action" "run">>
<<vchoice "Cancel" "Journey_Cancel" "action" "return">>
</div><<cancelJourney>>
<<set $flags.groupCNCBoth to false>>
<<goto "Travel_Map">><<setBackground "reclaimed-travel">>
<<startJourney "vault">>
<h2>The Long Walk Back</h2>
<p>You begin the journey back to <strong>the vault</strong>.</p>
<div class="journey-info">
<div class="info-row">
<span class="label"><<icon "clock">> Estimated Time:</span>
<span class="value"><<print $journey.totalDistance>> hour<<if $journey.totalDistance !== 1>>s<</if>></span>
</div>
<div class="info-row">
<span class="label"><<icon "reclaimed">> Terrain:</span>
<span class="value"><<print ($worldMap.terrainTypes && $worldMap.terrainTypes[$journey.currentSegment.terrain]) ? $worldMap.terrainTypes[$journey.currentSegment.terrain].name : "The Reclaimed">></span>
</div>
</div>
<<canTriggerCompanionEvent>>
<<if _cte_canTrigger>>
<p>Kira walks beside you, silent.</p>
<</if>>
<div class="choice-container">
<<vchoice "Continue" "Journey_Tick" "action" "forward">>
</div><<set _jtGroveDue to !!($journey.active && (setup.grovePatrolDue() || setup.groveBountyDue() || setup.caravanEscortDue()))>>
<<if !_jtGroveDue && $journey.active && setup.pitWalkDue()>><<set _jtGroveDue to true>><</if>>
<<travelTick>>
<<survivalTick>>
<<weatherTick>>
<<tickExposure>>
<<set _jtOutcome to null>>
<<if $flags.survivalDeath>>
<<set _jtOutcome to "Journey_Survival_Death">>
<<elseif $journey.active && setup.roadPassOutDue()>>
<<if !setup.crisisEventSeen("Journey_Survival_CollapseFound") && random(1, 100) <= 50>>
<<run setup.markCrisisEvent("Journey_Survival_CollapseFound")>>
<<set _jtOutcome to "Journey_Survival_CollapseFound">>
<<else>>
<<set _jtOutcome to "Journey_PassOut">>
<</if>>
<<elseif $flags.companionCollapsed && ($journey.active || !$journey.lateCollapse)>>
<<set $flags.companionCollapsed to false>>
<<if !$journey.active>>
<<set $journey.lateCollapse to true>>
<<set $journey.active to true>>
<</if>>
<<set _jtOutcome to "Journey_Companion_Collapse">>
<<else>>
<<if $flags.companionCollapsed>>
<<set $flags.companionCollapsed to false>>
<<getJourneyCompanion>>
<<if _gc_companion>>
<<set _gc_companion.health to Math.max(Number(_gc_companion.health) || 0, _gc_companion.id === "kira" ? setup.kiraFloorHealth(1) : 1)>>
<</if>>
<</if>>
<<canTriggerCompanionEvent>>
<<if $journey.wetShirtPending>>
<<if !$journey.active>><<set $journey.active to true>><</if>>
<<set _jtOutcome to "Weather_WetShirt">>
<</if>>
<</if>>
<<if !_jtOutcome>>
<<if !$journey.active && _jtGroveDue>>
<<set $journey.active to true>>
<<elseif !$journey.active>>
<<set _jtOutcome to "Journey_Arrive">>
<<else>>
<<checkSurvivalCrisis>>
<<if $survival.crisis>><<set _jtOutcome to "Journey_Survival_Crisis">><<else>><<set $journey.crisisCount to 0>><<set $journey.pushOn to 0>><</if>>
<</if>>
<</if>>
<<if _jtOutcome>>
<div class="journey-tick-outcome"><<include _jtOutcome>></div>
<<else>>
<<journeyTerrainBackground>>
<h2>Traveling...</h2>
<<weatherNarrative>>
<<weatherLostNarrative>>
<<journeyHeader>>
<<set _eventRoll to random(1, 100)>>
<<set _terrain to $journey.currentSegment.terrain || "reclaimed">>
<<set _terrainChance to ($worldMap.terrainTypes[_terrain] ? $worldMap.terrainTypes[_terrain].encounterChance : 0.15) * 100>>
<<set _danger to $journey.currentSegment.danger || "low">>
<<set _dangerMult to ($worldMap.dangerLevels[_danger] ? $worldMap.dangerLevels[_danger].encounterMultiplier : 1)>>
<<set _eventThreshold to 100 - (_terrainChance * _dangerMult)>>
<<if setup.pitWalkDue()>><<set _eventThreshold to 0>><</if>>
<<if _eventRoll <= _eventThreshold && !setup.grovePatrolDue() && !setup.groveBountyDue() && !setup.caravanEscortDue()>>
<<travelNarrative>>
<<journeyChoices>>
<<else>>
<<setupLegacyTravel>>
<div class="choice-container">
<<link `'<span class="choice-button action"><span class="gi gi-forward gi-large"></span><span class="label">Continue</span></span>'`>><<journeyEventPick>><<goto _jePick>><</link>>
</div>
<</if>>
<</if>>
<<if setup.roadAwakeWarnDue()>>
<<run setup.markRoadAwakeWarned()>>
<<toast `setup.passOutWarning.text` `setup.passOutWarning.type`>>
<</if>><<endJourney>>
<<set _node to $worldMap.nodes[$currentLocation]>>
<<if $currentLocation !== "vault">><<set $flags.groupCNCBoth to false>><</if>>
<<run VaultUI.setArrivalBackground($currentLocation, _node)>>
<h2>Arrived</h2>
<p>You've reached <strong><<print _node.name>></strong>.</p>
<<set _nodeDesc to setup.placeDescription($currentLocation, _node)>>
<<if _nodeDesc>>
<p class="location-description"><<print _nodeDesc>></p>
<</if>>
<p class="journey-summary">Journey took <<print $journey.hoursElapsed>> hour<<if $journey.hoursElapsed !== 1>>s<</if>>.</p>
<<getArrivalPassage $currentLocation>>
<div class="choice-container">
<<if $currentLocation === "vault">>
<<if $journey.returnToPassage>>
<<set _returnPassage to $journey.returnToPassage>>
<<set $journey.returnToPassage to null>>
<<vchoice "Enter the Vault" _returnPassage "action" "house">>
<<else>>
<<vchoice "Enter the Vault" "Vault_Arrival" "action" "house">>
<</if>>
<<elseif _node.type === "junction">>
<<vchoice "Look around" "Journey_Junction" "action" "search">>
<<vchoice "Continue journey" "Travel_Map" "action" "map">>
<<else>>
<<vchoice "Explore" $journey.arrivalPassage "action" "search">>
<</if>>
</div><<set _node to $worldMap.nodes[$currentLocation]>>
<<setBackground "reclaimed-crossroads/crossroads_central">>
<h2><<print _node.name>></h2>
<p><<print _node.description>></p>
<p>Several paths branch out from here.</p>
<div class="junction-options">
<h3>Available Destinations</h3>
<<for _connId range _node.connections>>
<<set _connNode to $worldMap.nodes[_connId]>>
<<isLocationUnlocked _connId>>
<<if $journey.locationUnlocked>>
<<getTravelTime _connId>>
<div class="junction-option">
<<capture _connId, _connNode>>
<<link _connNode.name>>
<<startJourney _connId>>
<<goto "Journey_Start">>
<</link>>
<</capture>>
<span class="travel-info">(<<print $journey.estimatedTime>> hr<<if $journey.estimatedTime !== 1>>s<</if>>, <<print _connNode.danger>> danger)</span>
</div>
<</if>>
<</for>>
</div>
<div class="choice-container">
<<vchoice "Rest here" "Journey_Camp" "action" "fire">>
<<vchoice "Return to map" "Travel_Map" "action" "map">>
</div><<setBackground "prelude/caravan-camp-evening">>
<h2><<icon "fire">> Making Camp</h2>
<p>You find a defensible spot and begin setting up camp.</p>
<<set $flags.groupCNCBoth to false>>
<<showTravelVideo "ambient_resting">>
<<set $journey.paused to true>>
<<canTriggerCompanionEvent>>
<<if _cte_canTrigger>><<getJourneyCompanion>><</if>>
<<set _campBreakdown to (_cte_canTrigger && $journey.crisisCount >= 3 && setup.fatigueOf() >= 60 && random(1, 100) <= 20)>>
<<set _campWarmth to (_cte_canTrigger && _gc_companion && _gc_companion.romanceStage >= 2 && $time.phase === "night" && random(1, 100) <= 15)>>
<<if _campWarmth>>
<div class="choice-container">
<<vchoice "Continue" "Journey_Survival_IntimateWarmth" "action" "forward">>
</div>
<<elseif _campBreakdown>>
<div class="choice-container">
<<vchoice "Continue" "Journey_Survival_BreakdownComfort" "action" "forward">>
</div>
<<else>>
<<survivalStatus>>
<<if _cte_canTrigger>>
<<if setup.fatigueOf() >= 70>>
<<say "Kira" "Finally. I thought you'd never stop.">>
<<else>>
<<say "Kira" "I'll take first watch.">>
<</if>>
<</if>>
<<set _hasTent to UInv.BagHasItem("player", "tent")>>
<<set _hasTarp to UInv.BagHasItem("player", "tarp")>>
<div class="camp-options">
<h3>Camp Setup</h3>
<<if _hasTent>>
<p class="camp-option"><<icon "tent">> <strong>Tent available</strong> - Full weather protection, best recovery</p>
<<elseif _hasTarp>>
<p class="camp-option"><<icon "tarp">> <strong>Tarp available</strong> - Partial weather protection</p>
<<else>>
<p class="camp-option"><<icon "sleep">> <strong>No shelter</strong> - Rough rest on the ground</p>
<</if>>
</div>
<div class="choice-container">
<<if _hasTent>>
<<vchoice "Set up tent & sleep" "Journey_Camp_Tent" "action" "tent">>
<<elseif _hasTarp>>
<<vchoice "Set up tarp & sleep" "Journey_Camp_Tarp" "action" "sleep">>
<</if>>
<<vchoice "Rest on ground until dawn" "Journey_Camp_Rest" "action" "sleep">>
<<vchoice "Short rest (2 hours)" "Journey_Camp_ShortRest" "action" "rest">>
<<if $journey.active>>
<<vchoice "Keep traveling" "Journey_Tick" "action" "forward">>
<<else>>
<<vchoice "Return to map" "Travel_Map" "action" "map">>
<</if>>
</div>
<</if>><<set $journey.campShelter to "tent">>
<<include "Journey_Camp_Wake">><<set $journey.campShelter to "tarp">>
<<include "Journey_Camp_Wake">><<set $journey.campShelter to "none">>
<<include "Journey_Camp_Wake">><<set _shelter to $journey.campShelter || "none">>
<<campRest _shelter>>
<<if setup.forcedReleaseDue()>>
<<include "Event_Forced_Release">>
<<else>>
<<include "Journey_Camp_Morning">>
<</if>><<set _shelter to $journey.campShelter || "none">>
<<setBackground "prelude/caravan-camp-evening">>
<<set _cmSleep to $journey.campSleep || { night: true, health: 15, energy: (setup.survival.campRecovery[_shelter] || setup.survival.campRecovery.none).energy }>>
<<if _cmSleep.night>>
<h2><<icon "sunrise">> Morning</h2>
<<storyVideo "story/mv_travel/camp_wake">>
<<switch _shelter>>
<<case "tent">>
<p>You wake in the tent, surprisingly well-rested. The shelter made all the difference.</p>
<<case "tarp">>
<p>You wake under the tarp. Not the most comfortable night, but the cover helped.</p>
<<default>>
<p>You wake stiff and sore on the hard ground. Better than nothing, but barely.</p>
<</switch>>
<<else>>
<h2><<icon "sunrise">> Back on Your Feet</h2>
<p>You rest a few hours by the fire. The sun is still up when you kick dirt over the coals.</p>
<</if>>
<p class="system-info"><<icon "health">> +<<print _cmSleep.health>> Health restored</p>
<p class="system-info"><<icon "energy">> +<<print _cmSleep.energy>> Energy restored</p>
<<canTriggerCompanionEvent>>
<<if _cte_canTrigger>>
<<switch _shelter>>
<<case "tent">>
<<say "Kira" "Best sleep I've had in days. Ready to move?">>
<<case "tarp">>
<<say "Kira" "Could be worse. At least it didn't rain.">>
<<default>>
<<say "Kira" "Ugh. My back is killing me. We really need better gear.">>
<</switch>>
<</if>>
<div class="choice-container">
<<if $journey.active>>
<<vchoice "Continue journey" "Journey_Tick" "action" "forward">>
<</if>>
<<vchoice "Return to vault" "Journey_ReturnToVault" "action" "return">>
<<vchoice "View map" "Travel_Map" "action" "map">>
</div><<shortRest 2>>
<<setBackground "prelude/caravan-camp-evening">>
<h2><<icon "rest">> Brief Rest</h2>
<p>You rest for a couple of hours, catching your breath and checking your supplies.</p>
<p class="system-info"><<icon "health">> +5 Health restored</p>
<p class="system-info"><<icon "energy">> +25% Energy restored</p>
<<set $player.health to Math.min($player.maxHealth, $player.health + 5)>>
<div class="choice-container">
<<if $journey.active>>
<<vchoice "Continue journey" "Journey_Tick" "action" "forward">>
<</if>>
<<vchoice "Full rest until dawn" "Journey_Camp_Rest" "action" "sleep">>
</div><<shortRest 1>>
<<setBackground "reclaimed-travel">>
<<canTriggerCompanionEvent>>
<<if _cte_canTrigger>><<getJourneyCompanion>><</if>>
<<set _feignNap to (_cte_canTrigger && _gc_companion && ($time.phase === "morning" || $time.phase === "afternoon") && $extremeContent && $extremeContent.cnc && !$flags.kiraIsUnconscious && !$flags.kiraInComa && $companions[0].status !== "unconscious" && ($companions[0].health || 0) > 1 && $flags.lastKiraTravelFeignDay !== $time.day && random(1, 100) <= 30)>>
<h2><<icon "wait">> Catching Your Breath</h2>
<<if _feignNap>>
<p>You find a gap in a high garden wall and a patch of grass in the sun behind it. Kira is already eyeing the old sun lounger on the lawn.</p>
<div class="choice-container">
<<vchoice "Continue" "Journey_Kira_FeignNap" "action" "forward">>
</div>
<<else>>
<<showTravelVideo "ambient_resting">>
<<set _stvClip to _stvFile ? _stvFile.split("/").pop().replace(/\.[^.]+$/, "") : null>>
<<if _stvClip is "7cb0dce6ea9d">><p>You pause for an hour on whatever passes for a seat out here — a rock, a fallen trunk, an old bench nobody has sat on in years.</p><<else>><p>You pause for an hour, sitting in the shade of a rocky outcrop.</p><</if>>
<<survivalStatus>>
<<if _cte_canTrigger>>
<<say "Kira" "Needed that. Ready when you are.">>
<</if>>
<div class="choice-container">
<<vchoice "Continue journey" "Journey_Tick" "action" "forward">>
<<if $time.phase === "evening" || $time.phase === "night">>
<<vchoice "Make camp" "Journey_Camp" "action" "fire">>
<</if>>
</div>
<</if>><<set _currentPos to $journey.currentNode || $currentLocation>>
<<if _currentPos !== "vault">>
<<calculateRoute _currentPos "vault">>
<<startJourney "vault" $journey.calculatedRoute>>
<<goto "Journey_Start">>
<<else>>
<<goto "Vault_Hub">>
<</if>><<setBackground "prelude/caravan-camp-evening">>
<<set _jmNight to setup.campIsNight()>>
<<if _jmNight>><<advanceToHour 7>><<else>><<advanceTime 3>><</if>>
<<set $journey.lastSleptAt to $time.totalHours>>
<<if _jmNight>><<run setup.countSleep()>><</if>>
<<run setup.groveDeadlineNotice()>>
<<if _jmNight>>
<h2><<icon "sunrise">> Dawn</h2>
<<storyVideo "story/mv_travel/journey_dawn">>
<p>Light creeps across the horizon. Another day in the Reclaimed.</p>
<<else>>
<h2><<icon "sunrise">> Back on Your Feet</h2>
<p>You rest a few hours by the fire. The sun is still up when you kick dirt over the coals.</p>
<</if>>
<<set _fatigueRecovery to _jmNight ? setup.travelConfig.fatigueRecovery.dawnRest : Math.round(setup.travelConfig.fatigueRecovery.dawnRest / 2)>>
<<set _jmHeal to _jmNight ? 15 : 5>>
<<clampStat "player.energy" _fatigueRecovery 0 $player.maxEnergy>>
<<set $player.health to Math.min($player.maxHealth, $player.health + _jmHeal)>>
<p class="system-info"><<icon "energy">> +<<print _fatigueRecovery>> Energy restored</p>
<p class="system-info"><<icon "health">> +<<print _jmHeal>> Health restored</p>
<<canTriggerCompanionEvent>>
<<if _cte_canTrigger>>
<<getJourneyCompanion>>
<<set _gc_companion.health to Math.min(_gc_companion.maxHealth, _gc_companion.health + _jmHeal)>>
<<say "Kira" "Time to move.">>
<</if>>
<div class="choice-container">
<<if $journey.active>>
<<vchoice "Continue journey" "Journey_Tick" "action" "forward">>
<</if>>
<<vchoice "Return to vault" "Journey_ReturnToVault" "action" "return">>
<<vchoice "View map" "Travel_Map" "action" "map">>
</div><<goto "WorldMap_View">><<setBackground "reclaimed-day">>
<h2><<print ($worldMap.nodes && $worldMap.nodes[$currentLocation]) ? $worldMap.nodes[$currentLocation].name : "Unknown Location">></h2>
<p>You've arrived at the location. There's not much here yet.</p>
<p><em>This location's content is coming in a future update.</em></p>
<div class="choice-container">
<<vchoice "Return to vault" "Journey_ReturnToVault" "action" "return">>
<<vchoice "View map" "Travel_Map" "action" "map">>
</div><<goto "WorldMap_View">><<setBackground "vault-entrance-interior">>
<h2>Prepare for Expedition</h2>
<div class="prep-section-label">Travel with:</div>
<div class="prep-status-row">
<<if $companions && $companions.length > 0>>
<<set _canTravelIds to []>>
<<for _comp range $companions>>
<<set _canTravel to true>>
<<set _unavailableReason to "">>
<<if _comp.id === "kira" && setup.kiraStaysInMedical(_comp)>>
<<set _canTravel to false>>
<<set _unavailableReason to "Unconscious">>
<<elseif _comp.id === "kira" && setup.kiraAtCenter()>>
<<set _canTravel to false>>
<<set _unavailableReason to "Held at the Covenant's Center">>
<<elseif _comp.id === "kira" && setup.kiraAway()>>
<<set _canTravel to false>>
<<set _unavailableReason to "Out scavenging">>
<<elseif _comp.currentLocation === "medical">>
<<set _canTravel to false>>
<<set _unavailableReason to "Recovering">>
<<elseif _comp.health <= 30>>
<<set _canTravel to false>>
<<set _unavailableReason to "Too injured">>
<</if>>
<<if _canTravel && _comp.id === "kira" && setup.kiraHidesOverClothes()>>
<<set _canTravel to false>>
<<set _unavailableReason to "Refuses to leave (clothing damaged)">>
<</if>>
<<if _canTravel>>
<<run _canTravelIds.push(_comp.id)>>
<<set _isSelected to ($expeditionCompanion === _comp.id) ? "true" : "false">>
<label class="prep-companion-card" @data-selected="_isSelected">
<<if $expeditionCompanion === _comp.id>><input type="radio" name="expeditionCompanion" @value="_comp.id" checked><<else>><input type="radio" name="expeditionCompanion" @value="_comp.id"><</if>>
<div class="companion-card-content"><div class="companion-card-name"><<icon "companion">> <<print _comp.name>></div></div>
</label>
<<else>>
<div class="prep-companion-card disabled">
<div class="companion-card-content">
<div class="companion-card-name"><<icon "companion">> <<print _comp.name>></div>
<div class="companion-card-unavailable"><<print _unavailableReason>></div>
</div>
</div>
<</if>>
<</for>>
<<if $expeditionCompanion && !_canTravelIds.includes($expeditionCompanion)>><<set $expeditionCompanion to "">><</if>>
<<set _soloSelected to ($expeditionCompanion === "") ? "true" : "false">>
<label class="prep-companion-card solo" @data-selected="_soloSelected">
<<if $expeditionCompanion === "">>
<input type="radio" name="expeditionCompanion" value="" checked>
<<else>>
<input type="radio" name="expeditionCompanion" value="">
<</if>>
<div class="companion-card-content">
<div class="companion-card-name"><<icon "male">> Solo</div>
<div class="companion-card-warning">More dangerous</div>
</div>
</label>
<<else>>
<div class="prep-companion-card disabled">
<div class="companion-card-content">
<div class="companion-card-name">No companions</div>
</div>
</div>
<<set $expeditionCompanion to "">>
<</if>>
</div>
<<script>>
$(document).off('change.companion').on('change.companion', 'input[name="expeditionCompanion"]', function() {
State.variables.expeditionCompanion = $(this).val();
$('.prep-companion-card').attr('data-selected', 'false');
$(this).closest('.prep-companion-card').attr('data-selected', 'true');
});
<</script>>
<<set _foodMax to Math.min(5, $vault.food)>>
<<set _waterMax to Math.min(5, $vault.water)>>
<div class="prep-section-label">Pack supplies:</div>
<div class="prep-status-row"><div class="prep-status-box prep-supply-box"><h4><<icon "food">> Food</h4><div class="prep-supply-control"><button class="supply-btn supply-minus" data-target="carriedFood" data-min="0">−</button><span class="supply-value" id="food-value"><<print $player.carriedFood>></span><button class="supply-btn supply-plus" data-target="carriedFood" @data-max="_foodMax">+</button></div><div class="prep-supply-note"><<icon "vault">> <<print $vault.food>></div></div><div class="prep-status-box prep-supply-box"><h4><<icon "water">> Water</h4><div class="prep-supply-control"><button class="supply-btn supply-minus" data-target="carriedWater" data-min="0">−</button><span class="supply-value" id="water-value"><<print $player.carriedWater>></span><button class="supply-btn supply-plus" data-target="carriedWater" @data-max="_waterMax">+</button></div><div class="prep-supply-note"><<icon "vault">> <<print $vault.water>></div></div></div>
<<script>>
$(document).off('click.supply').on('click.supply', '.supply-btn', function() {
var $btn = $(this);
var target = $btn.data('target');
var current = State.variables.player[target];
var isPlus = $btn.hasClass('supply-plus');
var min = parseInt($btn.data('min')) || 0;
var max = parseInt($btn.data('max')) || 5;
if (isPlus && current < max) {
State.variables.player[target] = current + 1;
} else if (!isPlus && current > min) {
State.variables.player[target] = current - 1;
}
var displayId = target === 'carriedFood' ? 'food-value' : 'water-value';
$('#' + displayId).text(State.variables.player[target]);
});
<</script>>
<<set _healthPct to "width: " + $player.health + "%">>
<<set _energyPct to "width: " + $player.energy + "%">>
<<set _hungerPct to "width: " + $player.hunger + "%">>
<div class="prep-status-row">
<div class="prep-status-box">
<h4><<icon "male">> You</h4>
<div class="prep-stat-row">
<span class="prep-stat-icon"><<icon "health">></span>
<div class="prep-stat-bar health-bar">
<div class="prep-stat-fill" @style="_healthPct"></div>
</div>
<span class="prep-stat-value"><<print $player.health>>/<<print $player.maxHealth>></span>
</div>
<div class="prep-stat-row">
<span class="prep-stat-icon"><<icon "energy">></span>
<div class="prep-stat-bar energy-bar">
<div class="prep-stat-fill" @style="_energyPct"></div>
</div>
<span class="prep-stat-value"><<print $player.energy>>/100</span>
</div>
<div class="prep-stat-row">
<span class="prep-stat-icon"><<icon "eating">></span>
<div class="prep-stat-bar hunger-bar">
<div class="prep-stat-fill" @style="_hungerPct"></div>
</div>
<span class="prep-stat-value"><<print $player.hunger>>/100</span>
</div>
</div>
<<if $companions[0]>>
<<set _kiraHealthPct to "width: " + (($companions[0].health / $companions[0].maxHealth) * 100) + "%">>
<<set _kiraEnergyPct to "width: " + ($companions[0].energy || 100) + "%">>
<div class="prep-status-box">
<h4><<icon "companion">> Kira</h4>
<div class="prep-stat-row"><span class="prep-stat-icon"><<icon "health">></span><div class="prep-stat-bar health-bar"><div class="prep-stat-fill" @style="_kiraHealthPct"></div></div><span class="prep-stat-value"><<print $companions[0].health>>/<<print $companions[0].maxHealth>></span></div>
<div class="prep-stat-row"><span class="prep-stat-icon"><<icon "energy">></span><div class="prep-stat-bar energy-bar"><div class="prep-stat-fill" @style="_kiraEnergyPct"></div></div><span class="prep-stat-value"><<print $companions[0].energy || 100>>/100</span></div>
</div>
<</if>>
<div class="prep-status-box prep-time-box">
<h4><<icon "time">> Time</h4>
<div class="prep-time-display"><<print $time.phase.charAt(0).toUpperCase() + $time.phase.slice(1)>></div>
</div>
</div>
<<if $player.health < 30>>
<div class="map-warning">
<span class="warning-icon"><<icon "alert">></span>
<span class="warning-text">Your health is critically low. Visit the medical bay or rest before departing.</span>
</div>
<<elseif $player.health < 50>>
<div class="map-warning">
<span class="warning-icon"><<icon "alert">></span>
<span class="warning-text">Your health is low. Consider the medical bay or resting before traveling.</span>
</div>
<</if>>
<<set _tpLockText to setup.starvingTravelLockText("vault")>>
<<if _tpLockText>>
<div class="map-warning critical hunger-warning">
<span class="warning-icon"><<icon "alert">></span>
<span class="warning-text"><<= _tpLockText>></span>
<<set _tpPackFood to setup.packFoodItems()>>
<<if $vault.food gt 0>>
<span class="warning-action"><<link "Eat first">><<set $survival.eatReturn to "Travel_Prepare">><<goto "Kitchen_Eat">><</link>></span>
<<elseif _tpPackFood.length>>
<span class="warning-action"><<link "Eat first">><<uinvUseItem _tpPackFood[0].name "player">><<toast `"From your pack: " + $useFeedback` "success">><<goto "Travel_Prepare">><</link>></span>
<</if>>
</div>
<</if>>
<div class="choice-container">
<<vchoice "Depart to the Reclaimed" "Travel_Depart" "action" "journey">>
<<vchoice "Cancel" "Vault_Hub" "action" "return">>
</div><<set $player.carriedFood to Math.max(0, Math.min($player.carriedFood || 0, $vault.food || 0))>>
<<set $player.carriedWater to Math.max(0, Math.min($player.carriedWater || 0, $vault.water || 0))>>
<<set $vault.food to $vault.food - $player.carriedFood>>
<<set $vault.water to $vault.water - $player.carriedWater>>
<<packCarriedSupplies>>
<<if $expeditionCompanion>>
<<set $combat.companionInCombat to $expeditionCompanion>>
<<set $companions[0].present to true>>
<<else>>
<<set $combat.companionInCombat to null>>
<<if $companions[0]>>
<<set $companions[0].present to false>>
<</if>>
<</if>>
<<set $currentLocation to "vault">>
<<goto "WorldMap_View">><<widget "packCarriedSupplies">>
<<for _pkRow range [["carriedFood", "ration", "food", "rations"], ["carriedWater", "water", "water", "water"]]>>
<<set _pkN to $player[_pkRow[0]] || 0>>
<<if _pkN gt 0>>
<<set _pkFit to setup.bagFits("player", _pkRow[1], _pkN)>>
<<set _addItemNotice to null>>
<<if _pkFit gt 0>><<addItem _pkRow[1] _pkFit>><</if>>
<<if _pkN gt _pkFit>>
<<set $vault[_pkRow[2]] to ($vault[_pkRow[2]] || 0) + (_pkN - _pkFit)>>
<<toast `"Backpack full: " + (_pkN - _pkFit) + " " + _pkRow[3] + " left in the vault."` "warning">>
<</if>>
<<set $player[_pkRow[0]] to 0>>
<</if>>
<</for>>
<</widget>><<widget "travelMediaState">>
<<silently>>
<<getJourneyCompanion>>
<<set _tmsKiraTits to (_gc_companion && $clothing && $clothing.kira && $clothing.kira.titsExposed)>>
<<set _tmsKiraPussy to (_gc_companion && $clothing && $clothing.kira && $clothing.kira.pussyExposed)>>
<<set _tmsKiraNaked to (_gc_companion && $journey && $journey.exposure && $journey.exposure.companion.naked)>>
<<set _tmsPlayerDick to ($clothing && $clothing.player && $clothing.player.dickExposed)>>
<<set _tmsPlayerNaked to ($journey && $journey.exposure && $journey.exposure.player.naked)>>
<<set _tmsPlayerLust to ($player && $player.lust >= 70)>>
<<set _tmsKiraLust to (_gc_companion && _gc_companion.lust >= 60)>>
<<if _tmsKiraNaked && _tmsPlayerNaked>>
<<set _travelState to "both_naked">>
<<elseif _tmsKiraNaked>>
<<set _travelState to "kira_naked">>
<<elseif _tmsPlayerNaked>>
<<set _travelState to "player_naked">>
<<elseif _tmsKiraTits && _tmsKiraPussy>>
<<set _travelState to "kira_both_exposed">>
<<elseif (_tmsKiraTits || _tmsKiraPussy) && _tmsPlayerDick>>
<<set _travelState to "both_exposed">>
<<elseif _tmsKiraPussy>>
<<set _travelState to "kira_pussy_exposed">>
<<elseif _tmsKiraTits>>
<<set _travelState to "kira_tits_exposed">>
<<elseif _tmsPlayerDick>>
<<set _travelState to "player_dick_exposed">>
<<elseif _tmsPlayerLust && _tmsKiraLust>>
<<set _travelState to "high_lust_both">>
<<elseif _tmsKiraLust>>
<<set _travelState to "high_lust_kira">>
<<elseif _tmsPlayerLust>>
<<set _travelState to "high_lust_player">>
<<else>>
<<set _travelState to "ambient_walking">>
<</if>>
<</silently>>
<</widget>>
<<widget "travelMediaTarget">>
<<silently>>
<<set _tmtSlot to setup.travelMediaSlot(_args[0]) || setup.travelMediaSlots.ambient_walking>>
<<set _tmtWho to _tmtSlot.who>>
<<if _tmtWho === "auto">>
<<getJourneyCompanion>>
<<set _tmtWho to _gc_companion ? "kira" : "player">>
<</if>>
<<set _travelMediaTarget to {
gender: _tmtSlot.gender || (_tmtWho === "player" ? "male" : "female"),
position: _tmtSlot.position || "standing",
combatExpression: "any",
visualPerformer: "universal"
}>>
<<if _tmtSlot.clothing>>
<<set _travelMediaTarget.mediaClothing to _tmtSlot.clothing>>
<<elseif _tmtWho === "kira">>
<<set _travelMediaTarget.clothing to clone(($clothing && $clothing.kira) || {})>>
<<set _travelMediaTarget.bareStaysBare to true>>
<<elseif _tmtWho === "player">>
<<run setup.combatMediaTemps.stash(["clothingFilter", "cfState"])>>
<<clothingFilter "player">>
<<set _travelMediaTarget.mediaClothing to _clothingFilter || "dressed">>
<<run setup.combatMediaTemps.restore()>>
<<else>>
<<set _travelMediaTarget.mediaClothing to "any">>
<</if>>
<</silently>>
<</widget>>
<<widget "showTravelVideo">>
<<silently>>
<<run setup.combatMediaTemps.stash()>>
<<set _stvCat to setup.travelMediaSlot(_args[0]) ? _args[0] : "ambient_walking">>
<<set _stvSeq to (_stvSeq || 0) + 1>>
<<set _stvBox to _args[1] || ("travel-video-" + _stvCat + "-" + _stvSeq)>>
<<set _stvOwn to setup.travelMediaFolder(_stvCat)>>
<<set _stvSlot to setup.travelMediaSlot(_stvCat)>>
<<set _stvRequire to _stvSlot.require || {}>>
<<set _stvPrefer to setup.travelMediaPrefer(_stvCat)>>
<<travelMediaTarget _stvCat>>
<<getJourneyCompanion>>
<<set _stvSolo to !_gc_companion && _stvSlot.who !== "stranger">>
<<set _stvFile to null>>
<<set _stvFormat to null>>
<<set _stvTags to null>>
<<set _stvSource to null>>
<<deriveCombatMediaFilters _travelMediaTarget>>
<<set _stvWant to _combatFilters.clothing>>
<<set _stvChain to (_stvSolo && _stvSlot.who === "kira") ? [] : setup.travelMediaChain(_stvCat, _tmtWho, _stvWant)>>
<<set _stvAt to 0>>
<<set _stvHint to setup.lineMediaTake ? (setup.lineMediaTake() || []) : []>>
<<set _stvHintAt to 0>>
<<for (_stvAt lt _stvChain.length || _stvHintAt lt _stvHint.length) && !_stvFile>>
<<set _stvFromHint to _stvHintAt lt _stvHint.length>>
<<set _stvFolder to _stvFromHint ? _stvHint[_stvHintAt] : setup.travelMediaFolder(_stvChain[_stvAt].category)>>
<<if !setup.mediaManifestCache[_stvFolder]>><<loadMediaManifest _stvFolder>><</if>>
<<if setup.mediaManifestCache[_stvFolder] && setup.mediaManifestCache[_stvFolder].media && setup.mediaManifestCache[_stvFolder].media.length>>
<<set _stvIsOwn to _stvFromHint || _stvChain[_stvAt].own>>
<<set _stvNever to setup.travelMediaNeverFiles(_stvFolder, _stvCat, { clothing: _stvWant, own: _stvIsOwn, solo: _stvSolo })>>
<<set _stvRecent to setup.travelMediaRecent(_stvFolder)>>
<<set _stvLastPass to (_stvIsOwn || setup.mediaManifestCache[_stvFolder].media.length lt 3) ? 0 : 1>>
<<for _stvN range setup.travelMediaPasses(_stvRecent.length, _stvLastPass)>>
<<if _stvFile>><<break>><</if>>
<<set _stvAvoid to _stvNever.concat(_stvN > 0 ? _stvRecent.slice(-_stvN) : [])>>
<<for _stvKeep to _stvPrefer.length; _stvKeep gte 0 && !_stvFile; _stvKeep-->>
<<deriveCombatMediaFilters _travelMediaTarget>>
<<run delete _combatFilters.performer>>
<<if _stvIsOwn>>
<<run delete _combatFilters.clothing>>
<<else>>
<<run Object.assign(_combatFilters, _stvRequire)>>
<</if>>
<<for _stvI to 0; _stvI lt _stvKeep; _stvI++>>
<<set _combatFilters[_stvPrefer[_stvI][0]] to _stvPrefer[_stvI][1]>>
<</for>>
<<run setup.mediaAvoidBegin(_stvFolder, _stvAvoid)>>
<<runCombatMediaCascade _stvFolder _combatFilters>>
<<run setup.mediaAvoidEnd(_stvFolder)>>
<<if setup.combatMediaIsClip(_result)>>
<<set _stvFile to _result.file>>
<<set _stvFormat to _result.format>>
<<set _stvTags to _result.tags>>
<<set _stvSource to _stvFolder>>
<</if>>
<</for>>
<</for>>
<</if>>
<<if _stvFromHint>>
<<set _stvHintAt++>>
<<else>>
<<set _stvAt++>>
<</if>>
<</for>>
<<if _stvFile>><<run setup.travelMediaRemember(_stvSource, _stvFile)>><</if>>
<<run setup.combatMediaTemps.restore()>>
<</silently>>
<div @id="_stvBox" class="card-video-container travel-video-container" @data-travel-category="_stvCat" style="display:none"></div>
<<run window.fillCombatVideoBox(_stvBox, _stvFile, _stvFormat, _stvTags, _stvOwn, _stvSource)>>
<<if setup.lineMediaBox>><<run setup.lineMediaBox(_stvBox, _travelMediaTarget)>><</if>>
<</widget>>
<<widget "journeyTerrainBackground">>
<<set _jtbTerrain to ($journey && $journey.currentSegment && $journey.currentSegment.terrain) || null>>
<<set _jtbData to (_jtbTerrain && $worldMap && $worldMap.terrainTypes) ? $worldMap.terrainTypes[_jtbTerrain] : null>>
<<if _jtbData && _jtbData.backgrounds && _jtbData.backgrounds.length > 0>>
<<if $time.phase === "night" || $time.phase === "evening">>
<<setBackground `_jtbData.backgrounds[_jtbData.backgrounds.length - 1]`>>
<<else>>
<<setBackground _jtbData.backgrounds[0]>>
<</if>>
<<else>>
<<setBackground "reclaimed-travel">>
<</if>>
<</widget>><<run setup.survival = {
hunger: {
satisfied: 70,
hungry: 50,
veryHungry: 30,
starving: 10
},
fatigue: {
fresh: 30,
tired: 50,
fatigued: 70,
exhausted: 90,
collapsing: 100
},
terrainEnergyDrain: {
reclaimed: 4,
ruins: 5,
highway: 3,
forest: 5,
urban: 4,
industrial: 5,
ravine: 6,
swamp: 7,
mountains: 6
},
campRecovery: {
none: { fatigue: 30, energy: 30, description: "Rough rest on the ground" },
tarp: { fatigue: 45, energy: 40, description: "Basic shelter from the elements" },
tent: { fatigue: 60, energy: 60, description: "Proper shelter and rest" },
shelter: { fatigue: 50, energy: 50, description: "Found shelter provides decent cover" }
}
}>>
<<run setup.hungerStateOf = function (h) {
h = Number(h) || 0;
return h >= 70 ? "satisfied" : h >= 40 ? "hungry" : h >= 20 ? "very_hungry" : "starving";
}>>
<<run setup.fatigueOf = function () {
var p = State.variables.player || {}, m = p.maxEnergy || 100;
return Math.max(0, Math.min(100, Math.round(100 - 100 * (Number(p.energy) || 0) / m)));
}>>
<<run setup.travelHungerLockAt = 25>>
<<run setup.packFoodItems = function () {
try {
return UInv.GetItemsArray("player").map(function (n) {
return { name: n, restore: Number(UInv.GetItemPropertyValue("player", n, "hungerRestore")) || 0 };
}).filter(function (i) { return i.restore > 0; }).sort(function (a, b) { return b.restore - a.restore; });
} catch (e) { return []; }
}>>
<<run setup.packHasFood = function () { return setup.packFoodItems().length > 0; }>>
<<run setup.starvingTravelLock = function (from) {
var V = State.variables;
if (!V.player || !(Number(V.player.hunger) < setup.travelHungerLockAt)) return null;
var noFood = !((V.vault && V.vault.food) > 0) && !setup.packHasFood() && !(setup.vaultFishCount() > 0);
var here = from || V.currentLocation || "vault";
if (here === "vault") return { onlyFishers: noFood };
if (here === "fishers_rest" && V.flags && V.flags.starvingFishTrip) return { onlyFishers: true, homeOnly: true };
return null;
}>>
<<run setup.travelLock = function (destId) {
var V = State.variables;
var hurt = (V.player && V.player.health < 20) || (V.expeditionCompanion === "kira" && setup.kiraWithYou() && V.companions[0].health < 20);
if (hurt && !((V.currentLocation || "vault") !== "vault" && destId === "vault")) return "Too Injured";
var lock = setup.starvingTravelLock();
if (!lock) return "";
if (lock.homeOnly) return destId === "vault" ? "" : "Too hungry: go home";
if (lock.onlyFishers && destId === "fishers_rest") return "";
return lock.onlyFishers ? "Too hungry: only Fisher's Rest" : "Too hungry: eat first";
}>>
<<run setup.campIsNight = function () { var h = State.variables.time.hour; return h >= 17 || h < 7; }>>
<<run setup.vaultCrisisFishersOnly = function () {
var lock = setup.starvingTravelLock("vault");
return !!(lock && lock.onlyFishers);
}>>
<<run setup.vaultCrisisEatFirst = function () {
var lock = setup.starvingTravelLock("vault");
return !!(lock && !lock.onlyFishers);
}>>
<<run setup.noteStarvingFishTrip = function (destId) {
var V = State.variables;
if ((V.currentLocation || "vault") !== "vault") return;
var lock = setup.starvingTravelLock();
V.flags.starvingFishTrip = !!(lock && lock.onlyFishers && destId === "fishers_rest");
}>>
<<run setup.starvingTravelLockText = function (from) {
var lock = setup.starvingTravelLock(from);
if (!lock) return "";
if (lock.homeOnly) return "You're still starving. Head home: you're in no shape for anything else.";
var dry = false;
try { dry = UInv.BagHasItem("player", "canteen"); } catch (e) { }
if (lock.onlyFishers) return "You're too close to starving to go far, and there is no food in the vault and nothing to eat or drink in your pack" + (dry ? " (your canteen is dry)" : "") + ". The only trip you can make is to Fisher's Rest, to fish, and back.";
var V = State.variables;
return "You're too close to starving to leave on a trip. Eat or drink something before you go: there is " + ((V.vault && V.vault.food > 0) ? "food in the vault." : setup.vaultFishCount() > 0 ? "fish in the vault's storage: prep it in the kitchen." : "food or drink in your pack.");
}>>
<<run setup.hungerAlerts = {
hungry: { text: "You're getting hungry.", type: "warning" },
very_hungry: { text: "You're very hungry. Eat soon.", type: "warning" },
near_starving: { text: "You need food soon. You're close to starving.", type: "danger" },
starving: { text: "You're starving. Eat, or you'll start losing health.", type: "danger" }
}>>
<<run setup.hungerAlertStateOf = function (h) {
var st = setup.hungerStateOf(h);
return (st === "very_hungry" && Number(h) < setup.travelHungerLockAt) ? "near_starving" : st;
}>>
<<run setup.hungerRelief = {
satisfied: { text: "You've eaten. You're not hungry any more.", type: "success" },
hungry: { text: "You've eaten. Still hungry, but you'll manage.", type: "success" },
very_hungry: { text: "A little food. You're still very hungry.", type: "success" },
near_starving: { text: "A bite of food. Still close to starving: eat more.", type: "warning" }
}>>
<<run setup.hungerRepeat = { hours: 3, text: "Still starving. Your body is eating itself: find food.", type: "danger" }>>
<<run setup.survival.waterRestore = 15>>
<<run setup.survival.crisisOdds = {
collapseBase: 15, collapsePerPush: 20, collapseMax: 75,
toll: 40, delirium: 20, kiraOffer: 25, hallucination: 25
}>>
<<run setup.collapseChance = function () {
var j = State.variables.journey || {}, o = setup.survival.crisisOdds;
if ((j.crisisCount || 0) < 2) return 0;
return Math.min(o.collapseMax, o.collapseBase + o.collapsePerPush * (j.pushOn || 0));
}>>
<<run setup.hoursAwake = function () {
var V = State.variables, t = V.time || {}, h = Number(t.hour) || 0;
var since7 = (h >= 5 && h < 7) ? 0 : (h - 7 + 24) % 24;
var slept = V.journey && typeof V.journey.lastSleptAt === "number" ? (Number(t.totalHours) || 0) - V.journey.lastSleptAt : Infinity;
return Math.max(0, Math.min(since7, slept));
}>>
<<run setup.survival.passOutAwakeHours = 19>>
<<run setup.roadPassOutDue = function () {
var V = State.variables, p = V.player || {}, t = V.time || {};
var night = t.phase === "night" || t.phase === "late_night";
return setup.hoursAwake() >= setup.survival.passOutAwakeHours || (night && (Number(p.energy) || 0) <= 0);
}>>
<<run setup.survival.passOutWarnAwakeHours = 16>>
<<run setup.passOutWarning = { text: "You've been on your feet since morning. Make camp soon.", type: "warning" }>>
<<run setup.roadAwakeWarnDue = function () {
var V = State.variables, j = V.journey, t = V.time || {};
if (!j || !j.active) return false;
var awake = setup.hoursAwake();
if (awake < setup.survival.passOutWarnAwakeHours || setup.roadPassOutDue()) return false;
return !V.survival || V.survival.awakeWarnedAt !== (Number(t.totalHours) || 0) - awake;
}>>
<<run setup.markRoadAwakeWarned = function () {
var V = State.variables;
if (!V.survival) V.survival = {};
V.survival.awakeWarnedAt = (Number(V.time && V.time.totalHours) || 0) - setup.hoursAwake();
}>>
<<run setup.roadRob = function (withScrap) {
var took = [];
try {
["ration", "food", "canned food", "water"].forEach(function (i) {
var n = UInv.BagHasItem("player", i);
if (n) { UInv.DeleteItem("player", i); took.push(i); }
});
} catch (e) { }
var V = State.variables;
if (withScrap && V.vault && V.vault.scrap > 0) {
var s = Math.min(V.vault.scrap, 10);
V.vault.scrap -= s;
took.push(s + " scrap");
}
return took;
}>>
<<run setup.roadRobText = function (took) {
return took && took.length ? "They took: " + took.join(", ") + "." : "There was nothing left in your pack to take.";
}>>
<<run setup.crisisEventSeen = function (p) {
var j = State.variables.journey || {};
return Array.isArray(j.crisisEventsSeen) && j.crisisEventsSeen.indexOf(p) !== -1;
}>>
<<run setup.markCrisisEvent = function (p) {
var j = State.variables.journey;
if (!j) return;
if (!Array.isArray(j.crisisEventsSeen)) j.crisisEventsSeen = [];
if (j.crisisEventsSeen.indexOf(p) === -1) j.crisisEventsSeen.push(p);
}>>
<<widget "pushOnChoice">>
<<capture _args>>
<<link `'<span class="choice-button action"><span class="gi gi-forward gi-large"></span><span class="label">' + _args[0] + '</span></span>'`>><<set $journey.pushOn to ($journey.pushOn || 0) + 1>><<goto "Journey_Tick">><</link>>
<</capture>>
<</widget>>
<<widget "survivalTick">>
<<set $journey.hoursSinceFood++>>
<<set $journey.hoursSinceRest++>>
<<clampStat "player.hunger" -3>>
<<set _terrain to $journey.currentSegment.terrain || "reclaimed">>
<<set _energyDrain to setup.survival.terrainEnergyDrain[_terrain] || 4>>
<<set _negEnergyDrain to -_energyDrain>>
<<clampStat "player.energy" _negEnergyDrain 0 $player.maxEnergy>>
<<set _extraDrain to 0>>
<<if $journey.weather === "storm">>
<<set _extraDrain += 2>>
<<elseif $journey.weather === "rain">>
<<set _extraDrain += 1>>
<</if>>
<<if $player.hunger <= 20>>
<<set _extraDrain += 2>>
<<elseif $player.hunger <= 50>>
<<set _extraDrain += 1>>
<</if>>
<<if _extraDrain > 0>>
<<set _negExtraDrain to -_extraDrain>>
<<clampStat "player.energy" _negExtraDrain 0 $player.maxEnergy>>
<</if>>
<<if $player.hunger <= 10>>
<<clampStat "player.health" -2 0 100>>
<<set _stToast to "Your stomach cramps — starving (−2 health">>
<<getJourneyCompanion>>
<<if _gc_companion>>
<<set _gc_companion.health -= 1>>
<<set _stToast += ", " + (_gc_companion.name || "Kira") + " −1">>
<<if _gc_companion.id === "kira">><<set _gc_companion.health to setup.kiraFloorHealth(_gc_companion.health)>><</if>>
<<if _gc_companion.health <= 0>>
<<set $flags.companionCollapsed to true>>
<</if>>
<</if>>
<<if !$journey.currentSegment || !$journey.currentSegment.starveToasted>>
<<toast `_stToast + ")"` "danger">>
<<if $journey.currentSegment>><<set $journey.currentSegment.starveToasted to true>><</if>>
<</if>>
<</if>>
<<if $player.health <= 0>>
<<set $flags.survivalDeath to true>>
<<if $player.hunger <= 10>>
<<set $flags.deathCause to "starvation">>
<<elseif setup.fatigueOf() >= 100>>
<<set $flags.deathCause to "exhaustion">>
<<else>>
<<set $flags.deathCause to "wounds">>
<</if>>
<</if>>
<</widget>>
<<widget "getHungerState">>
<<set $survival.hungerState to setup.hungerStateOf($player.hunger)>>
<</widget>>
<<widget "hungerAlertCheck">>
<<if $survival && $player && typeof $player.hunger === "number">>
<<set _haRank to { satisfied: 0, hungry: 1, very_hungry: 2, near_starving: 3, starving: 4 }>>
<<getHungerState>>
<<set _haNow to setup.hungerAlertStateOf($player.hunger)>>
<<set _haWas to _haRank[$survival.hungerAlertState] || 0>>
<<set _haHour to ($time && $time.totalHours) || 0>>
<<if _haRank[_haNow] gt _haWas>>
<<toast `setup.hungerAlerts[_haNow].text` `setup.hungerAlerts[_haNow].type`>>
<<set $survival.hungerRepeatAt to _haHour>>
<<elseif _haRank[_haNow] lt _haWas>>
<<toast `setup.hungerRelief[_haNow].text` `setup.hungerRelief[_haNow].type`>>
<<elseif _haNow === "starving" && (passage() === "Journey_Tick" || _haHour - ($survival.hungerRepeatAt || 0) >= setup.hungerRepeat.hours)>>
<<toast `setup.hungerRepeat.text` `setup.hungerRepeat.type`>>
<<set $survival.hungerRepeatAt to _haHour>>
<</if>>
<<set $survival.hungerAlertState to _haNow>>
<</if>>
<</widget>>
<<widget "getFatigueState">>
<<set _gfsTired to setup.fatigueOf()>>
<<if _gfsTired < setup.survival.fatigue.fresh>>
<<set $survival.fatigueState to "fresh">>
<<elseif _gfsTired < setup.survival.fatigue.tired>>
<<set $survival.fatigueState to "tired">>
<<elseif _gfsTired < setup.survival.fatigue.fatigued>>
<<set $survival.fatigueState to "fatigued">>
<<elseif _gfsTired < setup.survival.fatigue.exhausted>>
<<set $survival.fatigueState to "exhausted">>
<<else>>
<<set $survival.fatigueState to "collapsing">>
<</if>>
<</widget>>
<<widget "checkSurvivalCrisis">>
<<set $survival.crisis to false>>
<<set $survival.crisisType to "">>
<<if setup.fatigueOf() >= setup.survival.fatigue.collapsing>>
<<set $survival.crisis to true>>
<<set $survival.crisisType to "exhaustion">>
<<elseif $player.hunger <= 10>>
<<set $survival.crisis to true>>
<<set $survival.crisisType to "starvation">>
<</if>>
<</widget>>
<<widget "consumeFood">>
<<if UInv.BagHasItem("player", "ration") || UInv.BagHasItem("player", "food") || UInv.BagHasItem("player", "canned food")>>
<<if UInv.BagHasItem("player", "ration")>>
<<run UInv.DeleteItem("player", "ration", 1)>>
<<elseif UInv.BagHasItem("player", "canned food")>>
<<run UInv.DeleteItem("player", "canned food", 1)>>
<<else>>
<<run UInv.DeleteItem("player", "food", 1)>>
<</if>>
<<set $journey.hoursSinceFood to 0>>
<<set $player.hunger to Math.min($player.maxHunger, $player.hunger + 40)>>
<<clampStat "player.energy" 5 0 $player.maxEnergy>>
<</if>>
<</widget>>
<<widget "consumeWater">>
<<if UInv.BagHasItem("player", "water") || UInv.BagHasItem("player", "canteen")>>
<<if UInv.BagHasItem("player", "water")>>
<<run UInv.DeleteItem("player", "water", 1)>>
<</if>>
<<set $player.hunger to Math.min($player.maxHunger, $player.hunger + setup.survival.waterRestore)>>
<</if>>
<</widget>>
<<widget "shortRest">>
<<set _restHours to _args[0] || 2>>
<<advanceTime _restHours>>
<<set $journey.hoursSinceRest to 0>>
<<set $player.energy to Math.min($player.maxEnergy, Math.round($player.energy + $player.maxEnergy * 0.25))>>
<<set $flags.groupCNCBoth to false>>
<<if $companions && $companions[0] && $companions[0].present>>
<<clampStat "companions[0].tension" -3>>
<</if>>
<</widget>>
<<run setup.stableRoll = function (key, n) {
var str = String(key) + ":" + String(n), h = 2166136261;
for (var i = 0; i < str.length; i++) { h ^= str.charCodeAt(i); h = Math.imul(h, 16777619); }
return (Math.abs(h) % 100) + 1;
}>>
<<run setup.survival.dayCampHours = 4>>
<<run setup.campNight = function () { var h = Number(State.variables.time.hour) || 0; return h >= 17 || h < 4; }>>
<<run setup.campSleep = function (hours, recovery, night) {
var f = Math.max(0, Math.min(1, hours / 8)), e = (recovery && recovery.energy) || 30;
return { hours: hours, night: !!night, health: Math.round(15 * f), energy: Math.round(e * f), food: Math.min(12, Math.round(hours)) };
}>>
<<widget "campRest">>
<<set _quality to _args[0] || "none">>
<<set _recovery to setup.survival.campRecovery[_quality] || setup.survival.campRecovery.none>>
<<set _crStart to $time.totalHours>>
<<set _crNight to setup.campNight()>>
<<if _crNight>><<advanceToHour 7>><<else>><<advanceTime setup.survival.dayCampHours>><</if>>
<<set $journey.campSleep to setup.campSleep($time.totalHours - _crStart, _recovery, _crNight)>>
<<if _crNight>><<run setup.groveDeadlineNotice()>><</if>>
<<set _weatherRoll to random(1, 100)>>
<<if _weatherRoll <= 30>>
<<set $weather to "clear">>
<<set $journey.weather to "clear">>
<<elseif _weatherRoll <= 60>>
<<set $weather to "cloudy">>
<<set $journey.weather to "cloudy">>
<<elseif _weatherRoll <= 80>>
<<set $weather to "rain">>
<<set $journey.weather to "rain">>
<<elseif _weatherRoll <= 90>>
<<set $weather to "fog">>
<<set $journey.weather to "fog">>
<<else>>
<<set $weather to "storm">>
<<set $journey.weather to "storm">>
<</if>>
<<set $journey.weatherDuration to random(3, 6)>>
<<set $journey.hoursSinceRest to 0>>
<<set $journey.campedTonight to true>>
<<set $journey.lastSleptAt to $time.totalHours>>
<<if _crNight>><<run setup.countSleep()>><</if>>
<<set $player.health to Math.min($player.maxHealth, $player.health + $journey.campSleep.health)>>
<<set $player.energy to Math.min($player.maxEnergy, $player.energy + $journey.campSleep.energy)>>
<<getJourneyCompanion>>
<<if _gc_companion>>
<<set _gc_companion.health to Math.min(_gc_companion.maxHealth, _gc_companion.health + $journey.campSleep.health)>>
<</if>>
<<if $companions && $companions.length > 0 && $companions[0]>>
<<set _campTensionDecay to random(2, 5)>>
<<set _negCampTensionDecay to -_campTensionDecay>>
<<clampStat "companions[0].tension" _negCampTensionDecay>>
<</if>>
<<if $player.lust > 0>>
<<set _campLustDecay to random(3, 8)>>
<<set _negCampLustDecay to -_campLustDecay>>
<<clampStat "player.lust" _negCampLustDecay>>
<</if>>
<<set _crFood to -$journey.campSleep.food>>
<<clampStat "player.hunger" _crFood>>
<<if _quality === "tent" || _quality === "shelter">>
<<set $journey.wetness to 0>>
<<elseif _quality === "tarp">>
<<clampStat "journey.wetness" -30>>
<</if>>
<</widget>>
<<widget "survivalStatus">>
<<getHungerState>>
<<getFatigueState>>
<div class="survival-status">
<div @class="'survival-stat' + ($survival.hungerState !== 'satisfied' ? ' warning' : '')">
<<icon "food">>
<<switch $survival.hungerState>>
<<case "satisfied">>Fed
<<case "hungry">>Hungry
<<case "very_hungry">>Very Hungry
<<case "starving">>Starving!
<</switch>>
</div>
<div @class="'survival-stat' + ($survival.fatigueState !== 'fresh' ? ' warning' : '')">
<<icon "sleep">>
<<switch $survival.fatigueState>>
<<case "fresh">>Rested
<<case "tired">>Tired
<<case "fatigued">>Fatigued
<<case "exhausted">>Exhausted
<<case "collapsing">>Collapsing!
<</switch>>
</div>
<<set _weatherSpeedMod to setup.travelConfig.speedModifiers[$journey.weather] || 1.0>>
<<if _weatherSpeedMod > 1.0>>
<<set _slowPercent to Math.round((_weatherSpeedMod - 1.0) * 100)>>
<div class="survival-stat warning">
<<weatherIcon>>
-<<print _slowPercent>>% Speed
</div>
<</if>>
</div>
<</widget>>
<<run setup.survivalReactions = {
exhaustion: {
early: [
"Hey! You okay?",
"Whoa—careful!",
"You need to sit down. Right now."
],
caring: [
"Hey... hey, stay with me.",
"I've got you. Just breathe.",
"You pushed too hard. Stubborn idiot."
],
intimate: [
"Don't you dare pass out on me.",
"Come here... I've got you. I've always got you.",
"You absolute fool. ...My fool, but still."
]
},
dehydration: {
early: [
"You don't look good.",
"Your lips are cracked. We need water.",
"How long since you drank anything?"
],
caring: [
"Your skin is dry... this is bad.",
"We have to find water. I'm not watching you die of thirst.",
"Please, just... hang in there."
],
intimate: [
"You're scaring me. Please, we need to find water.",
"I can't lose you. Not to something as stupid as thirst.",
"Your lips are so dry... let me—just save your strength."
]
},
starvation: {
early: [
"When did you last eat?",
"You're pale. You need food.",
"Your hands are shaking."
],
caring: [
"You're running on fumes. We have to find something to eat.",
"You look like death. Here—take some of my portion.",
"Don't you dare martyr yourself for extra rations."
],
intimate: [
"You've been giving me your food, haven't you? You idiot...",
"I'd rather starve together than watch you waste away.",
"Your body is eating itself. Please... eat something."
]
}
}>><<setBackground "reclaimed-travel">>
<<if !$journey.crisisCount>><<set $journey.crisisCount to 0>><</if>>
<<set $journey.crisisCount++>>
<<canTriggerCompanionEvent>>
<<set _hasCompanion to _cte_canTrigger>>
<<if _hasCompanion>><<getJourneyCompanion>><</if>>
<<set _jscOdds to setup.survival.crisisOdds>>
<<set _jscSpecial to null>>
<<if !setup.crisisEventSeen("Journey_Survival_CollapseFound") && random(1, 100) <= setup.collapseChance()>>
<<set _jscSpecial to "Journey_Survival_CollapseFound">>
<<elseif !setup.crisisEventSeen("Journey_Survival_RaiderToll") && $journey.crisisCount >= 2 && $survival.crisisType === "starvation" && random(1, 100) <= _jscOdds.toll>>
<<set _jscSpecial to "Journey_Survival_RaiderToll">>
<<elseif !setup.crisisEventSeen("Journey_Survival_DeliriumTouch") && $player.hunger <= 20 && random(1, 100) <= _jscOdds.delirium>>
<<set _jscSpecial to "Journey_Survival_DeliriumTouch">>
<<elseif !setup.crisisEventSeen("Journey_Survival_KiraOffer") && $journey.crisisCount >= 4 && _hasCompanion && _gc_companion && _gc_companion.trust >= 50 && random(1, 100) <= _jscOdds.kiraOffer>>
<<set _jscSpecial to "Journey_Survival_KiraOffer">>
<<elseif !setup.crisisEventSeen("Journey_Survival_Hallucination") && (setup.fatigueOf() >= 95 || $player.hunger <= 15) && random(1, 100) <= _jscOdds.hallucination>>
<<set _jscSpecial to "Journey_Survival_Hallucination">>
<</if>>
<<if _jscSpecial>><<run setup.markCrisisEvent(_jscSpecial)>><</if>>
<<if _jscSpecial>>
<<include _jscSpecial>>
<<else>>
<<set _reactionTier to "early">>
<<if _hasCompanion && _gc_companion>>
<<if _gc_companion.romanceStage >= 3>>
<<set _reactionTier to "intimate">>
<<elseif _gc_companion.trust >= 50 || _gc_companion.affection >= 40>>
<<set _reactionTier to "caring">>
<</if>>
<</if>>
<<set _hallucinating to false>>
<<if setup.fatigueOf() >= 95 || $player.hunger <= 15>>
<<set _hallucinating to true>>
<</if>>
<<switch $survival.crisisType>>
<<case "exhaustion">>
<h2><<icon "sleep">> Exhaustion</h2>
<p>Your legs give out. You collapse to your knees, chest heaving, vision swimming.</p>
<<if _hallucinating>>
<p class="hallucination">The ground seems to breathe beneath you. Shadows move at the edge of your vision—are those figures watching? You blink and they're gone.</p>
<</if>>
<<if _hasCompanion>>
<<set _reactions to setup.survivalReactions.exhaustion[_reactionTier]>>
<<set _reaction to _reactions[random(0, _reactions.length - 1)]>>
<<say "Kira" _reaction>>
<<if _reactionTier === "intimate">>
<p>She catches you before you hit the ground, pulling you against her. Her hand finds your face, checking your temperature.</p>
<<say "Kira" "Your skin is clammy. We're stopping. No arguments.">>
<<elseif _reactionTier === "caring">>
<p>She catches you before you hit the ground, lowering you down carefully.</p>
<<say "Kira" "You've pushed too hard. We have to rest. Now.">>
<<else>>
<p>She grabs your arm, steadying you.</p>
<<say "Kira" "You can't keep going like this.">>
<</if>>
<</if>>
<p class="narrator">Your body is done. Rest, or force it on and pay for it.</p>
<<case "starvation">>
<h2><<icon "food">> Starvation</h2>
<p>Your stomach has stopped growling. It's past that now. Your hands shake. Your thoughts are sluggish.</p>
<<if _hallucinating>>
<p class="hallucination">You smell cooking meat. Rich, savory, impossibly appetizing. Your mouth waters despite the dryness—but there's nothing. No fire. No food. Just the aching void in your belly.</p>
<</if>>
<<if _hasCompanion>>
<<set _reactions to setup.survivalReactions.starvation[_reactionTier]>>
<<set _reaction to _reactions[random(0, _reactions.length - 1)]>>
<<say "Kira" _reaction>>
<<if _reactionTier === "intimate">>
<p>She presses something into your hand—half of her own ration.</p>
<<say "Kira" "Don't argue. Just eat.">>
<<elseif _reactionTier === "caring" && UInv.BagHasItem("kira", "ration")>>
<p>She's already digging through her pack.</p>
<<say "Kira" "I have a little. Here—don't make a thing of it.">>
<</if>>
<</if>>
<p class="warning">You need food soon or you won't be able to continue.</p>
<</switch>>
<div class="choice-container">
<<if $survival.crisisType === "exhaustion">>
<<vchoice "Make camp here" "Journey_Camp" "action" "fire">>
<<if UInv.BagHasItem("player", "stimpak")>>
<<vchoice "Use stimpack to push on" "Journey_Survival_UseStimpack" "action" "syringe">>
<</if>>
<<if $journey.crisisCount >= 2 && _hasCompanion && _gc_companion && _gc_companion.trust >= 30>>
<<vchoice "Let Kira help you walk" "Journey_Survival_KiraSupport" "action" "partner">>
<</if>>
<<pushOnChoice "Force yourself to keep walking">>
<<elseif $survival.crisisType === "starvation">>
<<if UInv.BagHasItem("player", "ration") || UInv.BagHasItem("player", "food")>>
<<vchoice "Eat food" "Journey_Survival_Eat" "action" "food">>
<</if>>
<<if UInv.BagHasItem("player", "water")>>
<<vchoice "Drink water" "Journey_Survival_Drink" "action" "water">>
<</if>>
<<vchoice "Search for food" "Journey_Survival_SearchFood" "action" "search">>
<<vchoice "Search for water" "Journey_Survival_SearchWater" "action" "search">>
<<pushOnChoice "Push on despite hunger">>
<<if $journey.crisisCount >= 2>>
<<vchoice "Desperate measures..." "Journey_Survival_DesperateMeasures" "action" "broken-heart">>
<</if>>
<</if>>
</div>
<<if $journey.crisisCount >= 1>><p class="system-info">Pushing on through a crisis makes a collapse more likely.</p><</if>>
<</if>><<consumeWater>>
<<setBackground "reclaimed-travel">>
<<canTriggerCompanionEvent>>
<h2><<icon "water">> Relief</h2>
<p>You drink deeply. The water is warm but it's the sweetest thing you've ever tasted.</p>
<<if _cte_canTrigger>>
<<say "Kira" "Better?">>
<p>You nod, already feeling the fog lifting from your mind.</p>
<<say "Kira" "Good. We need to be more careful about rationing.">>
<</if>>
<div class="choice-container">
<<vchoice "Continue journey" "Journey_Tick" "action" "forward">>
</div><<consumeFood>>
<<setBackground "reclaimed-travel">>
<<canTriggerCompanionEvent>>
<h2><<icon "food">> Nourishment</h2>
<p>You wolf down the ration. It's bland and dry, but your body practically sings with relief.</p>
<<if _cte_canTrigger>>
<<say "Kira" "Slow down, you'll choke. ...Feeling better?">>
<p>You nod between bites.</p>
<<say "Kira" "We should scavenge when we can. Supplies won't last forever.">>
<</if>>
<div class="choice-container">
<<vchoice "Continue journey" "Journey_Tick" "action" "forward">>
</div><<run UInv.DeleteItem("player", "stimpak", 1)>>
<<set _stimpackRecovery to setup.travelConfig.fatigueRecovery.stimpack>>
<<clampStat "player.energy" _stimpackRecovery 0 $player.maxEnergy>>
<<setBackground "reclaimed-travel">>
<<canTriggerCompanionEvent>>
<h2><<icon "syringe">> Chemical Push</h2>
<p>The needle slides in. The effect is immediate—warmth flooding through your veins, exhaustion retreating like a tide.</p>
<p class="warning">This isn't rest. This is borrowed time.</p>
<<if _cte_canTrigger>>
<<say "Kira" "Those things will kill you eventually, you know.">>
<p>But even she looks relieved that you're moving again.</p>
<</if>>
<div class="choice-container">
<<vchoice "Continue journey" "Journey_Tick" "action" "forward">>
</div><<set _roll to random(1, 100)>>
<<setBackground "reclaimed-travel">>
<<canTriggerCompanionEvent>>
<h2><<icon "search">> Searching for Water</h2>
<<advanceTime 1>>
<<showTravelVideo "survival_search">>
<<if _roll <= 40>>
<p>You search the area desperately... and find a small stream trickling between rocks.</p>
<<if _cte_canTrigger>>
<<say "Kira" "There! Water!">>
<</if>>
<p>You drink your fill, the cool water reviving you.</p>
<<set $player.hunger to Math.min($player.maxHunger, $player.hunger + setup.survival.waterRestore)>>
<div class="choice-container">
<<vchoice "Continue journey" "Journey_Tick" "action" "forward">>
</div>
<<else>>
<p>You search for an hour but find nothing. Just more dense undergrowth and tangled vines.</p>
<<if _cte_canTrigger>>
<<say "Kira" "Nothing. We need to keep moving—maybe there's something ahead.">>
<</if>>
<div class="choice-container">
<<vchoice "Keep searching (1 hour)" "Journey_Survival_SearchWater" "action" "search">>
<<pushOnChoice "Push on">>
</div>
<</if>><<set _roll to random(1, 100)>>
<<setBackground "reclaimed-travel">>
<<canTriggerCompanionEvent>>
<h2><<icon "search">> Foraging</h2>
<<advanceTime 1>>
<<showTravelVideo "survival_search">>
<<if _roll <= 30>>
<p>You find something edible—dried roots, a few berries that don't look poisonous.</p>
<<if _cte_canTrigger>>
<<say "Kira" "Not exactly a feast, but it'll keep us going.">>
<</if>>
<p>You eat what you found. It's bitter but filling.</p>
<<set $journey.hoursSinceFood to 0>>
<<set $player.hunger to Math.min($player.maxHunger, $player.hunger + 20)>>
<p class="system-info"><<icon "food">> +20 Food</p>
<div class="choice-container">
<<vchoice "Continue journey" "Journey_Tick" "action" "forward">>
</div>
<<else>>
<p>Nothing. The Reclaimed offers no charity today.</p>
<<if _cte_canTrigger>>
<<say "Kira" "This area's been picked clean. Or nothing grows here at all.">>
<</if>>
<div class="choice-container">
<<vchoice "Keep searching (1 hour)" "Journey_Survival_SearchFood" "action" "search">>
<<pushOnChoice "Push on">>
</div>
<</if>><<setBackground "reclaimed-travel">>
<<getJourneyCompanion>>
<<set _cfg to setup.travelConfig.fatigueRecovery>>
<<set $player.energy to Math.max($player.energy, Math.min($player.maxEnergy - _cfg.kiraSupportMinFatigue, $player.energy + _cfg.kiraSupport))>>
<h2><<icon "partner">> Leaning on Kira</h2>
<<if _gc_companion && _gc_companion.romanceStage >= 3>>
<p>Without a word, Kira moves to your side. She pulls your arm over her shoulders, her other arm wrapping around your waist—firmly, possessively.</p>
<<say "Kira" "I've got you. Just focus on putting one foot in front of the other.">>
<p>Her warmth seeps into you. The contact steadies you more than it should—not just physically, but something deeper.</p>
<<say "Kira" "You lean on me when you need to. That's what this is now.">>
<<set _gc_companion.affection += 2>>
<<elseif _gc_companion && _gc_companion.trust >= 50>>
<p>Kira ducks under your arm without asking permission. She's surprisingly strong for her size.</p>
<<say "Kira" "Shut up and walk. I'm not carrying your corpse back to the Vault.">>
<p>Her words are harsh but her grip is careful, adjusting to support your weight without hurting you.</p>
<<addTrust "kira" 1>>
<<else>>
<p>Kira hesitates, then offers her shoulder.</p>
<<say "Kira" "Look, I... here. Just don't make this weird.">>
<p>She takes some of your weight, helping you shuffle forward. It's awkward, but it works.</p>
<</if>>
<p class="narrator">You can continue traveling, but at reduced speed.</p>
<<set $journey.supportMode to true>>
<div class="choice-container">
<<vchoice "Continue with Kira's help" "Journey_Tick" "action" "forward">>
<<vchoice "Rest here instead" "Journey_Camp" "action" "fire">>
</div><<setBackground "reclaimed-travel">>
<<canTriggerCompanionEvent>>
<<set _type to (typeof _args !== "undefined" && _args[0]) || "random">>
<<if _type === "random">>
<<set _type to either("vision", "sound", "figure", "memory")>>
<</if>>
<h2><<icon "eye">> Something's Wrong...</h2>
<<switch _type>>
<<case "vision">>
<p>The world <em>shifts</em>. Colors bleed together. The Reclaimed ahead warps and twists like a reflection in disturbed water.</p>
<<storyVideo "story/mv_travel/hallucination">>
<p>For a moment—just a moment—you see it. A city, whole and bright. People walking streets that aren't there anymore. A life that was never yours.</p>
<<if _cte_canTrigger>>
<<say "Kira" "Hey. HEY. Look at me.">>
<p>Her face swims into view, concerned, real.</p>
<<say "Kira" "What did you see?">>
<</if>>
<p>You blink, and it's gone. Just dust and ruins.</p>
<<case "sound">>
<p>A voice. Clear as day, calling your name. You spin—nothing. The Reclaimed is empty.</p>
<p>But you heard it. You <em>heard</em> it. Someone calling for you from just over that ridge...</p>
<<if _cte_canTrigger>>
<<say "Kira" "There's nobody there. I've been watching. There's nobody.">>
<p>She takes your hand—whether to steady you or to keep you from wandering off, you're not sure.</p>
<<say "Kira" "Your mind is playing tricks. You need rest. Real rest.">>
<</if>>
<<case "figure">>
<p>A figure, standing in the distance. Watching you. Waiting.</p>
<p>You can't make out features—it's just a silhouette against the hazy sky. But it's definitely there.</p>
<<if _cte_canTrigger>>
<p>Kira follows your gaze.</p>
<<say "Kira" "What are you... there's nothing there.">>
<p>You look again. She's right. Empty Reclaimed. Nothing but rock and scrub.</p>
<<say "Kira" "You're scaring me. We need to stop.">>
<</if>>
<<case "memory">>
<p>The smell hits you first. Cooking. Home. A place you haven't been in... how long?</p>
<p>For a heartbeat, you're somewhere else entirely. Safe. Warm. Someone is laughing—was that your voice?</p>
<p>Then it's gone, and you're back in the dust. The emptiness feels heavier than before.</p>
<<if _cte_canTrigger>>
<p>Kira is watching you with a strange expression.</p>
<<say "Kira" "Where did you go just now?">>
<p>You don't have an answer that makes sense.</p>
<</if>>
<</switch>>
<p class="warning">Your weakened state is causing hallucinations. You need to address your survival needs.</p>
<div class="choice-container">
<<pushOnChoice "Focus... push through">>
<<vchoice "We need to stop" "Journey_Camp" "action" "fire">>
</div><<setBackground "reclaimed-travel">>
<<canTriggerCompanionEvent>>
<<if _cte_canTrigger>><<getJourneyCompanion>><</if>>
<h2><<icon "broken-heart">> Desperate Times</h2>
<p>You've been in crisis too long. Your body is failing. Conventional options are running out.</p>
<<if _cte_canTrigger && _gc_companion>>
<<if _gc_companion.romanceStage >= 2>>
<p>Kira's watching you with growing concern. She knows how bad it's gotten.</p>
<<say "Kira" "There has to be something... some way...">>
<<else>>
<p>Even Kira looks worried. That alone tells you how dire things are.</p>
<</if>>
<</if>>
<p>The Reclaimed doesn't offer free meals. Everything has a price.</p>
<div class="choice-container">
<<if _cte_canTrigger && _gc_companion && _gc_companion.trust >= 40>>
<<vchoice "Ask Kira to share her rations" "Journey_Survival_AskKiraFood" "companion" "food">>
<<vchoice "Ask Kira if she has any water" "Journey_Survival_AskKiraWater" "companion" "water">>
<</if>>
<<vchoice "Eat whatever you can find" "Journey_Survival_RiskyFood" "action" "food">>
<<vchoice "Drink from a stagnant pool" "Journey_Survival_BadWater" "action" "water">>
<<vchoice "Search the ruins for a stash" "Journey_Survival_Scavenge" "action" "search">>
<<vchoice "Wait by the road for a caravan" "Journey_Survival_Caravan" "trade" "scrap">>
<<vchoice "Make camp here" "Journey_Camp" "action" "fire">>
<<pushOnChoice "Endure it">>
</div><<setBackground "reclaimed-travel">>
<<set _akwDrink to setup.survival.waterRestore>>
<<set _akwHas to UInv.BagHasItem("kira", "water")>>
<<if _akwHas>><<run UInv.DeleteItem("kira", "water", 1)>><</if>>
<h2><<icon "water">> Kira's Help</h2>
<<if !_akwHas>>
<p>Kira unscrews her canteen and tips it upside down. Nothing comes out.</p>
<<say "Kira" "Bone dry. I finished it an hour ago. I'd give it to you if I had it, you know that.">>
<p>She screws the cap back on and looks away down the road.</p>
<<elseif $companions[0].romanceStage >= 3>>
<p>Before you can even form the words, Kira's pressing her canteen to your lips.</p>
<<say "Kira" "Drink. Don't argue. I'm not watching you die of thirst.">>
<p>You try to protest—she needs water too.</p>
<<say "Kira" "If you die, what's the point of me surviving?">>
<p>The look in her eyes brooks no argument. You drink.</p>
<<set $player.hunger to Math.min($player.maxHunger, $player.hunger + _akwDrink)>>
<<addAffection "kira" 1>>
<<elseif $companions[0].trust >= 60>>
<<say "Kira" "Here.">>
<p>She hands over her canteen without hesitation.</p>
<<say "Kira" "I've been conserving. You need it more than me right now.">>
<p>There's warmth in her voice that wasn't there before.</p>
<<set $player.hunger to Math.min($player.maxHunger, $player.hunger + _akwDrink)>>
<<addTrust "kira" 2>>
<<else>>
<p>Kira hesitates.</p>
<<say "Kira" "I... fine. But we're rationing properly from now on.">>
<p>She passes you the canteen grudgingly. The water is warm and tastes like metal, but it's life.</p>
<<set $player.hunger to Math.min($player.maxHunger, $player.hunger + _akwDrink)>>
<</if>>
<div class="choice-container">
<<vchoice "Continue journey" "Journey_Tick" "action" "forward">>
</div><<setBackground "reclaimed-travel">>
<h2><<icon "food">> Kira's Rations</h2>
<<if $companions[0].romanceStage >= 3>>
<p>Kira's already unwrapping something from her pack before you can ask.</p>
<<say "Kira" "I know. I can tell. Here.">>
<p>She presses half a ration into your hand, then sits beside you, leaning close.</p>
<<say "Kira" "We eat together. That's how it is now.">>
<<set $journey.hoursSinceFood to 0>>
<<set $player.hunger to Math.min($player.maxHunger, $player.hunger + 30)>>
<<addAffection "kira" 1>>
<<elseif $companions[0].trust >= 60>>
<<say "Kira" "You look like hell. Here—take this.">>
<p>She tosses you a ration. It's clearly from her own supply.</p>
<<say "Kira" "Don't make a big deal of it. Partners look out for each other.">>
<<set $journey.hoursSinceFood to 0>>
<<set $player.hunger to Math.min($player.maxHunger, $player.hunger + 30)>>
<<addTrust "kira" 2>>
<<else>>
<p>Kira's jaw tightens, but after a moment she nods.</p>
<<say "Kira" "Fine. But you owe me.">>
<p>She hands over a ration bar. Small, but better than nothing.</p>
<<set $journey.hoursSinceFood to 0>>
<<set $player.hunger to Math.min($player.maxHunger, $player.hunger + 20)>>
<</if>>
<div class="choice-container">
<<vchoice "Continue journey" "Journey_Tick" "action" "forward">>
</div><<setBackground "reclaimed-travel">>
<<canTriggerCompanionEvent>>
<<advanceTime 1>>
<<set _rfRoll to random(1, 100)>>
<h2><<icon "food">> Whatever You Can Find</h2>
<<showTravelVideo "survival_risky_food">>
<p>You stop being picky. Grubs under a rotten log, pale mushrooms in the shade of a wall, a can so swollen it creaks when you press it.</p>
<<if _rfRoll <= 35>>
<p>You get lucky. The can holds beans, sour but edible, and the mushrooms taste like nothing at all. Your stomach unclenches for the first time in hours.</p>
<<set $player.hunger to Math.min($player.maxHunger, $player.hunger + 30)>>
<<set $journey.hoursSinceFood to 0>>
<p class="system-info"><<icon "food">> +30 Food</p>
<<elseif _rfRoll <= 75>>
<p>It stays down. Barely. An hour later the cramps come, folding you over, and you spend a long time on your knees in the dirt.</p>
<<set $player.hunger to Math.min($player.maxHunger, $player.hunger + 10)>>
<<clampStat "player.energy" -15 0 $player.maxEnergy>>
<<clampStat "player.health" -5 0 100>>
<p class="warning">Sick: +10 Food, −15 Energy, −5 Health</p>
<<else>>
<p>The mushrooms were the wrong kind. Your mouth goes numb, then your hands, and then everything you ate comes back up, and more. You lie shaking until it passes.</p>
<<clampStat "player.hunger" -5>>
<<clampStat "player.energy" -20 0 $player.maxEnergy>>
<<clampStat "player.health" -15 0 100>>
<p class="warning">Poisoned: −5 Food, −20 Energy, −15 Health</p>
<</if>>
<<if _cte_canTrigger>>
<<say "Kira" "Next time, ask me before you put something in your mouth.">>
<</if>>
<div class="choice-container">
<<vchoice "Continue journey" "Journey_Tick" "action" "forward">>
<<vchoice "Rest a while" "Journey_ShortRest" "action" "rest">>
</div><<setBackground "reclaimed-travel">>
<<canTriggerCompanionEvent>>
<<set _bwRoll to random(1, 100)>>
<h2><<icon "water">> Stagnant Water</h2>
<<set _w26bw to setup.storyAvoidStems("events/travel/survival_bad_water", ["4d207c303adb"])>><<showTravelVideo "survival_bad_water">><<if _w26bw>><<run setup.mediaAvoidEnd("events/travel/survival_bad_water")>><</if>><<set _stvClip to _stvFile ? _stvFile.split("/").pop().replace(/\.[^.]+$/, "") : null>>
<<if _stvClip is "9281245ce04c">><p>Green scum, a dead bird at the edge, a smell like a cellar. Where it seeps out over the stones there is no scum, only dark water. You scoop it up with your hand and drink anyway.</p><<else>><p>Green scum, a dead bird at the edge, a smell like a cellar. You push the scum aside with your hand and drink anyway.</p><</if>>
<<set $player.hunger to Math.min($player.maxHunger, $player.hunger + setup.survival.waterRestore)>>
<<if _bwRoll <= 50>>
<p>It tastes like rust and rot, but it's wet, and it stays down.</p>
<p class="system-info"><<icon "water">> +<<print setup.survival.waterRestore>> Food</p>
<<else>>
<<set _w26bw to setup.storyAvoidStems("events/travel/survival_bad_water", ["9281245ce04c"])>><<showTravelVideo "survival_bad_water">><<if _w26bw>><<run setup.mediaAvoidEnd("events/travel/survival_bad_water")>><</if>><<set _stvClip to _stvFile ? _stvFile.split("/").pop().replace(/\.[^.]+$/, "") : null>>
<<if _stvClip is "4d207c303adb">><p>Your guts turn on you before you've gone a hundred steps. You stop with your shirt pulled up and both hands pressed into your belly, then spend the next hour squatting behind rocks, weaker every time.</p><<else>><p>Your guts turn on you before you've gone a hundred steps. You spend the next hour squatting behind rocks, weaker every time.</p><</if>>
<<advanceTime 1>>
<<clampStat "player.energy" -15 0 $player.maxEnergy>>
<<clampStat "player.health" -10 0 100>>
<p class="warning">Sick: +<<print setup.survival.waterRestore>> Food, −15 Energy, −10 Health</p>
<</if>>
<<if _cte_canTrigger>>
<<say "Kira" "I'm not drinking that. And I'm not holding your hair either.">>
<</if>>
<div class="choice-container">
<<vchoice "Continue journey" "Journey_Tick" "action" "forward">>
</div><<setBackground "reclaimed-travel">>
<<canTriggerCompanionEvent>>
<<advanceTime 1>>
<<set _scRoll to random(1, 100)>>
<h2><<icon "search">> Someone Else's Stash</h2>
<<showTravelVideo "survival_search">>
<p>You leave the road and pick through the ruins for an hour: collapsed doorways, a burnt-out car, a body nobody buried.</p>
<<if _scRoll <= 35>>
<p>Under a loose slab behind the car: a raider stash, wrapped in oilcloth. A ration and a bottle of water. Someone is going to miss this.</p>
<<run setup.fightLootStart()>>
<<run setup.postBattleTakeLoot("ration", "Ration", 1, "", "fightLoot")>>
<<run setup.postBattleTakeLoot("water", "Clean Water", 1, "", "fightLoot")>>
<p class="system-info"><<icon "food">> Found a ration and a water</p>
<<lootLeftList "fightLoot">>
<<if _cte_canTrigger>><<say "Kira" "Take it and move. Before whoever hid it comes back.">><</if>>
<div class="choice-container">
<<vchoice "Continue journey" "Journey_Tick" "action" "forward">>
</div>
<<elseif _scRoll <= 60>>
<p>The body has been picked over already. Boots gone, pack gone. You turn out its pockets anyway and find a few pieces of scrap, and nothing you can eat.</p>
<<set $vault.scrap to ($vault.scrap || 0) + 5>>
<p class="system-info"><<icon "scrap">> +5 Scrap</p>
<div class="choice-container">
<<vchoice "Continue journey" "Journey_Tick" "action" "forward">>
</div>
<<else>>
<p>You find the stash. You also find the people it belongs to, coming back down the road with their rifles on their shoulders.</p>
<<say "Raider" "Well, look at that. A rat in our pantry.">>
<div class="choice-container">
<<vchoice "Face them" "Journey_Survival_RaiderToll" "action" "danger">>
</div>
<</if>><<setBackground "reclaimed-travel">>
<<canTriggerCompanionEvent>>
<<if _cte_canTrigger>><<getJourneyCompanion>><</if>>
<<advanceTime 2>>
<<set _cvRoll to random(1, 100)>>
<<set _cvCost to 15>>
<h2><<icon "scrap">> Waiting for a Caravan</h2>
<p>You sit by the road where the old tracks run, and you wait. Two hours of heat and flies and your stomach eating itself.</p>
<<if _cvRoll <= 60>>
<<showTravelVideo "survival_caravan">><<set _stvClip to _stvFile ? _stvFile.split("/").pop().replace(/\.[^.]+$/, "") : null>>
<<if _stvClip is "b6f1aea8d647" or _stvClip is "681d0e5b01d3" or _stvClip is "575d9dde4f4a">><<set _cvRide to "truck">><p>Then dust on the horizon, and engines. A small convoy: three battered trucks, armed guards riding the beds, a heavy-set trader with a ledger on his knee.</p><<elseif _stvClip is "169d2594108d">><<set _cvRide to "rig">><p>Then dust on the horizon. A trader's rig rolls up and stops by the road, and a heavy-set man climbs down with a ledger under his arm.</p><<else>><<set _cvRide to "wagon">><p>Then dust on the horizon, and the creak of carts. A small caravan: three wagons, armed guards, a heavy-set trader with a ledger on his knee.</p><</if>><<if $journey>><<set $journey.roadTraderRide to _cvRide>><</if>>
<<say "Trader" "You look like death. Food's fifteen scrap: two rations and a water. No credit.">>
<<scrapBalance>>
<div class="choice-container">
<<if ($vault.scrap || 0) >= _cvCost>>
<<vchoice "Pay fifteen scrap" "Journey_Survival_Caravan_Trade" "trade" "scrap">>
<<else>>
<<vchoiceDisabled "Pay fifteen scrap (you have too little)" "trade" "scrap">>
<<if _cte_canTrigger && _gc_companion && _gc_companion.trust >= 50>>
<<vchoice "Kira pulls you aside" "Journey_Survival_KiraOffer" "companion" "partner">>
<</if>>
<</if>>
<<vchoice "Let them pass" "Journey_Tick" "action" "forward">>
</div>
<<else>>
<p>Nobody comes. The road stays empty, and the hours are gone.</p>
<<if _cte_canTrigger>><<say "Kira" "Well. That was a waste of daylight.">><</if>>
<div class="choice-container">
<<vchoice "Continue journey" "Journey_Tick" "action" "forward">>
</div>
<</if>><<setBackground "reclaimed-travel">>
<<canTriggerCompanionEvent>>
<<set $vault.scrap to Math.max(0, ($vault.scrap || 0) - 15)>>
<<run setup.fightLootStart()>>
<<run setup.postBattleTakeLoot("ration", "Ration", 2, "", "fightLoot")>>
<<run setup.postBattleTakeLoot("water", "Clean Water", 1, "", "fightLoot")>>
<h2><<icon "scrap">> A Fair Trade</h2>
<<showTravelVideo "survival_caravan_trade">>
<<set _cvRide to ($journey && $journey.roadTraderRide) || "wagon">>
<<if _cvRide is "truck">><p>You count fifteen scrap into the trader's palm. He checks every piece, then hands down two rations and a bottle of water from the truck.</p><<elseif _cvRide is "rig">><p>You count fifteen scrap into the trader's palm. He checks every piece, then hands down two rations and a bottle of water from the rig.</p><<else>><p>You count fifteen scrap into the trader's palm. He checks every piece, then hands down two rations and a bottle of water from the wagon.</p><</if>>
<<say "Trader" "Eat slow, or you'll bring it straight back up.">>
<p class="system-info"><<icon "food">> −15 Scrap, +2 Rations, +1 Water</p>
<<lootLeftList "fightLoot">>
<<if _cte_canTrigger>><<say "Kira" "Best fifteen scrap we ever spent.">><</if>>
<div class="choice-container">
<<vchoice "Eat now" "Journey_Survival_Eat" "action" "food">>
<<vchoice "Continue journey" "Journey_Tick" "action" "forward">>
</div><<setBackground "prelude/caravan-camp-night">>
<h2><<icon "fire">> Shared Warmth</h2>
<p>The cold is biting. Even huddled together, you're both shivering.</p>
<<if $companions[0].romanceStage >= 4>>
<<say "Kira" "This isn't working. We need... skin contact. Body heat.">>
<<storyVideo "story/travel_camp_warmth/intimate_warmth">>
<p>She's already pulling at her clothes, pragmatic despite the flush creeping up her neck.</p>
<<say "Kira" "Don't make it weird. This is survival.">>
<<if _storyFamily is "sf_cg_travel_camp_warmth_01">><p>But the way her hands linger as she presses against you says otherwise. Then she's naked in your lap, arms locked round your neck, forehead against yours, and your hands are full of her ass.</p><<else>><p>But the way her hands linger as she presses against you says otherwise.</p><</if>>
<div class="choice-container">
<<vchoice "Just survival warmth" "Journey_Survival_WarmthOnly" "intimate" "fire">>
<<vchoice "It doesn't have to be just survival" "Journey_Survival_WarmthIntimate" "intimate" "heart">>
</div>
<<elseif $companions[0].romanceStage >= 2>>
<<say "Kira" "We should... get closer. For warmth.">>
<p>She hesitates, then presses against your side. Her body is tense at first, then slowly relaxes.</p>
<<say "Kira" "Just don't read anything into it.">>
<p>Her heartbeat says something different.</p>
<<set $companions[0].affection += 2>>
<<set _warmthRecovery to -setup.travelConfig.fatigueRecovery.kiraWarmthClose>>
<<set _warmthRecovery to -_warmthRecovery>><<clampStat "player.energy" _warmthRecovery 0 $player.maxEnergy>>
<div class="choice-container">
<<vchoice "Rest together" "Journey_Morning" "action" "sleep">>
</div>
<<else>>
<p>Kira keeps her distance, but the cold eventually wins.</p>
<<say "Kira" "Fine. Back to back. For warmth. That's it.">>
<<set _warmthRecovery to -setup.travelConfig.fatigueRecovery.kiraWarmthDistant>>
<<set _warmthRecovery to -_warmthRecovery>><<clampStat "player.energy" _warmthRecovery 0 $player.maxEnergy>>
<div class="choice-container">
<<vchoice "Rest" "Journey_Morning" "action" "sleep">>
</div>
<</if>><<setBackground "prelude/caravan-camp-night">>
<<storyVideo "story/travel_camp_warmth/warmth_only">>
<<if _storyClip is "748d6546ae34">><p>You hold each other through the night, skin against skin, sharing what warmth you have. She stays in your lap, arms around you, her fingers tracing your back while the firelight comes striped through the windbreak. Nothing more.</p><<else>><p>You hold each other through the night, skin against skin, sharing what warmth you have. Nothing more.</p><</if>>
<p>But there's an intimacy in it that goes beyond anything physical. Vulnerability shared. Trust earned.</p>
<<say "Kira" "...Thank you. For not... you know.">>
<p>She burrows closer, and eventually, sleep comes.</p>
<<set _warmthRecovery to -setup.travelConfig.fatigueRecovery.kiraWarmthOnly>>
<<set _warmthRecovery to -_warmthRecovery>><<clampStat "player.energy" _warmthRecovery 0 $player.maxEnergy>>
<<addTrust "kira" 1>>
<<addAffection "kira" 1>>
<div class="choice-container">
<<vchoice "Sleep" "Journey_Morning" "action" "sleep">>
</div><<setBackground "prelude/caravan-camp-night">>
<p>The cold becomes an excuse. Then the excuse becomes unnecessary.</p>
<<say "Kira" "I... yes. Please.">>
<<storyVideo "story/travel_camp_warmth/warmth_intimate">>
<<if _storyFamily is "sf_cg_travel_camp_warmth_01">><p>What starts as shared warmth stops being about warmth. She lifts up and sinks her ass down onto your cock, slow, then hard, riding you where you sit while you pull her cheeks apart with both hands, and when she throws her head back her cry carries out past the fire into the dark.</p><<else>><p>What starts as shared warmth becomes something more. Desperate. Hungry. Two people clinging to each other against the void of the Reclaimed.</p><</if>>
<p>When it's over, you're both warm. Exhausted. Tangled together in a way that has nothing to do with survival anymore.</p>
<<say "Kira" "...okay. That was definitely not just survival.">>
<p>She doesn't sound upset about it.</p>
<<set _warmthRecovery to -setup.travelConfig.fatigueRecovery.kiraWarmthIntimate>>
<<set _warmthRecovery to -_warmthRecovery>><<clampStat "player.energy" _warmthRecovery 0 $player.maxEnergy>>
<<addAffection "kira" 1>>
<<clampStat "companions[0].lust" -30>>
<<clampStat "player.lust" -30>><<run setup.playerReleased()>>
<<if $companions[0].romanceStage < 5>>
<<set $companions[0].romanceStage++>>
<</if>>
<div class="choice-container">
<<if setup.campIsNight()>><<vchoice "Sleep tangled together" "Journey_Morning" "action" "sleep">><<else>><<vchoice "Rest tangled together a while" "Journey_Morning" "action" "sleep">><</if>>
</div><<setBackground "reclaimed-travel">>
<<set _numRaiders to random(2, 3)>>
<<set _raiderGender to either("male", "female", "mixed")>>
<<if $journey>><<set $journey.tollWomen to "">><</if>>
<<set _rtKira to setup.kiraWithYou()>>
<h2><<icon "danger">> Raider Checkpoint</h2>
<<if _raiderGender !== "female">><<storyVideo "story/travel_survival_toll/journey_survival_raider_toll">><</if>>
<<if _storyFamily is "sf_cg_travel_survival_toll_01">><p>They emerge from the rocks like ghosts. <<print _numRaiders>> raiders, armed and blocking your path.<<if _raiderGender !== "female">> They herd you into a candle-lit ruin by the road, and the biggest, a slab of muscle in a stained white vest, plants himself in the doorway.<</if>></p><<else>><p>They emerge from the rocks like ghosts. <<print _numRaiders>> raiders, armed and blocking your path.</p><</if>>
<<if _raiderGender === "male">>
<<if _rtKira>><p>All men. Their eyes rake over Kira's body before anything else.</p><<else>><p>All men. They look you over the way you'd look over a pack mule.</p><</if>>
<<elseif _raiderGender === "female">>
<<set _rtFace to either("threatening", "attacking")>>
<<run VaultUI.showCharacter("raider", "right", _rtFace, "female")>>
<<if $journey>><<set $journey.tollWomen to _rtFace>><</if>>
<p>All women. Hard-faced, scarred. Their leader's eyes settle on you with predatory interest.</p>
<<else>>
<p>Mixed group. They spread out, cutting off escape routes.</p>
<</if>>
<<say "Raider" "Toll road. You want through, you pay.">>
<<if _rtKira>><<say $player.name "We don't have much.">><<else>><<say $player.name "I don't have much.">><</if>>
<p>The leader looks at your depleted supplies. At your exhausted state.<<if _rtKira>> At Kira.<</if>></p>
<<if _raiderGender === "female">>
<<say "Raider" "You'll do. Nice and pretty.">>
<p>She gestures at you with her blade.</p>
<<say "Raider" "On your knees. Service us, and you can pass.">>
<<elseif _rtKira>>
<<say "Raider" "Your girl's got something we want.">>
<<say "Kira" "Fuck off.">>
<<say "Raider" "Feisty. That'll make it more fun.">>
<<else>>
<<say "Raider" "Scrap. Or the pack. Or we take the pack and your boots, and you crawl.">>
<</if>>
<p class="warning">You're too weak to fight. They know it.</p>
<div class="choice-container">
<<if _raiderGender === "female">>
<<vchoice "Agree to their terms" "Journey_Survival_RaiderToll_PlayerUsed" "intimate" "submission">>
<<elseif _rtKira>>
<<if $companions[0].trust >= 30>>
<<vchoice "Look at Kira... let her decide" "Journey_Survival_RaiderToll_KiraChoice" "companion" "partner">>
<</if>>
<<if $extremeContent.cnc>>
<<vchoice "Offer Kira to them" "Journey_Survival_RaiderToll_OfferKira" "intimate" "corruption">>
<</if>>
<</if>>
<<vchoice "Pay in scrap and supplies" "Journey_Survival_RaiderToll_PayScrap" "trade" "scrap">>
<<vchoice "Try to fight anyway" "Journey_Survival_RaiderToll_Fight" "action" "attack">>
<<vchoice "Try to run" "Journey_Survival_RaiderToll_Flee" "action" "run">>
</div><<setBackground "reclaimed-travel">>
<<set _rpTook to setup.roadRob(true)>>
<<if $journey && $journey.tollWomen>><<run VaultUI.keepCharacter("raider", $journey.tollWomen, "female")>><</if>>
<h2><<icon "scrap">> The Toll</h2>
<p>You empty your pockets and your pack onto the road. They don't haggle. They just take.</p>
<p class="warning"><<print setup.roadRobText(_rpTook)>></p>
<<say "Raider" "Pleasure doing business. Road's yours.">>
<<if setup.kiraWithYou()>>
<<say "Kira" "We'll get it back. All of it. Someday.">>
<</if>>
<<storyVideo "story/travel_survival_toll/pay_scrap">>
<<if _storyClip is "3bb5256aa6e6">><p>They walk off across the flat, one of them walking backwards to keep you in sight. You walk on lighter, and hungrier.</p><<else>><p>They melt back into the rocks. You walk on lighter, and hungrier.</p><</if>>
<div class="choice-container">
<<vchoice "Keep moving" "Journey_Tick" "action" "forward">>
</div><<setBackground "reclaimed-travel">>
<p>You look at Kira. She reads your expression instantly.</p>
<<if $companions[0].trust >= 60>>
<<if setup.kiraAllowsUse()>>
<p>She doesn't need it explained. Something passes between you, and the corner of her mouth goes up before she can stop it.</p>
<<else>>
<p>Her jaw tightens. Something passes between you—understanding born of shared desperation.</p>
<</if>>
<<say "Kira" "...how much food?">>
<p>The raiders grin.</p>
<<say "Raider" "Enough to get you to the next settlement. If she's good.">>
<<say "Kira" "Fine.">>
<p>She steps forward before you can object.</p>
<<if setup.kiraAllowsUse()>>
<<say "Kira" "But he watches. Up close, where I can see his face. And if any of you try anything after—I'll gut you in your sleep.">>
<<else>>
<<say "Kira" "But he watches. And if any of you try anything after—I'll gut you in your sleep.">>
<</if>>
<div class="choice-container">
<<vchoice "Watch Kira pay the toll" "Journey_Survival_RaiderToll_WatchKira" "intimate" "search">>
<<vchoice "\"No. We'll find another way.\"" "Journey_Survival_RaiderToll_Refuse" "action" "shield">>
</div>
<<else>>
<<say "Kira" "Are you fucking kidding me?">>
<<if setup.kiraAllowsUse()>>
<p>She looks at you, then at them, and the color comes up her throat. It isn't anger.</p>
<<say "Kira" "You'd let them...? Here? With you standing right there?">>
<p>She doesn't say no. She's waiting to hear you say it.</p>
<<else>>
<p>She looks at you with disbelief. Betrayal.</p>
<<say "Kira" "You'd let them...?">>
<</if>>
<<set $companions[0].trust += setup.kiraUseTrust(-2)>>
<div class="choice-container">
<<vchoice "\"I'm sorry. We need the supplies.\"" "Journey_Survival_RaiderToll_ForceKira" "intimate" "corruption">>
<<vchoice "\"You're right. Forget it.\"" "Journey_Survival_RaiderToll_Fight" "action" "attack">>
</div>
<</if>><<setBackground "reclaimed-travel">>
<<set $flags.watchedKiraPayToll to true>>
<<clampStat "player.lust" 25>>
<<storyVideo "story/travel_survival_toll/watch_kira">>
<<if _storyFamily is "sf_cg_travel_survival_toll_01">><p>They make her kneel on the ruin's dusty floor.</p><<else>><p>They make her kneel in the dirt.</p><</if>>
<<say "Raider" "Boyfriend can watch. Make sure she does it right.">>
<<if setup.kiraAllowsUse()>>
<p>Kira looks at you once, a long look with the start of a grin in it, then turns to the first raider.</p>
<<if _storyFamily is "sf_cg_travel_survival_toll_01">><p class="explicit">She takes him in her mouth without being told. He fists her hair and shoves her down on it, and she lets him, bobbing hard and eager on it, her eyes turned up to his face.</p><<else>><p class="explicit">She takes him in her mouth without being told. Eager. Greedy. Like she's been waiting for it.</p><</if>>
<<else>>
<p>Kira looks at you once—her eyes unreadable—then turns to the first raider.</p>
<<if _storyFamily is "sf_cg_travel_survival_toll_01">><p class="explicit">She takes him in her mouth without being told. He fists her hair and shoves her down on it, and she lets him, bobbing with the flat, bored rhythm of someone paying off a debt.</p><<else>><p class="explicit">She takes him in her mouth without being told. Efficient. Detached. Like she's done this before.</p><</if>>
<</if>>
<<say "Raider" "Fuck... she knows what she's doing.">>
<p>You watch. Your cock hardens despite everything—or because of it.</p>
<<if $companions[0].romanceStage >= 3>>
<p class="internal-thought">This is your Kira. On her knees for strangers. For food.</p>
<<else>>
<<if setup.kiraAllowsUse()>>
<p class="internal-thought">She's doing this for both of you. And she's loving every second of it.</p>
<<else>>
<p class="internal-thought">She's doing this for both of you. Because you couldn't protect her.</p>
<</if>>
<</if>>
<p class="explicit">The first one finishes in her mouth. She swallows without hesitation, then moves to the next.</p>
<<say "Kira" "...">>
<<if setup.kiraAllowsUse()>>
<p>She looks at you while she does it. Mouth, hands, whatever they want, and her eyes keep coming back to yours.</p>
<<else>>
<p>She doesn't look at you. Her hands work mechanically. Mouth, hands, whatever they want.</p>
<</if>>
<<if _storyFamily is "sf_cg_travel_survival_toll_01">><p class="explicit">By the time she's done, cum drips from her chin. Her knees are scraped raw from the rough floor.</p><<else>><p class="explicit">By the time she's done, cum drips from her chin. Her knees are scraped raw from the rough ground.</p><</if>>
<<say "Raider" "Good girl. Here's your payment.">>
<p>They toss a pack of supplies at your feet and disappear into the Reclaimed, laughing.</p>
<<set $player.hunger to Math.min($player.maxHunger, $player.hunger + 50)>>
<<set $journey.hoursSinceFood to 0>>
<<run setup.fightLootStart()>>
<<run setup.postBattleTakeLoot("ration", "Ration", 2, "", "fightLoot")>>
<<run setup.postBattleTakeLoot("water", "Clean Water", 2, "", "fightLoot")>>
<<lootLeftList "fightLoot">>
<<set $companions[0].submission += 5>>
<<set $companions[0].trust += setup.kiraUseTrust(-1)>>
<<if setup.kiraAllowsUse()>>
<p>Kira wipes her mouth with the back of her hand and stands, and looks straight at you.</p>
<<say "Kira" "Don't say a word. I mean it. I want to keep the taste of them till we make camp. Then I'm going to tell you every cock, in order, and you're going to listen. Walk.">>
<<else>>
<p>Kira wipes her mouth and stands. She doesn't look at you.</p>
<<say "Kira" "Don't. Just... don't.">>
<</if>>
<div class="choice-container">
<<vchoice "Continue in silence" "Journey_Tick" "action" "forward">>
</div><<setBackground "reclaimed-travel">>
<<set $flags.offeredKiraToRaiders to true>>
<<addCorruption 10>>
<<say $player.name "...take her. Do what you want.">>
<<if $companions[0]>>
<<if setup.kiraAllowsUse()>>
<p>Kira's head whips toward you. For half a second her face does something that isn't anger at all. Then she remembers to fight.</p>
<<else>>
<p>Kira's head whips toward you.</p>
<</if>>
<<say "Kira" "WHAT?!">>
<p>Before she can react, they grab her.</p>
<<say "Kira" `$player.name + "! What the fuck are you—"`>>
<p>A hand clamps over her mouth. They drag her behind a ruined wall.</p>
<</if>>
<p>You hear the sounds. Struggling at first. Then...</p>
<<storyVideo "story/travel_survival_toll/offer_kira">>
<<if _storyFamily is "sf_cg_travel_survival_toll_01">><p class="explicit">Muffled moans. The slap of flesh. Through a gap in the wall you see her straddling one of them on the floor, riding his cock with her fingers working her clit.</p><<else>><p class="explicit">Muffled moans. The slap of flesh. Someone grunting.</p><</if>>
<<say "Raider" "She's tighter than she looks!">>
<p>You could intervene. You don't.</p>
<<clampStat "player.lust" 30>>
<<if setup.kiraAllowsUse()>>
<p class="explicit">It goes on for what feels like hours. They take turns. You hear Kira cum at least twice, loud, not even trying to keep it down.</p>
<<say "Kira" "Nngh... fuck... don't stop... fuck you... ahh...">>
<<else>>
<p class="explicit">It goes on for what feels like hours. They take turns. You hear Kira cum at least twice—her body betraying her completely.</p>
<<say "Kira" "Nngh... fuck... hate you... ahh...">>
<</if>>
<p>Finally, they're done. They throw a pack at you as they leave.</p>
<<set $player.hunger to Math.min($player.maxHunger, $player.hunger + 60)>>
<<set $journey.hoursSinceFood to 0>>
<<run setup.fightLootStart()>>
<<run setup.postBattleTakeLoot("ration", "Ration", 3, "", "fightLoot")>>
<<run setup.postBattleTakeLoot("water", "Clean Water", 2, "", "fightLoot")>>
<<lootLeftList "fightLoot">>
<p>Kira stumbles out. Her clothes are torn. Cum leaks down her thighs.</p>
<<if setup.kiraAllowsUse()>>
<p>She stops in front of you, close enough that you can smell them on her.</p>
<<say "Kira" "You traded me for a bag of food. ...Fuck. Do you know how many times I came back there? Four. I counted, so I could tell you.">>
<<else>>
<p>She doesn't say anything. Just walks past you.</p>
<</if>>
<<set $companions[0].trust += setup.kiraUseTrust(-6)>>
<<set $companions[0].affection += setup.kiraUseAffection(-4)>>
<<set $companions[0].submission += 15>>
<<if setup.kiraAllowsUse()>>
<p>She takes the pack off your shoulder and walks on ahead of you, slowly, so you can watch it run down her legs.</p>
<<else>>
<p class="guilt">You traded her like currency. And she'll never forget it.</p>
<</if>>
<div class="choice-container">
<<vchoice "Follow her" "Journey_Tick" "action" "forward">>
</div><<setBackground "reclaimed-travel">>
<<set $flags.playerPaidToll to true>>
<<run VaultUI.showCharacter("raider", "right", "neutral", "female")>>
<<storyVideo "story/travel_survival_toll/player_used">>
<<if _storyFamily is "sf_cg_travel_survival_toll_01">><p>They shove you flat on your back on a ruined office floor. The female raiders circle you like predators.</p><<else>><p>You kneel in the dirt. The female raiders circle you like predators.</p><</if>>
<<say "Raider" "Good boy. Now open wide.">>
<p class="explicit">The leader pulls down her pants and straddles your face.</p>
<<say "Raider" "Tongue out. Make me cum and you get water.">>
<<if setup.kiraWithYou()>>
<p>Kira watches, her expression unreadable.</p>
<<say "Kira" "...">>
<</if>>
<<if _storyFamily is "sf_cg_travel_survival_toll_01">><p class="explicit">The leader grinds her pussy on your face while a blonde sinks onto your cock and rides it. Then they swap. They ride you until your jaw aches and your cock is raw.</p><<else>><p class="explicit">You service them one by one. Face, cock, whatever they demand. They ride you until your jaw aches and your cock is raw.</p><</if>>
<<say "Raider" "Not bad. Better than most.">>
<p>They toss supplies at you and disappear, satisfied.</p>
<<set $player.hunger to Math.min($player.maxHunger, $player.hunger + 50)>>
<<set $journey.hoursSinceFood to 0>>
<<run setup.fightLootStart()>>
<<run setup.postBattleTakeLoot("ration", "Ration", 2, "", "fightLoot")>>
<<run setup.postBattleTakeLoot("water", "Clean Water", 2, "", "fightLoot")>>
<<lootLeftList "fightLoot">>
<<set $player.lust to 20>><<run setup.playerReleased()>>
<<if setup.kiraWithYou()>>
<<say "Kira" "...we don't talk about this.">>
<<if $companions[0].affection >= 40>>
<p>She helps you up. Her hand lingers on yours.</p>
<<say "Kira" "You didn't have to do that.">>
<<addAffection "kira" 1>>
<</if>>
<</if>>
<div class="choice-container">
<<vchoice "Continue" "Journey_Tick" "action" "forward">>
</div><<setBackground "reclaimed-travel">>
<p>You're weak. Starving. Parched. But you won't give them what they want.</p>
<<if setup.kiraWithYou()>><<say $player.name "We'll take our chances.">><<else>><<say $player.name "I'll take my chances.">><</if>>
<<set _fightRoll to random(1, 100)>>
<<if _fightRoll <= 20>>
<p>Desperation makes you dangerous. You catch them off-guard.</p>
<<if setup.kiraWithYou()>>
<p>Kira moves with you, blade flashing.</p>
<</if>>
<p>Two of them go down before they know what's happening. The rest flee.</p>
<<if setup.kiraWithYou()>><<say "Kira" "Holy shit. We actually...">><</if>>
<p>You find a small cache on the bodies.</p>
<<run setup.fightLootStart()>>
<p class="loot-found">Found: <<print setup.postBattleTakeLoot("ration", "Ration", 1, "", "fightLoot")>></p>
<<lootLeftList "fightLoot">>
<<set $player.hunger to Math.min($player.maxHunger, $player.hunger + 20)>>
<div class="choice-container">
<<vchoice "Keep moving" "Journey_Tick" "action" "forward">>
</div>
<<else>>
<<if $journey && $journey.tollWomen>><<run VaultUI.keepCharacter("raider", $journey.tollWomen, "female")>><</if>>
<p>They beat you down in seconds. Too weak to fight.</p>
<<clampStat "player.health" -15 0 100>>
<<if setup.kiraWithYou()>>
<<clampStat "companions[0].health" -10 0 100>>
<</if>>
<<set _rfTook to setup.roadRob(true)>>
<p>They take what little you have and leave you bleeding in the dirt.</p>
<p class="warning"><<print setup.roadRobText(_rfTook)>></p>
<<say "Raider" "Should've paid the toll, idiots.">>
<p class="warning">You've lost supplies and taken damage.</p>
<div class="choice-container">
<<vchoice "Crawl forward" "Journey_Tick" "action" "forward">>
</div>
<</if>><<setBackground "reclaimed-travel">>
<<set _fleeRoll to random(1, 100)>>
<<if _fleeRoll <= 30>>
<p>You bolt.<<if setup.kiraWithYou()>> Kira follows.<</if>></p>
<p>Somehow, you lose them in the ruins. Luck, nothing more.</p>
<<clampStat "player.energy" -20 0 $player.maxEnergy>>
<<if setup.kiraWithYou()>><<say "Kira" "That was... too close.">><</if>>
<div class="choice-container">
<<vchoice "Keep moving" "Journey_Tick" "action" "forward">>
</div>
<<else>>
<<if $journey && $journey.tollWomen>><<run VaultUI.keepCharacter("raider", $journey.tollWomen, "female")>><</if>>
<p>You try to run. They catch you in three steps.</p>
<<say "Raider" "Wrong choice.">>
<p>They beat <<if setup.kiraWithYou()>>you both<<else>>you<</if>> down. Take everything.</p>
<<clampStat "player.health" -20 0 100>>
<<if setup.kiraWithYou()>>
<<clampStat "companions[0].health" -15 0 100>>
<</if>>
<<set _rflTook to setup.roadRob(true)>>
<p class="warning"><<print setup.roadRobText(_rflTook)>></p>
<p>You're left with nothing but bruises and the long walk ahead.</p>
<div class="choice-container">
<<vchoice "Stumble forward" "Journey_Tick" "action" "forward">>
</div>
<</if>><<setBackground "reclaimed-travel">>
<<say $player.name "No. We'll find another way.">>
<<if $companions[0]>>
<p>Relief flickers across Kira's face. Then determination.</p>
<<say "Kira" "Then let's fight.">>
<</if>>
<div class="choice-container">
<<vchoice "Continue" "Journey_Survival_RaiderToll_Fight" "action" "forward">>
</div><<setBackground "reclaimed-travel">>
<<set $flags.forcedKiraToPayToll to true>>
<<addCorruption 15>>
<<say $player.name "I'm sorry. We need the supplies.">>
<<if setup.kiraAllowsUse()>>
<p>Kira's face goes red, right down her throat. Then she remembers to look furious.</p>
<<say "Kira" "You... you fucking COWARD!">>
<p>She doesn't run.</p>
<p>The raiders grab her. She struggles—really struggles—but they're stronger.</p>
<<say "Kira" "Fuck you! Fuck ALL of you!">>
<p>Over the shoulder of the one holding her, her eyes find yours. She shakes her head, once. <em>Don't.</em></p>
<<else>>
<p>Kira's face goes pale. Then red with fury.</p>
<<say "Kira" "You... you fucking COWARD!">>
<p>But she doesn't run. Where would she go?</p>
<p>The raiders grab her. She struggles—really struggles—but they're stronger.</p>
<<say "Kira" `$player.name + "! Don't just STAND there!"`>>
<</if>>
<p>You stand there.</p>
<<storyVideo "story/travel_survival_toll/force_kira">>
<<if _storyFamily is "sf_cg_travel_survival_toll_01">><p class="explicit">They bend her over a scarred scrap-wood table. Tear her pants down. She screams when the first one pushes inside.</p><<else>><p class="explicit">They bend her over a rusted car hood. Tear her pants down. She screams when the first one pushes inside.</p><</if>>
<<say "Raider" "Fight all you want, bitch. Makes it better.">>
<p>You watch. You tell yourself it's necessary. That this is survival.</p>
<<if _storyFamily is "sf_cg_travel_survival_toll_01">><p class="explicit">They use her roughly, one after another. Somewhere in the second one the screaming stops, and after that she just takes it, cheek flattened on the tabletop under his hand on the back of her neck, fingers splayed on the wood.</p><<else>><p class="explicit">They use her roughly. One after another. She stops screaming eventually. Just takes it, face pressed against cold metal.</p><</if>>
<<clampStat "player.lust" 20>>
<<set $player.hunger to Math.min($player.maxHunger, $player.hunger + 60)>>
<<set $journey.hoursSinceFood to 0>>
<<run setup.fightLootStart()>>
<<run setup.postBattleTakeLoot("ration", "Ration", 3, "", "fightLoot")>>
<<run setup.postBattleTakeLoot("water", "Clean Water", 3, "", "fightLoot")>>
<p>When they're done, they toss the supplies at your feet.</p>
<<lootLeftList "fightLoot">>
<<say "Raider" "Worth every cap. Thanks for the gift.">>
<<if _storyFamily is "sf_cg_travel_survival_toll_01">><p>Kira slides off the table. Her legs don't quite work right.</p><<else>><p>Kira slides off the hood. Her legs don't quite work right.</p><</if>>
<<set $companions[0].trust += setup.kiraUseTrust(-8)>>
<<set $companions[0].affection += setup.kiraUseAffection(-6)>>
<<set $companions[0].submission += 20>>
<<if setup.kiraAllowsUse()>>
<p>She tugs her pants up, slowly, and looks at you over her shoulder while she does it.</p>
<<say "Kira" "Coward. ...You stood there and let them bend me over for a bag of food.">>
<p>She steps in close and bites your lip, hard enough to sting.</p>
<<say "Kira" "Best toll I ever paid. You carry the food.">>
<<else>>
<p>She won't look at you. Won't speak to you.</p>
<p class="guilt">You broke something that might never heal.</p>
<</if>>
<div class="choice-container">
<<vchoice "Keep moving" "Journey_Tick" "action" "forward">>
</div><<setBackground "reclaimed-travel">>
<<set $flags.collapseEvent to true>>
<<set $flags.deathCause to "">>
<<set _cfKira to setup.kiraWithYou()>>
<h2><<icon "danger">> Collapse</h2>
<<if _cfKira>>
<p>You can't go any further. Your legs give out. Kira follows moments later.</p>
<p>You lie in the dust, too weak to move. The sun beats down mercilessly.</p>
<<say "Kira" "I can't...">>
<p>Her voice trails off. She's barely conscious.</p>
<<else>>
<p>You can't go any further. Your legs give out, and the ground comes up to meet you.</p>
<p>You lie in the dust, too weak to move. Nobody knows you're out here.</p>
<</if>>
<<advanceTime 2>>
<<set $journey.lastSleptAt to $time.totalHours>>
<<set $player.energy to Math.max($player.energy, 25)>>
<p>Voices. Footsteps. Someone found you.</p>
<<set _finderType to either("scavengers", "raiders", "travelers")>>
<<if _finderType === "scavengers">>
<<storyVideo "story/travel_collapse_found/journey_survival_collapse_found">>
<<if _storyFamily is "sf_cg_travel_collapse_found_02">><p>Scavengers stand over you, long coats and rifles, black against the sky. Seen from the dirt they look like giants. A woman hangs back by their cart.</p><<else>><p>Two scavengers, male and female, stand over you.</p><</if>>
<<say "Scavenger" "Well, well. What do we have here?">>
<<if _cfKira>>
<<say "Scavenger F" "They're half-dead. Should we help them?">>
<<say "Scavenger" "Help costs. What've they got?">>
<<else>>
<<say "Scavenger F" "He's half-dead. Should we help him?">>
<<say "Scavenger" "Help costs. What's he got?">>
<</if>>
<<if _storyFamily is "sf_cg_travel_collapse_found_02">><p>One of them picks your pack up out of the dust and roots through it. Almost nothing.</p><<else>><p>They search your packs. Find almost nothing.</p><</if>>
<<say "Scavenger" "Nothing worth shit.">>
<<if _cfKira>>
<p>His eyes settle on Kira's prone form.</p>
<<say "Scavenger" "Unless...">>
<div class="choice-container">
<<if $extremeContent.cnc>>
<<vchoice "Pretend to stay unconscious" "Journey_Survival_CollapseFound_Watch" "intimate" "search">>
<</if>>
<<vchoice "Try to speak" "Journey_Survival_CollapseFound_Negotiate" "action" "speech">>
<<vchoice "Try to fight" "Journey_Survival_CollapseFound_Fight" "action" "attack">>
</div>
<<else>>
<p>He weighs your pack in one hand, then looks at your boots.</p>
<div class="choice-container">
<<vchoice "Try to speak" "Journey_Survival_CollapseFound_Negotiate" "action" "speech">>
<<vchoice "Try to fight" "Journey_Survival_CollapseFound_Fight" "action" "attack">>
</div>
<</if>>
<<elseif _finderType === "raiders">>
<p>Raiders. Three of them. They prod you with boots.</p>
<<say "Raider" "Still breathing. Barely.">>
<<if _cfKira>><<say "Raider 2" "The girl too. Could have some fun before they die.">><<else>><<say "Raider 2" "Take his boots. The pack too.">><</if>>
<div class="choice-container">
<<vchoice "Try to fight back" "Journey_Survival_CollapseFound_Fight" "action" "attack">>
</div>
<<else>>
<p>Travelers. A small caravan. They kneel beside you.</p>
<<say "Traveler" "Easy. Don't try to move. Here—water.">>
<p>A canteen is pressed to your lips. You drink greedily.</p>
<<set $player.hunger to Math.min($player.maxHunger, $player.hunger + 20)>>
<<say "Traveler" "You're lucky we came along. The Reclaimed would've killed you.">>
<<if _cfKira>>
<p>They help Kira too. She comes around slowly.</p>
<<say "Kira" "...thanks...">>
<</if>>
<div class="choice-container">
<<vchoice "Thank them and continue" "Journey_Tick" "action" "forward">>
</div>
<</if>><<setBackground "reclaimed-travel">>
<<set $flags.watchedKiraUsedWhileDown to true>>
<<addCorruption 8>>
<p>You keep your eyes closed. Limp. Playing dead.</p>
<<say "Scavenger" "She's out cold too. Perfect.">>
<p>Through slitted eyes, you watch him kneel beside Kira.</p>
<<say "Scavenger F" "Really? Right here?">>
<<say "Scavenger" "No one around. No one to hear her scream.">>
<p class="explicit">He rolls Kira onto her back. Tugs at her pants.</p>
<p>She doesn't react. Too weak, too far gone.</p>
<<say "Scavenger" "Nice. Real nice.">>
<<storyVideo "story/travel_collapse_found/watch">>
<<if _storyFamily is "sf_cg_travel_collapse_found_02">><p class="explicit">He spreads her legs and pushes inside. He pins her wrists, then her throat. Kira makes a small sound—not quite conscious, not quite asleep. Her eyes flutter half open, unfocused, and close again.</p><<else>><p class="explicit">He spreads her legs and pushes inside. Kira makes a small sound—not quite conscious, not quite asleep.</p><</if>>
<<clampStat "player.lust" 30>>
<p>You could stop this. You don't.</p>
<<if _storyFamily is "sf_cg_travel_collapse_found_02">><p class="explicit">He hooks her slack legs over his shoulder and fucks her unconscious body while his partner watches. Kira moans softly—her body responding even as her mind floats somewhere else.</p><<else>><p class="explicit">He fucks her unconscious body while his partner watches. Kira moans softly—her body responding even as her mind floats somewhere else.</p><</if>>
<<say "Scavenger F" "Hurry up. We should go.">>
<<say "Scavenger" "Almost... fuck... there.">>
<p class="explicit">He finishes inside her with a grunt. Pulls out. Cum drips between her thighs.</p>
<<say "Scavenger" "Leave 'em. They're as good as dead anyway.">>
<p>They disappear into the Reclaimed.</p>
<p>Kira stirs after a moment. Her hand moves between her legs. Confusion crosses her face.</p>
<<say "Kira" "What... I feel...">>
<p>She looks at you. You pretend to just be waking up.</p>
<<say $player.name "Kira? What happened?">>
<<if $player.corruption >= 40>>
<p class="internal-thought">She doesn't know. Doesn't have to know.</p>
<<set $flags.hidCollapseAbuse to true>>
<<else>>
<p>You can't meet her eyes.</p>
<</if>>
<<set $companions[0].submission += 5>>
<div class="choice-container">
<<vchoice "\"I don't know. Let's just keep moving.\"" "Journey_Tick" "action" "forward">>
<<vchoice "Tell her what happened" "Journey_Survival_CollapseFound_Truth" "action" "speech">>
</div><<setBackground "reclaimed-travel">>
<<say $player.name "Kira... someone found us while we were out. They...">>
<<if setup.kiraAllowsUse()>>
<p>Her hand goes to her thighs. The wetness there.</p>
<<say "Kira" "They... while I was...">>
<p>Realization. Her breath catches.</p>
<<say $player.name "I couldn't move. I was—">>
<<say "Kira" "I know. I know you couldn't. That's not... give me a second.">>
<<else>>
<p>Her face goes white. Her hand touches her thighs. The wetness there.</p>
<<say "Kira" "They... while I was...">>
<p>Realization. Horror. Then fury.</p>
<<say "Kira" "And you just LET them?!">>
<<say $player.name "I couldn't move. I was—">>
<<say "Kira" "BULLSHIT!">>
<</if>>
<<storyVideo "story/travel_collapse_found/raider_use">>
<<if _storyFamily is "sf_cg_travel_collapse_found_02">><p>She's shaking. She presses a hand over her mouth and it doesn't stop the sob. Tears cut tracks through the dirt on her face.</p><<else>><p>She's shaking. Tears cut tracks through the dirt on her face.</p><</if>>
<<set $companions[0].trust += setup.kiraUseTrust(-5)>>
<<set $companions[0].affection += setup.kiraUseAffection(-4)>>
<<if setup.kiraAllowsUse()>>
<<say "Kira" "I'm not crying about them, idiot. I'm crying because I slept through it. Some stranger fucked me in the dirt, I can feel it running down my legs, and I don't remember one fucking second of it.">>
<p>She drags the back of her wrist across her eyes, and a laugh comes out of her, wet and shaky.</p>
<<say "Kira" "What a fucking waste.">>
<p>She stumbles to her feet and walks ahead, wiping her face, and looks back to make sure you're following.</p>
<<else>>
<<say "Kira" "You watched. You watched and you did NOTHING.">>
<p>She stumbles to her feet. Walks ahead without waiting for you.</p>
<p class="guilt">The silence that follows is worse than any words.</p>
<</if>>
<div class="choice-container">
<<vchoice "Follow her" "Journey_Tick" "action" "forward">>
</div><<setBackground "reclaimed-travel">>
<<if setup.kiraWithYou()>><<say $player.name "Wait... we can pay. We have...">><<else>><<say $player.name "Wait... I can pay. I have...">><</if>>
<p>You force yourself to speak despite your parched throat.</p>
<<storyVideo "story/travel_collapse_found/negotiate">>
<<if _storyFamily is "sf_cg_travel_collapse_found_02">><p>The man leans down into your face: goggles, matted dreadlocks, a grin full of bad teeth. Behind him the woman waits by their shopping cart.</p><</if>>
<<set _negotiateRoll to random(1, 100) + Math.floor(($player.charm || 10) / 3)>>
<<if _negotiateRoll >= 50>>
<p>The scavengers exchange glances.</p>
<<say "Scavenger F" "Desperate. Might be useful later. Let's just take the stuff and go.">>
<<say "Scavenger" "Fine.">>
<<set _cnTook to setup.roadRob(true)>>
<p>They take what little you have and leave. You're alive. Barely.</p>
<p class="warning"><<print setup.roadRobText(_cnTook)>></p>
<<if setup.kiraWithYou()>><<say "Kira" "...that could've been worse.">><</if>>
<div class="choice-container">
<<vchoice "Keep moving" "Journey_Tick" "action" "forward">>
</div>
<<elseif setup.kiraWithYou()>>
<<say "Scavenger" "You've got nothing we want. Except...">>
<p>His eyes move to Kira again.</p>
<div class="choice-container">
<<vchoice "Continue" "Journey_Survival_CollapseFound_Watch" "action" "forward">>
</div>
<<else>>
<<say "Scavenger" "You've got nothing we want.">>
<p>He takes the pack anyway, and leaves you a kick in the ribs to remember him by.</p>
<<set _cnTook to setup.roadRob(true)>>
<<clampStat "player.health" -10 0 100>>
<p class="warning"><<print setup.roadRobText(_cnTook)>> −10 Health.</p>
<div class="choice-container">
<<vchoice "Crawl forward" "Journey_Tick" "action" "forward">>
</div>
<</if>><<setBackground "reclaimed-travel">>
<p>You try to rise. Try to fight.</p>
<p>Your body refuses. You manage to get to one knee before collapsing again.</p>
<<say "Raider" "Look at that. Got some fight left.">>
<p>A boot crashes into your ribs.</p>
<<clampStat "player.health" -10 0 100>>
<<say "Raider" "Not anymore.">>
<<set _cffTook to setup.roadRob(true)>>
<p>They take everything and leave you broken in the dust.</p>
<p class="warning"><<print setup.roadRobText(_cffTook)>></p>
<div class="choice-container">
<<vchoice "Crawl forward" "Journey_Tick" "action" "forward">>
</div><<setBackground "reclaimed-travel">>
<h2><<icon "partner">> Kira's Offer</h2>
<p>You've found a trader's camp. They have supplies—food, water, medicine.</p>
<p>They want scrap. You don't have enough.</p>
<<say "Trader" "No scrap, no deal. Simple as that.">>
<<storyVideo "story/travel_kira_offer/offer">>
<<if _storyClip is "e1f6397566af">><p>Kira sits you down away from the others, out of earshot, and talks low and fast.</p><<else>><p>Kira pulls you aside, out of earshot.</p><</if>>
<<if $companions[0].trust >= 70>>
<<say "Kira" "I can get us supplies.">>
<<say $player.name "How? We don't have—">>
<<say "Kira" "I know what men like that want. I've... done it before. When I was alone.">>
<p>Her jaw is set. Determined.</p>
<<say "Kira" "You wait here. Don't follow me. And we never talk about it.">>
<div class="choice-container">
<<vchoice "Let her go" "Journey_Survival_KiraOffer_Accept" "intimate" "partner">>
<<vchoice "\"No. We find another way.\"" "Journey_Survival_KiraOffer_Refuse" "action" "shield">>
<<if $extremeContent.dubcon>>
<<vchoice "\"I want to watch.\"" "Journey_Survival_KiraOffer_Watch" "intimate" "search">>
<</if>>
</div>
<<elseif $companions[0].trust >= 50>>
<<say "Kira" "There might be a way. But... you won't like it.">>
<<say $player.name "What?">>
<<say "Kira" "I can... convince them. The way women convince men.">>
<p>She can't quite meet your eyes.</p>
<div class="choice-container">
<<vchoice "\"You don't have to—\"" "Journey_Survival_KiraOffer_Refuse" "action" "shield">>
<<vchoice "\"...okay.\"" "Journey_Survival_KiraOffer_Accept" "intimate" "partner">>
</div>
<<else>>
<p>Kira looks at the trader. Looks at you. Says nothing.</p>
<p>Some things aren't offered to people who haven't earned trust.</p>
<div class="choice-container">
<<vchoice "Leave empty-handed" "Journey_Tick" "action" "forward">>
</div>
<</if>><<setBackground "reclaimed-travel">>
<<set $flags.letKiraPayPrice to true>>
<<say $player.name "...be careful.">>
<<say "Kira" "I always am.">>
<p>She walks toward the trader's tent. Disappears inside.</p>
<p>You wait. Time stretches. You hear muffled sounds—talking, then something else.</p>
<<advanceTime 1>>
<p>An hour later, Kira emerges. Her hair is disheveled. Her lips are swollen.</p>
<p>She tosses you a pack.</p>
<<say "Kira" "Food. Water. Let's go.">>
<<set $player.hunger to Math.min($player.maxHunger, $player.hunger + 60)>>
<<set $journey.hoursSinceFood to 0>>
<<run setup.fightLootStart()>>
<<run setup.postBattleTakeLoot("ration", "Ration", 4, "", "fightLoot")>>
<<run setup.postBattleTakeLoot("water", "Clean Water", 3, "", "fightLoot")>>
<<lootLeftList "fightLoot">>
<p>She doesn't elaborate. You don't ask.</p>
<<set $companions[0].submission += 3>>
<<addTrust "kira" 1>>
<div class="choice-container">
<<vchoice "Continue in silence" "Journey_Tick" "action" "forward">>
</div><<setBackground "reclaimed-travel">>
<<set $flags.watchedKiraPayTrader to true>>
<<addCorruption 5>>
<<say $player.name "I want to watch.">>
<p>Kira's eyes widen.</p>
<<say "Kira" "...what?">>
<<say $player.name "If you're going to do this... I want to see.">>
<<if setup.kiraAllowsUse()>>
<p>Something shifts in her expression, and it isn't hurt. Her pupils go wide.</p>
<<else>>
<p>Something shifts in her expression. Hurt? Arousal? Both?</p>
<</if>>
<<say "Kira" "...fine. Pervert.">>
<p>She approaches the trader. Whispers something. He grins and nods at a tent.</p>
<p>You follow them inside.</p>
<<storyVideo "story/travel_kira_offer/watch">>
<<if _storyFamily is "sf_cg_travel_kira_offer_04">><p class="explicit">She lets him look her over like merchandise, his mouth on her tits, his hands everywhere. Then Kira kneels. Takes out the trader's cock. Starts working him with practiced efficiency, both hands on the shaft.</p><<else>><p class="explicit">Kira kneels. Takes out the trader's cock. Starts working him with practiced efficiency.</p><</if>>
<<say "Trader" "Shit... your boyfriend's watching?">>
<<say "Kira" "He likes to watch.">>
<p class="explicit">She takes him deep, eyes flicking to you occasionally. Checking your reaction.</p>
<<clampStat "player.lust" 30>>
<p>You're rock hard. Watching your companion suck a stranger's cock for food.</p>
<<if _storyFamily is "sf_cg_travel_kira_offer_04">><p class="explicit">She sinks lower, onto the floor between his feet, and takes him to the root until spit runs off her chin. She gags but doesn't pull away. Her eyes find yours—defiant, challenging.</p><<else>><p class="explicit">The trader grabs her hair and fucks her face. Kira gags but doesn't pull away. Her eyes find yours—defiant, challenging.</p><</if>>
<<say "Trader" "Gonna cum—">>
<p class="explicit">He finishes in her mouth. She swallows, opens her mouth to show him it's gone.</p>
<<say "Trader" "Fuck. Deal's a deal. Take what you need.">>
<<set $player.hunger to Math.min($player.maxHunger, $player.hunger + 60)>>
<<set $journey.hoursSinceFood to 0>>
<<run setup.fightLootStart()>>
<<run setup.postBattleTakeLoot("ration", "Ration", 4, "", "fightLoot")>>
<<run setup.postBattleTakeLoot("water", "Clean Water", 3, "", "fightLoot")>>
<<lootLeftList "fightLoot">>
<<if setup.kiraAllowsUse()>>
<p>Outside, Kira wipes her mouth with her thumb, and licks the thumb clean.</p>
<<say "Kira" "Happy now? ...Don't answer. I saw your face. Later you're going to tell me what it looked like, with my hand round your cock.">>
<<else>>
<p>Outside, Kira wipes her mouth.</p>
<<say "Kira" "Happy now?">>
<</if>>
<<set $companions[0].trust += setup.kiraUseTrust(-1)>>
<<set $companions[0].submission += 8>>
<<gainExhibitionism "kira" 5>>
<div class="choice-container">
<<vchoice "Continue" "Journey_Tick" "action" "forward">>
</div><<setBackground "reclaimed-travel">>
<<say $player.name "No. You don't have to do that. We'll find another way.">>
<<if $companions[0].trust >= 60>>
<p>Something softens in her expression.</p>
<<say "Kira" "...thanks. For not just... letting me.">>
<<addAffection "kira" 1>>
<<addTrust "kira" 1>>
<<else>>
<<say "Kira" "Your call. Hope you know what you're doing.">>
<</if>>
<p>You leave the trader's camp empty-handed. But with something else intact.</p>
<div class="choice-container">
<<vchoice "Keep moving" "Journey_Tick" "action" "forward">>
</div><<setBackground "reclaimed-travel">>
<<set $flags.deliriumEvent to true>>
<<set _dtKira to setup.kiraWithYou()>>
<h2><<icon "eye">> Delirium</h2>
<p>The heat. The thirst. Everything blurs together.</p>
<<if _dtKira>>
<p>You're sitting against a rock. Kira is beside you—or is she? Hard to tell what's real anymore.</p>
<<else>>
<p>You're sitting against a rock. There's a woman beside you, dark hair, the shape of someone you know. There can't be. You came out here alone. Hard to tell what's real anymore.</p>
<</if>>
<<storyVideo "story/travel_delirium/delirium_touch">>
<<if _storyClip is "33baf11420c1">><p class="hallucination">She's there in the dark beside you, lying back, watching you. Then she isn't.</p><<elseif _storyFamily is "sf_cg_travel_delirium_01">><p class="hallucination">She's touching herself. Dress rucked up, fingers working between her spread thighs, eyes on your cock.</p><<else>><p class="hallucination">She's touching you. Her hand on your thigh. Moving higher.</p><</if>>
<<if _dtKira>>
<<say "Kira" "It's okay... I want to...">>
<<else>>
<p class="hallucination">"It's okay... I want to..."</p>
<</if>>
<p>Is this real? Her voice sounds distant, echoey.</p>
<<if _storyFamily is "sf_cg_travel_delirium_01">><p class="hallucination">She licks her fingers and slides them back into her pussy. Your own hand is on your cock and you don't remember taking it out.</p><<else>><p class="hallucination">Her lips on your neck. Her hand finding your cock through your pants.</p><</if>>
<<clampStat "player.lust" 20>>
<<if $player.hunger <= 15 || setup.fatigueOf() >= 95>>
<p class="warning">You're too far gone to know what's real.</p>
<div class="choice-container">
<<if _dtKira>>
<<vchoice "Give in to the hallucination" "Journey_Survival_DeliriumTouch_GiveIn" "intimate" "high-arousal">>
<<else>>
<<vchoice "Give in to her" "Journey_Survival_DeliriumTouch_Alone" "intimate" "high-arousal">>
<</if>>
<<vchoice "Try to focus... is this real?" "Journey_Survival_DeliriumTouch_Focus" "action" "eye">>
<<if !_dtKira>>
<<pushOnChoice "Shake it off and walk">>
<</if>>
</div>
<<else>>
<<if _dtKira>>
<p>Your head clears slightly. Kira is sitting nearby, but not touching you.</p>
<<say "Kira" "Hey... you okay? You were mumbling.">>
<<else>>
<p>Your head clears slightly. There's nobody on the rock beside you. There never was.</p>
<</if>>
<p>Hallucination. Just a hallucination.</p>
<<clampStat "player.lust" 10>>
<<if !_dtKira>>
<p class="internal-thought">You're seeing things. Keep walking before you start talking back to her.</p>
<</if>>
<div class="choice-container">
<<if _dtKira>>
<<vchoice "\"Fine. Just... seeing things.\"" "Journey_Tick" "action" "forward">>
<<else>>
<<vchoice "Keep walking" "Journey_Tick" "action" "forward">>
<</if>>
</div>
<</if>><<setBackground "reclaimed-travel">>
<<set $flags.deliriumActed to true>>
<<addCorruption 10>>
<p>You stop trying to figure out what's real.</p>
<p>Your hands move. Find warmth. Soft skin.</p>
<p class="hallucination">She's willing. Eager. Pulling you closer.</p>
<<say "Kira" "Yes... please...">>
<<storyVideo "story/travel_delirium/delirium_touch_give_in">>
<<if _storyFamily is "sf_cg_travel_delirium_01">><p class="explicit">You pull her into your lap, facing you, and push your cock into her ass. She leans back on her hands, thighs spread over yours, slick and tight and perfect.</p><<else>><p class="explicit">You pull her into your lap. Push inside her. She's warm and wet and perfect.</p><</if>>
<p class="hallucination">This is what she wants. What you both need. Just survival instinct. Nothing wrong with it.</p>
<<if _storyFamily is "sf_cg_travel_delirium_01">><p class="explicit">You tip her onto her back. She hauls her knees to her chest, spreads her ass for you with both hands, and you sink back into it. Spit strings from her open mouth.</p><</if>>
<<clampStat "player.lust" -40>><<run setup.playerReleased()>>
<p>When you finish, the world snaps back into focus.</p>
<p>Kira is beneath you. Eyes wide. Frozen.</p>
<<say "Kira" "...what...">>
<p>Oh god. Oh god.</p>
<<say $player.name "Kira—I thought—I was hallucinating—">>
<<if $companions[0].romanceStage >= 3>>
<p>She stares at you. Then, slowly, her expression shifts.</p>
<<say "Kira" "...you were out of your head. I tried to push you off but you were...">>
<p>She looks away.</p>
<<say "Kira" "Let's just... not do that again. Not like that.">>
<<set $companions[0].trust -= 2>>
<<set $companions[0].submission += 10>>
<<else>>
<p>She shoves you off. Scrambles away.</p>
<<say "Kira" "You fucking USED me!">>
<<say $player.name "I didn't know—I thought—">>
<<say "Kira" "You THOUGHT?!">>
<p>Tears streak down her face.</p>
<<set $companions[0].trust -= 6>>
<<set $companions[0].affection -= 5>>
<<set $companions[0].submission += 15>>
<</if>>
<p class="guilt">Whether you knew or not... you did what you did.</p>
<div class="choice-container">
<<vchoice "Continue in heavy silence" "Journey_Tick" "action" "forward">>
</div><<setBackground "reclaimed-travel">>
<<set $flags.deliriumActed to true>>
<<set _dtVelith to !!($supernaturals && $supernaturals.succubus && $supernaturals.succubus.met)>>
<p>You stop trying to work out what's real. It's too hot to care, and she's right there.</p>
<<storyVideo "story/travel_delirium/alone_1_fingers">><<set _w26a to _storyClip>>
<p class="hallucination">She watches your hand move on your cock with her lip caught in her teeth, two fingers buried in her own pussy, <<if _storyClip is "cd222d12a97b">>and she's naked and oiled and shining so you can see all of it,<<else>>and her dress has ridden up around her waist so you can see all of it,<</if>> pink and slick and opening for her. "Look at you," she says. "Out here all alone. Nobody to see." She pulls her fingers out wet and sucks them clean, and she's smiling at you around them.</p>
<p>The rock at your back goes soft. The road is gone. There's cool blue cloth under you, a bed you've never owned, and no dust anywhere, and she's crawling up it toward you naked.</p>
<<storyVideo "story/travel_delirium/delirium_touch_give_in">>
<p class="explicit">She swings a leg over you and leans back on her hands, knees up and wide, and lowers herself onto your cock, not into her pussy but her ass, tight as a fist and hot as the sun on your neck. She holds her legs open for you with nothing hidden, her cunt bare and dripping above where you're buried in her, and she rides you slow with her mouth hanging open.</p>
<p class="hallucination">"Harder," she breathes. "You've been walking for days. Take something."</p>
<p class="explicit">You take it. Your hips jerk up off the blue sheets and she gasps with every stroke, her tits bouncing, her eyes rolling, and she rubs her clit in quick little circles while you fuck up into her ass. It's so tight you can feel your heartbeat in it, and the slap of skin on skin is the only sound in the whole world.</p>
<<storyVideo "story/travel_delirium/alone_3_climax">><<set _w26b to _storyClip>>
<<if _storyClip is "f6e52d23064e">><p>Somewhere in it she's on her side under you, legs held up together in your hand, and you come with a shout that cracks in your dry throat. It goes on and on, your whole body wrung out through your cock, and when you pull out of her she reaches up and sucks your fingers.</p><<else>><p>You come with a shout that cracks in your dry throat. It goes on and on, your whole body wrung out through your cock, while she clenches down and milks every pulse.</p><</if>>
<<if _dtVelith>>
<p class="hallucination">Right at the end her laugh changes. It goes lower and older, and it isn't hers. "There you are," something purrs in your ear. "Seeds grow in the strangest soil."</p>
<<if !$flags.deliriumVelithHeard>>
<<clampStat "player.corruption" 5 0 `$player.maxCorruption || setup.CORRUPTION_MAX`>>
<<set $flags.corruptionGained to true>>
<<checkTransformation>>
<<set $flags.deliriumVelithHeard to true>>
<p class="system-info"><<icon "corruption">> Corruption +5</p>
<</if>>
<</if>>
<p>The world snaps back into place.</p>
<p>Rock. Dust. Glare. <<if $clothing.player.bottom > 0>>Your pants are around your knees and your<<else>>Your<</if>> fist is still wrapped around your softening cock. Cum is cooling on your stomach and spattered dark into the dirt between your boots. You're breathing as if you ran a mile, and there's nobody on the rock beside you. There never was. A lizard watches you from a stone a few feet away, unimpressed.</p>
<p class="internal-thought">You're losing it out here. Eat something before she comes back.</p>
<<clampStat "player.lust" -40>>
<<run setup.playerReleased()>>
<<clampStat "player.energy" -10 0 $player.maxEnergy>>
<p class="system-info"><<icon "energy">> Energy −10</p>
<div class="choice-container">
<<vchoice "Clean up and rest a while" "Journey_ShortRest" "action" "sleep">>
<<pushOnChoice "Clean up and walk on">>
</div><<setBackground "reclaimed-travel">>
<p>You squeeze your eyes shut. Open them. Force clarity.</p>
<<if !setup.kiraWithYou()>>
<p>Nobody. A rock, the road, your own shadow. Your hand is shaking in your lap.</p>
<p class="internal-thought">Get up. Find food. Before you start talking back to her.</p>
<div class="choice-container">
<<vchoice "Rest briefly" "Journey_ShortRest" "action" "sleep">>
<<pushOnChoice "Push on">>
</div>
<<else>>
<p>Kira is nearby. Not touching you. Looking concerned.</p>
<<say "Kira" "You were reaching for me. What's going on?">>
<<say $player.name "Hallucinating. Thought you were...">>
<p>You trail off. She doesn't need to know what you saw.</p>
<<if $companions[0].trust >= 50>>
<<say "Kira" "We need to rest. You're losing it.">>
<p>She helps you to shade. Gives you water from her own ration.</p>
<<set $player.hunger to Math.min($player.maxHunger, $player.hunger + 10)>>
<<set $companions[0].affection += 2>>
<<else>>
<<say "Kira" "...right. Well. Try not to touch me in your sleep.">>
<</if>>
<div class="choice-container">
<<vchoice "Rest briefly" "Journey_ShortRest" "action" "sleep">>
<<pushOnChoice "Push on">>
</div>
<</if>><<setBackground "prelude/caravan-camp-night">>
<h2><<icon "partner">> Breaking Point</h2>
<p>Night camp. You're both at the end of your rope.</p>
<<storyVideo "story/travel_camp_breakdown/journey_survival_breakdown_comfort">>
<<if _storyFamily is "sf_cg_travel_camp_breakdown_01">><p>Kira sits beside you on the log, staring into the small fire. Then, suddenly—she breaks.</p><<else>><p>Kira sits across from you, staring into the small fire. Then, suddenly—she breaks.</p><</if>>
<<say "Kira" "I can't do this anymore.">>
<<if _storyFamily is "sf_cg_travel_camp_breakdown_01">><p>Her voice cracks. She turns to you, talking fast and low, eyes wet, her composure gone.</p><<else>><p>Tears stream down her face. Her composure cracks completely.</p><</if>>
<<say "Kira" "Every day it's just... fight, starve, almost die. What's the point?">>
<<if $companions[0].trust >= 60>>
<<if _storyFamily is "sf_cg_travel_camp_breakdown_01">><p>You lay your arm along the log behind her. She doesn't pull away.</p><<else>><p>You move to her side. She doesn't pull away.</p><</if>>
<<say $player.name "We've made it this far. We'll make it further.">>
<<say "Kira" "Will we? Or will we just die out here, alone and forgotten?">>
<p>She leans into you. Desperate for contact. For comfort.</p>
<div class="choice-container">
<<vchoice "Just hold her" "Journey_Survival_BreakdownComfort_Hold" "companion" "partner">>
<<if $companions[0].romanceStage >= 2>>
<<vchoice "Kiss her" "Journey_Survival_BreakdownComfort_Kiss" "intimate" "heart">>
<</if>>
<<if $player.corruption >= 30>>
<<vchoice "She's vulnerable... take advantage" "Journey_Survival_BreakdownComfort_Exploit" "intimate" "corruption">>
<</if>>
</div>
<<else>>
<p>You watch her cry, unsure what to do.</p>
<<say $player.name "It'll be okay.">>
<<say "Kira" "Don't. Don't give me empty words.">>
<p>She turns away. The distance between you feels wider than ever.</p>
<div class="choice-container">
<<vchoice "Give her space" "Journey_Morning" "action" "sleep">>
</div>
<</if>><<setBackground "prelude/caravan-camp-night">>
<p>You wrap your arms around her. Just hold her.</p>
<p>She cries into your chest. Minutes pass. Her sobs slow.</p>
<<say "Kira" "...sorry. I don't usually...">>
<<say $player.name "You don't have to apologize.">>
<p>She looks up at you. Vulnerable. Raw.</p>
<<say "Kira" "Thank you. For not... taking advantage.">>
<<addAffection "kira" 2>>
<<addTrust "kira" 2>>
<<clampStat "player.energy" 20 0 $player.maxEnergy>>
<p>You hold each other through the night. Nothing more. But somehow, enough.</p>
<div class="choice-container">
<<vchoice "Sleep" "Journey_Morning" "action" "sleep">>
</div><<setBackground "prelude/caravan-camp-night">>
<p>You cup her face. Wipe her tears with your thumb.</p>
<<storyVideo "story/travel_camp_breakdown/kiss">>
<p>Then you kiss her.</p>
<p>She freezes for a moment—then melts into it. Desperate. Hungry.</p>
<<say "Kira" "Please... I need...">>
<<if _storyFamily is "sf_cg_travel_camp_breakdown_01">><p>She doesn't finish. Just drags you down by the jaw, and when you pull her tank top over her head she arches into your mouth on her throat.</p><<else>><p>She doesn't finish. Just pulls you closer.</p><</if>>
<<if $companions[0].romanceStage >= 3>>
<div class="choice-container">
<<vchoice "Continue" "Journey_Survival_BreakdownComfort_Intimate" "action" "forward">>
</div>
<<else>>
<p>The kiss deepens. But eventually, you both pull back.</p>
<<say "Kira" "...not yet. I'm sorry. I just...">>
<<say $player.name "It's okay. Whenever you're ready.">>
<<addAffection "kira" 2>>
<<set $companions[0].romanceStage++>>
<div class="choice-container">
<<if setup.campIsNight()>><<vchoice "Hold her until morning" "Journey_Morning" "action" "sleep">><<else>><<vchoice "Hold her a while" "Journey_Morning" "action" "sleep">><</if>>
</div>
<</if>><<setBackground "prelude/caravan-camp-night">>
<<set $flags.breakdownIntimacy to true>>
<p>The kiss becomes more. Clothes are pushed aside. Bodies press together.</p>
<<say "Kira" "I need this. I need YOU.">>
<<storyVideo "story/travel_camp_breakdown/intimate">>
<p class="explicit">You make love by firelight. Not the desperate rutting of survival—something gentler. More meaningful.</p>
<<if _storyFamily is "sf_cg_travel_camp_breakdown_01">><p>She lies on her side and you slide into her from behind, slow. She pulls your fingers to her lips, sucks them, holds your hand there like it's the only real thing in the world.</p><<else>><p>She clings to you like you're the only real thing in the world.</p><</if>>
<<say "Kira" "Don't let go. Please don't let go.">>
<p class="explicit">When you finish together, she cries again—but different tears this time.</p>
<<addAffection "kira" 3>>
<<addTrust "kira" 2>>
<<clampStat "companions[0].lust" -40>>
<<clampStat "player.lust" -40>><<run setup.playerReleased()>>
<<clampStat "player.energy" 40 0 $player.maxEnergy>>
<<if $companions[0].romanceStage < 5>>
<<set $companions[0].romanceStage++>>
<</if>>
<<say "Kira" "...I think I'm falling for you. Idiot that I am.">>
<div class="choice-container">
<<vchoice "\"I'm falling for you too.\"" "Journey_Morning" "intimate" "heart">>
</div><<setBackground "prelude/caravan-camp-night">>
<<set $flags.exploitedBreakdown to true>>
<<addCorruption 10>>
<p>She's vulnerable. Desperate. She'd do anything right now for comfort.</p>
<p class="internal-thought">You could take advantage of that.</p>
<p>Your hands move. Not to comfort—to possess.</p>
<<say "Kira" "What are you—">>
<<say $player.name "Shh. Let me make you feel better.">>
<p>She hesitates. Then, too broken to resist, she lets you.</p>
<<storyVideo "story/travel_camp_breakdown/exploit">>
<<if _storyFamily is "sf_cg_travel_camp_breakdown_01">><p class="explicit">You push her face-down into the bedroll, pin her arm behind her back and take her from behind. She doesn't fight—just grips the blanket, eyes shut, tears still wet on her cheeks.</p><<else>><p class="explicit">You push her down. Take what you want. She doesn't fight—just lies there, tears still wet on her cheeks.</p><</if>>
<<say "Kira" "...okay. Okay. Just... be quick.">>
<p class="explicit">You fuck her while she cries. When you finish, you feel satisfied. She feels hollow.</p>
<<clampStat "player.lust" -50>><<run setup.playerReleased()>>
<<set $companions[0].submission += 15>>
<<set $companions[0].trust -= 4>>
<<set $companions[0].affection -= 3>>
<p>Afterward, she curls up away from you. Silent.</p>
<p class="guilt">You used her lowest moment for your own pleasure.</p>
<div class="choice-container">
<<vchoice "Sleep" "Journey_Morning" "action" "sleep">>
</div><<setBackground "reclaimed-travel">>
<<getJourneyCompanion>>
<h2><<icon "alert">> Kira Collapses</h2>
<<storyVideo "events/travel_forced_rest">>
<p>Kira stumbles, her legs giving out beneath her. She hits the ground hard, barely catching herself on her hands.</p>
<<say "Kira" "I... I can't...">>
<p>She tries to push herself up but her arms are shaking. The journey, the hunger, the exhaustion - it's all caught up with her.</p>
<<say $player.name "Kira!">>
<p>You rush to her side. She's conscious but barely. Her breathing is shallow, her skin pale.</p>
<<if _gc_companion>>
<<set _gc_companion.health to 1>>
<<if _gc_companion.id === "kira">><<set _gc_companion.health to setup.kiraFloorHealth(1)>><</if>>
<</if>>
<<set $journey.paused to true>>
<p class="system-info"><<icon "alert">> Kira has collapsed from exhaustion. You must rest before continuing.</p>
<div class="choice-container">
<<vchoice "Set up camp immediately" "Journey_Camp" "action" "tent">>
</div><<setBackground "reclaimed-dusk">>
<<set _poKira to setup.kiraWithYou()>>
<<set _poRoll to setup.stableRoll("passout-theft", $time.totalHours)>>
<<advanceToHour 7>>
<<set $journey.lastSleptAt to $time.totalHours>>
<<run setup.countSleep()>>
<<set $player.energy to Math.max($player.energy, 35)>>
<<clampStat "player.health" -5 1 100>>
<<clampStat "player.hunger" -5>>
<<set _poTook to []>>
<<if !_poKira && _poRoll <= 35>>
<<if UInv.BagHasItem("player", "ration")>><<run UInv.DeleteItem("player", "ration", 1)>><<run _poTook.push("a ration")>>
<<elseif ($vault.scrap || 0) > 0>><<set _poScrap to Math.min($vault.scrap, 3)>><<set $vault.scrap -= _poScrap>><<run _poTook.push(_poScrap + " scrap")>><</if>>
<</if>>
<h2><<icon "sleep">> Out on Your Feet</h2>
<<set _w26po to (_poKira || !_poTook.length) && setup.storyAvoidStems("events/travel/survival_pass_out", ["ce6f945c8a75"])>><<showTravelVideo "survival_pass_out">><<if _w26po>><<run setup.mediaAvoidEnd("events/travel/survival_pass_out")>><</if>>
<p>Your eyes close on their own. You keep walking for a few steps asleep on your feet, then the road tilts and you're down in the dirt.</p>
<p>You tell yourself you'll get up in a second. You don't.</p>
<p class="narrator">When you open your eyes again the sky is grey with dawn. Your neck is stiff, your hip aches where a stone dug into it all night, and your mouth tastes of dust.</p>
<<if _poKira>>
<p>Kira is sitting a few feet away with her back against a rock, knees drawn up, watching the road. She looks like she hasn't slept.</p>
<<say "Kira" "You went down like a sack of rocks. Mid-sentence. I dragged you off the road and kept watch.">>
<<say "Kira" "Don't do that to me again. We stop and make camp like normal people.">>
<<elseif _poTook.length>>
<p>Your pack lies open beside you. Someone went through it while you slept and didn't bother to wake you.</p>
<p class="warning">Gone: <<print _poTook.join(", ")>>.</p>
<<else>>
<p>Nobody came. You were lucky. Out here, that won't last.</p>
<</if>>
<p class="system-info"><<icon "energy">> You slept where you fell. −5 Health, −5 Food</p>
<div class="choice-container">
<<vchoice "Get up and walk on" "Journey_Tick" "action" "forward">>
</div><<setBackground "reclaimed-travel">>
<<set $journey.deathWithKira to setup.kiraWithYou()>>
<<set $journey.active to false>>
<<set $journey.blackoutArrival to $journey.returnToPassage || null>>
<<set $journey.returnToPassage to null>>
<h2><<icon "sleep">> Blackout</h2>
<<switch $flags.deathCause>>
<<case "starvation">>
<p>Your body has nothing left to give. Your heart stutters. Your vision goes gray at the edges.</p>
<p>You hit the ground without even feeling it. The hunger finally stops.</p>
<<case "exhaustion">>
<p>One step. That's all you need. Just one more step.</p>
<p>You don't make it. Your body shuts down, consciousness fleeing like a frightened animal.</p>
<<case "wounds">>
<p>The wounds you carried onto the road open up again. Warm blood runs down your side with every step, and the ground tilts under you.</p>
<p>You go down hard. You don't feel yourself land.</p>
<<default>>
<p>Your legs fold under you. You fall, and the darkness swallows you whole.</p>
<</switch>>
<<storyVideo "story/travel_survival_death/death">>
<<if _storyFamily is "sf_cg_travel_survival_death_04">><p>The world goes red. The red shrinks to a single burning point, and the point goes out.</p><</if>>
<<if $journey.deathWithKira>>
<p>Somewhere, distantly, you hear Kira screaming your name.</p>
<<say "Kira" `$player.name + "! No, no, no—"`>>
<p>Then her voice fades too.</p>
<</if>>
<div class="choice-container">
<<vchoice "..." "Journey_Survival_Death_Awakening" "action" "sleep">>
</div><<setBackground "reclaimed-dusk">>
<<run UInv.EmptyBag("player")>>
<<set $clothing.player.top to 0>>
<<set $clothing.player.bottom to 0>>
<<set $clothing.player.chestExposed to true>>
<<set $clothing.player.dickExposed to true>>
<<set $clothing.player.assExposed to true>>
<<set $player.health to 5>>
<<if $flags.deathCause === "starvation">>
<<set $player.hunger to 15>>
<<set $journey.hoursSinceFood to 12>>
<</if>>
<<set $player.energy to 30>>
<<if !$flags.deathCount>><<set $flags.deathCount to 0>><</if>>
<<set $flags.deathCount++>>
<<if $journey.deathWithKira>>
<<set $flags.kiraMissing to true>>
<<set $flags.kiraLocation to either("nearby_ruins", "raider_camp", "scavenger_den")>>
<</if>>
<<set $flags.survivalDeath to false>>
<h2><<icon "sunrise">> Awakening</h2>
<p>Pain. That's the first thing you feel. Pain means you're alive.</p>
<<storyVideo "story/travel_survival_death/death_awakening">>
<<if _storyFamily is "sf_cg_travel_survival_death_04">><p>You open your eyes. Dust. You're half buried in a drift of it, caked from scalp to heel, under a sky of pale, dying light. You heave your head and shoulders up and it pours off your back in dry sheets.</p><<else>><p>You open your eyes. Dust. Rock. A sky painted in shades of dying light.</p><</if>>
<p>How long were you out? Hours? Days?</p>
<p>You try to move and realize several things at once:</p>
<ul>
<li>You're naked. Completely stripped.</li>
<li>Everything you were carrying is gone.</li>
<li>Someone dragged you here and left you for dead.</li>
<<if $journey.deathWithKira>><li>Kira is nowhere to be seen.</li><</if>>
</ul>
<p class="warning">Your supplies, weapons, and clothing have been stolen.</p>
<<if $journey.deathWithKira>>
<p>Kira. Where is Kira?</p>
<p>You force yourself to your knees, ignoring the screaming protest of every muscle. Look around wildly.</p>
<p>Drag marks in the dirt. Two sets—one for you, one smaller. They took her.</p>
<p class="internal-thought">They took her alive. Why would they take her alive?</p>
<p>You know why. You don't want to think about it.</p>
<</if>>
<div class="choice-container">
<<if $journey.deathWithKira>>
<<vchoice "Force yourself to stand" "Journey_Survival_Death_Search" "action" "strength">>
<<else>>
<<vchoice "Force yourself to stand" "Journey_Survival_Death_Recovery" "action" "strength">>
<</if>>
</div><<setBackground "reclaimed-evening">>
<h2><<icon "search">> Finding Your Bearings</h2>
<<storyVideo "story/travel_survival_death/death_search">>
<<if _storyFamily is "sf_cg_travel_survival_death_04">><p>You stagger upright beside the gutted wreck they dumped you by: one naked man on a cracked, empty flat, your shadow stretched long across the dirt. You turn slowly and scan the horizon.</p><<else>><p>You stagger upright. Naked. Vulnerable. Alone.</p><</if>>
<p>The landscape is familiar—you're not far from where you collapsed. Maybe a few hundred meters.</p>
<p>Your captors—or saviors, depending on perspective—didn't take you far before stripping you and leaving.</p>
<<switch $flags.kiraLocation>>
<<case "nearby_ruins">>
<p>You spot something. Movement in the ruins to the east. A flash of... rope? Fabric?</p>
<p class="internal-thought">That's where they're keeping her. Has to be.</p>
<<case "raider_camp">>
<p>Smoke rises from a makeshift camp to the north. Laughter. Male voices.</p>
<p class="internal-thought">Raiders. They have her.</p>
<<case "scavenger_den">>
<p>A half-collapsed building to the south shows signs of habitation. Fresh tracks lead inside.</p>
<p class="internal-thought">Scavengers. They took everything—including Kira.</p>
<</switch>>
<p>You need to find her. But you're in no shape to fight.</p>
<div class="choice-container">
<<vchoice "Sneak toward the location" "Journey_Survival_FindKira_Approach" "action" "stealth">>
<<vchoice "Search for anything useful first" "Journey_Survival_Death_Scavenge" "action" "search">>
</div><<setBackground "reclaimed-evening">>
<h2><<icon "search">> Desperate Scavenging</h2>
<p>You search the immediate area. Your captors were thorough, but not perfect.</p>
<<set _scavengeRoll to random(1, 100)>>
<<if _scavengeRoll <= 40>>
<p>You find a torn piece of cloth caught on debris. Not much, but enough to cover yourself.</p>
<<set $clothing.player.bottom to 30>>
<<set $clothing.player.dickExposed to false>>
<<set $clothing.player.assExposed to false>>
<p class="notification">Found: Makeshift covering</p>
<<elseif _scavengeRoll <= 70>>
<p>A discarded water bottle, still holding a few mouthfuls. Warm and stale, but wet.</p>
<<set $player.hunger to Math.min($player.maxHunger, $player.hunger + 10)>>
<<clampStat "player.health" 3 0 100>>
<p class="notification">Found: Partial water bottle</p>
<<else>>
<p>Nothing. The Reclaimed offers no charity.</p>
<</if>>
<p>You can't delay any longer. Kira needs you.</p>
<div class="choice-container">
<<vchoice "Go find Kira" "Journey_Survival_FindKira_Approach" "action" "forward">>
</div><<setBackground "reclaimed-evening">>
<h2><<icon "stealth">> Approaching</h2>
<<switch $flags.kiraLocation>>
<<case "nearby_ruins">>
<p>You creep through the rubble, staying low. The ruins offer cover.</p>
<p>Voices. One male, gruff. Someone else—whimpering.</p>
<p>You peer around a collapsed wall and see them.</p>
<div class="choice-container">
<<vchoice "Continue" "Journey_Survival_FindKira_Ruins" "action" "forward">>
</div>
<<case "raider_camp">>
<p>The raider camp is crude but functional. Three, maybe four of them. Armed.</p>
<p>And in the center, tied to a post—</p>
<div class="choice-container">
<<vchoice "Continue" "Journey_Survival_FindKira_Raiders" "action" "forward">>
</div>
<<case "scavenger_den">>
<p>The scavenger den is quiet. Too quiet. You slip through a gap in the wall.</p>
<p>Inside, you find her.</p>
<div class="choice-container">
<<vchoice "Continue" "Journey_Survival_FindKira_Scavengers" "action" "forward">>
</div>
<</switch>><<setBackground "reclaimed-ruins">>
<h2><<icon "danger">> The Ruins</h2>
<<storyVideo "story/travel_findkira_ruins/ruins">>
<<if _storyFamily is "sf_cg_travel_findkira_ruins_03">><p>A lone scavenger stands over Kira. She's strung up by her wrists from a chain in a gutted brick room, arms above her head, stripped to a soaked vest.</p><<else>><p>A lone scavenger stands over Kira. She's tied to a rusted pipe, arms above her head, clothes torn away.</p><</if>>
<p>He hasn't noticed you yet. Too focused on his prize.</p>
<<if _storyFamily is "sf_cg_travel_findkira_ruins_03">><p>He hauls on the chain until she's on her toes, sloshes water over her, grabs her waist and leers up into her face.</p><</if>>
<<say "Scavenger" "Your boyfriend's dead, sweetheart. Might as well enjoy what comes next.">>
<p>Kira's face is bruised. Her lip is split. But her eyes—her eyes are still defiant.</p>
<<say "Kira" "Fuck you.">>
<<say "Scavenger" "That's the plan.">>
<p>He reaches for his belt.</p>
<div class="choice-container">
<<vchoice "Attack him now" "Journey_Survival_FindKira_Attack" "action" "attack">>
<<vchoice "Wait for an opening" "Journey_Survival_FindKira_Wait" "action" "stealth">>
<<if $player.corruption >= 50>>
<<vchoice "Watch what happens" "Journey_Survival_FindKira_Watch" "intimate" "search">>
<</if>>
</div><<setBackground "wasteland-camp">>
<h2><<icon "danger">> Raider Camp</h2>
<p>Kira is tied to a wooden post in the center of camp. Her clothes have been cut away, leaving her naked and exposed.</p>
<<storyVideo "story/travel_findkira_raidercamp/raiders">>
<p>Three raiders sit around a fire, passing a bottle. A fourth stands guard, though he's more interested in leering at Kira than watching the perimeter.</p>
<<say "Raider" "She's feisty. I like that.">>
<<say "Raider 2" "Dibs on first round.">>
<<say "Kira" "Touch me and I'll bite it off.">>
<p>They laugh.</p>
<<say "Raider" "We'll see about that.">>
<p>You're outnumbered. Outgunned. But they don't know you're here.</p>
<div class="choice-container">
<<vchoice "Create a distraction" "Journey_Survival_FindKira_Distraction" "action" "stealth">>
<<vchoice "Wait until they're distracted" "Journey_Survival_FindKira_Wait_Raiders" "action" "stealth">>
<<if $player.corruption >= 50>>
<<vchoice "Watch from hiding" "Journey_Survival_FindKira_Watch_Raiders" "intimate" "search">>
<</if>>
</div><<setBackground "reclaimed-ruins">>
<h2><<icon "search">> Scavenger Den</h2>
<p>The inside of the building is dark and cluttered. Stolen goods everywhere.</p>
<p>Kira is in the back, tied to a chair. A female scavenger is going through her belongings while a male sits nearby, sharpening a knife.</p>
<p>Kira's clothes are torn but still partially on. They haven't started on her yet—too busy cataloging loot.</p>
<<say "Scavenger F" "The gear's decent. Should fetch good trade.">>
<<say "Scavenger M" "What about her?">>
<<say "Scavenger F" "Keep her. Sell her. Whatever. She's not my type.">>
<<say "Kira" "Let me go and maybe I won't kill you.">>
<<say "Scavenger F" "Cute.">>
<div class="choice-container">
<<vchoice "Sneak up while they're distracted" "Journey_Survival_FindKira_Sneak" "action" "stealth">>
<<vchoice "Look for a weapon first" "Journey_Survival_FindKira_Weapon" "action" "search">>
</div><<setBackground "wasteland-camp">>
<p>You find a chunk of rubble. Throw it into the darkness on the far side of camp.</p>
<p>The crash echoes. The raiders jump up.</p>
<<say "Raider" "What was that?">>
<<say "Raider 2" "Go check it out.">>
<p>Two of them move toward the noise. The others are distracted, looking away from Kira.</p>
<p>You move fast. Slip behind the post. Start working at her bonds.</p>
<<say "Kira" `$player.name + "?! How—"`>>
<<say $player.name "Shh. Almost got it.">>
<p>The rope comes free. You grab her hand and run.</p>
<p>Behind you, shouts. But you're already disappearing into the darkness.</p>
<<set _bondsAlreadyCut to true>>
<div class="choice-container">
<<vchoice "Continue" "Journey_Survival_FindKira_Rescue" "action" "forward">>
</div><<setBackground "wasteland-camp">>
<p>You wait. Watch. Look for an opportunity.</p>
<p>The raiders drink. Get louder. Cruder.</p>
<<say "Raider 2" "Alright, I'm going first. Waited long enough.">>
<p>He stands, walking toward Kira. The others cheer.</p>
<<say "Kira" "Stay back. I'll fucking kill you.">>
<<say "Raider 2" "Sure you will, sweetheart.">>
<<storyVideo "story/travel_findkira_raidercamp/wait_raiders">>
<<if _storyFamily is "sf_cg_travel_findkira_raidercamp_02">><p class="explicit">He cuts her loose from the post, drags her to the supply table and bends her over it, kicks her legs apart and shoves his cock into her ass despite her struggling.</p><<else>><p class="explicit">He grabs her, forces her legs apart despite her struggling.</p><</if>>
<<set $flags.kiraHurtOnRoad to true>>
<p>The others are watching. Laughing. Distracted.</p>
<p>This might be your only chance.</p>
<div class="choice-container">
<<vchoice "Move now while they're distracted" "Journey_Survival_FindKira_Raiders_Strike" "action" "stealth">>
<<if $player.corruption >= 50>>
<<vchoice "Wait until he's done" "Journey_Survival_FindKira_Watch_Raiders_Full" "intimate" "search">>
<</if>>
</div><<setBackground "wasteland-camp">>
<p>You circle behind. The raider at Kira is too busy to notice. The others are watching the show.</p>
<p>You find a discarded bottle. Heavy glass.</p>
<p>One swing. The guard drops. You grab his knife.</p>
<p>The others turn too slow. You're already cutting Kira's bonds.</p>
<<say "Raider 2" "What the—">>
<p>Kira's free. She kicks him square in the face before he can react.</p>
<<say "Kira" "RUN!">>
<p>You run. Into the darkness. The remaining raiders chase, but they're drunk and slow.</p>
<p>You lose them in the ruins.</p>
<<set _bondsAlreadyCut to true>>
<div class="choice-container">
<<vchoice "Continue" "Journey_Survival_FindKira_Rescue" "action" "forward">>
</div><<setBackground "wasteland-camp">>
<<set $flags.watchedKiraGangRape to true>>
<<addCorruption 20>>
<p>You stay hidden. Watch.</p>
<<storyVideo "story/travel_findkira_raidercamp/watch_raiders">>
<<if _storyFamily is "sf_cg_travel_findkira_raidercamp_02">><p class="explicit">They take turns with her. One after another. One shoves his cock down her throat until spit runs off her chin; the next folds her on her back, pins her bound wrists above her head, grips her throat and fucks her ass while he kisses her. Kira fights at first, then stops. Just endures, until her body betrays her in a moan she can't swallow.</p><<else>><p class="explicit">They take turns with her. One after another. Kira fights at first, then stops. Just endures.</p><</if>>
<<clampStat "player.lust" 40>>
<p>Hours pass. Eventually, they pass out drunk around the fire.</p>
<p>You slip in. Cut her bonds. She can barely stand.</p>
<<if setup.kiraAllowsUse()>>
<<say "Kira" "...you... you were there?">>
<p>Her voice is hoarse, wrecked. Then she laughs, a cracked, filthy sound.</p>
<<say "Kira" "The whole time? You watched all of them have me and never made a sound. ...Fuck. Fuck you. Give me a second, I can't feel my legs.">>
<<else>>
<<say "Kira" "...you... you were there?">>
<p>Her voice is hollow. Broken.</p>
<<say "Kira" "The whole time?">>
<</if>>
<<set $companions[0].trust += setup.kiraUseTrust(-10)>>
<<set $companions[0].affection += setup.kiraUseAffection(-8)>>
<<set $companions[0].submission += 25>>
<div class="choice-container">
<<vchoice "Continue" "Journey_Survival_FindKira_Rescue_Dark" "action" "forward">>
</div><<setBackground "wasteland-camp">>
<<set $flags.watchedKiraRaiderUse to true>>
<<addCorruption 15>>
<p>You wait. Watch the first raider finish with Kira.</p>
<<storyVideo "story/travel_findkira_raidercamp/watch_raiders_full">>
<<if _storyFamily is "sf_cg_travel_findkira_raidercamp_02">><p class="explicit">He has her bent forward, both arms wrenched back behind her, then his fist in her hair, and he grunts, slamming hard into her ass. Then he pulls out. Cum drips down her thighs.</p><<else>><p class="explicit">He grunts, thrusting hard, then pulls out. Cum drips down her thighs.</p><</if>>
<<clampStat "player.lust" 30>>
<p>The others are drunk. Distracted by their own turn coming up.</p>
<p>Now. While they're changing places.</p>
<p>You strike from the shadows. Fast. Brutal. Three raiders down before they know what's happening. The fourth runs.</p>
<<if setup.kiraAllowsUse()>>
<p>Kira stares at you as you cut her bonds, and then her mouth curves.</p>
<<say "Kira" "You... waited. You let him finish first.">>
<p>It's not a question. It sounds a lot like thanks.</p>
<<else>>
<p>Kira stares at you as you cut her bonds.</p>
<<say "Kira" "You... waited.">>
<p>It's not a question.</p>
<</if>>
<<set $companions[0].trust += setup.kiraUseTrust(-4)>>
<<set _bondsAlreadyCut to true>>
<div class="choice-container">
<<vchoice "Continue" "Journey_Survival_FindKira_Rescue" "action" "forward">>
</div><<setBackground "reclaimed-ruins">>
<p>You move silently through the clutter. Years of survival in the Reclaimed have made you good at this.</p>
<p>The female scavenger is absorbed in sorting loot. The male is half-asleep.</p>
<p>You reach Kira. Her eyes widen when she sees you, but she's smart enough not to react.</p>
<p>You work at her bonds. One knot. Two.</p>
<<say "Scavenger M" "Huh? What—">>
<p>He's spotted you. But it's too late. Kira's free.</p>
<p>She grabs the nearest heavy object—a wrench—and swings.</p>
<p>The male goes down. The female reaches for a weapon.</p>
<<say "Kira" "Don't.">>
<p>The female freezes. Looks at the two of you. Makes a calculation.</p>
<<say "Scavenger F" "Fine. Take her. I don't need the trouble.">>
<p>You back out slowly, Kira covering you with the wrench.</p>
<<set _bondsAlreadyCut to true>>
<div class="choice-container">
<<vchoice "Continue" "Journey_Survival_FindKira_Rescue" "action" "forward">>
</div><<setBackground "reclaimed-ruins">>
<p>You search the cluttered space. Find a rusty pipe.</p>
<p>Better than nothing.</p>
<p>You approach from behind. The male never sees it coming.</p>
<p>The female whirls, knife in hand.</p>
<<say "Scavenger F" "You son of a—">>
<p>Kira kicks the chair she's tied to backward, slamming into the female's legs. She goes down.</p>
<p>You hit her once. She stops moving.</p>
<p>You cut Kira free.</p>
<<say "Kira" "Took you long enough.">>
<p>But there's relief in her eyes.</p>
<<set _bondsAlreadyCut to true>>
<div class="choice-container">
<<vchoice "Continue" "Journey_Survival_FindKira_Rescue" "action" "forward">>
</div><<setBackground "reclaimed-ruins">>
<p>No time. No weapons. Doesn't matter.</p>
<p>You charge.</p>
<<set _attackRoll to random(1, 100) + Math.floor(($player.strength || 10) / 2)>>
<<if _attackRoll >= 45>>
<p>The scavenger turns too late. You crash into him, sending him sprawling.</p>
<p>His head hits stone. He doesn't get up.</p>
<<say "Kira" `$player.name + "?! You're alive?!"`>>
<p>You're already working at her bonds.</p>
<div class="choice-container">
<<vchoice "Continue" "Journey_Survival_FindKira_Rescue" "action" "forward">>
</div>
<<else>>
<p>He's faster than you expected. Turns. Catches your arm. Uses your momentum against you.</p>
<p>You hit the ground hard. Before you can rise, his boot is on your throat.</p>
<<say "Scavenger" "Well, well. Boyfriend's not dead after all.">>
<p>He looks from you to Kira. Grins.</p>
<<say "Scavenger" "This is going to be fun.">>
<div class="choice-container">
<<vchoice "Continue" "Journey_Survival_FindKira_Captured" "action" "forward">>
</div>
<</if>><<setBackground "reclaimed-ruins">>
<p>You wait. Watch. Look for an opening.</p>
<p>The scavenger turns his back to you, focused entirely on Kira. His pants are already undone.</p>
<p>Now.</p>
<p>You move silent as death. Grab a chunk of rubble. Bring it down on his skull.</p>
<p>He drops without a sound.</p>
<<say "Kira" "Holy—you're ALIVE?!">>
<div class="choice-container">
<<vchoice "Continue" "Journey_Survival_FindKira_Rescue" "action" "forward">>
</div><<setBackground "reclaimed-ruins">>
<<set $flags.watchedKiraPostDeath to true>>
<<addCorruption 15>>
<p>You could intervene. You don't.</p>
<p>Some dark part of you wants to see what happens.</p>
<<storyVideo "story/travel_findkira_ruins/watch">>
<<if _storyFamily is "sf_cg_travel_findkira_ruins_03">><p class="explicit">The scavenger lets the chain down, tears the soaked vest off her and bends her over a ledge of broken tile, kicking her legs apart. She struggles, but with her wrists still bound there's nothing she can do.</p><<else>><p class="explicit">The scavenger pushes Kira's legs apart. She struggles, but tied as she is, there's nothing she can do.</p><</if>>
<<say "Kira" "No—get OFF—">>
<<if _storyFamily is "sf_cg_travel_findkira_ruins_03">><p class="explicit">He forces his cock into her ass. She screams—pain, rage, helplessness.</p><<else>><p class="explicit">He enters her roughly. She screams—pain, rage, helplessness.</p><</if>>
<<clampStat "player.lust" 30>>
<p>You watch. Your cock hardens despite—or because of—everything.</p>
<<if _storyFamily is "sf_cg_travel_findkira_ruins_03">><p class="explicit">He fucks her from behind, grunting with each thrust, dragging her head back by her hair, then folds her head-down over the ledge and keeps going. Kira's screams fade to whimpers, then to silence.</p><<else>><p class="explicit">He fucks her against the pipe, grunting with each thrust. Kira's screams fade to whimpers, then to silence.</p><</if>>
<<say "Scavenger" "Fuck yes... tight little thing...">>
<p>When he finishes, he pulls out and starts fixing his pants.</p>
<<say "Scavenger" "Good girl. Maybe I'll keep you.">>
<p>His back is to you. Vulnerable.</p>
<div class="choice-container">
<<vchoice "Kill him now" "Journey_Survival_FindKira_Watch_Kill" "action" "attack">>
<<vchoice "Wait for him to leave" "Journey_Survival_FindKira_Watch_Leave" "action" "stealth">>
</div><<setBackground "reclaimed-ruins">>
<p>You move fast. Silent. A rock in your hand.</p>
<p>He never sees it coming. The crack of stone on skull. He falls.</p>
<<storyVideo "story/travel_findkira_ruins/watch_kill">>
<<if _storyFamily is "sf_cg_travel_findkira_ruins_03">><p>Kira stares at you, eyes huge, wet hair plastered to her cheek. His fingers are still knotted in that hair where he slumped against her, and cum is still running down her thighs.</p><<else>><p>Kira stares at you. Eyes wide. Cum still dripping down her thighs.</p><</if>>
<<if setup.kiraAllowsUse()>>
<<say "Kira" "You... you were THERE?!">>
<p>She realizes. Then, slowly, a grin spreads across her face.</p>
<<say "Kira" "You WATCHED? ...You stood there in the dark and watched him fuck me. You absolute bastard.">>
<<else>>
<<say "Kira" "You... you were THERE?!">>
<p>She realizes. Horror and betrayal twist her features.</p>
<<say "Kira" "You WATCHED?!">>
<</if>>
<<set $companions[0].trust += setup.kiraUseTrust(-8)>>
<<set $companions[0].affection += setup.kiraUseAffection(-6)>>
<div class="choice-container">
<<vchoice "Continue" "Journey_Survival_FindKira_Rescue_Dark" "action" "forward">>
</div><<setBackground "reclaimed-ruins">>
<p>You stay hidden. The scavenger finishes with Kira and wanders off to piss.</p>
<p>You slip out, circle around, find him with his back turned.</p>
<p>One rock. One swing. He drops.</p>
<p>You return to Kira, approaching from a different angle as if you just arrived.</p>
<<say $player.name "Kira! Thank god—">>
<p>She looks up. Relief floods her face.</p>
<<say "Kira" "You're alive! I thought—they said you were dead—">>
<p>She doesn't know. She'll never know.</p>
<<set $flags.hidPostDeathAbuse to true>>
<div class="choice-container">
<<vchoice "Continue" "Journey_Survival_FindKira_Rescue" "action" "forward">>
</div><<setBackground "reclaimed-ruins">>
<h2><<icon "partner">> Reunion</h2>
<<storyVideo "story/travel_survival_death/find_kira_rescue">>
<<set _bondsAlreadyCut to ["Journey_Survival_FindKira_Distraction", "Journey_Survival_FindKira_Raiders_Strike", "Journey_Survival_FindKira_Watch_Raiders_Full", "Journey_Survival_FindKira_Sneak", "Journey_Survival_FindKira_Weapon"].includes(previous())>>
<<if _bondsAlreadyCut>>
<<if _storyFamily is "sf_cg_travel_survival_death_04">><p>She stumbles back into your arms and you wrap her up from behind, mouth at her neck. She sags against your chest, eyes shut, shaking.</p><<else>><p>She falls into your arms, shaking.</p><</if>>
<<else>>
<<if _storyFamily is "sf_cg_travel_survival_death_04">><p>You cut her bonds. She stumbles back into your arms and you wrap her up from behind, mouth at her neck. She sags against your chest, eyes shut, shaking.</p><<else>><p>You cut her bonds. She falls into your arms, shaking.</p><</if>>
<</if>>
<<if $clothing.player.top <= 0 && $clothing.player.bottom <= 0>>
<<say "Kira" "You're... naked. They stripped you too?">>
<<say $player.name "Everything. Took everything.">>
<</if>>
<<say "Kira" "I thought you were dead. They said you were dead. I thought...">>
<p>She's crying. Clinging to you.</p>
<<say "Kira" "Don't do that to me again. Don't you DARE.">>
<<addTrust "kira" 2>>
<<addAffection "kira" 3>>
<<set $flags.kiraMissing to false>>
<<set $clothing.kira.top to 30>>
<<set $clothing.kira.bottom to 30>>
<<set $clothing.kira.titsExposed to false>>
<<set $clothing.kira.pussyExposed to false>>
<<run setup.fishingGame.endKiraForfeit()>>
<p>You search the scavenger's body. Find a knife, some scraps of food, a torn shirt.</p>
<<run setup.fightLootStart()>>
<<run setup.postBattleTakeLoot("combat knife", "Combat Knife", 1, "", "fightLoot")>>
<<lootLeftList "fightLoot">>
<<set $player.hunger to Math.min($player.maxHunger, $player.hunger + 20)>>
<<set $clothing.player.top to 30>>
<<set $clothing.player.chestExposed to false>>
<p>It's not much. But it's a start.</p>
<div class="choice-container">
<<vchoice "\"Let's get out of here.\"" "Journey_Survival_Death_Recovery" "action" "forward">>
</div><<setBackground "reclaimed-ruins">>
<<if setup.kiraAllowsUse()>>
<h2><<icon "partner">> Reunion</h2>
<<else>>
<h2><<icon "partner">> Bitter Reunion</h2>
<</if>>
<<storyVideo "story/travel_survival_death/find_kira_rescue_dark">>
<<if setup.kiraAllowsUse()>>
<<if _storyFamily is "sf_cg_travel_survival_death_04">><p>You cut her bonds and reach for her. She slips out of your arms and walks off a few steps, naked, shoving her hair off her face, then turns round to look at you.</p><<else>><p>You cut her bonds. She doesn't fall into your arms. She shoves you back a step, hard, both hands flat on your chest.</p><</if>>
<<say "Kira" "You were RIGHT THERE! And you let me think you were dead!">>
<<say $player.name "I... I couldn't—">>
<<say "Kira" "Bullshit. You watched. You watched him—">>
<p>She can't finish. She's laughing, or crying, or both, and she wipes her face with the back of her wrist.</p>
<<say "Kira" "Don't you ever let me think you're dead again. Ever. ...The rest you can watch any time you like.">>
<<else>>
<<if _storyFamily is "sf_cg_travel_survival_death_04">><p>You cut her bonds and reach for her. She tears herself out of your arms and walks away from you, naked, shoving her hair off her face.</p><<else>><p>You cut her bonds. She doesn't fall into your arms. She shoves you away.</p><</if>>
<<say "Kira" "You were RIGHT THERE!">>
<<say $player.name "I... I couldn't—">>
<<say "Kira" "BULLSHIT! You watched! You watched him—">>
<p>She can't finish. Tears stream down her face.</p>
<<say "Kira" "Why? WHY?">>
<p>You don't have an answer she wants to hear.</p>
<</if>>
<<set $flags.kiraMissing to false>>
<<set $companions[0].submission += 20>>
<<set $clothing.kira.top to 30>>
<<set $clothing.kira.bottom to 30>>
<<set $clothing.kira.titsExposed to false>>
<<set $clothing.kira.pussyExposed to false>>
<<run setup.fishingGame.endKiraForfeit()>>
<<if setup.kiraAllowsUse()>>
<<if _storyFamily is "sf_cg_travel_survival_death_04">><p>She scrubs her face with the heel of her hand, back half turned, then knots what scraps remain around her hips and chest, glancing back at you over her shoulder while she does it.</p><<else>><p>She wipes her face. Gets dressed in what scraps remain, slowly, and lets you watch that too.</p><</if>>
<<say "Kira" "Let's go. Before more show up.">>
<p>She walks close enough that her arm keeps brushing yours.</p>
<<else>>
<<if _storyFamily is "sf_cg_travel_survival_death_04">><p>She scrubs her face with the heel of her hand, back half turned, then knots what scraps remain around her hips and chest without once looking at you.</p><<else>><p>She wipes her face. Gets dressed in what scraps remain. Won't look at you.</p><</if>>
<<say "Kira" "Let's go. Before more show up.">>
<p>The silence between you is deafening.</p>
<</if>>
<<run setup.fightLootStart()>>
<<run setup.postBattleTakeLoot("combat knife", "Combat Knife", 1, "", "fightLoot")>>
<<lootLeftList "fightLoot">>
<<set $clothing.player.top to 30>>
<<set $clothing.player.chestExposed to false>>
<div class="choice-container">
<<vchoice "Follow her" "Journey_Survival_Death_Recovery" "action" "forward">>
</div><<setBackground "reclaimed-ruins">>
<<set $flags.capturedTogether to true>>
<h2><<icon "danger">> Captured</h2>
<<storyVideo "story/travel_findkira_ruins/captured">>
<<if _storyFamily is "sf_cg_travel_findkira_ruins_03">><p>He ties you up beside Kira: you stripped bare, her in nothing but the soaked vest, both of you trussed and useless.</p><<else>><p>He ties you up next to Kira. Both of you naked. Both helpless.</p><</if>>
<<say "Scavenger" "Two for one. My lucky day.">>
<<if _storyFamily is "sf_cg_travel_findkira_ruins_03">><p>He presses up against her, grins into her face, grabs her by the waist, then looks back at you, deciding.</p><<else>><p>He looks between you, deciding.</p><</if>>
<<say "Scavenger" "Tell you what. I'll let you choose. Her, or I open you up.">>
<<say $player.name "What?">>
<<say "Scavenger" "Either she gets fucked or you get cut. Pick.">>
<div class="choice-container">
<<vchoice "\"...her.\"" "Journey_Survival_FindKira_Captured_Her" "intimate" "corruption">>
<<vchoice "Try to break free" "Journey_Survival_FindKira_Captured_Fight" "action" "strength">>
</div><<setBackground "reclaimed-ruins">>
<<addCorruption 15>>
<<set $flags.choseKiraForAbuse to true>>
<<say $player.name "...her.">>
<<if setup.kiraAllowsUse()>>
<p>Kira's head snaps round. Her pupils go wide, and she wets her lips before she can stop herself.</p>
<<else>>
<p>Kira's face goes white.</p>
<</if>>
<<say "Kira" "What?">>
<<say $player.name "I said her.">>
<p>The scavenger grins.</p>
<<say "Scavenger" "Cold. I like it.">>
<<storyVideo "story/travel_findkira_ruins/captured_her">>
<<if _storyFamily is "sf_cg_travel_findkira_ruins_03">><p class="explicit">He cuts her down, throws her on her back on the cracked floor tiles, folds her legs back and forces his cock into her ass, one hand on her throat, the other in her hair. She screams. Cries. Calls your name.</p><<else>><p class="explicit">He takes Kira while you watch. She screams. Cries. Calls your name.</p><</if>>
<p>You don't look away.</p>
<<set $companions[0].trust += setup.kiraUseTrust(-7)>>
<<set $companions[0].affection += setup.kiraUseAffection(-5)>>
<<set $companions[0].submission += 15>>
<<clampStat "player.lust" 25>>
<<if setup.kiraAllowsUse()>>
<p>When he's done, Kira turns her head on the tiles and looks straight at you, wrecked and flushed. She licks her split lip and mouths one word at you: <em>bastard.</em> She's smiling.</p>
<<else>>
<p>When he's done, Kira won't look at you. Won't speak.</p>
<</if>>
<<say "Scavenger" "Entertaining. Now what to do with you two...">>
<<if setup.kiraAllowsUse()>>
<p>He wanders off, leaving you both tied. Kira is already working at her bonds, still breathing hard.</p>
<<else>>
<p>He wanders off, leaving you both tied. Kira is already working at her bonds, rage giving her strength.</p>
<</if>>
<div class="choice-container">
<<vchoice "Continue" "Journey_Survival_FindKira_Escape" "action" "forward">>
</div><<setBackground "reclaimed-ruins">>
<p>You try to break free. Try to fight.</p>
<<say "Scavenger" "Look at that. Got some fight left.">>
<p>A boot crashes into your ribs.</p>
<<clampStat "player.health" -10 0 100>>
<<say "Scavenger" "Not anymore.">>
<p>He wanders off to take a piss. His mistake.</p>
<p>Kira has been working at her bonds. She slips free.</p>
<div class="choice-container">
<<vchoice "Continue" "Journey_Survival_FindKira_Escape" "action" "forward">>
</div><<setBackground "reclaimed-ruins">>
<h2><<icon "run">> Escape</h2>
<p>Kira frees herself, then you. Silent. Efficient.</p>
<<storyVideo "story/travel_findkira_ruins/escape">>
<<if _storyFamily is "sf_cg_travel_findkira_ruins_03">><p>She picks up a length of sharpened steel. Moves toward where the scavenger went.</p><<else>><p>She picks up a rock. Moves toward where the scavenger went.</p><</if>>
<<if _storyFamily is "sf_cg_travel_findkira_ruins_03">><p>You hear a crack. A thud. She steps back round the doorway, the steel in her fist, blood on her hands.</p><<else>><p>You hear a crack. A thud. She returns, blood on her hands.</p><</if>>
<<say "Kira" "He won't hurt anyone else.">>
<<if setup.kiraAllowsUse()>>
<p>She says it like a job done. She wipes her hands on her thighs, looks at you, and one corner of her mouth goes up.</p>
<<say "Kira" "What? He tied us up and called it his lucky day. It wasn't.">>
<<else>>
<p>Her voice is flat. Dead.</p>
<</if>>
<<set $flags.kiraMissing to false>>
<<run setup.fightLootStart()>>
<<run setup.postBattleTakeLoot("combat knife", "Combat Knife", 1, "", "fightLoot")>>
<<lootLeftList "fightLoot">>
<<set $clothing.player.top to 30>>
<<set $clothing.player.bottom to 30>>
<<set $clothing.player.chestExposed to false>>
<<set $clothing.player.dickExposed to false>>
<<set $clothing.kira.top to 30>>
<<set $clothing.kira.bottom to 30>>
<<set $clothing.kira.titsExposed to false>>
<<set $clothing.kira.pussyExposed to false>>
<<run setup.fishingGame.endKiraForfeit()>>
<<set $player.hunger to Math.min($player.maxHunger, $player.hunger + 15)>>
<div class="choice-container">
<<vchoice "Move on" "Journey_Survival_Death_Recovery" "action" "forward">>
</div><<setBackground "reclaimed-evening">>
<h2><<icon "forward">> Moving Forward</h2>
<<if $journey.deathWithKira>>
<p>You're alive. Both of you. Barely.</p>
<p>Everything you worked for is gone. Weapons. Supplies. Equipment. All stolen.</p>
<p>But you have each other. You have the clothes on your back—what little there is.</p>
<<else>>
<p>You're alive. Barely.</p>
<p>Everything you worked for is gone. Weapons. Supplies. Equipment. All stolen.</p>
<p>You have the clothes on your back—what little there is.</p>
<</if>>
<p>And you have a destination. The vault. Safety. Rebuild.</p>
<<storyVideo "story/travel_survival_death/death_recovery">>
<<if $journey.deathWithKira>>
<<if _storyClip is "55e9ae2619fb">><p>The old highway ahead is half buried under drifts of blown dust. Two small figures walk down the middle of it, you and her.</p><</if>>
<<if $flags.watchedKiraPostDeath || $flags.choseKiraForAbuse || $flags.watchedKiraGangRape || $flags.watchedKiraRaiderUse>>
<<if setup.kiraAllowsUse()>>
<<if _storyClip is "55e9ae2619fb">><p>Kira walks beside you, close enough that her arm keeps knocking yours. Every so often she looks over at you, and the corner of her mouth goes up.</p><<else>><p>Kira walks a step ahead of you, slower than she needs to, and keeps looking back to make sure you're watching her walk.</p><</if>>
<<say "Kira" "Stop looking at me like that. I know what you saw. ...Keep looking, actually. It's a long walk.">>
<<else>>
<<if _storyClip is "55e9ae2619fb">><p>Kira walks beside you. Silent. A wall between you that wasn't there before.</p><<else>><p>Kira walks ahead of you. Silent. A wall between you that wasn't there before.</p><</if>>
<p class="guilt">Some things can't be taken back.</p>
<</if>>
<<elseif $flags.capturedTogether>>
<p>Kira stays close. Whatever happened between you, you survived it together.</p>
<<say "Kira" "We don't talk about this. Ever. Understood?">>
<<else>>
<p>Kira stays close. Her hand finds yours.</p>
<<say "Kira" "We'll get it all back. We'll be okay.">>
<<addTrust "kira" 1>>
<</if>>
<</if>>
<<set $journey.destination to "vault">>
<<set $journey.active to false>>
<<set $currentLocation to "vault">>
<p>The vault is still far. But you'll make it. You have to.</p>
<div class="choice-container">
<<if setup.day4NearDeathEveningDue()>>
<<vchoice "Head back to the vault" "Day4_Evening_NearDeath" "action" "forward">>
<<else>>
<<vchoice "Head back to the vault" "Vault_Hub" "action" "forward">>
<</if>>
</div><<widget "weatherTick">>
<<set _cfg to setup.travelConfig.weather>>
<<if !$journey.weather>>
<<set $journey.weather to "clear">>
<<set $journey.weatherDuration to random(_cfg.duration.clear.min, _cfg.duration.clear.max)>>
<<set $journey.wetness to 0>>
<</if>>
<<set $journey.weatherDuration -= 1>>
<<if $journey.weatherDuration <= 0>>
<<weatherTransition>>
<</if>>
<<weatherWetnessUpdate>>
<<weatherLostCheck>>
<</widget>>
<<widget "weatherTransition">>
<<set _cfg to setup.travelConfig.weather>>
<<set _currentWeather to $journey.weather>>
<<set _roll to random(1, 100)>>
<<set _timePhase to $time.phase>>
<<set _fogChance to _cfg.fogChance.normal>>
<<if _timePhase === "dawn" || _timePhase === "evening">>
<<set _fogChance to _cfg.fogChance.dawnEvening>>
<</if>>
<<switch _currentWeather>>
<<case "clear">>
<<if _roll <= _fogChance>>
<<set $journey.weather to "fog">>
<<set $journey.weatherDuration to random(_cfg.duration.fog.min, _cfg.duration.fog.max)>>
<<else>>
<<set $journey.weather to "cloudy">>
<<set $journey.weatherDuration to random(_cfg.duration.cloudy.min, _cfg.duration.cloudy.max)>>
<</if>>
<<case "cloudy">>
<<if _roll <= _cfg.transitions.cloudy.toRain>>
<<set $journey.weather to "rain">>
<<set $journey.weatherDuration to random(_cfg.duration.rain.min, _cfg.duration.rain.max)>>
<<elseif _roll <= _cfg.transitions.cloudy.toClear>>
<<set $journey.weather to "clear">>
<<set $journey.weatherDuration to random(_cfg.duration.clear.min, _cfg.duration.clear.max)>>
<<else>>
<<set $journey.weather to "fog">>
<<set $journey.weatherDuration to random(_cfg.duration.fog.min, _cfg.duration.fog.max)>>
<</if>>
<<case "rain">>
<<if _roll <= _cfg.transitions.rain.toStorm>>
<<set $journey.weather to "storm">>
<<set $journey.weatherDuration to random(_cfg.duration.storm.min, _cfg.duration.storm.max)>>
<<else>>
<<set $journey.weather to "cloudy">>
<<set $journey.weatherDuration to random(_cfg.duration.cloudy.min, _cfg.duration.cloudy.max)>>
<</if>>
<<case "storm">>
<<if _roll <= _cfg.transitions.storm.toRain>>
<<set $journey.weather to "rain">>
<<set $journey.weatherDuration to random(_cfg.duration.rain.min, _cfg.duration.rain.max)>>
<<else>>
<<set $journey.weather to "cloudy">>
<<set $journey.weatherDuration to random(_cfg.duration.cloudy.min, _cfg.duration.cloudy.max)>>
<</if>>
<<case "fog">>
<<if _roll <= _cfg.transitions.fog.toClear>>
<<set $journey.weather to "clear">>
<<set $journey.weatherDuration to random(_cfg.duration.clear.min, _cfg.duration.clear.max)>>
<<else>>
<<set $journey.weather to "cloudy">>
<<set $journey.weatherDuration to random(_cfg.duration.cloudy.min, _cfg.duration.cloudy.max)>>
<</if>>
<<default>>
<<set $journey.weather to "clear">>
<<set $journey.weatherDuration to random(_cfg.duration.clear.min, _cfg.duration.clear.max)>>
<</switch>>
<<set $journey.weatherChanged to true>>
<<set $weather to $journey.weather>>
<<run VaultUI.setWeather($journey.weather)>>
<</widget>>
<<widget "weatherWetnessUpdate">>
<<set _wetCfg to setup.travelConfig.wetness>>
<<set _delta to _wetCfg.delta[$journey.weather] || 0>>
<<if _delta < 0>>
<<set $journey.wetness to Math.max(0, $journey.wetness + _delta)>>
<<else>>
<<set $journey.wetness to Math.min(_wetCfg.maxWetness, $journey.wetness + _delta)>>
<</if>>
<<if $journey.wetness >= _wetCfg.wetShirtThreshold && !$journey.wetShirtTriggered>>
<<set $journey.wetShirtPending to true>>
<</if>>
<</widget>>
<<widget "weatherLostCheck">>
<<set _lostCfg to setup.travelConfig.lost>>
<<set _lostChance to _lostCfg.chances[$journey.weather] || 0>>
<<if _lostChance > 0 && !$journey.isLost>>
<<set _lostRoll to random(1, 100)>>
<<if _lostRoll <= _lostChance>>
<<set $journey.isLost to true>>
<<set $journey.lostHours to random(_lostCfg.hours.min, _lostCfg.hours.max)>>
<<set $journey.totalDistance += $journey.lostHours>>
<</if>>
<</if>>
<</widget>>
<<widget "weatherSpeedModifier">>
<<set _weatherSpeedMod to setup.travelConfig.speedModifiers[$journey.weather] || 1.0>>
<</widget>>
<<widget "weatherDescription">>
<<switch $journey.weather>>
<<case "clear">>
<<set _weatherDesc to "The sky is clear.">>
<<case "cloudy">>
<<set _weatherDesc to "Clouds gather overhead.">>
<<case "rain">>
<<set _weatherDesc to "Rain falls steadily.">>
<<case "storm">>
<<set _weatherDesc to "A storm rages around you.">>
<<case "fog">>
<<set _weatherDesc to "Thick fog obscures your surroundings.">>
<<default>>
<<set _weatherDesc to "">>
<</switch>>
<<print _weatherDesc>>
<</widget>>
<<widget "weatherIcon">>
<<set _weatherIconName to "weather-" + ($journey.weather || "clear")>>
<<icon _weatherIconName>>
<</widget>>
<<widget "weatherNarrative">>
<<if $journey.weatherChanged>>
<<set $journey.weatherChanged to false>>
<<switch $journey.weather>>
<<case "clear">>
<<set _narratives to [
"The clouds part, revealing blue sky.",
"The weather clears. A welcome change.",
"Sunlight breaks through at last."
]>>
<<case "cloudy">>
<<set _narratives to [
"Clouds roll in, darkening the sky.",
"The sky grows overcast.",
"Grey clouds gather on the horizon."
]>>
<<case "rain">>
<<set _narratives to [
"Rain begins to fall.",
"The first drops hit your face. Then more.",
"It starts to rain. Of course it does."
]>>
<<case "storm">>
<<set _narratives to [
"Thunder rumbles. The storm hits hard.",
"Lightning splits the sky. The downpour intensifies.",
"The rain becomes a deluge. Wind howls around you."
]>>
<<case "fog">>
<<set _narratives to [
"Fog rolls in, thick and grey.",
"Mist rises from the ground, obscuring everything.",
"Visibility drops as fog engulfs you."
]>>
<<default>>
<<set _narratives to []>>
<</switch>>
<<if _narratives.length > 0>>
<p class="weather-change"><<print _narratives.random()>></p>
<</if>>
<</if>>
<</widget>>
<<widget "weatherLostNarrative">>
<<if $journey.isLost>>
<<set $journey.isLost to false>>
<<switch $journey.weather>>
<<case "storm">>
<<set _lostTexts to [
"The storm is blinding. You lose the trail, forced to backtrack.",
"Wind and rain drive you off course. It takes time to find your way again.",
"You shelter from the worst of it, losing precious time."
]>>
<<case "fog">>
<<set _lostTexts to [
"The fog is disorienting. Everything looks the same. You've been walking in circles.",
"You can barely see ten feet ahead. When the fog lifts, you're not where you thought.",
"Shapes loom in the mist. You dodge what might be danger, losing your way."
]>>
<<default>>
<<set _lostTexts to ["You lose your way briefly, adding time to the journey."]>>
<</switch>>
<p class="lost-warning"><<print _lostTexts.random()>></p>
<p class="stat-change negative">+<<print $journey.lostHours>> hour<<if $journey.lostHours > 1>>s<</if>> added to journey</p>
<<getJourneyCompanion>>
<<if _gc_companion && _gc_companionId === "kira">>
<<set _kiraLostComments to [
"\"Great. Just great.\"",
"\"I told you we should have waited it out.\"",
"\"...Let's just keep moving.\""
]>>
<<dialogue "Kira" "companion">><<print _kiraLostComments.random()>><</dialogue>>
<</if>>
<</if>>
<</widget>><<set $journey.wetShirtPending to false>>
<<set $journey.wetShirtTriggered to true>>
<<if !setup.journeyCompanion()>>
<<storyVideo "story/travel_wet_shirt/alone">>
<<if _storyClip is "12a7164e66af">><p>Rain hammers the broken asphalt into a skin of splashes. It soaks through your clothes. You keep your head down and walk on.</p><<else>><p>The rain soaks through your clothes. You keep your head down and walk on.</p><</if>>
<div class="choice-container">
<<vchoice "Keep moving" "Journey_Tick" "action" "forward">>
</div>
<<else>>
<<set _exhib to $exhibitionism.kira || 0>>
<<set _wsTier to _exhib < 20 ? "t0_cover" : (_exhib < 40 ? "t2_drop_arms" : (_exhib < 60 ? "show" : "t4_smooth"))>>
<<set _wsBox to setup.wetShirtBox("story/travel_wet_shirt/" + _wsTier)>>
<<set _stvClip to null>><<set _storyClip to null>>
<<if _wsBox is "road">>
<<showTravelVideo "wet_shirt">>
<<set _stvClip to _stvFile ? _stvFile.split("/").pop().replace(/\.[^.]+$/, "") : null>>
<</if>>
<<if _exhib < 20>>
<<dialogue "Kira" "companion">>Damn it! My shirt...<</dialogue>>
<<if _wsBox is "tier">><<storyVideo "story/travel_wet_shirt/t0_cover">><</if>>
<<if _stvClip is "de4307c586de">><p class="explicit">You duck into the doorway of a ruin, both dripping. The rain has soaked through her thin top, rendering it nearly transparent. Her nipples are clearly visible, hardened by the cold.</p><<elseif _stvClip is "7708780f37fe" or _stvClip is "7ee308f8e348">><p class="explicit">The squall blows over as fast as it came and the sun breaks through, but the rain has already soaked through her thin top, rendering it nearly transparent. Her nipples are clearly visible.</p><<else>><p class="explicit">The rain has soaked through her thin top, rendering it nearly transparent. Her nipples are clearly visible, hardened by the cold.</p><</if>>
<<if _storyClip is "07ed2405e523">><p>She snatches her jacket off her shoulder and drags it round her, clutching it shut over her chest, face burning red.</p><<else>><p>She crosses her arms tightly over her chest, face burning red.</p><</if>>
<<dialogue "Kira" "companion">>Don't you dare look!<</dialogue>>
<<set $companions[0].lust to Math.min(100, $companions[0].lust + 5)>>
<<addTension "kira" 10 "caught exposed in rain">>
<<elseif _exhib < 40>>
<<dialogue "Kira" "companion">>Great. Perfect. Love this.<</dialogue>>
<<if _wsBox is "tier">><<storyVideo "story/travel_wet_shirt/t2_drop_arms">><</if>>
<p class="explicit">Her wet shirt clings to every curve. There's no hiding anything now - her breasts are on display, nipples pressing hard against the soaked fabric.</p>
<<if _storyClip is "179ce8d9714e">><p>She makes a half-hearted attempt to cover herself with her jacket, then sighs and drops her arms.</p><<else>><p>She makes a half-hearted attempt to cover herself, then sighs and drops her arms.</p><</if>>
<<dialogue "Kira" "companion">>Whatever. Not like it matters at this point.<</dialogue>>
<p>She catches you looking and rolls her eyes.</p>
<<dialogue "Kira" "companion">>Yeah, yeah. Enjoy the view, I guess.<</dialogue>>
<<set $companions[0].lust to Math.min(100, $companions[0].lust + 10)>>
<<addTension "kira" 5 "resigned to being exposed">>
<<elseif _exhib < 60>>
<<dialogue "Kira" "companion">>Well. The rain certainly knows how to make things interesting.<</dialogue>>
<<if _wsBox is "tier">><<storyVideo "story/travel_wet_shirt/show">><</if>>
<p class="explicit">The rain has turned her shirt into a second skin. Every detail of her tits is visible - the full swell of them, her erect nipples straining against the transparent fabric.</p>
<<if _storyClip is "81ec0fa4c83d">><p>She notices your stare and smirks, tips her head back into the rain and stretches one arm above her head. The water runs straight down her front.</p><<elseif _storyClip is "9c716eb55c6d">><p>She notices your stare and smirks, holds her canteen up over her head and empties it down her front, laughing, as if she weren't wet enough already. The motion lifts her breasts, making them even more prominent.</p><<elseif _storyClip is "86bb5170ea90">><p>She notices your stare and smirks, clasps her hands behind her back and pushes her chest out into the wind. The motion lifts her breasts, making them even more prominent.</p><<else>><p>She notices your stare and smirks, stretching her arms above her head. The motion lifts her breasts, making them even more prominent.</p><</if>>
<<dialogue "Kira" "companion">>Something catch your attention?<</dialogue>>
<p>There's no embarrassment in her voice. If anything, she seems amused.</p>
<<set $companions[0].lust to Math.min(100, $companions[0].lust + 15)>>
<<set $player.lust to Math.min(100, $player.lust + 10)>>
<<else>>
<<dialogue "Kira" "companion">>Mmm. There's something about rain, isn't there?<</dialogue>>
<<if _wsBox is "tier">><<storyVideo "story/travel_wet_shirt/t4_smooth">><</if>>
<p class="explicit">Her soaked shirt might as well not exist. Every curve, every detail of her breasts is on display - the way they move as she walks, her nipples hard and prominent against the clinging wet fabric.</p>
<<if _storyClip is "ed5190a9c7dc">><p>She cups her breasts through the soaked shirt, then runs her hands down her sides, smoothing the wet material against her skin. The motion is deliberate. Provocative.</p><<elseif _storyClip is "46be924362eb">><p>She hooks her fingers under the hem of the wet shirt and peels it up to her chest, holds it there, then lets it fall. The motion is deliberate. Provocative.</p><<elseif _storyClip is "5b10b8d98dc7">><p>She peels the soaked shirt up over her breasts and holds it there, skin shining with rain. "I could just take it off." The motion is deliberate. Provocative.</p><<elseif _storyClip is "701dafd640d3">><p>She runs her hands over her breasts, smoothing the wet material against her skin while the rain runs down her front. The motion is deliberate. Provocative.</p><<elseif _storyClip is "f04ab1dc9db5">><p>She grabs the hem of the soaked shirt and drags it up over her breasts, holds it there a moment and grins. The motion is deliberate. Provocative.</p><<else>><p>She runs her hands down her sides, smoothing the wet material against her skin. The motion is deliberate. Provocative.</p><</if>>
<<dialogue "Kira" "companion">>You know, I could just take it off. Let it dry properly.<</dialogue>>
<p>Her eyes meet yours, a challenge in them.</p>
<<dialogue "Kira" "companion">>Unless you'd rather I stay like this. Watching you try not to stare is pretty entertaining.<</dialogue>>
<<set $companions[0].lust to Math.min(100, $companions[0].lust + 20)>>
<<set $player.lust to Math.min(100, $player.lust + 15)>>
<<addTension "kira" -5 "enjoying the attention">>
<</if>>
<div class="choice-container">
<<vchoice "Keep moving" "Journey_Tick" "action" "forward">>
</div>
<</if>><<run VaultUI.setTimeOfDay($time.phase)>>
<<if !$currentLocation || !$worldMap.nodes[$currentLocation]>>
<<set $currentLocation to "vault">>
<</if>>
<<set _mapBackgrounds to {
"vault": "prelude/vault-exterior",
"overgrown_ruins": "reclaimed-ruins/reclaimed-ruins_neutral",
"raider_camp": "exterior/raider_camp_exterior",
"crossroads_central": "reclaimed-crossroads/crossroads_central",
"pleasure_den": "exterior/pleasure_den",
"outpost": "exterior/market_day",
"convoy": "exterior/the_crossway",
"market": "exterior/market_day",
"the_crossway": "exterior/the_crossway",
"lake_house": "fishers_rest/fishers_rest_lakeside",
"fishers_rest": "fishers_rest/fishers_rest_lakeside",
"crossroads_west": "exterior/farmstead_day",
"chemical_plant": "exterior/chemical_plant_day",
"nomad_route": "exterior/nomad_route",
"crossroads_east": "exterior/eastern_ruins_day",
"stalker_nest": "exterior/stalker_nest_exterior",
"verdant_outpost": "exterior/verdant_grove",
"greenhollow": "exterior/verdant_grove",
"crossroads_north": "exterior/northern_gate",
"hospital_ruins": "exterior/hospital_ruins",
"crossroads_south": "exterior/the_crossing",
"mutant_colony": "exterior/warren_entrance"
}>>
<<set _bgPath to _mapBackgrounds[$currentLocation]>>
<<if _bgPath>>
<<run VaultUI.setBackground(_bgPath)>>
<<else>>
<<set _bgNode to $worldMap.nodes[$currentLocation]>>
<<run VaultUI.setBackgroundDirect(_bgNode.previewImage || window.mapTerrainPreview(_bgNode.terrain))>>
<</if>>
<<run (function() {
var currentLoc = State.variables.currentLocation || 'vault';
State.variables.mapTravelTimes = {};
for (var nodeId in State.variables.worldMap.nodes) {
if (nodeId === currentLoc) continue;
State.variables.mapTravelTimes[nodeId] = setup.tripHours(currentLoc, nodeId);
}
})()>>
<h2><<icon "map">> Beyond the Vault</h2>
<<if $currentLocation === "vault" && setup.day4RuinsPending() && !($journey && $journey.active)>>
<div class="map-warning map-story-hint">
<span class="warning-icon"><<icon "map">></span>
<span class="warning-text">The pull leads to the <strong>Overgrown Ruins</strong>. Pick them on the map or in the list below.</span>
</div>
<<done>><<run window.showLocationInfo("overgrown_ruins")>><</done>>
<</if>>
<<set _currentWeather to ($journey && $journey.active && $journey.weather) ? $journey.weather : ($weather || 'clear')>>
<<set _weatherData to {
clear: { name: "Clear Skies", icon: "weather-clear", desc: "Good visibility", effect: "Normal travel" },
fog: { name: "Dense Fog", icon: "weather-fog", desc: "Low visibility", effect: "Navigation harder" },
rain: { name: "Rainfall", icon: "weather-rain", desc: "Wet conditions", effect: "Slower movement" },
storm: { name: "Storm", icon: "lightning", desc: "Dangerous", effect: "High risk" },
dust: { name: "Dust Storm", icon: "alert", desc: "Hazardous", effect: "Exposure damage" }
}>>
<<set _weather to _weatherData[_currentWeather] || _weatherData.clear>>
<div class="map-layout-wrapper">
<div class="world-map-container">
<img src="media/backgrounds/map-vault-area-compressed.webp" class="world-map-img" alt="The Reclaimed Map">
<div class="map-particles" id="map-particles">
<div class="map-particle"></div>
<div class="map-particle"></div>
<div class="map-particle"></div>
<div class="map-particle"></div>
<div class="map-particle"></div>
<div class="map-particle"></div>
<div class="map-particle"></div>
<div class="map-particle"></div>
</div>
<div @class="'map-time-overlay phase-' + $time.phase" id="map-time-overlay"></div>
<<set _mapWeather to ($journey && $journey.active && $journey.weather) ? $journey.weather : ($weather || 'clear')>>
<div @class="'map-weather-overlay weather-' + _mapWeather" id="map-weather-overlay">
<div class="storm-lightning-bolt">
<svg viewBox="0 0 50 120" preserveAspectRatio="none">
<path d="M25 0 L35 35 L28 35 L40 70 L30 70 L50 120 L20 65 L30 65 L15 35 L25 35 Z"/>
</svg>
</div>
<div class="storm-lightning-bolt bolt-2">
<svg viewBox="0 0 50 120" preserveAspectRatio="none">
<path d="M25 0 L35 35 L28 35 L40 70 L30 70 L50 120 L20 65 L30 65 L15 35 L25 35 Z"/>
</svg>
</div>
</div>
<div class="map-route-preview" id="map-route-preview">
<svg viewBox="0 0 100 100" preserveAspectRatio="none">
<path id="route-path" class="map-route-line" d=""></path>
</svg>
</div>
<<worldMapMarkers>>
<div class="map-legend">
<div class="map-legend-item"><span class="legend-dot safe"></span> Safe</div>
<div class="map-legend-item"><span class="legend-dot low"></span> Low</div>
<div class="map-legend-item"><span class="legend-dot medium"></span> Medium</div>
<div class="map-legend-item"><span class="legend-dot high"></span> High</div>
<div class="map-legend-item"><span class="legend-dot extreme"></span> Extreme</div>
</div>
<div id="map-info-panel" class="map-info-panel">
<div class="map-info-content">
<div class="map-info-text">
<div class="map-info-title" id="map-info-title">Location Name</div>
<div class="map-info-description" id="map-info-desc">Description here</div>
<div class="map-info-stats">
<span class="map-info-stat" id="map-info-danger"><<icon "alert">> Danger</span>
<span class="map-info-stat" id="map-info-time"><<icon "clock">> Travel Time</span>
</div>
</div>
<div class="map-info-image">
<img id="map-info-img" src="media/backgrounds/vault/vault_neutral.webp" alt="Location preview">
</div>
</div>
<button id="map-travel-btn" class="map-travel-btn" onclick="window.travelToLocation()">
<<icon "journey">> Travel Here
</button>
</div>
</div>
</div>
<<set _playerCritical to $player.health < 20>>
<<set _companionCritical to $expeditionCompanion === "kira" && setup.kiraWithYou() && $companions[0].health < 20>>
<<set _travelBlocked to _playerCritical || _companionCritical>>
<<set _injuryAway to $currentLocation !== "vault">>
<<set _hungerLockText to setup.starvingTravelLockText()>>
<<set _hungerLock to setup.starvingTravelLock()>>
<<if _travelBlocked>>
<div class="map-warning critical">
<span class="warning-icon"><<icon "alert">></span>
<span class="warning-text">
<<if _injuryAway>>
<<if _playerCritical && _companionCritical>>
You and Kira are too injured to go on. You can still get the two of you home to the vault.
<<elseif _playerCritical>>
You are too injured to go on. You can still limp home to the vault.
<<else>>
Kira is too injured to go on. You can still get her home to the vault.
<</if>>
<<elseif _playerCritical && _companionCritical>>
You and Kira are too injured to travel. Rest and recover first.
<<elseif _playerCritical>>
You are too injured to travel. Rest and recover first.
<<else>>
Kira is too injured to travel. Let her rest and recover first.
<</if>>
</span>
</div>
<<elseif $player.health < 50>>
<div class="map-warning">
<span class="warning-icon"><<icon "alert">></span>
<span class="warning-text">Your health is low. Consider the medical bay or resting before traveling.</span>
</div>
<</if>>
<<if _hungerLockText>>
<div class="map-warning critical hunger-lock">
<span class="warning-icon"><<icon "alert">></span>
<span class="warning-text"><<= _hungerLockText>></span>
</div>
<</if>>
<div class="map-destinations">
<h3>Available Destinations</h3>
<<set _destinations to []>>
<<for _nodeId, _node range $worldMap.nodes>>
<<if _nodeId !== $currentLocation>>
<<set _isUnlocked to true>>
<<set _isRevealed to $mapExploration.revealed[_nodeId] || $mapExploration.visited[_nodeId]>>
<<if _nodeId === "fishers_rest" && _hungerLock && _hungerLock.onlyFishers>><<set _isRevealed to true>><</if>>
<<if _node.unlockDay && $time.day < _node.unlockDay>>
<<set _isUnlocked to false>>
<</if>>
<<if _node.implemented === false>>
<<set _isUnlocked to false>>
<</if>>
<<if _isUnlocked>>
<<set _travelTime to $mapTravelTimes[_nodeId] || 2>>
<<set _storyLockReason to setup.placeEntryLock(_nodeId)>>
<<set _isStoryLocked to !!_storyLockReason>>
<<run _destinations.push({
id: _nodeId,
node: _node,
isRevealed: _isRevealed,
isVisited: $mapExploration.visited[_nodeId] || false,
travelTime: _travelTime,
isStoryLocked: _isStoryLocked,
storyLockReason: _storyLockReason
})>>
<</if>>
<</if>>
<</for>>
<<run _destinations.sort(function(a, b) {
if (a.isRevealed && !b.isRevealed) return -1;
if (!a.isRevealed && b.isRevealed) return 1;
return a.node.name.localeCompare(b.node.name);
})>>
<<set _undiscoveredCount to setup.mapUndiscoveredIds().filter(function (id) {
return !_destinations.some(function (d) { return d.id === id && d.isRevealed; });
}).length>>
<<for _dest range _destinations>>
<<if _dest.isRevealed>>
<<set _destLock to setup.travelLock(_dest.id)>>
<div @class="'destination-option' + (_destLock || _dest.isStoryLocked ? ' disabled' : '')">
<div class="dest-info">
<span class="dest-name">
<<if _dest.isVisited>><<icon "check">><</if>>
<<print _dest.node.name>>
</span>
<span class="dest-stats">
<span @class="'danger-' + (_dest.node.danger)"><<print _dest.node.danger>></span>
| <<print _dest.travelTime>> hr<<if _dest.travelTime !== 1>>s<</if>>
</span>
</div>
<<if _dest.node.type === "location" || _dest.node.type === "home">>
<<if _dest.isStoryLocked>>
<span class="travel-disabled"><<print _dest.storyLockReason>></span>
<<elseif _destLock>>
<span class="travel-disabled"><<= _destLock>></span>
<<else>>
<<capture _dest>>
<<link "Travel">>
<<run setup.noteStarvingFishTrip(_dest.id)>>
<<startJourney _dest.id>>
<<goto "Journey_Start">>
<</link>>
<</capture>>
<</if>>
<</if>>
</div>
<</if>>
<</for>>
<<if _undiscoveredCount > 0>>
<div class="destination-option undiscovered">
<div class="dest-info">
<span class="dest-name">??? (<<print _undiscoveredCount>> Undiscovered)</span>
<span class="dest-stats">Explore to reveal</span>
</div>
</div>
<</if>>
</div>
<div class="choice-container">
<<set _reenter to setup.reenterPlacePassage()>>
<<if _reenter>>
<<set _reenterName to $worldMap.nodes[$currentLocation].name>>
<<vchoice `"Back into " + _reenterName` _reenter "move" "door-handle">>
<</if>>
<<if $currentLocation !== "vault">>
<<vchoice "Return to Vault" "Journey_ReturnToVault" "action" "house">>
<<else>>
<<vchoice "Enter Vault" "Vault_Hub" "action" "house">>
<</if>>
</div><<widget "worldMapMarkers">>
<<for _nodeId, _node range $worldMap.nodes>>
<<set _markerStyle to "left: " + _node.x + "%; top: " + _node.y + "%;">>
<<set _markerClass to "map-marker type-" + _node.type + " danger-" + _node.danger>>
<<if $currentLocation === _nodeId>><<set _markerClass to _markerClass + " current-location">><</if>>
<<set _onclick to "showLocationInfo('" + _nodeId + "')">>
<<if _node.type === "home">>
<div @class="_markerClass" @style="_markerStyle" @onclick="_onclick">
<div class="map-marker-icon"><<if _node.icon>><<icon _node.icon>><</if>><<if _nodeId === 'vault'>><<icon "vault">><</if>></div>
<span class="map-marker-label"><<print _node.name>></span>
</div>
<<elseif _node.type === "location" || _node.type === "junction">>
<<set _dayUnlocked to (!_node.unlockDay || $time.day >= _node.unlockDay)>>
<<if ($mapExploration.revealed[_nodeId] || $mapExploration.visited[_nodeId]) && _dayUnlocked>>
<div @class="_markerClass" @style="_markerStyle" @onclick="_onclick">
<div class="map-marker-icon"><<if _node.icon>><<icon _node.icon>><</if>></div>
<span class="map-marker-label"><<print _node.name>></span>
</div>
<</if>>
<</if>>
<</for>>
<div class="map-fog" id="map-fog"></div>
<<script>>
$(document).one(':passageend', function() {
var fog = document.getElementById('map-fog');
if (!fog) return;
var visited = State.variables.mapExploration.visited;
var nodes = State.variables.worldMap.nodes;
var masks = ['radial-gradient(ellipse 55% 35% at 70% 92%, transparent 0%, black 100%)'];
for (var nodeId in nodes) {
var node = nodes[nodeId];
if (visited[nodeId] && typeof node.x === 'number' && typeof node.y === 'number') {
masks.push('radial-gradient(circle at ' + node.x + '% ' + node.y + '%, transparent 0%, transparent 8%, black 15%)');
}
}
var maskValue = masks.join(', ');
fog.style.webkitMaskImage = maskValue;
fog.style.maskImage = maskValue;
fog.style.webkitMaskComposite = 'intersect';
fog.style.maskComposite = 'intersect';
if (window.MapRoutePreview) {
window.MapRoutePreview.init();
}
});
<</script>>
<</widget>>
<<widget "markLocationVisited">>
<<set _locId to _args[0]>>
<<if _locId && $mapExploration.visited[_locId] !== undefined>>
<<set $mapExploration.visited[_locId] to true>>
<<set $mapExploration.revealed[_locId] to true>>
<<if $worldMap.nodes[_locId] && $worldMap.nodes[_locId].connections>>
<<for _connId range $worldMap.nodes[_locId].connections>>
<<set _connNode to $worldMap.nodes[_connId]>>
<<if _connNode && !_connNode.storyLocked>>
<<set $mapExploration.revealed[_connId] to true>>
<</if>>
<</for>>
<</if>>
<<set _visitedCount to 0>>
<<for _key, _val range $mapExploration.visited>>
<<if _val>><<set _visitedCount++>><</if>>
<</for>>
<<if _visitedCount >= 6>>
<<set $mapExploration.viewportLevel to 4>>
<<set $mapExploration.fogCleared.zone4_outer to true>>
<<elseif _visitedCount >= 4>>
<<set $mapExploration.viewportLevel to 3>>
<<set $mapExploration.fogCleared.zone3_central to true>>
<<elseif _visitedCount >= 2>>
<<set $mapExploration.viewportLevel to 2>>
<<set $mapExploration.fogCleared.zone2_crossroads to true>>
<</if>>
<</if>>
<</widget>>
<<widget "completeExpedition">>
<<set $mapExploration.expeditionsCompleted++>>
<<set $journeyHistory.completedJourneys++>>
<</widget>><<setBackground "reclaimed-ruins">>
<h2>Road Toll</h2>
<<set $vault.scrap to Math.max(0, ($vault.scrap || 0) - 10)>>
<p>You count ten scrap into a grimy palm, piece by piece. It feels like more.</p>
<<if $journey.encounter && $journey.encounter.scavengerFemale>>
<<say "Scavenger" "Pity. I'd have made you a better deal.">>
<p>She pockets it, steps aside, and watches you go with the rifle resting on her shoulder.</p>
<<else>>
<<say "Scavenger" "Smart. Now get moving before I change my mind.">>
<</if>>
<<if setup.kiraWithYou()>>
<<say "Kira" "Ten scrap for a man with a gun. We're getting robbed politely now.">>
<</if>>
<div class="choice-container">
<<vchoice "Continue" "Travel_Continue" "action" "map">>
</div><<setBackground "reclaimed-ruins">>
<<set _scvRide to $player.lust >= 60 || ($player.lust >= 30 && random(1, 2) === 1)>>
<<set _scvScene to setup.scavToll.pick(_scvRide ? "ride" : "face", $journey.encounter && $journey.encounter.scavengerClip)>>
<<set $flags.paidScavengerToll to true>>
<h2>The Toll</h2>
<p class="explicit">She marches you off the road at gunpoint into the first ruin that still has a roof and three walls, and kicks the door shut behind you.</p>
<<if _scvScene is "db_w1" or _scvScene is "db_w3">>
<p>Then she drags the sun-bleached blonde wig off her head and tosses it on a chair. Underneath, her own hair is <<if _scvScene is "db_w1">>a tumble of auburn curls<<else>>long and dark<</if>>.</p>
<<say "Scavenger" "Nobody shoots the blonde first. Learned that the hard way.">>
<</if>>
<<if setup.scavToll.has(_scvScene, "lead")>>
<<run setup.scavToll.begin("lead", _scvScene)>><<storyVideo "story/travel_scavenger_toll/lead">><<run setup.scavToll.end("lead")>>
<<if _scvScene is "alura">>
<p class="explicit">She doesn't wait for you to lie down. She plants a hand on your chest and shoves, and you go down hard on the cracked tiles of a dead kitchen. She climbs over you and looks down at you along the length of her body like you're something she found on the road and decided to keep.</p>
<<else>>
<p class="explicit">It's what's left of a roadside motel room, the mattress still on the frame, a lamp she's wired to a battery. She doesn't wait for you to lie down. She shoves you, hard, and you go over backwards onto the bed; then she's on top of you in her tank top and jeans, knees either side of your hips, and she catches your wrists and slams them down above your head. Her mouth finds yours. It isn't a kiss so much as a claim: teeth, tongue, the taste of dust and gun oil.</p>
<</if>>
<<else>>
<p class="explicit">She shoves you down and stands over you, taking her time, looking at what she's bought.</p>
<</if>>
<<say "Scavenger" "Hands stay where I put them. Move them and I stop being nice.">>
<<if _scvRide>>
<<run setup.scavToll.begin("ride", _scvScene)>><<storyVideo "story/travel_scavenger_toll/ride">><<run setup.scavToll.end("ride")>>
<<performSexAct "position_cowgirl">>
<<if _scvScene is "coh">>
<p class="explicit">She peels off the tank top, shoves her jeans down and kicks them away. She takes your cock in her fist, lines it up and sinks down on it in one long push, until she's sitting on your hips with all of you inside her. She lets out a breath like she's just set down a heavy pack.</p>
<<if _storyClip is "26dd75a021b9">>
<p class="explicit">You watch yourself disappear into her, over and over, her pussy stretched wet and tight around your shaft. When your hand creeps to her hip she lets it stay. When you try to thrust up to meet her, she flattens a palm on your chest and pins you, and sets the pace herself.</p>
<<elseif _storyClip is "fc3d5b4beb19">>
<p class="explicit">She drops forward onto her hands and rides you like that, her mouth on yours, her hair a curtain round both your faces with that one pink streak stuck to her cheek. Your hand finds the small of her back. She lets it stay. She grinds down harder.</p>
<<else>>
<p class="explicit">Then she sits up straight and rides you. Hard, for herself, her pussy hot and so wet you can hear it every time she drops. Her tits bounce. Sweat glues that pink streak to her cheek. When you try to thrust up to meet her, she flattens a palm on your chest and pins you, and sets the pace herself.</p>
<</if>>
<<elseif _scvScene is "alura">>
<p class="explicit">She yanks her top down under a pair of enormous tits and hikes her skirt to her waist, and there's nothing on under it. She straddles you right there on the tiles, takes your cock in her hand and sits down on it, all the way, with a groan that echoes off the empty room.</p>
<p class="explicit">Then she rides you, knees spread wide, bouncing hard enough that those tits slap together, one hand between her legs rubbing her clit while your cock slides in and out of her. She never takes her eyes off you.</p>
<<elseif _scvScene is "phoenix">>
<p class="explicit">Under the jacket she's in a scrap of black top and torn fishnets with the crotch ripped out. She squats over you and sinks down on your cock, and in the blue glow of a scavenged lantern you watch every inch of you go into her.</p>
<p class="explicit">Then she rides you, legs spread wide in those fishnets, grinding and bouncing, rubbing her clit, smiling down at you like she's won something.</p>
<<elseif _scvScene is "dvf">>
<p class="explicit">Under the jacket she's in black lingerie she must have looted from some dead city, cups barely holding her tits. She straddles you and sits down on your cock, all the way, and starts to ride.</p>
<p class="explicit">From where you lie there's nothing in the world but her: her pussy swallowing your cock, her heavy tits spilling out of the lace, her mouth falling open.</p>
<<else>>
<p class="explicit">She strips off everything below the waist, straddles your hips, takes your cock in her fist and sinks down on it in one long push. Then she rides you, hard, for herself, and when you try to thrust up to meet her she pins your chest with one palm and sets the pace herself.</p>
<</if>>
<<say "Scavenger" "Ten scrap. You'd have been cheaper, you know that?">>
<p class="explicit">She grinds down on you until she comes, thighs locked round your hips, nails dragging across your chest, and then she keeps going, rolling her hips with a lazy, cruel little smile, until you can't hold it and you come deep inside her.</p>
<p class="explicit">She climbs off while you're still twitching, wipes the mess off her thighs with your shirt and gets dressed.</p>
<<set $player.lust to 10>><<run setup.playerReleased()>>
<<else>>
<<run setup.scavToll.begin("face", _scvScene)>><<storyVideo "story/travel_scavenger_toll/face">><<run setup.scavToll.end("face")>>
<<performSexAct "oral_give">>
<<say "Scavenger" "Don't flatter yourself. Your cock stays in your pants. I want your mouth.">>
<<if _scvScene is "alura">>
<p class="explicit">She hikes her dress up and drops straight down onto your face. Her pussy covers your mouth, hot and already slick, and her weight pins your head to the tiles. Then she sits up straight, yanks her top down, and grinds on your face with those huge tits bouncing above you, your nose buried in her. Your hands come up to grab them.</p>
<<elseif _scvScene is "btaw">>
<<if _storyClip is "4042b02accbb">>
<p class="explicit">She turns her back on you to do it: skirt shoved up round her waist, a black thong pulled aside, and she sits her ass right down on your face. You grab two handfuls of it and hold on while she grinds her pussy against your mouth.</p>
<<else>>
<p class="explicit">She pulls her top off, pushes her glasses up her nose like she's about to read you, and sits down on your face. Upright, all her weight on your mouth, she grabs her own tits and throws her head back. Your hands find them too. She lets you.</p>
<</if>>
<<elseif _scvScene is "db_w1">>
<p class="explicit">She's in sheer black mesh and stockings under the jacket. She lowers herself onto your face slowly, making you wait for it, and settles her pussy on your mouth. Then she sits there looking down at you with her curls falling round her face, and rubs her clit while you lick her.</p>
<<elseif _scvScene is "db_w3">>
<p class="explicit">She's in a black leather corset under the jacket. She plants her ass on your face and reaches back to spread herself open over your mouth with her fingers, and you can't see anything but her.</p>
<<else>>
<p class="explicit">She lowers herself onto your face and sits. Her pussy covers your mouth, hot and already slick, smelling of sweat and road. Her weight pins your head to the floor. You can't see anything but her.</p>
<</if>>
<<say "Scavenger" "Tongue. Now. And don't you dare stop.">>
<p class="explicit">You lick her and she rides your face like she owns it, rolling her hips and grinding her clit against your tongue. Every time you come up for air she sits back down. When she comes, her thighs clamp over your ears and she shudders against your mouth, loud and long and utterly unashamed.</p>
<p class="explicit">Then she gets up and leaves you there, flat on your back, face soaked, cock straining against your trousers.</p>
<<say "Scavenger" "That's the toll. You can take care of that on your own time.">>
<<clampStat "player.lust" 25>>
<</if>>
<<if setup.kiraWithYou()>>
<p class="narrator">Kira is waiting on the road with her arms folded. She heard every second of it.</p>
<<if _scvRide>>
<<say "Kira" "Well. You paid in full. Loudly.">>
<<else>>
<<say "Kira" "You've got something on your face. No. All of it. Your whole face.">>
<</if>>
<<clampStat "companions[0].lust" 15>>
<<addTension "kira" 10>>
<</if>>
<div class="choice-container">
<<vchoice "Continue" "Travel_Continue" "action" "map">>
</div><<set _scvTrust to $companions[0].trust >= 60>>
<<set _scvCorrupt to ($companions[0].corruption || 0) >= 10>>
<<if !_scvTrust && !_scvCorrupt>><<goto "Journey_Encounter_Scavenger_KiraRefuses">><<else>>
<<setBackground "reclaimed-ruins">>
<<set _scvScene to setup.scavToll.pick("kira")>>
<<set $flags.kiraPaidScavengerToll to true>>
<h2>Her Toll</h2>
<p>You look at Kira. She looks back at you for a long moment.</p>
<<if _scvCorrupt>>
<<say "Kira" "Honestly? I've had worse offers.">>
<p class="explicit">She wets her lips and walks right past you to him, hips swinging, and you can't tell whether she's doing it for you or for herself. You're not sure she can either.</p>
<<else>>
<<say "Kira" "Fine. One time. Don't watch me like that.">>
<p>She squeezes your hand once, hard enough to hurt, and lets go.</p>
<<say "Kira" "And don't you dare say sorry after.">>
<</if>>
<<if setup.scavToll.has(_scvScene, "kira_suck")>>
<<say "Scavenger" "Mouth first. I want to see what I'm paying for.">>
<<run setup.scavToll.begin("kira_suck", _scvScene)>><<storyVideo "story/travel_scavenger_toll/kira_suck">><<run setup.scavToll.end("kira_suck")>>
<<if _scvScene is "k_ph">>
<p class="explicit">She kneels in front of him on a filthy patterned carpet. He pulls his cock out and strokes it in her face, and she licks his balls, then takes him in her mouth, deep, while he works himself over her tongue.</p>
<<elseif _scvScene is "k_hbl">>
<p class="explicit">He pushes two fingers into her mouth first, just to see if she'll let him. She does. Then she's on all fours on a bed somebody left made up in the ruin, his cock down her throat, his fist in her hair, drool pouring off her chin every time he drags her off it.</p>
<<elseif _scvScene is "k_cge">>
<p class="explicit">He lays her on her back across a table with her head hanging off the edge and fucks her throat upside down, balls on her face, drool running up over her cheeks and into her hair.</p>
<</if>>
<<if _scvCorrupt>>
<p class="explicit">She moans around him. She means it.</p>
<<else>>
<p class="explicit">She does it with her eyes screwed shut, like it's a job. Her thighs are pressed together anyway.</p>
<</if>>
<</if>>
<<run setup.scavToll.begin("kira", _scvScene)>><<storyVideo "story/travel_scavenger_toll/kira">><<run setup.scavToll.end("kira")>>
<<if _scvScene is "k_ph">>
<p class="explicit">Then he walks her out onto a broken balcony, bends her over the rusted railing with the whole empty sky behind her and shoves his cock into her from behind. She grips the rail with both hands and cries out every time he drives in.</p>
<<elseif _scvScene is "k_hbl">>
<p class="explicit">Then he pushes her down on the bed and takes her from behind, one hand fisted in her hair, the other on her ass, fucking her so hard her face drives into the sheets. Her hair's soaked with sweat. Her mouth hangs open.</p>
<<elseif _scvScene is "k_cge">>
<p class="explicit">Then he bends her over the table, hoists one of her legs up onto it, spits on her ass and works his cock into it while she swears at him through her teeth. He grabs her throat and pulls her head back so you can see her face while he fucks her ass.</p>
<<else>>
<p class="explicit">He bends her over the nearest thing that'll hold her weight, drags her trousers down to her knees and shoves his cock into her from behind.</p>
<</if>>
<<say "Kira" "Just— get it over with.">>
<p class="explicit">He fucks her like he's collecting a debt, slamming into her so hard it rocks her forward every time. She grits her teeth, then bites her lip, then gives up and moans, and the sound of it goes straight to your cock.</p>
<<say "Kira" "Fuck. Fuck, fine, don't— don't stop, you bastard—">>
<<if setup.scavToll.has(_scvScene, "kira_cum")>>
<<run setup.scavToll.begin("kira_cum", _scvScene)>><<storyVideo "story/travel_scavenger_toll/kira_cum">><<run setup.scavToll.end("kira_cum")>>
<<if _scvScene is "k_ph">>
<p class="explicit">When he's close he pulls out and puts her back on her knees on the carpet. He jerks himself over her open mouth until he comes, all over her tongue and cheek, and she takes it, then sucks him clean while it drips off her chin.</p>
<<else>>
<p class="explicit">When he's close he pulls out and rolls her onto her side. She lies there with her tongue out and he strokes himself over her face until he comes, in her mouth and across her lips and chin. She sucks the tip clean. Then, with his cum still on her lips, she smiles.</p>
<</if>>
<<else>>
<p class="explicit">He doesn't last much longer. He shoves in deep one last time with a grunt, and he's done.</p>
<</if>>
<<say "Scavenger" "Toll's paid. Pleasure doing business.">>
<p class="narrator">Kira pulls her clothes back on without hurrying and walks back to you without looking at him.</p>
<<if _scvCorrupt>>
<<say "Kira" "Don't give me that look. You liked watching. I liked being watched. We'll talk about it never.">>
<<addCorruption 5 "kira">>
<<else>>
<<say "Kira" "That's ten scrap you owe me. With interest.">>
<</if>>
<<clampStat "companions[0].lust" 20>>
<<addTension "kira" 15>>
<<clampStat "player.lust" 20>>
<div class="choice-container">
<<vchoice "Continue" "Travel_Continue" "action" "map">>
</div>
<</if>><<setBackground "reclaimed-ruins">>
<h2>No Deal</h2>
<p>You look at Kira. She's already shaking her head.</p>
<<say "Kira" "No. Fuck no. You want to sell something, sell your own ass.">>
<p>Her knife is out before he can answer.</p>
<<say "Kira" "Get your weapon up. We're paying the other way.">>
<<say "Scavenger" "Your funeral.">>
<div class="choice-container">
<<vchoice "Fight them off" "Journey_Encounter_Fight" "action" "attack">>
</div><<widget "amazonSightingEvents">>
<<set _amzEvents to []>>
<<set _amzTerrain to ($journey && $journey.currentSegment && $journey.currentSegment.terrain) || "">>
<<if (_amzTerrain === "reclaimed" || _amzTerrain === "forest") && ($time.phase === "morning" || $time.phase === "afternoon") && $time.day >= 5 && (!$flags.lastAmazonSightingDay || $time.day - $flags.lastAmazonSightingDay >= 5)>>
<<run _amzEvents.push("Travel_Amazon_Sighting")>>
<</if>>
<</widget>><<journeyTerrainBackground>>
<<set $flags.lastAmazonSightingDay to $time.day>>
<h2><<icon "search">> Over the Ridge</h2>
You crest a ridge and drop flat in the grass. Below you, a naked woman is training alone.
<<storyVideo "story/amazon_sighting/training">>
You lie there with your heart pounding into the dirt. Every time she squats, her ass spreads and tightens, and every time she drives the weight up your cock throbs against the ground. You can't look away.
She's strong enough to snap you in half. Your cock doesn't care. It's picturing those thighs clamped around your head.
<<if setup.kiraWithYou()>>
Kira slides up beside you on her belly and stares for a long moment.
<<say "Kira" "Amazon. Raider muscle. If she's training, her crew's not far off.">>
<<say "Kira" "And stop grinding on the dirt. She'll hear you drooling.">>
<</if>>
<<set $player.lust to Math.min(100, $player.lust + 5)>>
She hasn't seen you. Yet.
<div class="choice-container">
<<vchoice "Walk down to her" "Travel_Amazon_Fight" "action" "attack">>
<<vchoice "Keep watching" "Travel_Amazon_Watch" "intimate" "search">>
<<vchoice "Slip away" `$journey.returnPassage || "Journey_Event_Continue"` "action" "stealth">>
</div><<journeyTerrainBackground>>
<h2><<icon "search">> Over the Ridge</h2>
You stay down. Your cock is trapped hard against the dirt and every rep she does grinds it a little harder. You could watch those thighs work all day.
You don't get all day. She sets the weight down, straightens, and turns her head. Straight at your patch of grass.
She doesn't cover herself. She doesn't run. She picks up the bar in one hand like it weighs nothing and starts up the slope toward you.
<<if setup.kiraWithYou()>>
<<say "Kira" "Great. Now she's seen you drooling. Get up, she's coming either way.">>
<</if>>
<div class="choice-container">
<<vchoice "Stand and fight" "Travel_Amazon_Fight" "action" "attack">>
<<vchoice "Run for it" `$journey.returnPassage || "Journey_Event_Continue"` "action" "run">>
</div><<setBackground "reclaimed-combat">>
<<createEnemy "raider_amazon" "standard">>
<<set _tafEnemies to [clone(_returnEnemy)]>>
<h2>Fight!</h2>
<<if previous() === "Travel_Amazon_Watch">>
<p class="narrator">She stops ten paces off, drops the bar in the grass, and rolls her shoulders.</p>
<<else>>
<p class="narrator">She hears your boots in the grass, drops the bar, and turns.</p>
<</if>>
<<startCombat _tafEnemies `setup.roadCombatCompanion()` true>>
<div class="choice-container">
<<vchoice "Continue" "Combat_Start" "action" "forward">>
</div><<widget "checkTravelAmbient">>
<<set _taPick to null>>
<<if setup.travelAmbient && setup.travelAmbient.enabled === true>>
<<getJourneyCompanion>>
<<set _taPick to setup.travelAmbientPick(_gc_companion, _gc_companionId)>>
<</if>>
<</widget>>
<<widget "travelAmbientHome">>
<<set _taHome to ($journey && $journey.destination === "vault")>>
<</widget>><<run setup.travelAmbientFired("tits_remark")>>
<<journeyTerrainBackground>>
<h2>Running Water</h2>
<<storyVideo "events/travel_kira_tits_remark">>
<p class="narrator">You duck into a gutted house by the road to fill the canteens. The pipes in the old bathroom still cough up water. Kira sticks her head under the tap and comes up soaked, hair plastered to her neck, water running down the rag of a tank top she's knotted over her chest. It has been doing a bad job for hours.</p>
<<if _storyClip is "e44abd9688e3">>
<p class="explicit">The wet rag won't stay put. She tugs it aside, and one bare tit pops right out, nipple hard from the cold water. She giggles and tucks it back in. It lasts about two seconds.</p>
<<elseif _storyClip is "e071da519465">>
<p class="explicit">The wet cloth has gone see-through and sticks to her. She pinches it at the nipple and plucks it off her skin, laughing, water dripping off the ends of her hair onto her chest.</p>
<<else>>
<p class="explicit">Her tits have been out for hours now. Wet, they're impossible to look away from, cold water beading on them and her nipples drawn up tight and dark.</p>
<</if>>
<<say $player.name `setup.travelAmbientLine("travel_kira_tits_remark", "player_remark", true)`>>
<<say "Kira" `setup.travelAmbientLine("travel_kira_tits_remark", "kira_response", true)`>>
<<if _storyClip is "e44abd9688e3">>
<p class="narrator">The tit pops out again. This time she leaves it.</p>
<<else>>
<p class="narrator">But she doesn't cover herself.</p>
<</if>>
<<clampStat "player.lust" 5>>
<<clampStat "companions[0].lust" 8>>
<<addTension "kira" 5>>
<<relationChange "kira" "affection" 2>>
<<journeyEventReturn>><<journeyTerrainBackground>>
<h2>Hands Off</h2>
<p class="narrator">Fuck it. You reach for her tits with both hands.</p>
<p class="explicit">She catches your wrists an inch short.</p>
<<if $companions[0].lust >= 50>>
<<say "Kira" "Uh-uh. Watch.">>
<<storyVideo "events/travel_kira_tits_grope">>
<p class="explicit">She shoves what's left of her top up over her tits and grabs them herself. Squeezes. Kneads them in slow circles, fingers sinking into the soft flesh, thumbs dragging over her hard nipples. Smiling at you the whole time.</p>
<<say "Kira" "This what you wanted to do?">>
<<say $player.name "Something like that.">>
<p class="explicit">She pinches her own nipples and her breath catches. Then she takes one of your hands and presses it flat over her tit. It's warm and heavy in your palm, and her heart is going fast under it.</p>
<<say "Kira" "...okay. That's enough.">>
<p class="narrator">She lets go of your hand. You don't move it right away. She doesn't make you.</p>
<<say "Kira" "You're an asshole.">>
<<say $player.name "You liked it.">>
<<say "Kira" "...shut up.">>
<<clampStat "companions[0].lust" 15>>
<<addTension "kira" 5>>
<<relationChange "kira" "affection" 1>>
<<else>>
<<say "Kira" "Don't. Fucking. Touch me without asking.">>
<<say $player.name "I— sorry, I thought—">>
<<say "Kira" "I don't care what you thought. Hands off.">>
<<storyVideo "events/travel_kira_tits_grope">>
<p class="explicit">Then, looking you dead in the eye, she shoves what's left of her top up and grabs her own tits, squeezes them, kneads them in slow circles and smiles at you over them.</p>
<<say "Kira" "See? That's how it's done. Now you know what you're missing.">>
<p class="narrator">She drops the top and walks on. Her nipples are harder than before.</p>
<<clampStat "companions[0].lust" 8>>
<<addTension "kira" 10>>
<<relationChange "kira" "affection" -1>>
<</if>>
<<clampStat "player.lust" 12>>
<<journeyEventReturn>><<run setup.travelAmbientFired("ass_watch")>>
<<journeyTerrainBackground>>
<h2>The View</h2>
<<storyVideo "events/travel_kira_ass_watch">>
<<switch _storyClip>>
<<case "032ab0732b03">>
<p class="explicit">The road runs through a dead town, under a long concrete arcade. Kira ducks behind a pillar, peeks out at you, then walks on ahead in a short denim skirt she pulled off a mannequin two streets back. She tugs at the hem, then looks back over her shoulder and smiles.</p>
<<case "77d577e7b4a2">>
<p class="explicit">Where the road runs along an old railing, Kira plants her feet apart in a pair of tiny denim shorts and heels she found in a burnt-out car, and sticks her thumb out at the road, grinning, like one of the rusted cars along the verge might start up and stop for her.</p>
<p class="explicit">None of them do. She gives up and walks on ahead of you, hips swinging in those shorts.</p>
<<case "94e06c746219">>
<p class="explicit">At a gap in the trees she stops and stretches, arms behind her head. From down the bank all you see is sky, a sheer blue bra that hides nothing, and her ass split by a thin blue string.</p>
<<case "188aff92f873">>
<p class="explicit">A villa by the road still has water in its pool. Kira strips to a scrap of bikini and walks the wet stones along the edge ahead of you, barefoot, hands in her hair, ass swaying with every step. Halfway along she glances back over her shoulder.</p>
<<case "885b21af3410">>
<p class="explicit">On a patch of lawn behind a dead house, Kira peels off her bottoms, turns her back on you and starts unhooking her bra. Blue lace panties, stretched tight across her ass.</p>
<<case "8c8313ce9428">>
<p class="explicit">On a patch of lawn behind a dead house, Kira shoves her panties down to her thighs and bends over right in front of you, ass up under the trees, her pussy and her asshole bare in the sunlight, the blue lace stretched between her knees.</p>
<<case "56041dc82913">>
<p class="explicit">Kira hacks at the brush blocking the way, bent forward, and her scrap of a skirt rides up with every swing until her bare ass is right there at your eye level. She hasn't noticed you've stopped walking.</p>
<<case "45b213d78443">>
<p class="explicit">Kira climbs out of the pool of a dead villa with water sheeting off her and stands with her bare ass right in front of your face, wet and shining. She grabs one cheek and squeezes it.</p>
<<case "db949b4e6f76">>
<p class="explicit">In a gutted house by the road, Kira braces one hand on the tiled wall, cocks her hip in a pair of tight red shorts and looks back at you. She hooks a thumb in the waistband, tugs it down an inch over her cheek and lets it snap back.</p>
<<case "13f2c29fbc73">>
<p class="explicit">In the shell of an old house, Kira scrubs the grime off a tiled wall with a rag, bent right over, and her red shorts slide down off her ass while she works. Under them, a white mesh thong. She looks back, sees you looking, and keeps scrubbing.</p>
<<case "16f9bf2b1a8b">>
<p class="explicit">Kira comes out of a ruined washroom with her shorts soaked through and stuck to her ass. She dabs at it with a rag, grins back at you, and saunters off through the doorway.</p>
<<case "2d926e951feb">>
<p class="explicit">In the kitchen of a house by the road, somehow still whole, Kira stands at the sink with her back to you, rinsing the canteens in a pink T-shirt and nothing below it but a white thong buried between her cheeks.</p>
<<default>>
<p class="explicit">Kira walks ahead of you. What's left of her pants does nothing for her ass. Each step rolls one cheek and then the other, and your eyes follow them like a dog after a thrown stick.</p>
<</switch>>
<<if $clothing.kira.pussyExposed && (!_storyClip || _storyClip is "8c8313ce9428" || _storyClip is "45b213d78443")>>
<p class="explicit">And you can see everything. Her pussy lips peek out every time she moves, glistening with... is she wet?</p>
<p class="narrator">Fuck. She's wet.</p>
<<say "Kira" "I can feel you staring at my ass.">>
<<say $player.name "Sorry.">>
<<say "Kira" "No you're not.">>
<p class="narrator">She's right. You're not.</p>
<<say "Kira" "Just... enjoy the view, I guess. Not like I can do anything about it.">>
<p class="explicit">She shifts her hips. Is she... showing off?</p>
<<clampStat "companions[0].lust" 12>>
<<clampStat "player.lust" 15>>
<<else>>
<p class="narrator">You're mesmerized. It's impossible to focus on anything else.</p>
<<say "Kira" "Eyes up, pervert.">>
<<say $player.name "How did you—">>
<<say "Kira" "I can feel your eyes burning holes in my ass.">>
<<say $player.name "Can you blame me?">>
<<say "Kira" "...no. But you could at least pretend to have some self-control.">>
<p class="narrator">Self-control is the last thing on your mind right now.</p>
<<clampStat "companions[0].lust" 8>>
<<addTension "kira" 7>>
<<clampStat "player.lust" 12>>
<</if>>
<<journeyEventReturn>><<run setup.travelAmbientFired("comments")>>
<<journeyTerrainBackground>>
<h2>Noticed</h2>
<<storyVideo "events/travel_kira_comments_dick">>
<<if _storyClip is "b455d4967155">>
<p class="explicit">You stop in a gutted kitchen to rest your feet. Kira leans on the counter next to you, closer than she needs to, laughing at a joke she never finishes. Then her hand drops to your crotch and rubs your cock through your pants, slow, like she's weighing fruit at a market stall.</p>
<<elseif _storyClip is "e559a4b12d61">>
<p class="explicit">You step into the washroom of a dead house to piss. Kira pokes her head round the door frame, grinning, then walks right in and leans into your face, close enough that you can smell the road dust in her hair.</p>
<<else>>
<p class="narrator">Kira's eyes keep dropping to your crotch. She's trying to be subtle. Failing.</p>
<</if>>
<<say "Kira" `setup.travelAmbientLine("travel_kira_comments_dick", "kira_comment", true)`>>
<<say $player.name `setup.travelAmbientLine("travel_kira_comments_dick", "player_response", true)`>>
<<if $companions[0].lust >= 50>>
<p class="explicit">She licks her lips and squeezes her thighs together.</p>
<<say "Kira" `setup.travelAmbientLine("travel_kira_comments_dick", "kira_comment", true)`>>
<p class="narrator">Neither of you has taken a step in a full minute. The road can wait.</p>
<<clampStat "companions[0].lust" 12>>
<<addTension "kira" 8>>
<<else>>
<p class="narrator">She swallows hard and looks at the road. Ten steps later her eyes are back on your crotch.</p>
<<clampStat "companions[0].lust" 8>>
<<addTension "kira" 5>>
<</if>>
<<clampStat "player.lust" 10>>
<<journeyEventReturn>><<run setup.travelAmbientFired("offers_help")>>
<<journeyTerrainBackground>>
<h2>An Offer</h2>
<<if !setup.mediaManifestCache["events/travel_kira_offers_help"]>><<loadMediaManifest "events/travel_kira_offers_help">><</if>>
<<set _taOfferHelp to setup.mediaManifestCache["events/travel_kira_offers_help"] && setup.mediaManifestCache["events/travel_kira_offers_help"].media && setup.mediaManifestCache["events/travel_kira_offers_help"].media.length > 0>>
<<if _taOfferHelp && random(1, 6) is 1>>
<<storyVideo "events/travel_kira_offers_help">>
<<else>>
<<storyVideo "events/travel_kira_offers_blowjob">>
<</if>>
<<switch _storyClip>>
<<case "e675da54bdd9">>
<p class="explicit">You shelter for a moment in the back room of a roadside shrine, a hundred melted candle stubs still burning on an iron rack. Kira steps in close in her thin white tank, talking low, eyes on yours. Her palm slides down your stomach and rubs your cock through your pants, slow. Your hand finds her tit through the cotton. She lets it stay.</p>
<<case "dc51a1042ccd">>
<p class="explicit">Kira stops and turns to face you. She slides two of her fingers into her mouth and sucks them, slow. Then she takes your hand and sucks yours. Eyes on yours the whole time. It isn't subtle.</p>
<<default>>
<p class="narrator">Kira stops walking and stares at your cock like it owes her money. She hesitates, then speaks.</p>
<</switch>>
<<say "Kira" `setup.travelAmbientLine("travel_kira_offers_help", "offer", true)`>>
<p class="narrator"><<= setup.travelAmbientLine("travel_kira_offers_help", "hesitation")>></p>
<<clampStat "player.lust" 8>>
<div class="choice-container">
<<vchoice "\"Please. Yes. Handjob.\"" "Journey_Ambient_Kira_Handjob" "intimate" "hand">>
<<vchoice "\"I want your mouth.\"" "Journey_Ambient_Kira_Blowjob" "intimate" "lips">>
<<vchoice "\"We should wait until we get back.\"" "Journey_Ambient_Kira_OffersHelp_Decline" "action" "return">>
</div><<journeyTerrainBackground>>
<h2>Her Mouth</h2>
<<storyVideo "events/travel_kira_blowjob">>
<<if _storyClip is "0c7d8c05f3dc">>
<p class="explicit">Kira stops, turns, and drops to her knees in front of you with her top still on. She holds your eyes, takes the head in her mouth and sucks it slow and deep for a few strokes of her fist.</p>
<<elseif _storyClip is "de45f6528be1">>
<p class="explicit">Kira kneels on a sun-bleached cushion at your feet, opens her mouth wide and holds her tongue out flat, a target. You rest the tip on it and stroke yourself. She grins up at you around it.</p>
<<elseif $clothing.kira.titsExposed>>
<p class="explicit">Kira drops to her knees in front of you, tits bare, looks up at you and takes your cock in her mouth.</p>
<<else>>
<p class="explicit">Kira pulls her top off over her head and tosses it aside. Topless, on her knees, she looks up at you and takes your cock in her mouth.</p>
<</if>>
<<if _storyClip is "5d9c651cae32">>
<p class="explicit">Down in the grass, she works the head with her lips while her fist pumps the shaft, her eyes locked on yours, and she doesn't slow down for a second.</p>
<<elseif _storyClip is "b80234be910b">>
<p class="explicit">You sit back on a low ledge and she kneels between your legs. She takes you deep and sloppy, spit running down your shaft, her hair still wet and stuck to her shoulders, her eyes up on yours the whole time.</p>
<<elseif _storyClip is "8ae66c2ccf93">>
<p class="explicit">She sucks you fast and wet on her knees in the grass, her hand never stopping on the shaft, her eyes never leaving yours.</p>
<<elseif _storyClip is "0c7d8c05f3dc" or _storyClip is "de45f6528be1">>
<<else>>
<p class="explicit">She bobs her head fast, wet and sloppy, her hand stroking what she can't fit. Her eyes never leave yours.</p>
<</if>>
<p class="explicit">You won't last and she knows it; she hollows her cheeks and sucks harder.</p>
<p class="explicit">You cum in her mouth. She keeps sucking until you're empty, then pulls back and shows you: tongue out, your load pooled on it. She swallows. Keeps stroking you, slow. Smiles up at you.</p>
<<say "Kira" "You needed that. We both know it.">>
<<say $player.name "...much better.">>
<<say "Kira" "Don't read into this.">>
<<applyRelease "oral_receive">>
<<relationChange "kira" "affection" 2>>
<<relationChange "kira" "trust" 2>>
<<set $flags.kiraBlowjobTravel to true>>
<<journeyEventReturn>><<run setup.travelAmbientFired("forced_rest")>>
<<journeyTerrainBackground>>
<h2>Spent</h2>
<p class="narrator">Your legs give out. Exhaustion hits you all at once, and you go down flat on your back and stay there.</p>
<<say $player.name "Just... need a minute...">>
<p class="explicit">You're too tired to even cover yourself. Your cock is hard anyway, pointing straight up at the sky.</p>
<p class="narrator">Kira stands over you, boots planted either side of your hips, looking from your face to your cock and back.</p>
<<say "Kira" "Well. Since we're stopped anyway...">>
<<say "Kira" "Too tired to argue?">>
<p class="narrator">You can only nod.</p>
<<say "Kira" "Good.">>
<<storyVideo "events/travel_kira_mounts">>
<<if _storyClip is "bc832028c5d8">>
<p class="explicit">She strips and straddles you facing away, lines your cock up and sinks down onto it. Then she rides. Her ass slaps down on you, hard, both hands pulling her cheeks apart so you can watch your cock disappear into her.</p>
<<else>>
<p class="explicit">She strips and squats over you facing you, lines your cock up and sinks down onto it. You both moan. Then she rides you hard, her tits bouncing, her cunt gripping you on every drop.</p>
<</if>>
<<say "Kira" "Just... lie there... let me do the work.">>
<p class="explicit">You're too exhausted to do anything else. She uses you for her own pleasure, grinding down harder and harder, chasing it, until her pussy clamps on your cock and she cums with a hiss through her teeth. You go right after her.</p>
<<say "Kira" "Mmmm... there. Now you can rest.">>
<p class="narrator">She stays on top of you, your softening cock still inside her. "Five minutes," she murmurs. You drift off with her warmth around you.</p>
<<shortRest 1>>
<<applyRelease "sex_quick">>
<<relationChange "kira" "affection" 3>>
<<relationChange "kira" "trust" 2>>
<<set $flags.kiraForcedRestSex to true>>
<<journeyEventReturn>><<run setup.travelAmbientFired("mutual_need")>>
<<journeyTerrainBackground>>
<h2>Breaking Point</h2>
<p class="narrator">You're both half-naked, you've both been hard or wet for the last three miles, and neither of you has said one word about it.</p>
<p class="narrator">You stop at the same moment and turn to face each other.</p>
<<say "Kira" "We need to—">>
<<say $player.name "Yeah.">>
<p class="explicit">You crash together mouth first, teeth knocking, her hand already down the front of your pants and yours between her legs.</p>
<<say "Kira" "I'm so fucking wet—">>
<<say $player.name "I know. I can smell you.">>
<<say "Kira" "Then do something about it.">>
<<if random(1, 4) is 1>>
<<storyVideo "events/travel_kira_sex_desperate">>
<<else>>
<<storyVideo "events/travel_mutual_sex">>
<</if>>
<<switch _storyClip>>
<<case "152381fd9a31">>
<p class="explicit">No time to find anywhere. She slaps her hands on the nearest wall and sticks her ass out, pulling one cheek aside for you. You don't even get your pants off — you fuck her standing, from behind, through your open fly. Hard and fast against a wall of faded murals, in the street of a dead town. Far down the street somebody shuffles past. Neither of you stops.</p>
<<case "c07bcb931fb2">>
<p class="explicit">You throw a blanket on the ground. She's on it on all fours before it settles, ass up. You take her from behind, hard, her tits swinging under her with every thrust, her moans loud enough to carry.</p>
<<case "ffb10fadeddc">>
<p class="explicit">She shoves you down on your back and climbs on, facing you, and sinks onto your cock. Then she bounces hard, leaves and open sky above her, her tits jumping, her cunt slamming down on you again and again.</p>
<<case "5fd32ebdea96">>
<p class="explicit">You go down on a blanket between the trees, you on top. She pulls her knees up and pushes her legs against your chest and you drive into her, fast, too pent up to be gentle.</p>
<<default>>
<p class="explicit">You find the nearest surface. She's on it instantly, legs spread. You thrust into her and she locks her legs around you and holds on while you fuck her fast and hard.</p>
<</switch>>
<p class="explicit">She cums almost as soon as you're in her, shaking and swearing, and you're only a few strokes behind her, emptying yourself inside her.</p>
<p class="narrator">Afterwards you're both breathing like you ran the last mile, sticky and filthy and grinning at nothing.</p>
<<say "Kira" "Never speak of this.">>
<<say $player.name "Which time?">>
<p class="narrator">She almost laughs.</p>
<<say "Kira" "Any of them.">>
<<applyRelease "sex_quick">>
<<relationChange "kira" "affection" 3>>
<<relationChange "kira" "trust" 3>>
<<set $flags.mutualNeedSex to true>>
<<journeyEventReturn>><<run setup.travelAmbientFired("tits_staring")>>
<<journeyTerrainBackground>>
<h2>Eyes Front</h2>
<p class="explicit"><<= setup.travelAmbientLine("travel_kira_tits_staring", "cant_stop")>></p>
<<say "Kira" `setup.travelAmbientLine("travel_kira_tits_staring", "she_notices", true)`>>
<<say $player.name `setup.travelAmbientLine("travel_kira_tits_staring", "player_response", true)`>>
<<if $clothing.player.dickExposed>>
<p class="explicit">Your cock is out too, and it's rock hard from watching her. She sees it. Her eyes stay on it a second too long.</p>
<p class="narrator"><<= setup.travelAmbientLine("travel_kira_tits_staring", "kira_blush")>></p>
<<clampStat "companions[0].lust" 12>>
<<else>>
<p class="narrator"><<= setup.travelAmbientLine("travel_kira_tits_staring", "kira_blush")>></p>
<<clampStat "companions[0].lust" 10>>
<</if>>
<<clampStat "player.lust" 10>>
<<addTension "kira" 8>>
<<journeyEventReturn>><<run setup.travelAmbientFired("tits_grope")>>
<<journeyTerrainBackground>>
<h2>Right There</h2>
<p class="explicit">Kira's tits are right there. Bouncing. Exposed. Begging to be touched.</p>
<p class="narrator">The tension between you is thick. She's aware you're staring. You're aware she's aware.</p>
<<say "Kira" "What?">>
<<say $player.name "Nothing.">>
<<say "Kira" "You're giving me that look again.">>
<<say $player.name "What look?">>
<<say "Kira" "The look that says you want to do something stupid.">>
<p class="narrator">She's not wrong.</p>
<div class="choice-container">
<<vchoice "Grab her tits — quick grope" "Journey_Ambient_KiraTits_Grope_Do" "intimate" "grab">>
<<vchoice "Resist the urge" "Journey_Ambient_KiraTits_Grope_Resist" "action" "hand">>
</div><<journeyTerrainBackground>>
<h2>Right There</h2>
<p class="narrator">You clench your fists and look away.</p>
<<say $player.name "Nothing. Let's keep moving.">>
<p class="explicit">Kira looks at you, then down at her bare tits, then back at you.</p>
<<say "Kira" "You wanted to touch them.">>
<<say $player.name "What?">>
<<say "Kira" "Don't play dumb. I saw that look.">>
<p class="narrator">Caught.</p>
<<say $player.name "I... yeah. But I didn't.">>
<p class="narrator">Kira stares at you for a long moment.</p>
<<say "Kira" "...thanks. For not being a creep about it.">>
<<say $player.name "I mean, they're very nice, but—">>
<<say "Kira" "Shut up before you ruin the moment.">>
<p class="narrator">She almost smiles.</p>
<<clampStat "player.lust" 5>>
<<clampStat "companions[0].lust" 5>>
<<relationChange "kira" "trust" 1>>
<<relationChange "kira" "affection" 1>>
<<journeyEventReturn>><<run setup.travelAmbientFired("tits_snaps")>>
<<journeyTerrainBackground>>
<<travelAmbientHome>>
<h2>Outburst</h2>
<p class="explicit">You're staring again. Kira's tits, bouncing with each step. Her nipples, hard and begging to be sucked.</p>
<p class="narrator">Your cock is straining. She's driving you crazy without even trying.</p>
<<say "Kira" "Oh for fuck's sake!">>
<p class="narrator">She stops walking and rounds on you.</p>
<<if _taHome>>
<<say "Kira" "Are you going to stare at my tits the entire fucking way back?!">>
<<else>>
<<say "Kira" "Are you going to stare at my tits the entire fucking way?!">>
<</if>>
<<say $player.name "I— sorry—">>
<<say "Kira" "No you're not! You've been eye-fucking me for the last mile!">>
<p class="explicit">She grabs her own tits, lifting them.</p>
<<say "Kira" "These?! Is this what you want?! Here! Get a good look!">>
<<say $player.name "Kira—">>
<<say "Kira" "I can feel your eyes on me! It's making me— it's—">>
<p class="explicit">She drops her hands, breathing hard. Her cheeks are flushed. Her thighs pressed together.</p>
<<say "Kira" "...just stop looking at me like that.">>
<<say $player.name "Like what?">>
<<say "Kira" "Like you want to fuck me right here in the dirt.">>
<p class="narrator">Silence.</p>
<<say $player.name "...I mean—">>
<<say "Kira" "Don't. Just... let's keep walking.">>
<p class="explicit">She turns and walks ahead. But you can see how her thighs rub together with each step. How her breathing hasn't slowed.</p>
<p class="narrator">She's just as worked up as you are.</p>
<<clampStat "player.lust" 15>>
<<clampStat "companions[0].lust" 18>>
<<addTension "kira" 15>>
<<set $flags.kiraTitsOutburst to true>>
<<journeyEventReturn>><<run setup.travelAmbientFired("pussy_friction")>>
<<journeyTerrainBackground>>
<h2>Friction</h2>
<p class="explicit">Kira stops suddenly, hand going to her crotch.</p>
<<say $player.name "What's wrong?">>
<<say "Kira" "Nothing. Just... the fabric. It's rubbing against me.">>
<p class="narrator">Oh.</p>
<p class="explicit">With her pants torn, every step has been rubbing rough fabric directly against her bare pussy. The friction, the stimulation—</p>
<<say "Kira" "It's... it's a problem.">>
<<say $player.name "A problem?">>
<p class="explicit">She shifts her weight, thighs pressing together. Her face is flushed.</p>
<<say "Kira" "It feels... fuck, it feels good. Too good. I can't stop— every step just—">>
<p class="narrator">She's breathing hard. Her hand is still between her legs.</p>
<<say $player.name "Do you need to... take a break?">>
<<say "Kira" "No. No, we need to keep moving. I just need to— to ignore it.">>
<p class="explicit">She starts walking again. But you can see the way she moves now — careful steps, thighs rubbing together, breath hitching with each stride.</p>
<p class="narrator">The torn fabric is slowly grinding her toward orgasm. And there's nothing she can do about it.</p>
<<if $companions[0].lust >= 70>>
<p class="explicit">Ten steps later, she stops again. Gasping.</p>
<<say "Kira" "Fuck— I can't— it's too much—">>
<<say $player.name "Kira?">>
<p class="explicit">Her hand moves faster between her legs. She's not trying to stop the friction anymore. She's chasing it.</p>
<<say "Kira" "Don't— don't look at me—">>
<p class="explicit">But you do. You watch Kira's knees buckle, watch her gasp and moan, watch her cum from nothing but the friction of walking with her pussy out.</p>
<<say "Kira" "Ah— ah— FUCK—!">>
<p class="explicit">She slumps against a ruined wall, panting, thighs slick with her own wetness.</p>
<<say "Kira" "...don't say a word.">>
<<say $player.name "I wasn't going to.">>
<<say "Kira" "Good.">>
<p class="narrator">But she can barely stand. And you still have a long way to walk.</p>
<<clampStat "companions[0].lust" -40>>
<<addTension "kira" -10>>
<<clampStat "player.lust" 20>>
<<set $flags.kiraFrictionOrgasm to true>>
<<else>>
<<clampStat "companions[0].lust" 15>>
<<clampStat "player.lust" 8>>
<</if>>
<<journeyEventReturn>><<run setup.travelAmbientFired("kira_staring")>>
<<journeyTerrainBackground>>
<h2>Caught Looking</h2>
<p class="narrator">You catch Kira staring. Again.</p>
<<say $player.name "See something you like?">>
<p class="explicit">She jerks her eyes away, face flushing red.</p>
<<say "Kira" "I wasn't— I was just—">>
<<say $player.name "Staring at my dick?">>
<<say "Kira" "It's right there! Where else am I supposed to look?!">>
<<say $player.name "You could look at my face.">>
<<say "Kira" "I tried that. But then I kept thinking about... it.">>
<<say $player.name "It?">>
<p class="explicit">She gestures vaguely at your crotch, where your cock is now fully hard from this conversation.</p>
<<say "Kira" "That. Your... your dick.">>
<<say $player.name "You can say it.">>
<<say "Kira" "I just did.">>
<<say $player.name "Say it again.">>
<<say "Kira" "Why?">>
<<say $player.name "Because I want to hear you say it.">>
<p class="narrator">Silence. Then:</p>
<<say "Kira" "...your dick. Your cock. Your... fuck, you're hard right now, aren't you?">>
<<say $player.name "Very.">>
<p class="explicit">She licks her lips without noticing. Her eyes are locked on your erection.</p>
<<say "Kira" "It looks... it looks like it hurts.">>
<<say $player.name "It does.">>
<<say "Kira" "Maybe we should... do something about that.">>
<p class="narrator">Wait. What?</p>
<<say $player.name "Kira—">>
<<say "Kira" "I mean— later. Back at the vault. With... medical supplies. Or something.">>
<p class="narrator">She's flustered. Backtracking. But you both know what she meant.</p>
<<say $player.name "Right. Medical supplies.">>
<<say "Kira" "Exactly.">>
<p class="explicit">But her eyes drop to your cock one more time before she forces herself to look away.</p>
<<clampStat "companions[0].lust" 15>>
<<addTension "kira" 12>>
<<clampStat "player.lust" 12>>
<<set $flags.kiraOfferedHelp to true>>
<<journeyEventReturn>><<journeyTerrainBackground>>
<h2>Not Here</h2>
<<say $player.name "We should wait. Until we're back at the vault.">>
<p class="explicit">Kira stares at you like you've grown a second head.</p>
<<say "Kira" "You're... turning me down?">>
<<say $player.name "I'm saying we should wait.">>
<<say "Kira" "Why?">>
<<say $player.name "Because out here, we're exposed. Vulnerable. If something happens—">>
<<say "Kira" "Fine. You're right. We should wait.">>
<p class="narrator">But she looks disappointed. And still very much turned on.</p>
<<say "Kira" "But when we get back...">>
<<say $player.name "When we get back?">>
<<say "Kira" "Find me. We'll... finish this conversation.">>
<<clampStat "companions[0].lust" 10>>
<<addTension "kira" 15>>
<<clampStat "player.lust" 5>>
<<relationChange "kira" "affection" 1>>
<<set $flags.kiraRainCheck to true>>
<<journeyEventReturn>><<journeyTerrainBackground>>
<h2>Relief</h2>
<<storyVideo "events/travel_kira_handjob">>
<<if _storyClip is "70c819b6e6b3">>
<p class="explicit">Kira goes down on her knees on the dusty floor of the house you're resting in, like she's about to pray, mouth already open. She takes your cock in her fist and pumps it slowly toward her waiting tongue, looking up at you.</p>
<<elseif _storyClip is "38b81b0cb0ef">>
<p class="explicit">Kira sinks to her knees on a scrap of old carpet by the road, wraps her hand around your cock and jerks it slow, her tongue hanging out flat under the tip so it bumps her tongue on every stroke, her eyes up on yours.</p>
<<else>>
<p class="explicit"><<= setup.travelAmbientLine("travel_kira_handjob", "start")>></p>
<</if>>
<p class="explicit"><<= setup.travelAmbientLine("travel_kira_handjob", "during")>></p>
<p class="explicit"><<= setup.travelAmbientLine("travel_kira_handjob", "during")>></p>
<p class="explicit"><<= setup.travelAmbientLine("travel_kira_handjob", "climax")>></p>
<p class="narrator"><<= setup.travelAmbientLine("travel_kira_handjob", "after")>></p>
<<applyRelease "handjob_quick">>
<<clampStat "companions[0].lust" -10>>
<<relationChange "kira" "affection" 2>>
<<relationChange "kira" "trust" 1>>
<<set $flags.kiraHandjobTravel to true>>
<<journeyEventReturn>><<run setup.travelAmbientFired("takes_initiative")>>
<<journeyTerrainBackground>>
<h2>She Snaps</h2>
<p class="narrator">Kira suddenly stops.</p>
<p class="explicit">She shoves you back against a ruined wall and drops to her knees. There's no asking. Just action.</p>
<<say "Kira" "Been staring at this thing for an hour.">>
<p class="explicit"><<= setup.travelAmbientLine("travel_kira_takes_initiative", "blowjob")>></p>
<p class="explicit"><<= setup.travelAmbientLine("travel_kira_takes_initiative", "blowjob")>></p>
<<lineMedia "takes-initiative-video">>
<p class="explicit">She pulls off you, spit hanging from her lip, stands and bends over, one hand braced on the wall.</p>
<<say "Kira" "Fuck me. Now. I'm not asking.">>
<p class="explicit"><<= setup.travelAmbientLine("travel_kira_takes_initiative", "fucking")>></p>
<p class="explicit"><<= setup.travelAmbientLine("travel_kira_takes_initiative", "fucking")>></p>
<<lineMedia "takes-initiative-video">>
<p class="explicit">You cum deep inside her. She moans as you flood her pussy.</p>
<<say "Kira" "...don't get used to that.">>
<p class="narrator">She says it, but you both know better.</p>
<<applyRelease "sex_quick">>
<<relationChange "kira" "affection" 2>>
<<relationChange "kira" "trust" 1>>
<<set $flags.kiraTookInitiative to true>>
<<set _taBack to $journey.returnPassage || "Journey_Event_Continue">>
<div class="choice-container">
<<vchoice "Continue walking" _taBack "action" "forward">>
<<if $companions[0].lust >= 40>>
<<vchoice "\"Your turn.\" — Go down on her" "Journey_Ambient_ReturnFavor" "intimate" "lips">>
<</if>>
</div><<journeyTerrainBackground>>
<h2>Your Turn</h2>
<<say $player.name "Your turn.">>
<<say "Kira" "What?">>
<p class="explicit">You push her against the wall, drop to your knees, and bury your face between her legs.</p>
<<say "Kira" "OH— fuck— what are you— AH!">>
<p class="explicit">Your tongue finds her clit immediately. She's soaking wet, desperate, grinding her cunt against your face.</p>
<<say "Kira" "Yes— right there— don't stop— FUCK!">>
<p class="explicit">You tongue-fuck her mercilessly, two fingers sliding into her pussy, curling up to hit that perfect spot.</p>
<<say "Kira" "I'm— I'm going to— FUCK I'M CUMMING!">>
<p class="explicit">She screams, thighs clamping around your head, pussy gushing against your mouth. You don't stop until she's shaking, gasping, begging you to stop.</p>
<<say "Kira" "Okay— okay— I can't— too much—">>
<p class="explicit">You stand, face wet with her. She stares at you, panting.</p>
<<say "Kira" "...fuck.">>
<<say $player.name "Good?">>
<<say "Kira" "...yeah. Really fucking good.">>
<<applyRelease "oral_give">>
<<relationChange "kira" "affection" 3>>
<<relationChange "kira" "trust" 2>>
<<set $flags.mutualOralTravel to true>>
<<journeyEventReturn>><<setBackground "reclaimed-ambush">>
<<set $flags.cncIntroduced to true>>
<h2>Ambush!</h2>
Movement. Too late to react.
<<if setup.kiraWithYou() && ($journey.exposure.companion.naked || $journey.exposure.companion.exposed)>>
<<storyVideo "events/cnc_ambush_kira_grabbed" "" "events/cnc_ambush_kira_spitroast">>
<<if _storyFamily is "sf_cg_travel_cnc_ambush_02">><<set _cncGrab to "cnc_ambush_kira_grabbed_sf">><<elseif _storyClip is "36da8b27a362">><<set _cncGrab to "cnc_ambush_kira_grabbed_throat">><<else>><<set _cncGrab to "cnc_ambush_kira_grabbed">><</if>>
<p class="explicit"><<randomLine "cnc_ambush_kira_grabbed" "grab">> <<randomLine "cnc_ambush_kira_grabbed" "grab">></p>
<<set _line to setup.randomLine("cnc_ambush_kira_grabbed", "grab")>>
<<say "Raider" _line>>
<<set _line to setup.randomLine("cnc_ambush_kira_grabbed", "kira_struggle")>>
<<say "Kira" _line>>
<p class="explicit"><<randomLine "cnc_ambush_kira_grabbed" "grab">> <<randomLine "cnc_ambush_kira_grabbed" "grab">></p>
<<set _line to setup.randomLine("cnc_ambush_kira_grabbed", "grab")>>
<<say "Raider" _line>>
<p class="explicit"><<randomLine _cncGrab "forced">> <<randomLine "cnc_ambush_kira_grabbed" "grab">></p>
<<set _line to setup.randomLine("cnc_ambush_kira_grabbed", "grab")>>
<<say "Raider" _line>>
<p class="explicit"><<randomLine _cncGrab "forced">></p>
<div class="choice-container">
<<vchoice "ATTACK — Fight them off!" "Travel_Ambush_Fight" "action" "attack">>
<<if $player.lust >= 80>>
<<vchoice "Watch... (too aroused to think straight)" "Travel_Ambush_Watch" "intimate" "search">>
<</if>>
</div>
<<elseif $journey.exposure.player.naked || $journey.exposure.player.exposed>>
A figure steps from the shadows. Female. Armed. Her eyes lock onto your exposed cock.
<<say "Scavenger" "Traveling like that? You're either very brave, very stupid, or very desperate.">>
<<say $player.name "Just had bad luck with the clothes.">>
<p class="explicit">Her eyes roam over your exposed body. She licks her lips.</p>
<<if setup.kiraWithYou()>>
<<say "Scavenger" "Lucky for me. On your knees. Both of you. Now.">>
<<else>>
<<say "Scavenger" "Lucky for me. On your knees. Now.">>
<</if>>
<p>She gestures with her weapon — a makeshift rifle that looks functional enough to blow holes in you.</p>
<div class="choice-container">
<<vchoice "Fight back" "Travel_Ambush_Fight" "action" "attack">>
<<vchoice "Comply" "Travel_Ambush_Comply_Female" "action" "strength">>
</div>
<</if>><<set $combat = {
active: true,
companionInCombat: setup.kiraWithYou() ? "kira" : null,
enemies: [
{
id: "raider_1",
name: "Raider",
type: "raider",
tier: "standard",
health: 60,
maxHealth: 60,
damage: 8,
dodge: 15,
armor: 0,
gender: "male",
lust: 0,
maxLust: 100,
lustResistance: 20,
aggression: 60,
loot: ["scrap metal", "stimpak"]
},
{
id: "raider_2",
name: "Raider",
type: "raider",
tier: "standard",
health: 55,
maxHealth: 55,
damage: 8,
dodge: 15,
armor: 0,
gender: "male",
lust: 0,
maxLust: 100,
lustResistance: 20,
aggression: 60,
loot: ["scrap metal", "weapon_part"]
}
],
turn: 0,
phase: "player",
victoryPassage: "Travel_Ambush_Aftermath_Killed"
}>>
<h2>Fight!</h2>
<<if setup.kiraWithYou()>>
You won't let them take Kira!
<p>Adrenaline floods your system. You draw your weapon and charge.</p>
<<say "Kira" `$player.name + "!"`>>
<p>She rolls away from the raiders, grabbing her own weapon. This is a fight for survival.</p>
<<else>>
<p>Adrenaline floods your system. You draw your weapon and charge. This is a fight for survival.</p>
<</if>>
<div class="choice-container">
<<vchoice "Begin Combat" "Combat_Start" "action" "map">>
</div><<storyVideo "events/cnc_ambush_watch" "" "events/cnc_ambush_kira_spitroast">>
<<if _storyFamily is "sf_cg_travel_cnc_ambush_02">><<set _cncGrab to "cnc_ambush_kira_grabbed_sf">><<set _cncWatch to "cnc_ambush_watch_sf">><<elseif _storyClip is "36da8b27a362">><<set _cncGrab to "cnc_ambush_kira_grabbed_throat">><<set _cncWatch to "cnc_ambush_watch_throat">><<elseif _storyClip is "592ac6b913b5">><<set _cncGrab to "cnc_ambush_kira_grabbed">><<set _cncWatch to "cnc_ambush_watch_tongue">><<else>><<set _cncGrab to "cnc_ambush_kira_grabbed">><<set _cncWatch to "cnc_ambush_watch">><</if>>
<<if setup.kiraAllowsUse()>><<set _cncWatch to _cncWatch + "_allowed">><</if>>
<<set $flags.watchedKiraCNC to true>>
<<clampStat "player.lust" 20>>
<<clampStat "companions[0].lust" 25>>
<<addTension "kira" 15>>
<<if $player.lust >= 90>>
<p class="explicit"><<randomLine _cncWatch "watching">> <<randomLine _cncWatch "watching">></p>
<<else>>
<p class="narrator"><<randomLine _cncWatch "watching">> <<randomLine _cncWatch "watching">></p>
<</if>>
<p class="explicit"><<randomLine _cncGrab "forced">> <<randomLine "cnc_ambush_kira_grabbed" "kira_struggle">></p>
<<set _line to setup.randomLine(_cncWatch, "kira_used")>>
<<say "Kira" _line>>
<p class="explicit"><<randomLine _cncGrab "forced">> <<randomLine "cnc_ambush_kira_grabbed" "reaction">></p>
<<set _line to setup.randomLine("cnc_ambush_kira_grabbed", "reaction")>>
<<say "Raider" _line>>
<p class="explicit"><<randomLine _cncGrab "forced">> <<randomLine "cnc_ambush_kira_grabbed" "reaction">></p>
<<set _line to setup.randomLine(_cncWatch, "kira_used")>>
<<say "Kira" _line>>
<p class="explicit"><<randomLine _cncGrab "forced">> <<randomLine _cncWatch "kira_used">></p>
<<set _line to setup.randomLine("cnc_ambush_kira_grabbed", "reaction")>>
<<say "Raider" _line>>
<p class="explicit"><<randomLine _cncWatch "kira_used">> <<randomLine _cncWatch "watching">></p>
<p class="explicit"><<randomLine "cnc_ambush_kira_grabbed" "reaction">> <<randomLine _cncWatch "kira_used">></p>
<<set _line to setup.randomLine(_cncWatch, "kira_used")>>
<<say "Kira" _line>>
<p class="explicit"><<randomLine "cnc_ambush_kira_grabbed" "reaction">> <<randomLine _cncGrab "forced">></p>
<<set _line to setup.randomLine("cnc_ambush_kira_grabbed", "reaction")>>
<<say "Raider" _line>>
<p class="explicit"><<randomLine _cncGrab "forced">> <<randomLine _cncWatch "kira_used">></p>
<p class="explicit"><<randomLine _cncWatch "kira_used">> <<randomLine "cnc_ambush_kira_grabbed" "reaction">></p>
<p class="explicit"><<randomLine _cncWatch "finish">> <<randomLine _cncWatch "finish">></p>
<<set _line to setup.randomLine(_cncWatch, "finish")>>
<<say "Raider" _line>>
<p class="explicit"><<randomLine _cncWatch "finish">></p>
<p class="explicit"><<randomLine _cncWatch "finish">> <<randomLine _cncWatch "finish">></p>
<<say "Kira" ".....">>
<p class="narrator"><<randomLine _cncWatch "finish">></p>
<div class="choice-container">
<<vchoice "Help her up" "Travel_Ambush_Aftermath_Help" "action" "hand">>
<<vchoice '"Are you okay?"' "Travel_Ambush_Aftermath_Ask" "talk" "talk">>
<<if $player.lust >= 80 && $clothing.player.dickExposed>>
<<vchoice "Use her while she's still filled with cum" "Travel_Ambush_Sloppy_Seconds" "intimate" "rapid-strikes">>
<</if>>
</div><<set $companions[0].trust += setup.kiraUseTrust(-1)>>
<<set $companions[0].lust to 40>>
<p>You move to her, help her to her feet. She's trembling, barely able to stand.</p>
<<storyVideo "story/travel_cnc_ambush/aftermath_help">>
<<if setup.kiraAllowsUse()>>
<<say "Kira" "Don't... don't say anything yet. My legs are still shaking.">>
<<say $player.name "I should have—">>
<<say "Kira" "Should have what? Stopped them? I told you not to.">>
<p class="explicit"><<if _storyFamily is "sf_cg_travel_cnc_ambush_02">>Cum glazes her face. She scoops a streak of it off her cheek with two fingers, tips her head back and sucks them clean, then wipes the rest off with the back of her hand.<<else>>Cum leaks down her thighs. She doesn't try to cover herself. She doesn't even close her legs.<</if>></p>
<<say "Kira" "Just... let's get back. Before someone else finds us. ...Or don't. Fuck. I don't even know which I want.">>
<<else>>
<<say "Kira" "Don't... don't say anything.">>
<<say $player.name "I should have—">>
<<say "Kira" "I said don't.">>
<p class="explicit"><<if _storyFamily is "sf_cg_travel_cnc_ambush_02">>Cum glazes her face. She wipes her mouth with the back of her hand and hides behind it. She can't meet your eyes.<<else>>Cum leaks down her thighs as she tries to cover herself. She can't meet your eyes.<</if>></p>
<<say "Kira" "Just... let's get back. Before someone else finds us.">>
<</if>>
<p class="narrator">Her hand finds yours. She squeezes it once. Hard.</p>
<p class="narrator">You don't let go.</p>
<div class="choice-container">
<<if setup.fightOnTripAway()>>
<<vchoice "Continue" "Travel_Continue" "action" "map">>
<<elseif setup.fightOnTrip()>>
<<vchoice "Continue to vault" "Travel_Continue" "action" "map">>
<<else>>
<<vchoice "Continue to vault" "Vault_Arrival" "action" "map">>
<</if>>
</div><<addTrust "kira" 1>>
<<set $companions[0].lust to 35>>
<<say $player.name "Kira... are you okay?">>
<<if setup.kiraAllowsUse()>>
<p>She laughs. It comes out hoarse and wrecked and very pleased with itself.</p>
<<else>>
<p>She laughs. It's a broken sound.</p>
<</if>>
<<storyVideo "story/travel_cnc_ambush/aftermath_ask">>
<<if setup.kiraAllowsUse()>>
<<say "Kira" "Do I look okay? Look at me.">>
<p class="explicit"><<if _storyFamily is "sf_cg_travel_cnc_ambush_02">>She's kneeling on the floor, naked, covered in cum.<<else>>She's sitting in the dirt, naked, covered in cum.<</if>> Her thighs are sticky with it. It drips from her chin.</p>
<<say "Kira" "I came. I fucking came while they held me down, and you stood there and watched me do it.">>
<<say $player.name "Your body reacted. That doesn't mean—">>
<<say "Kira" "Doesn't mean what? That I wanted it? I did. I told you I did.">>
<p>She finally looks at you. Her eyes are wet, and bright, and she's grinning.</p>
<<say "Kira" "You watched. All of it.">>
<<say $player.name "I'm sorry. I—">>
<<if setup.fightOnTripAway()>><<say "Kira" "Don't be. ...Walk me there. Slowly. My legs are still back there somewhere.">><<else>><<say "Kira" "Don't be. ...Walk me home. Slowly. My legs are still back there somewhere.">><</if>>
<p>She stands, unsteady, and starts walking. You follow.</p>
<<if setup.fightOnTripAway()>><p class="narrator">She leans on you the whole way, and every so often she laughs to herself, low, like she's remembering something.</p><<else>><p class="narrator">She leans on you the whole way back, and every so often she laughs to herself, low, like she's remembering something.</p><</if>>
<<else>>
<<say "Kira" "Do I fucking look okay?">>
<p class="explicit"><<if _storyFamily is "sf_cg_travel_cnc_ambush_02">>She's kneeling on the floor, naked, covered in cum.<<else>>She's sitting in the dirt, naked, covered in cum.<</if>> Her thighs are sticky with it. It drips from her chin.</p>
<<say "Kira" "I... they... I came. I fucking came while they...">>
<<say $player.name "Your body reacted. That doesn't mean—">>
<<say "Kira" "Doesn't mean what? That I wanted it? That I'm not a whore?">>
<p>She finally looks at you. Her eyes are wet.</p>
<<say "Kira" "You watched. You just... watched.">>
<<say $player.name "I'm sorry. I—">>
<<say "Kira" "Save it. Let's go.">>
<p>She stands, unsteady, and starts walking. You follow.</p>
<p class="narrator">Neither of you speak the rest of the way.</p>
<</if>>
<div class="choice-container">
<<if setup.fightOnTripAway()>>
<<vchoice "Continue" "Travel_Continue" "action" "map">>
<<elseif setup.fightOnTrip()>>
<<vchoice "Continue to vault" "Travel_Continue" "action" "map">>
<<else>>
<<vchoice "Continue to vault" "Vault_Arrival" "action" "map">>
<</if>>
</div><<set $flags.sloppy_seconds_kira to true>>
<<set $player.lust to 5>><<run setup.playerReleased()>>
<<set $companions[0].lust to 50>>
<<addCorruption 5 "kira">>
<<addTension "kira" -15>>
<p class="explicit">The sight of her like that — used, dripping cum from both holes, still trembling from her orgasm — it pushes you over the edge.</p>
<<say $player.name "Kira...">>
<<say "Kira" `"What— what are you— " + $player.name + ", no—"`>>
<p class="explicit">You push her back down into the dirt, face-first, ass up. Your cock is already out, throbbing.</p>
<<storyVideo "events/cnc_ambush_aftermath_take">>
<<say "Kira" "Don't— I just— they just— AH!">>
<p class="explicit">You thrust into her cum-filled pussy. She's impossibly slick, their semen mixing with her own wetness. Your cock slides through the mess they left inside her.</p>
<<say $player.name "You're already soaked.">>
<<say "Kira" "That's not— that's not me— that's their— FUCK!">>
<p class="explicit">You fuck her hard, your cock churning their cum inside her pussy. The wet sounds are obscene. She's moaning now, unable to stop herself.</p>
<<say "Kira" "You bastard— you're fucking their cum into me— I can feel it— so wet— ahh—">>
<p class="explicit">You reach around, rubbing her clit as you pound into her from behind. She screams.</p>
<<say "Kira" "No— I can't— not again— I'M CUMMING! FUCK!">>
<p class="explicit">She cums hard around your cock, her pussy milking you. The sensation of her clenching, the slickness of the mixed fluids, the depravity of it all — you explode.</p>
<p class="explicit">You pump your own load into her already-filled pussy. Adding to the mess. Claiming her despite — or because of — what just happened.</p>
<<say "Kira" "So... so full... I can feel it all inside me...">>
<p class="explicit">You pull out. Cum pours from her pussy — theirs and yours, mixed together. She collapses, twitching.</p>
<<say "Kira" "...you're just as bad as they are.">>
<p>But she's smiling. Just a little.</p>
<div class="choice-container">
<<if setup.fightOnTripAway()>>
<<vchoice "Help her up and move on" "Travel_Continue" "action" "map">>
<<elseif setup.fightOnTrip()>>
<<vchoice "Help her up and head back" "Travel_Continue" "action" "map">>
<<else>>
<<vchoice "Help her up and head back" "Vault_Arrival" "action" "map">>
<</if>>
</div><<set _taakWatched to !!($combat && $combat.kiraWatched)>>
<<if $combat>><<set $combat.kiraWatched to false>><</if>>
<<run VaultUI.setBackgroundDirect("media/backgrounds/wasteland/aftermath/combat_aftermath.webp")>>
<<if setup.kiraWithYou() && !_taakWatched>>
<<addTrust "kira" 2>>
<<addAffection "kira" 1>>
<<addTension "kira" -5>>
<</if>>
<h2>Victory</h2>
<<if setup.kiraWithYou() && !_taakWatched>>
<p>The raiders lie dead at your feet. You fought hard. Kira fought harder.</p>
<<say "Kira" "Thanks. For not... for fighting.">>
<p>She's breathing hard, adrenaline still pumping.</p>
<<else>>
<p>The raiders lie dead at your feet. You're breathing hard, adrenaline still pumping.</p>
<</if>>
<<if setup.kiraWithYou() && $journey.exposure.companion.exposed>>
<p class="explicit">Her tits are still out, heaving with each breath. She doesn't seem to care anymore.</p>
<<say "Kira" "Stop staring and let's go.">>
<</if>>
<<if setup.fightOnTripAway()>><p>You loot the bodies quickly and continue.</p><<else>><p>You loot the bodies quickly and continue toward the vault.</p><</if>>
<<run setup.fightLootStart()>>
<p class="loot-found">Found: <<print setup.postBattleTakeLoot("scrap metal", "Scrap Metal", 2, "", "fightLoot")>>, <<print setup.postBattleTakeLoot("dirty water", "Dirty Water", 1, "", "fightLoot")>></p>
<<lootLeftList "fightLoot">>
<div class="choice-container">
<<vchoice "Continue" "Travel_Safe" "action" "map">>
</div><<set _cfKira to setup.kiraWithYou()>>
<<clampStat "player.lust" 15>>
<<if _cfKira>><<clampStat "companions[0].lust" 20>><</if>>
<<set $flags.compliedCNC to true>>
<<if _cfKira>>
<p>You both sink to your knees slowly. No point getting shot.</p>
<<else>>
<p>You sink to your knees slowly. No point getting shot.</p>
<</if>>
<<say "Scavenger" "Smart. I like smart prey.">>
<p class="explicit">She circles <<if _cfKira>>you both<<else>>you<</if>>, weapon still trained. Her eyes linger on your exposed cock.</p>
<<say "Scavenger" "You. The man. Lie on your back.">>
<p>You comply. The ground is cold against your bare skin.</p>
<<storyVideo "events/cnc_toll_player_ridden">>
<p class="explicit">She straddles you in one smooth motion, grinding her clothed pussy against your cock.</p>
<<say "Scavenger" "Nice and hard already. Good.">>
<p class="explicit">She pulls aside her pants and sinks down onto you. Her pussy is tight and wet. She moans.</p>
<<if _cfKira>>
<<say "Kira" "What the fuck—">>
<<say "Scavenger" "Quiet. Or you're next.">>
<</if>>
<p class="explicit">She rides you hard, using your cock for her pleasure. Her hand stays on her weapon. You're being used at gunpoint.</p>
<<say "Scavenger" "Fuck— good cock— better than— ah— most waste trash—">>
<p class="explicit">She cums quickly, clenching around you, gasping. Then she pulls off.</p>
<<if _cfKira>>
<<say "Scavenger" "Your turn, girl.">>
<p>She points the weapon at Kira.</p>
<<say "Kira" "I'm not—">>
<<say "Scavenger" "You are. On him. Now.">>
<p class="narrator">Kira looks at you. You nod slightly. Better this than bullets.</p>
<p class="explicit">Kira straddles you, her pussy hovering over your cum-slick cock. She sinks down slowly.</p>
<<say "Kira" "Fuck... you're... this isn't...">>
<p class="explicit">The scavenger forces Kira to ride you, watching with hungry eyes. Kira's pussy is impossibly tight around you.</p>
<<say "Scavenger" "Faster. Make him cum inside you.">>
<p class="explicit">Kira rides you harder, her tits bouncing. Despite everything, she's getting wet. Her body is betraying her.</p>
<<say "Kira" "I'm— oh fuck— I'm going to—">>
<p>You both cum together. You flood Kira's pussy while she screams, clenching around you.</p>
<<say "Scavenger" "Good show. You can go now.">>
<p>She disappears into the ruins, leaving you both panting and joined.</p>
<<set $player.lust to 20>><<run setup.playerReleased()>>
<<set $companions[0].lust to 40>>
<<addTension "kira" 10>>
<<else>>
<<say "Scavenger" "Good cock. You can go now.">>
<p>She disappears into the ruins, leaving you on your back in the dirt, your cock wet and still aching for more.</p>
<<set $player.lust to 20>>
<</if>>
<div class="choice-container">
<<if setup.fightOnTripAway()>>
<<vchoice "Continue" "Travel_Continue" "action" "map">>
<<elseif setup.fightOnTrip()>>
<<vchoice "Continue to vault" "Travel_Continue" "action" "map">>
<<else>>
<<vchoice "Continue to vault" "Vault_Arrival" "action" "map">>
<</if>>
</div><<widget "cncTravelSpotEvents">>
<<set _cncSpotEvents to []>>
<<canTriggerCompanionEvent>>
<<if $extremeContent && $extremeContent.cnc && !($preferences && $preferences.multiplePartners === false) && _cte_canTrigger && _gc_companionId === "kira" && (!$flags.lastCncRoadEventDay || $time.day > $flags.lastCncRoadEventDay)>>
<<set _cncLeg to [$journey.currentSegment ? $journey.currentSegment.from : "", $journey.currentSegment ? $journey.currentSegment.to : ""]>>
<<set _cncPlayerBare to $journey.exposure.player.exposed || $journey.exposure.player.naked>>
<<set _cncAnyBare to _cncPlayerBare || $journey.exposure.companion.exposed || $journey.exposure.companion.naked>>
<<if _cncPlayerBare && setup.cncTravelSpots.cnc_toll_demand.some(function (n) { return _cncLeg.includes(n); })>>
<<run _cncSpotEvents.push(setup.cncTravelPassages.cnc_toll_demand)>>
<</if>>
<<if _cncAnyBare && setup.cncTravelSpots.cnc_group_both.some(function (n) { return _cncLeg.includes(n); })>>
<<run _cncSpotEvents.push(setup.cncTravelPassages.cnc_group_both)>>
<</if>>
<</if>>
<</widget>><<setBackground "reclaimed-road">>
<<storyVideo "events/cnc_toll_demand">>
<<set $flags.cncIntroduced to true>>
<h2>Toll Road</h2>
<p class="explicit"><<print setup.textPools.cnc_toll_demand.setup.join(" ")>></p>
<p class="explicit"><<print setup.textPools.cnc_toll_demand.threat.join(" ")>></p>
<p class="narrator">Three blades, three rifles, and three women who have already decided how this ends. Kira's hand drifts toward her knife. The tallest one clicks her tongue and shakes her head.</p>
<div class="choice-container">
<<vchoice "Pay the toll" "Travel_CNC_TollDemand_Pay" "intimate" "submission">>
<<vchoice "Fight your way through" "Journey_Encounter_Fight" "action" "attack">>
</div><<setBackground "reclaimed-road">>
<<storyVideo "events/cnc_toll_player_ridden">>
<<set $flags.paidCncToll to true>>
<<clampStat "player.lust" 20>>
<<clampStat "companions[0].lust" 20>>
<<addTension "kira" 10>>
<p class="explicit"><<print setup.textPools.cnc_toll_demand.used.join(" ")>></p>
<p class="explicit">Your cock is slick with all three of them by the end. Your jaw aches, your face is wet with pussy, and the cot under your back is soaked through.</p>
<<storyVideo "events/cnc_toll_both">>
<p class="explicit"><<print setup.textPools.cnc_toll_demand.release.join(" ")>></p>
<<set $player.lust to 10>><<run setup.playerReleased()>>
<<set $companions[0].lust to 55>>
<<journeyEventReturn>><<setBackground "reclaimed-ambush">>
<<set $flags.cncIntroduced to true>>
<h2>Surrounded!</h2>
<p class="explicit"><<print setup.textPools.cnc_group_both.ambush.join(" ")>></p>
<p class="narrator">The men drag Kira a few steps off. The women put you on your back beside her, close enough to touch.</p>
<div class="choice-container">
<<vchoice "ATTACK — Fight them off!" "Travel_Ambush_Fight" "action" "attack">>
<<vchoice "Stop struggling" "Travel_CNC_GroupBoth_Used" "intimate" "submission">>
</div><<setBackground "reclaimed-ambush">>
<<set $flags.groupUsedCNC to true>>
<<set $flags.groupCNCBoth to true>>
<<clampStat "player.lust" 20>>
<<clampStat "companions[0].lust" 25>>
<<addTension "kira" 15>>
<<storyVideo "events/cnc_group_kira_triple">>
<p class="explicit"><<if _storyClip is "e7a5404af033">>Three men surround Kira and take her every way they like, and by the time you can turn your head they're standing over her in a ring, stroking. She kneels in the middle with her wet hair plastered to her shoulders and glares up at them. "Go on, then. Cover my fucking face in it." They do, one after another, until cum hangs from her lashes and drips off her chin, and she laughs at them through it.<<else>><<print setup.textPools.cnc_group_both.kira_triple.join(" ")>><</if>></p>
<<storyVideo "events/cnc_group_player_used">>
<<set _cncPR to setup.textPools.cnc_group_both.player_ridden>>
<p class="explicit"><<if _storyClip is "3b21e0f22788">>Three women pin you down and fight over your cock, three fists pumping it at once. <<print _cncPR.slice(1).join(" ")>><<elseif _storyClip is "d348960d6b5e">><<print [_cncPR[0], _cncPR[2]].join(" ")>> The third kneels over your face and gropes her friend's bouncing tits while she rides. <<print _cncPR.slice(4).join(" ")>><<elseif _storyClip is "c0985b091d0a">><<print _cncPR[0]>> One swallows your cock while the other two kiss above it, tongues sliding over each other. <<print _cncPR.slice(4).join(" ")>><<else>><<print _cncPR.join(" ")>><</if>></p>
<<storyVideo "events/cnc_group_both">>
<<set _cncBU to setup.textPools.cnc_group_both.both_used>>
<p class="explicit"><<if _storyClip is "1d1ee0016a8c">><<print _cncBU[0]>> The one in the leather collar kneels under the pair and licks where your cock splits her friend open. <<print _cncBU.slice(1).join(" ")>><<else>><<print _cncBU.join(" ")>><</if>></p>
<<set $player.lust to 5>><<run setup.playerReleased()>>
<<set $companions[0].lust to 40>>
<<journeyEventReturn>><<widget "caravanRoadChoices">>
<div class="choice-container">
<<if setup.caravanCampOpen()>>
<<vchoice "Sit by the drivers' fire" "Travel_Caravan_Camp" "talk" "fire">>
<</if>>
<<vchoice "Walk on with the wagons" `$journey.returnPassage || "Journey_Event_Continue"` "action" "forward">>
</div>
<</widget>>
<<widget "caravanSeducedLine">>
<<set _cvHer to ($combat.seducedGender === "female")>>
<<set _cvUp to (typeof $combat.seducedOthers === "number" ? $combat.seducedOthers : 2)>>
<p><<if _cvHer>>The raider you seduced is in no state to lift a blade, let alone a crate.<<else>>The raider you faced has dropped the blade and wants no more of this.<</if>> <<if _cvUp > 1>>The others look at the drivers, at you, at their friend, and decide the crates aren't worth it. They back off into the ditches and away across the fields, empty-handed.<<elseif _cvUp is 1>>The other one looks at the drivers, at you, at their friend, decides the crates aren't worth it, and backs off into the ditch and away across the fields, empty-handed.<<else>>Nobody else is left on their feet to argue about it.<</if>> The crates are all there, still lashed down on the last wagon.</p>
<</widget>><<journeyTerrainBackground>>
<<createRaiderGroup `setup.ECONOMY.caravan.raiders[0]` `setup.ECONOMY.caravan.raiders[1]` null 0 "convoy">>
<<set $journey.encounter.enemies to _returnRaiderGroup>>
<<set _cvLead to $journey.encounter.enemies[0]>>
<h2>Ambush on the Highway</h2>
<<storyVideo "story/caravan/ambush">>
<p>Halfway down a long straight the lead mule throws its head and stops dead, and the wagon behind it nearly climbs its tailboard. A car lies on its roof across both lanes ahead, rust-red and fresh-dragged, the scrape marks still bright on the asphalt. The drivers have seen this before. Somebody swears, somebody reaches under a bench, and the mules stamp and blow.</p>
<<if _storyClip is "4353c9bcdd0c">><p>Then engines. They come in across the flats in their own dust, a long rig with a spiked car and two bikes running beside it, and they are off their machines before the wheels stop: <<print $journey.encounter.enemies.length>> of them, rags and road leather, blades out, eyes on the crates and nowhere else.</p><<elseif _storyClip is "e81746cf9d24">><p>Then engines. One bike first, loaded high, far out on the flats; then a whole line of them comes up out of the haze behind it. They are off their machines before the wheels stop: <<print $journey.encounter.enemies.length>> of them, rags and road leather, blades out, eyes on the crates and nowhere else.</p><<else>><p>They come up out of the ditches on both sides: <<print $journey.encounter.enemies.length>> of them, rags and road leather, blades out, eyes on the crates and nowhere else.</p><</if>>
<div class="enemy-preview">
<<for _cvRi, _cvRaider range $journey.encounter.enemies>>
<span @class="'enemy-tag' + (_cvRaider.gender === 'female' ? ' female' : ' male')"><<if _cvRaider.gender === "female">>♀<<else>>♂<</if>> _cvRaider.name</span>
<</for>>
</div>
<<say _cvLead.name "Wagons stop here. Crates come with us. Drivers can keep walking. The hired meat stays down.">>
<<say "Caravan master" "Hired! This is what I pay you for! Put the bastards in the ditch before they lay one finger on my crates!">>
<<if setup.kiraWithYou()>>
<<say "Kira" "Told you. Nobody pays that much scrap for a walk.">>
<</if>>
<div class="choice-container">
<<link `'<span class="choice-button action"><span class="gi gi-attack gi-large"></span><span class="label">Defend the wagons</span></span>'`>><<startCombat $journey.encounter.enemies `setup.roadCombatCompanion()` true>><<set $combat.returnPassage to "Travel_Caravan_Lost">><<set $combat.victoryPassage to "Travel_Caravan_Won">><<run setup.caravanFightBegin()>><<goto "Combat_Start">><</link>>
</div><<journeyTerrainBackground>>
<<set _cvFirst to setup.caravanFightResult("quiet")>>
<h2>A Quiet Road</h2>
<p>The highway runs straight and empty all the way west. You watch the ditches, the cars rusting on their roofs, the gaps between the dead trees, and nothing watches back. The mules plod, the wheels grind, and by the second mile the drivers are passing a bottle along the benches.</p>
<p>Once, far off across the fields, a thin line of smoke goes up and nobody comes from under it. That's the whole of the trouble.</p>
<<say "Caravan master" "Nobody home today. Don't get comfortable, hired. You're still paid to look, and quiet roads are where they wait for you to stop looking.">>
<<if setup.kiraWithYou()>>
<<say "Kira" "Easiest scrap we'll ever make. Don't tell her I said that.">>
<</if>>
<<caravanRoadChoices>><<journeyTerrainBackground>>
<<set _cvFirst to setup.caravanFightResult("won")>>
<<set _cvE to setup.caravanEscort()>>
<h2>The Wagons Roll On</h2>
<<if $combat.seductionWin>>
<<caravanSeducedLine>>
<<else>>
<p>The last of them goes down in the ditch or over it and away across the fields, and then the road is quiet except for the mules. The drivers crawl out from under the wagons. The crates are all there, still lashed down. One has a knife stuck in its lid where somebody tried to pry it open; the caravan master works it loose, looks it over, and tucks it into her belt.</p>
<</if>>
<<if _cvE>>
<<say "Caravan master" `"Every crate, and not a scratch on them that matters. That's " + setup.ECONOMY.caravan.perFightWon + " more on your tally, hired. Don't get used to me being pleased."`>>
<</if>>
<<if setup.kiraWithYou()>>
<<say "Kira" "Not bad, vault boy. Now let's move before they come back with friends.">>
<</if>>
<<caravanRoadChoices>><<journeyTerrainBackground>>
<<set _cvHow to setup.caravanFightEnd()>>
<<set _cvFirst to setup.caravanFightResult(_cvHow)>>
<<set _cvE to setup.caravanEscort()>>
<<set _cvN to setup.caravanRaidersStanding()>>
<<if _cvHow is "won">>
<h2>The Wagons Roll On</h2>
<<caravanSeducedLine>>
<<if _cvE>>
<<say "Caravan master" `"I don't care how you did it, hired, and I don't want to know. Every crate's still on the wagon. That's " + setup.ECONOMY.caravan.perFightWon + " more on your tally."`>>
<</if>>
<<if setup.kiraWithYou()>>
<<say "Kira" "Crates are safe. Wipe that look off your face before she sees it.">>
<</if>>
<<elseif _cvHow is "parley">>
<h2>Terms</h2>
<p>They lower their blades a little at a time, watching the drivers' hands under the benches as much as yours. Their price is one crate, and they don't haggle over which: they cut the nearest loose from the last wagon and haul it off the tailboard, back the way they came, into the ditches and away across the fields. The rest stay lashed down, and the wagons stand.</p>
<<if _cvE>>
<<say "Caravan master" "Talked the bastards off my wagons for one crate. First time I've seen that work. That crate's share comes out of your pay, hired, and you put nobody in the ditch, so there's no fight money in it either.">>
<</if>>
<<if setup.kiraWithYou()>>
<<say "Kira" "Talking. Huh. Didn't know you had that in you.">>
<</if>>
<<else>>
<h2>A Crate Short</h2>
<<if _cvHow is "fled">>
<p>You break off and run for the wagons, and the raiders let you go: you were never what they came for. <<if _cvN > 2>>Two of them saw through the ropes on the last wagon while the rest hold the drivers back with their knives<<elseif _cvN is 2>>One of them saws through the ropes on the last wagon while the other holds the drivers back with a knife<<else>>The one still on their feet saws through the ropes on the last wagon while the drivers keep well back<</if>>, and a crate goes over the tailboard into the ditch with a crack of splitting wood. Then they're gone with it, back the way they came, hooting.</p>
<<else>>
<p>When you can see straight again the wagons have pulled up a little way down the highway and the raiders are gone. So is a crate. The ropes on the last wagon hang cut, and a drag mark runs through the dust where they hauled it off into the fields.</p>
<</if>>
<<if _cvE>>
<<say "Caravan master" `_cvE.crates + " crates. I hired you to count to " + setup.ECONOMY.caravan.crates + ", hired, not to watch me count down. That crate's share of your pay is in some raider's belly now. Walk."`>>
<</if>>
<<if setup.kiraWithYou()>>
<<if _cvHow is "fled">>
<<say "Kira" "Don't look at me like that. They wanted the box, not us. Let them choke on it.">>
<<else>>
<<say "Kira" "We're still breathing. That's the part that matters. The crate can go fuck itself.">>
<</if>>
<</if>>
<</if>>
<<caravanRoadChoices>><<journeyTerrainBackground>>
<<set _cvFled to (setup.caravanEscort() || {}).fight === "fled">>
<h2>The Drivers' Fire</h2>
<<if setup.campIsNight()>>
<p>The caravan master won't push the mules through the dark after a fight. The wagons pull off the highway into a ring, shafts in, and somebody gets a fire going in the middle of it out of broken pallet slats. The drivers sit close to it and say very little.</p>
<<else>>
<p>The caravan master halts the wagons to water the mules and to let the drivers' hands stop shaking. Somebody kicks a cook fire together on the verge out of broken pallet slats, and the drivers crowd round it and say very little.</p>
<</if>>
<p>One of them, the woman who held the lead mule's head while the knives were out, drops onto the log beside you with a tin cup in her hand. She drinks and passes it over without asking. It's something brewed out of potatoes and spite, and it burns all the way down.</p>
<<if _cvFled>>
<<say "Caravan woman" "You ran when the knives came out. Smart. The dead ones never get warm again.">>
<<else>>
<<say "Caravan woman" "You stood in front of my wagon. Most hired meat stands behind it.">>
<</if>>
<p>She takes the cup back and finishes it. Her knee is against yours, and it's shaking.</p>
<<say "Caravan woman" "I'm cold, I've still got the shakes, and you're the warmest thing on this road. I'm going to sit in your lap now. Say no if you mean it.">>
<<if setup.kiraWithYou()>>
<p>Kira climbs onto the lead wagon's bench with her weapon across her knees and her back very deliberately to the fire.</p>
<<say "Kira" "I've got the watch. Whatever you two are doing down there, do it quiet.">>
<</if>>
<div class="choice-container">
<<vchoice "Let her" "Travel_Caravan_Camp_Ride" "intimate" "heart">>
<<vchoice "Back to the wagons" `$journey.returnPassage || "Journey_Event_Continue"` "action" "forward">>
</div><<journeyTerrainBackground>>
<<set _cvFled to (setup.caravanEscort() || {}).fight === "fled">>
<<if setup.caravanCampOnce()>>
<<advanceTime 0 30>>
<<set $player.lust to Math.min($player.lust, 20)>><<run setup.playerReleased()>>
<</if>>
<h2>The Drivers' Fire</h2>
<<storyVideo "story/caravan/camp_night">>
<<if _storyClip is "c178e984196b">><p>She doesn't take anything off but your belt. She walks you away from the cook fire, round behind a dead tractor at the edge of the halt, and puts you on your back in the long grass. She gets your belt open one-handed without looking down and finds your cock already hard in her cold fingers. She laughs at that, short. Then she hikes her skirt up round her waist, squats over you in her boots, and sinks onto you, slow, hot and wet and tight, a lot warmer inside than her hands.</p><<elseif _storyClip is "eba4c63425be">><p>She pulls her shirt off over her head and keeps the rest on. She walks you away from the cook fire, round behind a dead tractor at the edge of the halt, and puts you on your back in the long grass. She gets your belt open one-handed without looking down and finds your cock already hard in her cold fingers. She laughs at that, short. Then she hikes her skirt up round her waist, squats over you in her boots, and sinks onto you, slow, hot and wet and tight, a lot warmer inside than her hands. Your hand finds her hip, and she lets it stay there.</p><<elseif _storyClip is "f0144f32fb59">><p>She doesn't do it at the fire. She pulls you up off the log by your belt and walks you back into the pines behind the wagons, far enough that the drivers can pretend not to hear. There she throws a wagon blanket down on the needles, strips to the skin without any hurry, and pushes you down onto it. She gets your belt open one-handed and finds your cock already hard in her cold fingers. She laughs at that, short. Then she squats over you with her knees wide, leans back on her hands, and sinks onto you, slow, hot and wet and tight, a lot warmer inside than her hands.</p><<elseif _storyClip is "e6613653a11c">><p>She drops her coat on the log. She pushes you down onto the blanket by the fire, shoves her top down round her waist, and gets your belt open one-handed without looking down. Your cock is already hard in her cold fingers. She laughs at that, short. Then she squats over you with the fire at her back, holds you steady in her own hand, and sinks onto you, slow, hot and wet and tight, a lot warmer inside than her hands.</p><<else>><p>She doesn't take her coat off. She straddles you on the log with her knees in the dirt either side of you and the fire at her back, gets your belt open one-handed without looking down, and finds your cock already hard in her cold fingers. She laughs at that, short, into your neck. Then she shoves her trousers down off her hips, shifts her weight, and sinks onto you, slow, hot and wet and tight, a lot warmer inside than her hands.</p><</if>>
<<say "Caravan woman" "There. That's the warm I wanted.">>
<p>She rides you the way she drives: steady, no wasted motion, her hands on your shoulders and her hips doing all the work. <<if _storyClip is "c178e984196b" or _storyClip is "eba4c63425be" or _storyClip is "f0144f32fb59">>Back at the fire<<else>>On the far side of the fire<</if>> the other drivers find something interesting to look at in the mules. Somebody laughs. She doesn't care, and after a while neither do you. Every time you start to buck up into her she sits down hard and stops dead, buried to the root, and holds you there with her cunt squeezing until the edge backs off.</p>
<<if _cvFled>>
<<say "Caravan woman" "Not yet. You ran from them. You don't get to run from me. Sit under me till I say.">>
<<else>>
<<say "Caravan woman" "Not yet. You stood in front of my wagon. Now you sit under me till I say.">>
<</if>>
<p>She takes her time about it, and she takes hers twice: the first shudders through her with her teeth in your shoulder to keep it quiet, the second is loud enough to start the mules. Only then does she grind down and rock and squeeze, and nod once, like a driver giving the mules their head. Now. You come so hard <<if _storyClip is "c178e984196b" or _storyClip is "eba4c63425be">>your back lifts off the grass<<elseif _storyClip is "f0144f32fb59" or _storyClip is "e6613653a11c">>your back lifts off the blanket<<else>>the log creaks<</if>>, pumping up into her while she holds your face in her cold hands and watches you do it.</p>
<p>She climbs off, wipes herself with <<if _storyClip is "eba4c63425be">>a rag<<else>>a rag from her coat pocket<</if>>, drops the rag in your lap, <<if _storyClip is "c178e984196b">>walks you back to the log, <<elseif _storyClip is "eba4c63425be">>pulls her shirt back on, walks you back to the log, <<elseif _storyClip is "f0144f32fb59">>gets dressed, walks you back to the log, <</if>>and sits back down beside you with her hands held out to the fire as if nothing happened.</p>
<<say "Caravan woman" "Better. Now I can feel my fingers.">>
<<if setup.kiraWithYou()>>
<<say "Kira" "Finished? Good. Half the road heard you, idiot.">>
<</if>>
<div class="choice-container">
<<vchoice "Walk on with the wagons" `$journey.returnPassage || "Journey_Event_Continue"` "action" "forward">>
</div><<postBattleLeave>>
<<goto _pblNext>><<run setup.clothesTornAt = 30>>
<<run setup.clothesTorn = function (who) {
var c = (State.variables.clothing || {})[who];
return !!c && (c.top < setup.clothesTornAt || c.bottom < setup.clothesTornAt);
}>>
<<widget "postBattleLeave">>
<<set $postBattle to null>>
<<set _playerNaked to ($clothing.player.top <= 0 && $clothing.player.bottom <= 0)>>
<<set _kiraNaked to setup.kiraWithYou() && ($clothing.kira.top <= 0 && $clothing.kira.bottom <= 0)>>
<<set _playerExposed to ($clothing.player.dickExposed || $clothing.player.assExposed)>>
<<set _kiraExposed to setup.kiraWithYou() && ($clothing.kira.titsExposed || $clothing.kira.pussyExposed)>>
<<set _baseRisk to 20>>
<<if _playerExposed>><<set _baseRisk += 15>><</if>>
<<if _kiraExposed>><<set _baseRisk += 15>><</if>>
<<if _playerNaked>><<set _baseRisk += 20>><</if>>
<<if _kiraNaked>><<set _baseRisk += 20>><</if>>
<<if $companions[0].lust >= 60>><<set _baseRisk += 10>><</if>>
<<set $journey.encounter.risk to _baseRisk>>
<<if !setup.fightOnTrip()>><<set $journey.encounter.happened to false>><</if>>
<<set $journey.exposure.player.exposed to _playerExposed>>
<<set $journey.exposure.player.naked to _playerNaked>>
<<set $journey.exposure.companion.exposed to _kiraExposed>>
<<set $journey.exposure.companion.naked to _kiraNaked>>
<<if !setup.fightOnTrip()>><<set $journey.ticksThisSegment to 0>><</if>>
<<if setup.fightOnTrip()>>
<<set _pblNext to setup.hasRepairMaterial(["player"]) ? "PostBattle_QuickRepair_Option" : setup.fightTripRoad()>>
<<else>>
<<set _pblNext to setup.hasRepairMaterial(["player"]) ? "PostBattle_QuickRepair_Option" : "PostBattle_Travel_Start">>
<</if>>
<</widget>><<setBackground "reclaimed-aftermath">>
<h2>Before You Leave</h2>
<<if setup.fightOnTripAway()>><<if (setup.repairMaterial(["player"]) || {}).bag is "open">>You have an opened sewing kit with thread left in it. You could do a quick patch job before moving on.<<else>>You have cloth or a sewing kit in your pack. You could do a quick patch job before moving on.<</if>><<else>><<if (setup.repairMaterial(["player"]) || {}).bag is "open">>You have an opened sewing kit with thread left in it. You could do a quick patch job before heading back.<<else>>You have cloth or a sewing kit in your pack. You could do a quick patch job before heading back.<</if>><</if>>
<<if $journey.exposure.player.exposed || $journey.exposure.companion.exposed>>
<p class="warning">Warning: Traveling exposed increases encounter risk significantly.</p>
<p class="warning">Current encounter risk: <<print $journey.encounter.risk>>%</p>
<</if>>
<<if setup.kiraWithYou() && $journey.exposure.player.naked && $journey.exposure.companion.naked>>
<<if setup.fightOnTripAway()>><p class="explicit">You're both completely naked. The journey is going to be... intense.</p><<else>><p class="explicit">You're both completely naked. The journey back is going to be... intense.</p><</if>>
<<elseif $journey.exposure.player.naked>>
<p class="explicit">You're naked. Every step is going to feel very exposed.</p>
<<elseif setup.kiraWithYou() && $journey.exposure.companion.naked>>
<p class="explicit">Kira is completely naked. She's trying to cover herself with her hands, but it's not working.</p>
<</if>>
<div class="choice-container">
<<if $clothing.player.top lt 50 || $clothing.player.bottom lt 50>>
<<vchoice "Patch your clothes (quick fix)" "PostBattle_QuickRepair_Player" "action" "armor">>
<</if>>
<<if setup.kiraWithYou() && ($clothing.kira.top lt 50 || $clothing.kira.bottom lt 50)>>
<<vchoice "Patch Kira's clothes" "PostBattle_QuickRepair_Kira" "action" "armor">>
<</if>>
<<set _qrGo to setup.fightOnTrip() ? setup.fightTripRoad() : "PostBattle_Travel_Start">>
<<vchoice "No time — let's go" _qrGo "action" "run">>
</div><<setBackground "reclaimed-aftermath">>
You pull out what you have to mend with and do a rough patch job on your clothes.
<<quickPatch "player">>
<p>It's not pretty, but you're covered. Mostly.</p>
<<if $clothing.player.dickExposed>>
<p class="explicit">...your dick is still kind of visible through the gaps. The quick fix only does so much.</p>
<p class="narrator">The fabric is thin. The wind makes you very aware of what's barely hidden.</p>
<<else>>
<<if setup.fightOnTripAway()>><p>At least you're decent now. That should reduce the risk on the way.</p><<else>><p>At least you're decent now. That should reduce the risk on the way back.</p><</if>>
<</if>>
<<if setup.kiraWithYou()>><<say "Kira" "Better than nothing, I guess.">><</if>>
<div class="choice-container">
<<vchoice "Continue" "PostBattle_QuickRepair_Option" "action" "map">>
</div><<setBackground "reclaimed-aftermath">>
<<say $player.name "Let me patch you up.">>
<<say "Kira" "I can do it my—">>
<<say $player.name "Hold still.">>
<<quickPatch "kira">>
<p>You patch the worst of the tears with quick, rough stitches. Your hands brush against her skin more than strictly necessary.</p>
<<if $clothing.kira.titsExposed>>
<p class="explicit">Her tits are still mostly visible through the gaps and tears. The fabric barely holds together.</p>
<p class="narrator">She catches you looking.</p>
<<say "Kira" "Eyes up, asshole.">>
<<addTension "kira" 5>>
<<else>>
<<if setup.fightOnTripAway()>><p>It's not perfect, but she's covered now. That should help on the journey.</p><<else>><p>It's not perfect, but she's covered now. That should help on the journey back.</p><</if>>
<</if>>
<<say "Kira" "...thanks.">>
<div class="choice-container">
<<vchoice "Continue" "PostBattle_QuickRepair_Option" "action" "map">>
</div><<if setup.fightOnTrip()>>
<<include "Journey_Event_Continue">>
<<else>>
<<setBackground "reclaimed-travel">>
<h2>The Journey Back</h2>
You set off toward the vault. The Reclaimed stretches before you, wild and untamed.
<<fullTravelScene>>
<<if $journey.exposure.player.naked && $journey.exposure.companion.naked>>
<<clampStat "player.lust" 10>>
<<clampStat "companions[0].lust" 15>>
<<addTension "kira" 10>>
<<elseif $journey.exposure.player.naked>>
<<clampStat "companions[0].lust" 10>>
<<addTension "kira" 5>>
<<elseif $journey.exposure.companion.naked>>
<<clampStat "player.lust" 15>>
<<addTension "kira" 10>>
<<elseif $journey.exposure.player.exposed && $journey.exposure.companion.exposed>>
<<clampStat "player.lust" 8>>
<<clampStat "companions[0].lust" 8>>
<<addTension "kira" 8>>
<<elseif $journey.exposure.companion.exposed>>
<<clampStat "player.lust" 5>>
<<addTension "kira" 5>>
<<elseif $journey.exposure.player.exposed>>
<<clampStat "companions[0].lust" 5>>
<</if>>
<<startJourney "vault">>
<<setupLegacyTravel>>
<<set $journey.isPostBattle to true>>
<p class="narrator">The vault is still hours away. You have a long journey ahead.</p>
<<set _pbTorn to !!setup.journeyCompanion() && (setup.clothesTorn("player") || setup.clothesTorn("kira"))>>
<div class="choice-container">
<<if _pbTorn>><<vchoice "Begin the trek" "PostCombat_Clothing_Check" "action" "map">><<else>><<vchoice "Begin the trek" "Journey_Tick" "action" "map">><</if>>
</div>
<</if>><<if $journey.active>>
<<include "Journey_Event_Continue">>
<<else>>
<<set $journey.ticksThisSegment += 1>>
<<tickExposure>>
<<set _tcPick to "Journey_Segment">>
<<if random(1, 100) <= 15>>
<<set _ambientRoll to random(1, 5)>>
<<switch _ambientRoll>>
<<case 1>>
<<set _tcPick to "Journey_Ambient_WindGust">>
<<case 2>>
<<set _tcPick to "Journey_Ambient_Thirst">>
<<case 3>>
<<set _tcPick to "Journey_Ambient_Shame">>
<<case 4>>
<<set _tcPick to "Journey_Ambient_Arousal">>
<<case 5>>
<<set _tcPick to "Journey_Ambient_Memory">>
<</switch>>
<<elseif !$journey.encounter.happened && random(1, 100) <= $journey.encounter.risk>>
<<set $journey.encounter.happened to true>>
<<set _encounterType to random(1, 3)>>
<<switch _encounterType>>
<<case 1>><<set _tcPick to "Journey_Encounter_Scavenger">>
<<case 2>><<set _tcPick to "Journey_Encounter_Raider">>
<<case 3>><<set _tcPick to "Journey_Encounter_Opportunist">>
<</switch>>
<<else>>
<<set _tcPick to "Journey_Segment">>
<</if>>
<<journeyTerrainBackground>>
<p class="narrator">You keep walking.</p>
<div class="choice-container">
<<vchoice "Continue" _tcPick "action" "forward">>
</div>
<</if>><<journeyTerrainBackground>>
<<set _terrain to $journey.currentSegment.terrain || "reclaimed">>
<<set _variant to random(1, 3)>>
<<switch _terrain>>
<<case "forest">>
<<if _variant === 1>>
<h2>Dense Woodland</h2>
<p>Trees crowd close, their branches intertwining overhead. The canopy filters the light into dappled patterns on the forest floor.</p>
<<elseif _variant === 2>>
<h2>Overgrown Trail</h2>
<p>You push through dense undergrowth, the vegetation reclaiming what was once a path. Nature has taken everything back.</p>
<<else>>
<h2>Forest Stream</h2>
<p>A shallow stream cuts through the trees, clear water trickling over mossy stones.</p>
<p class="narrator">At least some things still flow in this broken world.</p>
<</if>>
<<case "highway">>
<<if _variant === 1>>
<h2>Ruined Highway</h2>
<p>The remnants of an old highway stretch before you — cracked asphalt, rusted guardrails, abandoned vehicles.</p>
<p class="narrator">This world ended long ago. You're just walking through its corpse.</p>
<<elseif _variant === 2>>
<h2>Old Road</h2>
<p>Faded lane markings peek through the weeds. The road goes on, cutting through the overgrowth.</p>
<<else>>
<h2>Vehicle Graveyard</h2>
<p>Rusted cars and trucks line both sides of the road, picked clean long ago. Some still have bones in the driver's seats.</p>
<</if>>
<<case "ruins" "urban">>
<<if _variant === 1>>
<h2>Settlement Ruins</h2>
<p>The bones of a pre-war settlement scatter across the landscape. Houses collapsed, stores looted long ago, vines creeping through broken windows.</p>
<p class="narrator">People lived here once. Loved, fucked, fought, died. Now the forest is swallowing it all.</p>
<<elseif _variant === 2>>
<h2>Crumbling Buildings</h2>
<p>You pick your way through debris and rubble. Every structure here is a tomb.</p>
<<else>>
<h2>Overgrown Plaza</h2>
<p>An old town square, now choked with weeds. A fountain stands dry and cracked in the center.</p>
<</if>>
<<case "industrial">>
<<if _variant === 1>>
<h2>Rusted Factory</h2>
<p>Smokestacks rise like dead fingers against the sky. The air tastes metallic and wrong.</p>
<<elseif _variant === 2>>
<h2>Industrial Maze</h2>
<p>Pipes and catwalks create a labyrinth of rusted metal. Something drips from above. You don't look up.</p>
<<else>>
<h2>Toxic Pools</h2>
<p>Chemical runoff has pooled in the low areas, iridescent and deadly. You give them a wide berth.</p>
<</if>>
<<case "ravine">>
<<if _variant === 1>>
<h2>Canyon Path</h2>
<p>The canyon walls rise on either side, narrowing the sky to a strip of blue above.</p>
<<elseif _variant === 2>>
<h2>Rocky Outcrop</h2>
<p>You navigate through a field of broken rocks and boulders. The terrain is treacherous.</p>
<<else>>
<h2>Cliff Trail</h2>
<p>The path hugs a sheer cliff face. One wrong step and it's a long way down.</p>
<</if>>
<<case "swamp">>
<<if _variant === 1>>
<h2>Waterlogged Ground</h2>
<p>Your boots squelch in the waterlogged earth. The air is thick with moisture and buzzing insects.</p>
<<elseif _variant === 2>>
<h2>Murky Waters</h2>
<p>Stagnant water stretches between the trees, reflecting the sky like a dark mirror. Something moves beneath the surface.</p>
<<else>>
<h2>Twisted Roots</h2>
<p>Gnarled tree roots rise from the muck, creating a treacherous maze. The smell of rot hangs heavy.</p>
<</if>>
<<default>>
<<if _variant === 1>>
<h2>The Reclaimed</h2>
<p>Grassland and scattered trees stretch before you. Nature has reclaimed what civilization abandoned.</p>
<<elseif _variant === 2>>
<h2>Open Meadow</h2>
<p>A clearing opens up — tall grass and wildflowers stretching to the treeline. No cover. No concealment.</p>
<<else>>
<h2>Windswept Ridge</h2>
<p>You climb a low ridge, wind rustling through the grass around you.</p>
<</if>>
<</switch>>
<<travelMediaState>>
<<showTravelVideo _travelState>>
<<if $journey.exposure.player.naked || $journey.exposure.companion.naked>>
<p class="ambient"><<print setup.getTravelLine("ambient_heat", null)>></p>
<</if>>
<<if $journey.exposure.companion.exposed || $journey.exposure.companion.naked>>
<<kiraExposureNarrative>>
<</if>>
<<if $journey.exposure.player.exposed || $journey.exposure.player.naked>>
<<playerExposureNarrative>>
<</if>>
<<if ($journey.exposure.player.exposed || $journey.exposure.player.naked) && ($journey.exposure.companion.exposed || $journey.exposure.companion.naked)>>
<<mutualExposureNarrative>>
<</if>>
<<if $player.lust >= 70 || ($companions[0] && $companions[0].lust >= 60)>>
<<arousalNarrative>>
<</if>>
<<set _jsAhead to ($journey && $journey.destination && $journey.destination !== "vault" && $worldMap && $worldMap.nodes && $worldMap.nodes[$journey.destination]) ? $worldMap.nodes[$journey.destination].name : "">>
<<if _jsAhead>>
<p class="narrator">You keep moving. <<= _jsAhead>> is still ahead.</p>
<<else>>
<p class="narrator">You keep moving. The vault is still ahead.</p>
<</if>>
<<if $journey.active>>
<<journeyEventReturn>>
<<elseif $journey.ticksThisSegment >= 3>>
<p class="narrator">The vault entrance is close now. You can feel the familiar hum of its systems.</p>
<div class="choice-container">
<<vchoice "Continue walking" "Travel_Continue" "action" "run">>
<<vchoice "Push for the vault" "Travel_Complete" "action" "house">>
</div>
<<else>>
<<if $journey.ticksThisSegment === 1>>
<p class="narrator">The journey back has just begun. The vault feels distant still.</p>
<<elseif $journey.ticksThisSegment === 2>>
<p class="narrator">You've made some progress, but the vault is still a ways off.</p>
<<else>>
<p class="narrator">You keep moving. Every step brings you closer to safety.</p>
<</if>>
<div class="choice-container">
<<vchoice "Keep going" "Travel_Continue" "action" "map">>
</div>
<</if>><<journeyTerrainBackground>>
<h2>Sudden Gust</h2>
A powerful gust of wind tears across the Reclaimed, catching you off guard.
<<showTravelVideo "wind_gust">>
<<if $journey.exposure.player.naked>>
<p class="explicit">The wind hits your naked body like a slap. Your cock swings wildly, the cold air making you acutely aware of every inch of exposed skin.</p>
<<clampStat "player.lust" 5>>
<<elseif $journey.exposure.player.exposed>>
<p class="explicit">The wind catches your torn clothing, whipping it aside and exposing your dick completely for several long seconds.</p>
<<clampStat "player.lust" 3>>
<</if>>
<<if setup.kiraWithYou() && $journey.exposure.companion.naked>>
<p class="explicit">Kira yelps as the wind blasts her naked body. Her tits bounce, her hair whips wildly, and she's completely unable to cover herself.</p>
<<say "Kira" "FUCK! This is— this is humiliating!">>
<p class="narrator">Her face is red — from wind or shame, you're not sure.</p>
<<clampStat "companions[0].lust" 8>>
<<addTension "kira" 5>>
<<elseif setup.kiraWithYou() && $journey.exposure.companion.exposed>>
<p class="explicit">The wind tears at Kira's torn clothing, exposing her tits fully. She scrambles to cover herself.</p>
<<say "Kira" "Damn it! Could this get any worse?">>
<<clampStat "companions[0].lust" 5>>
<</if>>
<<journeyEventReturn>><<journeyTerrainBackground>>
<h2>Dry Throat</h2>
<<travelMediaState>>
<<showTravelVideo _travelState>>
The sun is merciless. Your throat is dry, lips cracked.
<<if setup.kiraWithYou()>>
<<say "Kira" "Water?">>
<<say $player.name "We're rationing. We'll drink when we get back.">>
<<say "Kira" "Right. When we get back.">>
<<else>>
You shake the canteen. Not much left. You'll drink when you get back.
<</if>>
<p class="narrator">If you get back.</p>
<<if $journey.exposure.player.naked || $journey.exposure.companion.naked>>
<p class="explicit">The heat makes you sweat, which just makes the exposure worse. Every drop of moisture evaporates, leaving salt trails on bare skin.</p>
<</if>>
<<clampStat "player.energy" -5 0 $player.maxEnergy>>
<<if setup.kiraWithYou()>><<set $companions[0].energy -= 5>><</if>>
<<journeyEventReturn>><<journeyTerrainBackground>>
<h2>The Weight of Exposure</h2>
<<travelMediaState>>
<<showTravelVideo _travelState>>
<<if $journey.exposure.player.naked>>
<p class="narrator">You're walking through the Reclaimed with your cock out. Completely exposed. Vulnerable.</p>
<p class="narrator">Part of you is horrified. Part of you is... aroused by it.</p>
<<clampStat "player.lust" 10>>
<<addCorruption 1>>
<<elseif setup.kiraWithYou() && $journey.exposure.companion.naked>>
<<say "Kira" "...">>
<p class="narrator">She's silent, but you can see the shame and arousal warring on her face. Her thighs press together as she walks.</p>
<<say "Kira" "Don't look at me like that.">>
<<say $player.name "Like what?">>
<<say "Kira" "Like you're enjoying this.">>
<p class="narrator">You don't answer. Because you are.</p>
<<clampStat "companions[0].lust" 10>>
<<addTension "kira" 10>>
<<elseif $journey.exposure.player.exposed || $journey.exposure.companion.exposed>>
<p class="narrator">The torn clothes are almost worse than being naked. At least nudity is honest.</p>
<p class="narrator">This is just... humiliating.</p>
<</if>>
<<journeyEventReturn>><<journeyTerrainBackground>>
<h2>Unwanted Reaction</h2>
<<travelMediaState>>
<<showTravelVideo _travelState>>
<<if $journey.exposure.player.naked && $player.lust >= 40>>
<p class="explicit">Your cock hardens as you walk, completely unavoidable. The exposure, the danger, the adrenaline — it's all turning you on.</p>
<p class="explicit">You're walking through the Reclaimed with a full erection and there's nothing you can do to hide it.</p>
<<clampStat "player.lust" 10>>
<<if setup.kiraWithYou()>>
<<say "Kira" "Are you— are you seriously hard right now?">>
<<say $player.name "It's not— I can't help it.">>
<<say "Kira" "Unbelievable.">>
<p class="narrator">But she keeps glancing at it.</p>
<<clampStat "companions[0].lust" 10>>
<<addTension "kira" 10>>
<</if>>
<<elseif setup.kiraWithYou() && $journey.exposure.companion.naked && $companions[0].lust >= 40>>
<p class="explicit">Kira's breathing is getting heavier. Her nipples are hard. Her pussy is glistening.</p>
<<say $player.name "Kira?">>
<<say "Kira" "Shut up. Don't— don't say anything.">>
<p class="explicit">She's aroused. The exposure, the vulnerability, the shame — it's all turning her on and she hates it.</p>
<<say "Kira" "This is so fucked up.">>
<<clampStat "companions[0].lust" 15>>
<<addTension "kira" 15>>
<<else>>
<p class="narrator">The adrenaline from combat is still in your system. Your heart pounds. Your skin tingles.</p>
<p class="narrator">Danger and arousal are hard to separate.</p>
<<clampStat "player.lust" 5>>
<<clampStat "companions[0].lust" 5>>
<</if>>
<<journeyEventReturn>><<journeyTerrainBackground>>
<h2>Echoes</h2>
<<travelMediaState>>
<<showTravelVideo _travelState>>
<<if $flags.postBattleSexKira>>
<p class="narrator">You remember what happened right after the fight. Her body against yours. The desperate fucking.</p>
<<if setup.kiraWithYou() && $journey.exposure.companion.naked>>
<p class="narrator">She's naked again now. You could—</p>
<<say "Kira" "Don't even think about it.">>
<<say $player.name "I wasn't—">>
<<say "Kira" "You were. I can see it in your eyes.">>
<p class="narrator">Fair.</p>
<</if>>
<<clampStat "player.lust" 10>>
<<addTension "kira" 5>>
<<else>>
<p class="narrator">The fight is over. You won. But you're still running on adrenaline and lust.</p>
<p class="narrator">The Reclaimed doesn't care.</p>
<</if>>
<<journeyEventReturn>><<setBackground "reclaimed-ruins">>
<h2>Scavenger</h2>
<<storyVideo "events/travel/encounter_scavenger">>
<<set $journey.encounter to $journey.encounter || {}>>
<<set $journey.encounter.scavengerFemale to (_storyClip is "e4fdbd5aa781" or _storyClip is "6ccff5f1c7c7")>>
<<set $journey.encounter.scavengerClip to _storyClip>>
<<if _storyClip is "e4fdbd5aa781" or _storyClip is "6ccff5f1c7c7">>Movement. A woman steps out from behind the rubble — a lone scavenger, a battered rifle already in her hands.<<else>>Movement. A figure emerges from behind rubble — a lone scavenger, armed with a makeshift weapon.<</if>>
<<if setup.kiraWithYou() && ($journey.exposure.companion.naked || $journey.exposure.companion.exposed)>>
The scavenger's eyes lock onto Kira's exposed body. A slow grin spreads across their face.
<<say "Scavenger" "Well, well. What do we have here? Walking around like that?">>
<<say "Kira" "Back off.">>
<<say "Scavenger" "Or what? You'll fight me? Naked?">>
<p class="narrator">The scavenger circles, weapon ready, eyes roaming over Kira's body.</p>
<<say "Scavenger" "I think you owe me a toll for passing through my territory.">>
<<elseif $journey.exposure.player.naked || $journey.exposure.player.exposed>>
The scavenger's eyes drop to your exposed cock. A laugh.
<<say "Scavenger" "Traveling like that? You're either very brave or very stupid.">>
<<say $player.name "Neither. Just unlucky.">>
<<say "Scavenger" "Lucky for me though.">>
<<else>>
The scavenger sizes you up, weapon ready.
<<say "Scavenger" "Nice gear. Hand it over and nobody gets hurt.">>
<<say $player.name "Not happening.">>
<<say "Scavenger" "Your choice.">>
<</if>>
<div class="choice-container">
<<vchoice "Fight them off" "Journey_Encounter_Fight" "action" "attack">>
<<vchoice "Try to negotiate" "Journey_Encounter_Negotiate" "talk" "talk">>
</div><<setBackground "reclaimed-ambush">>
<<createRaiderGroup 2 5>>
<<set $journey.encounter.enemies to _returnRaiderGroup>>
<<set _raidKira to setup.kiraWithYou()>>
<h2>Raider Ambush</h2>
<<if $journey.encounter.enemies.length === 2>>
<p class="narrator">Two raiders step out of cover, weapons drawn. They've been waiting.</p>
<<elseif $journey.encounter.enemies.length === 3>>
<p class="narrator">Three raiders emerge from the ruins, surrounding you. An ambush.</p>
<<elseif $journey.encounter.enemies.length === 4>>
<p class="narrator">Four raiders materialize from the shadows, cutting off your escape routes.</p>
<<else>>
<p class="narrator">Five raiders close in from all directions. A well-planned trap.</p>
<</if>>
<div class="enemy-preview">
<<for _ri, _raider range $journey.encounter.enemies>>
<span @class="'enemy-tag' + (_raider.gender === 'female' ? ' female' : ' male')">
<<if _raider.gender === "female">>♀<<else>>♂<</if>> _raider.name
</span>
<</for>>
</div>
<<set _leadRaider to $journey.encounter.enemies[0]>>
<<say _leadRaider.name "Drop your weapons.">>
<<if _raidKira && $journey.exposure.companion.naked>>
<<set _commentRaider to $journey.encounter.enemies[Math.floor(Math.random() * $journey.encounter.enemies.length)]>>
<<say _commentRaider.name "Holy shit, she's naked. This just got interesting.">>
<p class="explicit">The raiders exchange grins, moving to surround you.</p>
<<if $journey.encounter.enemies.some(function (e) { return e.gender === "male"; })>><<storyVideo "story/travel_raider_negotiation/journey_encounter_raider">><</if>>
<<if _storyFamily is "sf_cg_travel_raider_negotiation_04">><p class="explicit">They drive you into a gutted stable by the road. They already have one prize in there: a naked dark-haired woman with a tattooed arm, dirt on her cheek. They shove Kira into the straw beside her, and the one in the checked shirt looks the two of them over like livestock.</p><</if>>
<<say _leadRaider.name "You. Stay where you are. And you, sweetheart? On your knees.">>
<<say "Kira" "Fuck you.">>
<<set _laughRaider to $journey.encounter.enemies[1] || $journey.encounter.enemies[0]>>
<<say _laughRaider.name "That's the idea.">>
<<elseif $journey.exposure.player.naked>>
<<set _confusedRaider to $journey.encounter.enemies[Math.floor(Math.random() * $journey.encounter.enemies.length)]>>
<<say _confusedRaider.name "What the hell? Why is he naked?">>
<<say _leadRaider.name "Who cares? Makes our job easier.">>
<</if>>
<<if $journey.encounter.enemies.length >= 4>>
<p class="narrator">You're badly outnumbered. This is going to hurt.</p>
<<else>>
<p class="narrator">You're outnumbered. This could go bad quickly.</p>
<</if>>
<div class="choice-container">
<<vchoice `"FIGHT — Take on " + $journey.encounter.enemies.length + " raiders"` "Travel_Raider_Combat" "action" "attack">>
<<vchoice "Try to negotiate" "Travel_Raider_Negotiate" "talk" "talk">>
<<if _raidKira && $companions[0].lust >= 60>>
<<vchoice "Let them take Kira (she might want it)" "Journey_Encounter_KiraTaken" "intimate" "search">>
<</if>>
</div><<setBackground "reclaimed-combat">>
<<advanceTime 0 5>>
<<set _raidKira to setup.kiraWithYou()>>
<h2>Fight!</h2>
<<if $journey.encounter.enemies.length >= 4>>
<p class="narrator">You launch yourself at them before they can fully close the trap. It's desperate, but it's your only chance.</p>
<<elseif $journey.encounter.enemies.length === 3>>
<p class="narrator">You attack without hesitation, hoping to thin their numbers before they overwhelm you.</p>
<<else>>
<p class="narrator">You attack without hesitation. The element of surprise works in your favor.</p>
<</if>>
<<if $journey.exposure.player.naked>>
<p class="explicit">Fighting naked is awkward as hell, but you manage. Your opponent is too surprised to take full advantage.</p>
<</if>>
<<if _raidKira && $journey.exposure.companion.naked>>
<p class="explicit">Kira fights with desperate fury, her naked body moving with lethal grace. Her exposure only makes her more dangerous.</p>
<</if>>
<<startCombat $journey.encounter.enemies `setup.roadCombatCompanion()` true>>
<div class="choice-container">
<<vchoice "Continue" "Combat_Start" "action" "forward">>
</div><<setBackground "reclaimed-ambush">>
<<advanceTime 0 5>>
<<set _leadRaider to $journey.encounter.enemies[0]>>
<<set _raiderCount to $journey.encounter.enemies.length>>
<<set _kiraCompliance to Math.floor(($companions[0].submission * 0.4) + ($companions[0].trust * 0.3) + ($companions[0].lust * 0.2) + ($companions[0].fear * 0.1))>>
<<set _raidKira to setup.kiraWithYou()>>
<h2>Negotiation</h2>
<<say $player.name "Wait. We don't have to do this.">>
<<say _leadRaider.name "You're right. You could just give us everything and walk away.">>
<<set _femaleRaiders to $journey.encounter.enemies.filter(function(e) { return e.gender === "female"; })>>
<<set _maleRaiders to $journey.encounter.enemies.filter(function(e) { return e.gender === "male"; })>>
<<set _raidWomenOnly to _femaleRaiders.length === $journey.encounter.enemies.length && _femaleRaiders.length > 0>>
<<if _raidWomenOnly>>
<<if _femaleRaiders.length > 1>><p class="explicit"><<randomLine "raider_female_only" "taunt_player">></p><<else>><p class="explicit"><<randomLine "raider_female_only" "taunt_player_one">></p><</if>>
<<if _raidKira>><<say "Kira" "<<randomLine 'kira_jokes' 'awkward_moment'>>">><</if>>
<<scrapBalance>>
<div class="choice-container">
<<vchoice `"Service " + (_femaleRaiders.length > 1 ? "all of them" : "her")` "Travel_Raider_Negotiate_PlayerService_FemaleOnly" "intimate" "seduce">>
<<if $vault.scrap >= 20>>
<<vchoice "Offer supplies instead (20 scrap)" "Travel_Raider_Negotiate_Supplies" "trade" "scrap">>
<</if>>
<<vchoice "Refuse — FIGHT!" "Travel_Raider_Combat" "action" "attack">>
</div>
<<elseif _raidKira && $journey.exposure.companion.naked>>
<p class="explicit">The raiders' eyes are locked on Kira's naked body. Several of them are already adjusting themselves, arousal obvious.</p>
<<if $journey.encounter.enemies.some(function (e) { return e.gender === "male"; })>><<storyVideo "story/travel_raider_negotiation/travel_raider_negotiate">><</if>>
<<if _storyFamily is "sf_cg_travel_raider_negotiation_04">><p class="explicit">The one in the checked shirt steps in between Kira and a second naked captive, close enough to breathe on them both.</p><</if>>
<<set _groper to $journey.encounter.enemies[Math.floor(Math.random() * _raiderCount)]>>
<<say _groper.name "Forget the supplies. I want HER.">>
<<if _kiraCompliance >= 86>>
<<say "Kira" `setup.randomLine("raider_negotiate", "kira_eager")`>>
<p class="explicit">Kira's flush deepens, but there's heat in her eyes too.</p>
<<elseif _kiraCompliance >= 66>>
<<say "Kira" `setup.randomLine("raider_negotiate", "kira_willing")`>>
<p class="explicit">Kira's flush deepens, but she doesn't immediately protest. Her thighs press together.</p>
<<elseif _kiraCompliance >= 46>>
<<say "Kira" `setup.randomLine("raider_negotiate", "kira_conflicted")`>>
<p class="narrator">Her voice wavers slightly. She's scared but trying not to show it.</p>
<<elseif _kiraCompliance >= 26>>
<<say "Kira" `setup.randomLine("raider_negotiate", "kira_reluctant")`>>
<p class="narrator">She's resisting, but not as fiercely as she could.</p>
<<else>>
<<say "Kira" `setup.randomLine("raider_negotiate", "kira_defiant")`>>
<p class="narrator">She means it. Getting her to cooperate won't be easy.</p>
<</if>>
<<say _leadRaider.name "Feisty. I like that.">>
<<elseif _raidKira && $journey.exposure.companion.exposed>>
<p class="explicit">Their eyes keep drifting to Kira's exposed skin. The atmosphere is tense with more than just violence.</p>
<<say _leadRaider.name "Your woman's showing quite a bit. Accident, or invitation?">>
<<if _kiraCompliance >= 66>>
<<say "Kira" "Does it matter?">>
<p class="explicit">She makes no move to cover herself.</p>
<<else>>
<<say "Kira" "Neither. Mind your own business.">>
<</if>>
<<else>>
<<if _raidKira>><p class="narrator">The lead raider looks you both over, calculating.</p><<else>><p class="narrator">The lead raider looks you over, calculating.</p><</if>>
<<say _leadRaider.name "You got supplies? Weapons? Something worth more than your lives?">>
<</if>>
<<if !_raidWomenOnly>>
<<scrapBalance>>
<div class="choice-container">
<<if $vault.scrap >= 20>>
<<vchoice "Offer supplies (20 scrap)" "Travel_Raider_Negotiate_Supplies" "trade" "scrap">>
<</if>>
<<if _raidKira>>
<<if $journey.exposure.companion.naked>>
<<if _kiraCompliance >= 46 || $companions[0].lust >= 50>>
<<vchoice "Offer to let them look (Kira poses)" "Travel_Raider_Negotiate_KiraPose" "intimate" "seduce">>
<<else>>
<<vchoice "Order Kira to pose for them" "Travel_Raider_Negotiate_KiraPose_Forced" "intimate" "seduce">>
<</if>>
<<elseif $journey.exposure.companion.exposed>>
<<if _kiraCompliance >= 46 || $companions[0].lust >= 50>>
<<vchoice "Ask Kira to strip completely" "Travel_Raider_Negotiate_KiraStrip" "intimate" "seduce">>
<<else>>
<<vchoice "Order Kira to strip (she'll resist)" "Travel_Raider_Negotiate_KiraStrip_Forced" "intimate" "seduce">>
<</if>>
<<else>>
<<if _kiraCompliance >= 35 || $companions[0].lust >= 40>>
<<vchoice "Suggest Kira show some skin" "Travel_Raider_Negotiate_KiraFlash" "intimate" "seduce">>
<<else>>
<<vchoice "Tell Kira to flash them (she won't like it)" "Travel_Raider_Negotiate_KiraFlash_Forced" "intimate" "seduce">>
<</if>>
<</if>>
<<if $journey.exposure.companion.naked || $journey.exposure.companion.exposed>>
<<if _kiraCompliance >= 55 || $companions[0].lust >= 60>>
<<vchoice "Let them touch Kira" "Travel_Raider_Negotiate_KiraGrope" "intimate" "hand">>
<<else>>
<<vchoice "Offer Kira's body to touch (force her)" "Travel_Raider_Negotiate_KiraGrope_Forced" "intimate" "hand">>
<</if>>
<</if>>
<<if _maleRaiders.length > 0>>
<<if _kiraCompliance >= 70 || $companions[0].lust >= 75>>
<<vchoice "Offer Kira's mouth (she might comply)" "Travel_Raider_Negotiate_KiraOral" "intimate" "lips">>
<<elseif $journey.exposure.companion.naked || $companions[0].lust >= 40>>
<<vchoice "Offer Kira's mouth (force her)" "Travel_Raider_Negotiate_KiraOral_Forced" "intimate" "lips">>
<</if>>
<</if>>
<<if _maleRaiders.length > 0 && ($journey.exposure.companion.naked || $journey.exposure.companion.exposed)>>
<<if _kiraCompliance >= 80 || $companions[0].lust >= 85>>
<<vchoice "Let them have her completely" "Travel_Raider_Negotiate_KiraUsed" "intimate" "seduce">>
<<else>>
<<vchoice "Give Kira to them (CNC)" "Travel_Raider_Negotiate_KiraUsed_Forced" "intimate" "seduce">>
<</if>>
<</if>>
<</if>>
<<if _femaleRaiders.length > 0>>
<<vchoice `"Offer yourself to the " + (_femaleRaiders.length > 1 ? "women" : "woman")` "Travel_Raider_Negotiate_PlayerService" "intimate" "hand">>
<</if>>
<<vchoice "Threaten them (risky)" "Travel_Raider_Negotiate_Threaten" "action" "attack">>
<<vchoice "Forget this — FIGHT!" "Travel_Raider_Combat" "action" "attack">>
</div>
<</if>><<setBackground "reclaimed-ambush">>
<<set _leadRaider to $journey.encounter.enemies[0]>>
<<set _raidKira to setup.kiraWithYou()>>
<h2>Paying the Toll</h2>
<<set $vault.scrap -= 20>>
<<if _raidKira>><<say $player.name "Here. Twenty units of scrap. Now let us pass.">><<else>><<say $player.name "Here. Twenty units of scrap. Now let me pass.">><</if>>
<p class="narrator">You hand over the materials. The lead raider weighs them, nods.</p>
<<say _leadRaider.name "Smart. Get moving before I change my mind.">>
<<if _raidKira && $journey.exposure.companion.naked>>
<p class="explicit">Their eyes follow Kira's naked form as you leave. You can hear them arguing about whether they should have demanded more.</p>
<<say "Kira" "I could feel them undressing me with their eyes. Except I'm already undressed.">>
<<clampStat "companions[0].lust" 10>>
<</if>>
<div class="choice-container">
<<vchoice "Leave quickly" "Travel_Continue" "action" "run">>
</div><<setBackground "reclaimed-ambush">>
<<advanceTime 0 5>>
<<set _leadRaider to $journey.encounter.enemies[0]>>
<<set _raiderCount to $journey.encounter.enemies.length>>
<h2>A Glimpse</h2>
<<say $player.name "What if my companion shows you something... memorable. Then you let us go.">>
<p class="narrator">Kira's eyes widen, then narrow. But she understands the situation.</p>
<<say "Kira" "You're serious.">>
<<say $player.name "It's this or fight _raiderCount of them.">>
<<say _leadRaider.name "I'm listening. Show us what she's got.">>
<<if $journey.encounter.enemies.some(function (e) { return e.gender === "male"; })>><<storyVideo "story/travel_raider_negotiation/kira_flash">><</if>>
<p class="explicit"><<randomLine "raider_kira_flash" "compliance">></p>
<<if _storyFamily is "sf_cg_travel_raider_negotiation_04">><p class="explicit">Then she peels the whole top off over her head and stands there bare-breasted, nothing on below either, smiling down at them while a raider's fingers slide over her pussy.</p><</if>>
<p class="explicit"><<randomLine "raider_kira_flash" "raider_reaction">></p>
<<set $journey.exposure.companion.exposed to true>>
<<set $clothing.kira.titsExposed to true>>
<<clampStat "companions[0].lust" 15>>
<<set $companions[0].submission += 5>>
<<for _e range $journey.encounter.enemies>>
<<set _e.lust to setup.enemyLustPlus(_e, 30)>>
<</for>>
<<say _leadRaider.name "Nice tits. But I think we want more.">>
<<say "Kira" "That wasn't the deal!">>
<<say _leadRaider.name "Deal's changed. Show us everything, or we take it.">>
<div class="choice-container">
<<vchoice "Tell Kira to strip completely" "Travel_Raider_Negotiate_KiraStrip" "intimate" "seduce">>
<<vchoice "Offer something else" "Travel_Raider_Negotiate_Escalate" "talk" "talk">>
<<vchoice "Enough — FIGHT!" "Travel_Raider_Combat_Aroused" "action" "attack">>
</div><<setBackground "reclaimed-ambush">>
<<advanceTime 0 5>>
<<set _leadRaider to $journey.encounter.enemies[0]>>
<<set _raiderCount to $journey.encounter.enemies.length>>
<h2>Forced Exposure</h2>
<<say $player.name "What if my companion shows you something... memorable. Then you let us go.">>
<<say "Kira" "What?! No. Absolutely not.">>
<<say $player.name "Kira, we're outnumbered. This is the only way.">>
<<say "Kira" "I am NOT stripping for these animals!">>
<p class="narrator">She's not backing down. You'll have to force her.</p>
<div class="choice-container">
<<vchoice "Grab her and do it yourself" "Travel_Raider_KiraFlash_PlayerForces" "action" "hand">>
<<vchoice "Let the raiders do it" "Travel_Raider_KiraFlash_RaidersForce" "intimate" "seduce">>
<<vchoice "Back off — find another way" "Travel_Raider_Negotiate" "talk" "talk">>
<<vchoice "Forget this — FIGHT!" "Travel_Raider_Combat" "action" "attack">>
</div><<setBackground "reclaimed-ambush">>
<<advanceTime 0 5>>
<<set _leadRaider to $journey.encounter.enemies[0]>>
<<set _raiderCount to $journey.encounter.enemies.length>>
<h2>Taking Control</h2>
<<if $journey.encounter.enemies.some(function (e) { return e.gender === "male"; })>><<storyVideo "story/travel_raider_negotiation_forced/travel_raider_kira_flash_player_forces">><</if>>
<<if _storyFamily is "sf_cg_travel_raider_negotiation_forced_04">><p class="narrator">Before you can move, the lead raider has her by the throat, slammed against the slatted wall, snarling into her face. When he lets go she stands there shaking, and you step behind her and grab the hem of her top.</p><<else>><p class="narrator">You step behind Kira and grab the hem of her top.</p><</if>>
<<say "Kira" "What are you— DON'T!">>
<p class="explicit"><<randomLine "raider_kira_flash" "forced_player">></p>
<<say $player.name "Look your fill. This is what you wanted.">>
<p class="explicit"><<randomLine "raider_kira_pose" "reaction_forced">></p>
<p class="explicit"><<randomLine "raider_kira_flash" "raider_reaction">></p>
<<set $journey.exposure.companion.exposed to true>>
<<set $clothing.kira.titsExposed to true>>
<<clampStat "companions[0].lust" 10>>
<<set $companions[0].submission += 15>>
<<set $companions[0].trust += setup.kiraUseTrust(-2)>>
<<set $companions[0].fear += 10>>
<<for _e range $journey.encounter.enemies>>
<<set _e.lust to setup.enemyLustPlus(_e, 35)>>
<</for>>
<<if setup.kiraAllowsUse()>>
<<say "Kira" "I'll never forgive you for this...">>
<p class="narrator">She says it loud enough for all of them. Then, under her breath, just for you:</p>
<<say "Kira" "...God, I'm soaked.">>
<<else>>
<<say "Kira" "I'll never forgive you for this...">>
<</if>>
<<say _leadRaider.name "Ha! Nice. But I want to see MORE.">>
<div class="choice-container">
<<vchoice "Strip her completely" "Travel_Raider_Negotiate_KiraStrip_Forced" "intimate" "seduce">>
<<vchoice "That's enough. Let us go." "Travel_Raider_Negotiate_Escalate" "talk" "talk">>
<<vchoice "FIGHT!" "Travel_Raider_Combat_Aroused" "action" "attack">>
</div><<setBackground "reclaimed-ambush">>
<<advanceTime 0 5>>
<<set _leadRaider to $journey.encounter.enemies[0]>>
<<set _raiderCount to $journey.encounter.enemies.length>>
<h2>Letting Them</h2>
<<say $player.name "She's not cooperating. You want to see her? Go ahead.">>
<<say "Kira" "You BASTARD—">>
<<if $journey.encounter.enemies.some(function (e) { return e.gender === "male"; })>><<storyVideo "story/travel_raider_negotiation_forced/travel_raider_kira_flash_raiders_force">><</if>>
<<if _storyFamily is "sf_cg_travel_raider_negotiation_forced_04">><p class="explicit">The lead raider drops onto a gutted couch and tells her to open her shirt. A knife at her ribs says she will. Button by button she does, shrugs it off and stands there in her bra while he stares.</p><<else>><p class="explicit"><<randomLine "raider_kira_flash" "forced_raiders">></p><</if>>
<<say "Kira" "NO! Get off me!">>
<<if setup.kiraAllowsUse()>>
<p class="explicit"><<randomLine "raider_kira_grope" "response_forced_allowed">></p>
<<else>>
<p class="explicit"><<randomLine "raider_kira_grope" "response_forced">></p>
<</if>>
<<set $journey.exposure.companion.exposed to true>>
<<set $clothing.kira.titsExposed to true>>
<<set $clothing.kira.top to 0>>
<<clampStat "companions[0].lust" 20>>
<<set $companions[0].submission += 20>>
<<set $companions[0].trust += setup.kiraUseTrust(-4)>>
<<set $companions[0].fear += 15>>
<<for _e range $journey.encounter.enemies>>
<<set _e.lust to setup.enemyLustPlus(_e, 45)>>
<</for>>
<<if _storyFamily is "sf_cg_travel_raider_negotiation_forced_04">><<say _leadRaider.name "Bra next. Then hold her still...">><<else>><<say _leadRaider.name "Fuck, look at those tits. Hold her still...">><</if>>
<p class="explicit"><<randomLine "raider_kira_grope" "initial">></p>
<<if setup.kiraAllowsUse()>>
<<say "Kira" "Get your hands— fuck— fine. FINE. Look, then, you animals.">>
<p class="narrator">Her defiance is crumbling. Over the lead raider's shoulder she catches your eye, and doesn't look away.</p>
<<else>>
<<say "Kira" "Please... just let us go...">>
<p class="narrator">Her defiance is crumbling.</p>
<</if>>
<div class="choice-container">
<<vchoice "Tell them to stop — that's enough" "Travel_Raider_Negotiate_Escalate" "talk" "talk">>
<<vchoice "Let them strip her completely" "Travel_Raider_Negotiate_KiraStrip_Forced" "intimate" "seduce">>
<<vchoice "Let them have more" "Travel_Raider_Negotiate_KiraGrope_Forced" "intimate" "hand">>
<<vchoice "This is wrong — FIGHT!" "Travel_Raider_Combat_Aroused" "action" "attack">>
</div><<setBackground "reclaimed-ambush">>
<<advanceTime 0 5>>
<<set _leadRaider to $journey.encounter.enemies[0]>>
<<set _raiderCount to $journey.encounter.enemies.length>>
<h2>Full Display</h2>
<<if !$journey.exposure.companion.exposed>>
<<say $player.name "What if she strips? Completely. You get a show, we walk.">>
<<say "Kira" "You can't be—">>
<<say $player.name "Kira. Please.">>
<</if>>
<p class="explicit"><<randomLine "raider_kira_strip" "compliance">></p>
<<set $journey.exposure.companion.naked to true>>
<<set $journey.exposure.companion.exposed to true>>
<<set $clothing.kira.titsExposed to true>>
<<set $clothing.kira.pussyExposed to true>>
<<set $clothing.kira.top to 0>>
<<set $clothing.kira.bottom to 0>>
<<clampStat "companions[0].lust" 25>>
<<set $companions[0].submission += 10>>
<<for _e range $journey.encounter.enemies>>
<<set _e.lust to setup.enemyLustPlus(_e, 50)>>
<</for>>
<p class="explicit"><<randomLine "raider_kira_strip" "display">></p>
<p class="explicit"><<randomLine "raider_kira_flash" "raider_reaction">></p>
<<storyVideo "story/travel_raider_negotiation/kira_strip">>
<<say _leadRaider.name "Turn around. Slowly. Let us see everything.">>
<<if _storyClip is "6d0b97627c14">><p class="explicit">She turns her back on them and bends forward so they see everything, the panties she just peeled off tangled round her thighs, then straightens, hands on her hips, and lets them drop to her ankles.</p><<else>><p class="explicit"><<randomLine "raider_kira_strip" "display">></p><</if>>
<<say "Kira" "You've seen everything. Now let us go.">>
<<set _avgLust to 0>>
<<for _e range $journey.encounter.enemies>>
<<set _avgLust += _e.lust>>
<</for>>
<<set _avgLust to Math.floor(_avgLust / _raiderCount)>>
<<if _avgLust >= 70>>
<<say _leadRaider.name "Looking's not enough anymore. I need to TOUCH.">>
<p class="narrator">They're too aroused. The situation is escalating.</p>
<div class="choice-container">
<<vchoice "Let them touch her" "Travel_Raider_Negotiate_KiraGrope" "intimate" "hand">>
<<vchoice "Offer her mouth instead" "Travel_Raider_Negotiate_KiraOral" "intimate" "lips">>
<<vchoice "No — FIGHT!" "Travel_Raider_Combat_Aroused" "action" "attack">>
</div>
<<else>>
<<say _leadRaider.name "...Fine. A deal's a deal. But she walks out of here naked. You don't get to cover up, sweetheart.">>
<<say "Kira" "Whatever. Let's go.">>
<div class="choice-container">
<<vchoice "Leave while you can" "Travel_Continue" "action" "run">>
<<vchoice "Actually... offer more" "Travel_Raider_Negotiate_Escalate" "intimate" "seduce">>
</div>
<</if>><<setBackground "reclaimed-ambush">>
<<advanceTime 0 10>>
<<set _leadRaider to $journey.encounter.enemies[0]>>
<<set _raiderCount to $journey.encounter.enemies.length>>
<h2>Posing</h2>
<<say $player.name "She'll pose for you. Give you all a good, long look. Then we leave.">>
<<say _leadRaider.name "Pose? She's already naked. I can see everything.">>
<<say $player.name "Not everything. Not... like this.">>
<<storyVideo "story/travel_raider_negotiation/kira_pose">>
<<if _storyClip is "ffa43f1c2ff7">><p class="explicit">The lead raider tosses her a scrap of sheer lingerie from their loot. "Put it on. I like it better when there's something to see through." She sprawls back on a split leather footstool from their loot pile, knees spread wide, and rubs her pussy through the see-through panties while they watch.</p><</if>>
<p class="explicit"><<randomLine "raider_kira_pose" "directions">></p>
<p class="explicit"><<randomLine "raider_kira_pose" "reaction_compliance">></p>
<<clampStat "companions[0].lust" 25>>
<<set $companions[0].submission += 15>>
<<for _e range $journey.encounter.enemies>>
<<set _e.lust to setup.enemyLustPlus(_e, 60)>>
<</for>>
<<say _leadRaider.name "Spread yourself open. I want to see that pussy.">>
<p class="explicit"><<randomLine "raider_kira_pose" "directions">></p>
<<say "Kira" "Is this... is this enough?">>
<<if setup.kiraAllowsUse()>>
<p class="explicit"><<randomLine "raider_kira_pose" "arousal_allowed">></p>
<<else>>
<p class="explicit"><<randomLine "raider_kira_pose" "arousal_betrayal">></p>
<</if>>
<<say _leadRaider.name "Fuck. She's dripping.">>
<div class="choice-container">
<<vchoice "That's enough — we're leaving" "Travel_Raider_Negotiate_PoseDone" "action" "run">>
<<vchoice "Let them touch" "Travel_Raider_Negotiate_KiraGrope" "intimate" "hand">>
<<vchoice "Offer her mouth" "Travel_Raider_Negotiate_KiraOral" "intimate" "lips">>
</div><<setBackground "reclaimed-ambush">>
<<advanceTime 0 10>>
<<set _leadRaider to $journey.encounter.enemies[0]>>
<<set _raiderCount to $journey.encounter.enemies.length>>
<h2>Forced Display</h2>
<<say $player.name "She'll pose for you. Show you everything.">>
<<say "Kira" "Like hell I will!">>
<p class="narrator">She's resisting. You'll have to make her.</p>
<<if $journey.encounter.enemies.some(function (e) { return e.gender === "male"; })>><<storyVideo "story/travel_raider_negotiation_forced/kira_pose_forced">><</if>>
<<if _storyFamily is "sf_cg_travel_raider_negotiation_forced_04">><<say $player.name "Kira. Over that table. Spread.">><<else>><<say $player.name "Kira. Get on your knees and spread.">><</if>>
<<say "Kira" "NO!">>
<p class="explicit"><<randomLine "raider_kira_pose" "forced">></p>
<<say $player.name "Hold still or I let them do this instead.">>
<p class="explicit"><<randomLine "raider_kira_pose" "reaction_forced">></p>
<<if _storyFamily is "sf_cg_travel_raider_negotiation_forced_04">><p class="explicit">You shove her face-down over the table, ass up, and the lead raider's hand closes on her cheek and pulls it wide.</p><</if>>
<<clampStat "companions[0].lust" 25>>
<<set $companions[0].submission += 25>>
<<set $companions[0].trust += setup.kiraUseTrust(-3)>>
<<set $companions[0].fear += 20>>
<<for _e range $journey.encounter.enemies>>
<<set _e.lust to setup.enemyLustPlus(_e, 65)>>
<</for>>
<<say _leadRaider.name "Spread that pussy open. I want to see inside.">>
<p class="explicit"><<randomLine "raider_kira_pose" "directions">></p>
<<if setup.kiraAllowsUse()>>
<<say "Kira" "I hate you... I hate all of you...">>
<p class="narrator">She says it to the raiders. When her eyes find yours she bites her lip, hard, and doesn't look away.</p>
<<else>>
<<say "Kira" "I hate you... I hate all of you...">>
<</if>>
<<if setup.kiraAllowsUse()>>
<p class="explicit"><<randomLine "raider_kira_pose" "arousal_allowed">></p>
<<else>>
<p class="explicit"><<randomLine "raider_kira_pose" "arousal_betrayal">></p>
<</if>>
<div class="choice-container">
<<vchoice "That's enough — we're leaving" "Travel_Raider_Negotiate_PoseDone" "action" "run">>
<<vchoice "Let them touch" "Travel_Raider_Negotiate_KiraGrope_Forced" "intimate" "hand">>
<<vchoice "Let them use her mouth" "Travel_Raider_Negotiate_KiraOral_Forced" "intimate" "lips">>
</div><<setBackground "reclaimed-ambush">>
<<advanceTime 0 5>>
<<set _leadRaider to $journey.encounter.enemies[0]>>
<<set _raiderCount to $journey.encounter.enemies.length>>
<h2>Stripped</h2>
<<if $journey.encounter.enemies.some(function (e) { return e.gender === "male"; })>><<storyVideo "story/travel_raider_negotiation_forced/kira_strip_forced">><</if>>
<<if !$journey.exposure.companion.exposed>>
<<say $player.name "Strip her.">>
<<say "Kira" "WHAT?! NO!">>
<p class="explicit"><<if _storyFamily is "sf_cg_travel_raider_negotiation_forced_04">>A knife pricks her ribs. She turns around and shoves her trousers down over a lace thong, bending forward to step out of them. Then hands tear away everything she still has on.<<else>><<randomLine "raider_kira_strip" "forced">><</if>></p>
<<say "Kira" "GET OFF ME! Let go!">>
<<else>>
<<say $player.name "Take the rest off her.">>
<<say "Kira" "No! Please!">>
<p class="explicit"><<if _storyFamily is "sf_cg_travel_raider_negotiation_forced_04">>A knife pricks her ribs. She turns around and shoves her trousers down over a lace thong, bending forward to step out of them. Then hands tear away everything she still has on.<<else>><<randomLine "raider_kira_strip" "forced">><</if>></p>
<</if>>
<p class="explicit"><<randomLine "raider_kira_strip" "display">></p>
<<set $journey.exposure.companion.naked to true>>
<<set $journey.exposure.companion.exposed to true>>
<<set $clothing.kira.titsExposed to true>>
<<set $clothing.kira.pussyExposed to true>>
<<set $clothing.kira.top to 0>>
<<set $clothing.kira.bottom to 0>>
<<clampStat "companions[0].lust" 25>>
<<set $companions[0].submission += 25>>
<<set $companions[0].trust += setup.kiraUseTrust(-5)>>
<<set $companions[0].fear += 20>>
<<for _e range $journey.encounter.enemies>>
<<set _e.lust to setup.enemyLustPlus(_e, 55)>>
<</for>>
<<say _leadRaider.name "Now THAT'S more like it. Turn her around, let us see everything.">>
<<if _storyFamily is "sf_cg_travel_raider_negotiation_forced_04">><p class="explicit">She's already facing away. The knife at her back bends her forward again, bare ass to the lead raider lounging on the couch.</p><<else>><p class="explicit"><<randomLine "raider_kira_strip" "display">></p><</if>>
<<if setup.kiraAllowsUse()>>
<<say "Kira" "You've seen it all now. ...Fucking look, then.">>
<p class="narrator">She doesn't cover herself. Over her shoulder, her eyes find yours.</p>
<<else>>
<<say "Kira" "Please... just let us go...">>
<</if>>
<<say _leadRaider.name "We're just getting started, sweetheart.">>
<div class="choice-container">
<<vchoice "Tell them that's enough" "Travel_Raider_Negotiate_Escalate" "talk" "talk">>
<<vchoice "Let them touch her more" "Travel_Raider_Negotiate_KiraGrope_Forced" "intimate" "hand">>
<<vchoice "Let them use her mouth" "Travel_Raider_Negotiate_KiraOral_Forced" "intimate" "lips">>
<<vchoice "Give her to them completely" "Travel_Raider_Negotiate_KiraUsed_Forced" "intimate" "seduce">>
<<vchoice "This has gone too far — FIGHT!" "Travel_Raider_Combat_Aroused" "action" "attack">>
</div><<setBackground "reclaimed-ambush">>
<<set _leadRaider to $journey.encounter.enemies[0]>>
<h2>Leaving</h2>
<<say $player.name "Show's over. We're leaving.">>
<p class="narrator">There's a tense moment where you're not sure if they'll honor the agreement. Then the lead raider steps aside.</p>
<<say _leadRaider.name "Get out of here before I change my mind.">>
<<storyVideo "story/travel_raider_negotiation/pose_done">>
<<if _storyClip is "f83fe0755a5d">><p class="explicit">Kira stays naked as you leave, jogging ahead up a pale bank tufted with grass, bare ass bouncing. At the top she throws one look back over her shoulder. You can feel their eyes on her until you're out of sight.</p><<else>><p class="explicit">Kira stays naked as you leave. You can feel their eyes on her until you're out of sight.</p><</if>>
<<say "Kira" "I can't believe you made me do that.">>
<<say $player.name "You're alive.">>
<<say "Kira" "I'm also soaking wet and incredibly frustrated. Thanks for that.">>
<div class="choice-container">
<<if setup.fightOnTripAway()>>
<<vchoice "Continue" "Travel_Continue" "action" "map">>
<<else>>
<<vchoice "Continue to the vault" "Travel_Continue" "action" "map">>
<</if>>
</div><<setBackground "reclaimed-ambush">>
<<advanceTime 0 10>>
<<set _leadRaider to $journey.encounter.enemies[0]>>
<<set _raiderCount to $journey.encounter.enemies.length>>
<h2>Hands On</h2>
<<say $player.name "You can... touch her. But that's it. Then we go.">>
<<say "Kira" "What?!">>
<<say $player.name "Just touching. Nothing more.">>
<<if $journey.encounter.enemies.some(function (e) { return e.gender === "male"; })>><<storyVideo "story/travel_raider_negotiation/kira_grope">><</if>>
<p class="explicit"><<randomLine "raider_kira_grope" "initial">></p>
<<if _storyFamily is "sf_cg_travel_raider_negotiation_04">><p class="explicit">The first one gets behind her, fills both hands with her tits and sucks at her neck, then spins her round and kneads her ass while she hooks her arms round his head.</p><</if>>
<<clampStat "companions[0].lust" 25>>
<<set $companions[0].submission += 20>>
<<for _e range $journey.encounter.enemies>>
<<set _e.lust to setup.enemyLustPlus(_e, 70)>>
<</for>>
<p class="explicit"><<randomLine "raider_kira_grope" "escalation">></p>
<<say "Kira" "Ah— that's... that's more than touching—">>
<<say _leadRaider.name "She's fucking soaked. She wants this.">>
<p class="explicit"><<randomLine "raider_kira_grope" "response_aroused">></p>
<<set _randomRaider to $journey.encounter.enemies[Math.floor(Math.random() * _raiderCount)]>>
<<say _randomRaider.name "Fuck just touching. I'm gonna—">>
<p class="narrator">Someone's pulling out their cock. This is about to go further.</p>
<div class="choice-container">
<<vchoice "Stop it there — ENOUGH!" "Travel_Raider_Negotiate_GropeStop" "action" "shield">>
<<vchoice "Let it happen" "Travel_Raider_Negotiate_KiraUsed" "intimate" "seduce">>
<<vchoice "Offer her mouth as compromise" "Travel_Raider_Negotiate_KiraOral" "intimate" "lips">>
<<vchoice "FIGHT — This has gone too far" "Travel_Raider_Combat_Aroused" "action" "attack">>
</div><<setBackground "reclaimed-ambush">>
<<advanceTime 0 10>>
<<set _leadRaider to $journey.encounter.enemies[0]>>
<<set _raiderCount to $journey.encounter.enemies.length>>
<h2>Offered Up</h2>
<<say $player.name "She's yours to touch. Do what you want with her body.">>
<<say "Kira" "WHAT?! You can't—">>
<<say $player.name "I just did.">>
<<if $journey.encounter.enemies.some(function (e) { return e.gender === "male"; })>><<storyVideo "story/travel_raider_negotiation_forced/kira_grope_forced">><</if>>
<p class="explicit"><<randomLine "raider_kira_grope" "forced">></p>
<<if _storyFamily is "sf_cg_travel_raider_negotiation_forced_04">><p class="explicit">They bend her over and drag what's left on her down round her thighs, and a pair of big hands kneads her ass and pulls her pussy open for everyone to see.</p><</if>>
<<say "Kira" "NO! Get off! Don't touch me!">>
<p class="explicit"><<randomLine "raider_kira_grope" "escalation">></p>
<<clampStat "companions[0].lust" 25>>
<<set $companions[0].submission += 30>>
<<set $companions[0].trust += setup.kiraUseTrust(-6)>>
<<set $companions[0].fear += 25>>
<<for _e range $journey.encounter.enemies>>
<<set _e.lust to setup.enemyLustPlus(_e, 80)>>
<</for>>
<<say _leadRaider.name "Hold her still. I want to see how tight she is.">>
<p class="explicit"><<randomLine "raider_kira_grope" "escalation">></p>
<<if setup.kiraAllowsUse()>>
<<say "Kira" "Fuck you... fuck all of you... ahh— fuck—">>
<p class="narrator">Her eyes find yours. She isn't asking you to stop it.</p>
<<else>>
<<say "Kira" "Please... please stop... I can't...">>
<</if>>
<<if setup.kiraAllowsUse()>>
<p class="explicit"><<randomLine "raider_kira_grope" "response_forced_allowed">></p>
<<else>>
<p class="explicit"><<randomLine "raider_kira_grope" "response_forced">></p>
<</if>>
<<say _leadRaider.name "The bitch is loving it. Look how wet she is.">>
<p class="narrator">Someone's already got their cock out. This is escalating fast.</p>
<div class="choice-container">
<<vchoice "STOP — that's enough!" "Travel_Raider_Negotiate_GropeStop" "action" "shield">>
<<vchoice "Let them use her mouth" "Travel_Raider_Negotiate_KiraOral_Forced" "intimate" "lips">>
<<vchoice "Let them take her completely" "Travel_Raider_Negotiate_KiraUsed_Forced" "intimate" "seduce">>
<<vchoice "This is wrong — FIGHT!" "Travel_Raider_Combat_Aroused" "action" "attack">>
</div><<setBackground "reclaimed-ambush">>
<<set _leadRaider to $journey.encounter.enemies[0]>>
<h2>Drawing the Line</h2>
<<say $player.name "ENOUGH. That's as far as it goes.">>
<p class="narrator">You step forward, hand on your weapon. The raiders hesitate, weighing their options.</p>
<<say _leadRaider.name "You're really going to fight over this? After everything she just let us do?">>
<<say $player.name "Touching was the deal. This is done.">>
<p class="explicit">Kira stumbles back to your side, flushed and trembling, her thighs visibly wet.</p>
<<if Math.random() < 0.5>>
<<say _leadRaider.name "...Fine. She was a good time anyway. Get out of here.">>
<p class="narrator">They let you go, though you can hear them jerking off as you leave.</p>
<div class="choice-container">
<<vchoice "Leave quickly" "Travel_Continue" "action" "run">>
</div>
<<else>>
<<say _leadRaider.name "No. I've got blue balls now and it's your fault. We're taking more.">>
<p class="narrator">They're not backing down. It's a fight.</p>
<div class="choice-container">
<<vchoice "FIGHT!" "Travel_Raider_Combat_Aroused" "action" "attack">>
</div>
<</if>><<setBackground "reclaimed-ambush">>
<<advanceTime 0 15>>
<<set _leadRaider to $journey.encounter.enemies[0]>>
<<set _maleRaiders to $journey.encounter.enemies.filter(function(e) { return e.gender === "male"; })>>
<<set _maleCount to _maleRaiders.length>>
<h2>Oral Payment</h2>
<<if _maleCount === 0>>
<p class="narrator">The raiders aren't interested in that kind of payment.</p>
<div class="choice-container">
<<vchoice "Continue" "Travel_Raider_Negotiate" "action" "forward">>
</div>
<<elseif _maleCount === 1>>
<<say $player.name "She'll use her mouth on you. Then we walk.">>
<<say _leadRaider.name "Just me? Works for me.">>
<<say "Kira" "You're pimping me out to ONE guy?">>
<<say $player.name "Fewer cocks to suck. You're welcome.">>
<<say "Kira" "<<randomLine 'kira_jokes' 'awkward_moment'>>">>
<<if $journey.encounter.enemies.some(function (e) { return e.gender === "male"; })>><<storyVideo "story/travel_raider_negotiation/kira_oral">><</if>>
<p class="explicit"><<randomLine "raider_single_male" "kira_oral_start">></p>
<<if _storyFamily is "sf_cg_travel_raider_negotiation_04">><p class="explicit">He hauls a second naked captive down into the straw by her hair, and the two of them take turns on his cock, cheek to cheek, trading it wet from one mouth to the other.</p><</if>>
<<clampStat "companions[0].lust" 25>>
<<set $companions[0].submission += 20>>
<<set $flags.kiraGaveOralToRaider to true>>
<<set $stats.sexScenes.kira.oral_given++>>
<p class="explicit"><<randomLine "raider_kira_oral" "action">></p>
<p class="explicit"><<randomLine "raider_kira_oral" "facefuck">></p>
<p class="explicit"><<randomLine "raider_kira_oral" "cum">></p>
<<set _leadRaider.lust to 15>>
<<say _leadRaider.name "Fuck, she's good. Alright, you can go.">>
<<if setup.kiraAllowsUse()>>
<<say "Kira" "Just one? ...Fuck. I was just getting started.">>
<p class="narrator">She wipes her mouth, looking almost disappointed it wasn't more.</p>
<<else>>
<<say "Kira" "Just... just one. That wasn't so bad.">>
<p class="narrator">She wipes her mouth, looking almost relieved it wasn't worse.</p>
<</if>>
<<else>>
<<say $player.name "She'll use her mouth. On all of you. Then we walk.">>
<<say _leadRaider.name "Now we're talking.">>
<<say "Kira" "You're... you're pimping me out.">>
<<say $player.name "I'm keeping us alive.">>
<<if $journey.encounter.enemies.some(function (e) { return e.gender === "male"; })>><<storyVideo "story/travel_raider_negotiation/kira_oral">><</if>>
<<if _storyFamily is "sf_cg_travel_raider_negotiation_04">><p class="explicit">They shove Kira to her knees in the straw beside another naked captive. The first one is already hard, stroking himself in front of both their faces, and the two women have to share him.</p><<else>><p class="explicit">The male raiders form a circle around Kira. The first one is already hard, stroking himself in front of her face.</p><</if>>
<<clampStat "companions[0].lust" 25>>
<<set $companions[0].submission += 25>>
<<set $flags.kiraGaveOralToRaiders to true>>
<<set $stats.sexScenes.kira.oral_given += _maleCount>>
<<say _leadRaider.name "On your knees, sweetheart. Get to work.">>
<p class="explicit"><<randomLine "raider_kira_oral" "start">></p>
<<for _i, _raider range _maleRaiders>>
<<if _i === 0>>
<p class="explicit"><<randomLine "raider_kira_oral" "action">></p>
<p class="explicit"><<randomLine "raider_kira_oral" "facefuck">></p>
<p class="explicit"><<randomLine "raider_kira_oral" "cum">></p>
<<elseif _i === _maleCount - 1>>
<p class="explicit">The last one, _raider.name, takes his time. <<randomLine "raider_kira_oral" "facefuck">></p>
<p class="explicit"><<randomLine "raider_kira_oral" "facial">></p>
<<else>>
<p class="explicit">_raider.name steps up next. <<randomLine "raider_kira_oral" "action">></p>
<</if>>
<</for>>
<<for _e range $journey.encounter.enemies>>
<<if _e.gender === "male">>
<<set _e.lust to 20>>
<</if>>
<</for>>
<p class="explicit"><<randomLine "raider_kira_oral" "aftermath">></p>
<<say _leadRaider.name "Good girl. Deal's a deal. You can go.">>
<<say "Kira" "...">>
<p class="explicit">She can't speak. Her throat is raw and she's still swallowing.</p>
<</if>>
<<if _maleCount !== 0>>
<div class="choice-container">
<<vchoice "Get out of here" "Travel_Continue" "action" "run">>
</div>
<</if>><<setBackground "reclaimed-ambush">>
<<advanceTime 0 30>>
<<set _leadRaider to $journey.encounter.enemies[0]>>
<<set _raiderCount to $journey.encounter.enemies.length>>
<<set _maleRaiders to $journey.encounter.enemies.filter(function(e) { return e.gender === "male"; })>>
<<set _maleCount to _maleRaiders.length>>
<h2>Used</h2>
<p class="narrator">You step back. You don't stop them.</p>
<<say "Kira" "Wait— you're not—">>
<<if _maleCount === 1>>
<<if $journey.encounter.enemies.some(function (e) { return e.gender === "male"; })>><<storyVideo "story/travel_raider_negotiation/kira_used">><</if>>
<p class="explicit"><<randomLine "raider_single_male" "kira_fuck_start">></p>
<<set $companions[0].lust to 85>>
<<set $companions[0].submission += 30>>
<<set $flags.kiraFuckedRaider to true>>
<<set $stats.sexScenes.kira.total++>>
<<set $stats.sexScenes.kira.vaginal++>>
<p class="explicit"><<randomLine "raider_single_male" "kira_fuck_action">></p>
<<if _storyFamily is "sf_cg_travel_raider_negotiation_04">><p class="explicit">He sprawls back on a gutted white couch dragged in off the road and pulls her down onto his cock with her back to him. She rides him, one hand spreading her own ass, until she squirts all over him.</p><</if>>
<<say _leadRaider.name "<<randomLine 'raider_single_male' 'player_join_offer'>>">>
<div class="choice-container">
<<vchoice "Join in (double-team her)" "Travel_Raider_Negotiate_KiraUsed_PlayerJoins" "intimate" "seduce">>
<<vchoice "Just watch" "Travel_Raider_Negotiate_KiraUsed_Solo" "action" "eye">>
</div>
<<elseif _maleCount === 0>>
<p class="narrator">Without any male raiders, this situation resolves differently...</p>
<div class="choice-container">
<<vchoice "Continue" "Travel_Continue" "action" "forward">>
</div>
<<else>>
<<if $journey.encounter.enemies.some(function (e) { return e.gender === "male"; })>><<storyVideo "story/travel_raider_negotiation/kira_used">><</if>>
<p class="explicit"><<randomLine "raider_kira_gangbang" "start">></p>
<<set $companions[0].lust to 90>>
<<set $companions[0].submission += 35>>
<<set $flags.kiraGangbangRaiders to true>>
<<set $stats.sexScenes.kira.total++>>
<<set $stats.sexScenes.kira.vaginal += _maleCount>>
<<set $stats.sexScenes.kira.oral_given += _maleCount>>
<p class="explicit"><<randomLine "raider_kira_gangbang" "action">></p>
<<if _storyFamily is "sf_cg_travel_raider_negotiation_04">><p class="explicit">One sprawls back on a gutted white couch dragged in off the road and pulls her down onto his cock with her back to him. She rides him, one hand spreading her own ass for the others to watch, until she squirts all over him.</p><</if>>
<p class="explicit"><<randomLine "raider_kira_gangbang" "surrender">></p>
<p class="explicit"><<randomLine "raider_kira_gangbang" "orgasm">></p>
<p class="explicit"><<randomLine "raider_kira_gangbang" "aftermath">></p>
<<say _leadRaider.name "Worth more than scrap, that one. You can go.">>
<p class="narrator">You help Kira up. She can barely walk.</p>
<<if setup.kiraAllowsUse()>>
<<say "Kira" "You let them. All of them. ...Fuck, vault boy.">>
<<say $player.name "You're alive.">>
<<say "Kira" "I'm a lot more than alive... fuck... I can't believe I came that hard...">>
<<else>>
<<say "Kira" "You... you let them...">>
<<say $player.name "You're alive.">>
<<say "Kira" "I'm also... fuck... I can't believe I came that hard...">>
<</if>>
<<for _e range $journey.encounter.enemies>>
<<set _e.lust to 10>>
<</for>>
<div class="choice-container">
<<vchoice "Leave" "Travel_Continue" "action" "run">>
</div>
<</if>><<setBackground "reclaimed-ambush">>
<<advanceTime 0 15>>
<<set _leadRaider to $journey.encounter.enemies[0]>>
<h2>Double-Teamed</h2>
<<say $player.name "Alright. Move over.">>
<p class="explicit">You strip and join the raider. Kira's eyes go wide as she realizes what's about to happen.</p>
<<say "Kira" "Both of you?! I can't—">>
<<say _leadRaider.name "Shut up and take it.">>
<<if $journey.encounter.enemies.some(function (e) { return e.gender === "male"; })>><<storyVideo "story/travel_raider_negotiation/kira_used_player_joins">><</if>>
<<if _storyFamily is "sf_cg_travel_raider_negotiation_04">><p class="explicit">The raider pulls out and plants himself in front of her face, and she swallows him to the root, spit running off her chin. When he fists her hair and shoves, she chokes and keeps going. You kneel behind her and sink into the pussy he just left dripping. She's spit-roasted between you, used from both ends.</p><<else>><p class="explicit">You position yourself at her mouth while the raider keeps fucking her pussy. She's spit-roasted between you, used from both ends.</p><</if>>
<<set $companions[0].lust to 95>>
<<set $companions[0].submission += 40>>
<<set $flags.kiraDoubleTeamed to true>>
<<set $stats.sexScenes.kira.total++>>
<<set $stats.sexScenes.kira.vaginal++>>
<<set $stats.sexScenes.kira.oral_given++>>
<<set $stats.sexScenes.player.total++>>
<<set $stats.sexScenes.player.oral_received++>>
<<if _storyFamily is "sf_cg_travel_raider_negotiation_04">><p class="explicit">Every time you slam into her, her moan buzzes up his shaft. He sprawls back on the couch and she crawls after him on all fours, still sucking, and you follow with your hands locked on her hips, fucking her slick pussy the whole way.</p><<else>><p class="explicit">Kira gags around your cock as the raider pounds her from behind. Her moans vibrate against your shaft. You swap positions, the raider using her throat while you fuck her slick pussy.</p><</if>>
<<say _leadRaider.name "She's loving it. Look at her.">>
<p class="explicit">He's right. Despite everything, Kira is cumming hard, her body shaking between you both.</p>
<p class="explicit">When you both finish, she's left trembling and dripping. Cum leaks from both ends.</p>
<<set $player.lust to 20>><<run setup.playerReleased()>>
<<for _e range $journey.encounter.enemies>>
<<set _e.lust to 10>>
<</for>>
<<say _leadRaider.name "Not bad. She can really take two cocks. You can go.">>
<<say "Kira" "I... I can't feel my legs...">>
<p class="explicit"><<randomLine "raider_single_male" "aftermath">></p>
<div class="choice-container">
<<vchoice "Help Kira up and leave" "Travel_Continue" "action" "run">>
</div><<setBackground "reclaimed-ambush">>
<<advanceTime 0 10>>
<<set _leadRaider to $journey.encounter.enemies[0]>>
<h2>Watching</h2>
<<say $player.name "I'll just... observe.">>
<<say _leadRaider.name "Suit yourself. More for me.">>
<<if $journey.encounter.enemies.some(function (e) { return e.gender === "male"; })>><<storyVideo "story/travel_raider_negotiation/kira_used_solo">><</if>>
<p class="explicit"><<randomLine "raider_single_male" "kira_fuck_action">></p>
<<if _storyClip is "4def47719edf">><p class="explicit">He doesn't bother taking her anywhere. He shoves her down on all fours on the cold rocks, drags her trousers to her knees, yanks her thong aside and fucks her from behind, boots still on, snow settling on his back. <<if setup.kiraAllowsUse()>>She moans, loud and shameless, with you standing right there, and doesn't try to keep it down.<<else>>She moans despite herself, her body responding even as you stand there doing nothing.<</if>></p><<else>><p class="explicit">You watch as the raider uses Kira completely. <<if setup.kiraAllowsUse()>>She moans, loud and shameless, with you standing right there, and doesn't try to keep it down.<<else>>She moans despite herself, her body responding even as you stand there doing nothing.<</if>></p><</if>>
<<set $companions[0].lust to 80>>
<<set $companions[0].submission += 25>>
<<clampStat "player.lust" 25>>
<<if setup.kiraAllowsUse()>>
<<say "Kira" "You're just... going to watch? ...Good. Get a good look.">>
<<if _storyFamily is "sf_cg_travel_raider_negotiation_04">><p class="explicit">He fucks her on her side, her face turned toward you, eyes half shut, mouth open. Then he rolls onto his back and pulls her on top facing away, one big hand prying her ass open while he bucks up into her. When her eyes find yours they're glassy and bright, and she doesn't stop riding him.</p><<else>><p class="explicit">Her eyes meet yours as another man fucks her. There's something in her gaze — anger, arousal, or both.</p><</if>>
<<else>>
<<say "Kira" "You're just... going to watch?">>
<<if _storyFamily is "sf_cg_travel_raider_negotiation_04">><p class="explicit">He fucks her on her side, her face turned toward you, eyes half shut, mouth open. Then he rolls onto his back and pulls her on top facing away, one big hand prying her ass open while he bucks up into her. When her eyes find yours they're glassy and furious at once, and she doesn't stop riding him.</p><<else>><p class="explicit">Her eyes meet yours as another man fucks her. There's something in her gaze — anger, arousal, or both.</p><</if>>
<</if>>
<p class="explicit">When the raider finishes inside her, Kira collapses forward, panting.</p>
<<set $stats.sexScenes.kira.total++>>
<<set $stats.sexScenes.kira.vaginal++>>
<<for _e range $journey.encounter.enemies>>
<<set _e.lust to 10>>
<</for>>
<<say _leadRaider.name "Good fuck. Get out of here.">>
<p class="explicit"><<randomLine "raider_single_male" "aftermath">></p>
<<if setup.kiraAllowsUse()>>
<<say "Kira" "I hope you enjoyed the show. ...I know I did.">>
<p class="narrator">Her voice is hoarse, and she's grinning.</p>
<<else>>
<<say "Kira" "I hope you enjoyed the show.">>
<p class="narrator">Her voice is cold. She's not happy about your choice.</p>
<</if>>
<<set $companions[0].trust += setup.kiraUseTrust(-2)>>
<div class="choice-container">
<<vchoice "Leave" "Travel_Continue" "action" "run">>
</div><<setBackground "reclaimed-ambush">>
<<advanceTime 0 15>>
<<set _leadRaider to $journey.encounter.enemies[0]>>
<<set _maleRaiders to $journey.encounter.enemies.filter(function(e) { return e.gender === "male"; })>>
<<set _maleCount to _maleRaiders.length>>
<h2>Forced Service</h2>
<<say $player.name "Use her mouth. All of you.">>
<<say "Kira" "NO! You can't make me—">>
<<say $player.name "I can. And I am.">>
<<if $journey.encounter.enemies.some(function (e) { return e.gender === "male"; })>><<storyVideo "story/travel_raider_negotiation_forced/kira_oral_forced">><</if>>
<p class="explicit"><<randomLine "raider_kira_oral" "forced_start">></p>
<<say "Kira" "Mmph—!">>
<<if setup.kiraAllowsUse()>>
<p class="explicit"><<randomLine "raider_kira_grope" "response_forced_allowed">></p>
<<else>>
<p class="explicit"><<randomLine "raider_kira_grope" "response_forced">></p>
<</if>>
<<clampStat "companions[0].lust" 25>>
<<set $companions[0].submission += 35>>
<<set $companions[0].trust += setup.kiraUseTrust(-7)>>
<<set $companions[0].fear += 30>>
<<set $flags.kiraForcedOralRaiders to true>>
<<set $stats.sexScenes.kira.oral_given += _maleCount>>
<<for _i, _raider range _maleRaiders>>
<<if _i === 0>>
<p class="explicit"><<randomLine "raider_kira_oral" "facefuck">></p>
<<say _raider.name "That's it, choke on it, bitch.">>
<p class="explicit"><<randomLine "raider_kira_oral" "cum">></p>
<<elseif _i === _maleCount - 1>>
<<if _storyFamily is "sf_cg_travel_raider_negotiation_forced_04">><p class="explicit">_raider.name is the last. He drags her to her knees, makes her hook her own fingers in her mouth and hold it wide, and jerks himself off onto her tongue.</p><<else>><p class="explicit">_raider.name is the last. <<randomLine "raider_kira_oral" "facial">></p><</if>>
<<else>>
<p class="explicit">_raider.name takes his turn. <<randomLine "raider_kira_oral" "action">></p>
<</if>>
<</for>>
<<for _e range $journey.encounter.enemies>>
<<if _e.gender === "male">>
<<set _e.lust to 25>>
<</if>>
<</for>>
<p class="explicit"><<randomLine "raider_kira_oral" "aftermath">></p>
<<say _leadRaider.name "Good enough. Get out of here.">>
<p class="narrator">Kira can't even stand. You have to help her up.</p>
<<say "Kira" "...">>
<<if setup.kiraAllowsUse()>>
<p class="explicit">She can barely speak. She looks up at you, face glazed, throat still working, and she's shaking, but it isn't fear.</p>
<<say "Kira" "...my throat... fuck... I'm going to sound like this for a week. ...Worth it.">>
<<else>>
<p class="explicit">She won't look at you. Won't speak. Just shakes.</p>
<</if>>
<div class="choice-container">
<<vchoice "Leave" "Travel_Continue" "action" "run">>
</div><<setBackground "reclaimed-ambush">>
<<advanceTime 0 30>>
<<set _leadRaider to $journey.encounter.enemies[0]>>
<<set _raiderCount to $journey.encounter.enemies.length>>
<<set _maleRaiders to $journey.encounter.enemies.filter(function(e) { return e.gender === "male"; })>>
<<set _maleCount to _maleRaiders.length>>
<h2>Given Away</h2>
<<say $player.name "She's yours. Do whatever you want with her.">>
<<say "Kira" "WHAT?! NO! You can't—">>
<<say $player.name "I just did. Enjoy her.">>
<p class="explicit"><<randomLine "raider_kira_gangbang" "forced_resistance">></p>
<<if setup.kiraAllowsUse()>>
<<say "Kira" "NO! STOP! Get your fucking hands off me!">>
<<else>>
<<say "Kira" "NO! STOP! Please! Don't do this!">>
<</if>>
<<if $journey.encounter.enemies.some(function (e) { return e.gender === "male"; })>><<storyVideo "story/travel_raider_negotiation_forced/kira_used_forced">><</if>>
<p class="explicit"><<randomLine "raider_kira_gangbang" "start">></p>
<<if _storyFamily is "sf_cg_travel_raider_negotiation_forced_04">><p class="explicit">They bend her face-down over a scarred desk, cheek on the wood. One pours oil down the crack of her ass and forces a fat black plug into her while she gasps, pulls it out to look at the gape, shoves it back. Another pins her head to the crate and fucks her throat until she drools. Then the lead raider sits back on a salvaged chair, pulls her down onto his cock ass-first and bounces her on it.</p><</if>>
<<clampStat "companions[0].lust" 25>>
<<set $companions[0].submission += 50>>
<<set $companions[0].trust += setup.kiraUseTrust(-10)>>
<<set $companions[0].fear += 40>>
<<set $flags.kiraGangrapedRaiders to true>>
<<set $stats.sexScenes.kira.total++>>
<<set $stats.sexScenes.kira.vaginal += _maleCount>>
<<set $stats.sexScenes.kira.oral_given += _maleCount>>
<<set $stats.sexScenes.kira.cnc++>>
<p class="explicit"><<randomLine "raider_kira_gangbang" "action">></p>
<<say _leadRaider.name "Fuck, she's tight. Hold her still.">>
<p class="explicit"><<randomLine "raider_kira_gangbang" "forced_resistance">></p>
<<say "Raider" "The slut's getting off on this!">>
<p class="explicit"><<randomLine "raider_kira_gangbang" "orgasm">></p>
<p class="explicit"><<randomLine "raider_kira_gangbang" "aftermath">></p>
<<for _e range $journey.encounter.enemies>>
<<set _e.lust to 5>>
<</for>>
<<say _leadRaider.name "Worth the hassle. You can take what's left of her.">>
<<if setup.kiraAllowsUse()>>
<p class="narrator">You pick Kira up. She's limp, boneless. Cum drips from between her legs with every step.</p>
<p class="narrator">She doesn't say anything for a long time. Then she turns her face into your neck.</p>
<<say "Kira" "...How many were there? I lost count after four. ...Fuck. I can still feel every one of them.">>
<<else>>
<p class="narrator">You pick Kira up. She's limp, unresponsive. Cum drips from between her legs with every step.</p>
<p class="narrator">She doesn't say anything. Not for a long time.</p>
<</if>>
<div class="choice-container">
<<vchoice "Leave" "Travel_Continue" "action" "run">>
</div><<setBackground "reclaimed-ambush">>
<<advanceTime 0 15>>
<<set _femaleRaiders to $journey.encounter.enemies.filter(function(e) { return e.gender === "female"; })>>
<<set _maleRaider to $journey.encounter.enemies.find(function(e) { return e.gender === "male"; }) || null>>
<<set _maleCount to $journey.encounter.enemies.filter(function(e) { return e.gender === "male"; }).length>>
<<set _femaleCount to _femaleRaiders.length>>
<h2>Counter-Offer</h2>
<<say $player.name "How about this — I service <<if _femaleCount > 1>>your women<<else>>her<</if>>, and we all walk away satisfied.">>
<<set _femaleLeader to _femaleRaiders[0]>>
<<say _femaleLeader.name "Oh? You think you can handle <<if _femaleCount > 1>>all of us<<else>>me<</if>>?">>
<<say $player.name "I know I can.">>
<p class="explicit"><<if _femaleCount > 1>>The female raiders exchange looks. Then grins.<<else>>_femaleLeader.name looks you up and down. Then grins.<</if>></p>
<<say _femaleLeader.name "Get your cock out. Let's see what you're working with.">>
<p class="explicit">You comply. <<if _femaleCount > 1>>The women like what they see.<<else>>She likes what she sees.<</if>></p>
<<for _i, _raider range _femaleRaiders>>
<<if _i === 0>>
<<storyVideo "story/travel_raider_negotiation/player_service_wall_ride">>
<p class="explicit"><<if _storyClip is "145320d66880">>_raider.name pushes you into a chair against the wall and rides you aggressively, her nails raking your chest.<<elseif _storyClip is "ca5bde6d679b">>_raider.name shoves you down and rides you aggressively, her nails raking your chest.<<else>>_raider.name pushes you against a wall and rides you aggressively, her nails raking your chest.<</if>></p>
<<else>>
<<switch (_i - 1) % 4>>
<<case 0>>
<<storyVideo "story/travel_raider_negotiation/player_service_eat_ride">>
<p class="explicit">_raider.name takes her turn next, demanding you eat her pussy before fucking her.</p>
<<case 1>>
<<storyVideo "story/travel_raider_negotiation/player_service_facesit_ride">>
<p class="explicit">_raider.name doesn't let you catch your breath. She shoves you down onto your back, sits on your face until she's dripping on your chin, then slides down and rides your cock hard.</p>
<<case 2>>
<<storyVideo "story/travel_raider_negotiation/player_service_hair_reverse">>
<p class="explicit">_raider.name grabs a fistful of your hair and drags your mouth between her thighs. She grinds on your tongue until her legs shake, then turns round and sinks onto you, her ass slapping into your lap.</p>
<<default>>
<<storyVideo "story/travel_raider_negotiation/player_service_watched">>
<p class="explicit"><<if _storyClip is "696d804d0e57">>_raider.name lies back next, soaked from watching. She makes you lick her first, then pulls you on top of her and makes you fuck her slow and deep while the others look on and laugh.<<else>>_raider.name climbs on next, soaked from watching. She makes you lick her first, then fucks you slow and deep while the others look on and laugh.<</if>></p>
<</switch>>
<</if>>
<</for>>
<<set $player.lust to 20>><<run setup.playerReleased()>>
<<set $stats.sexScenes.player.total += _femaleCount>>
<<set $stats.sexScenes.player.vaginal += _femaleCount>>
<<for _e range _femaleRaiders>>
<<set _e.lust to 15>>
<</for>>
<<if _maleRaider>>
<<say _femaleLeader.name "Mm. He's good. Let <<if setup.kiraWithYou()>>them<<else>>him<</if>> go, <<if _maleCount gt 1>>boys<<else>>boy<</if>>.">>
<<say _maleRaider.name "What about <<if _maleCount gt 1>>us<<else>>me<</if>>?">>
<<say _femaleLeader.name "Not my problem. Let's go.">>
<p class="narrator"><<if _femaleCount > 1>>The female raiders leave<<else>>_femaleLeader.name leaves<</if>> satisfied. <<if _maleCount gt 1>>The males glare but don't pursue it.<<else>>_maleRaider.name glares but doesn't pursue it.<</if>></p>
<<else>>
<<say _femaleLeader.name "Mm. He's good. Let <<if setup.kiraWithYou()>>them<<else>>him<</if>> go.">>
<p class="narrator"><<if _femaleCount > 1>>The female raiders leave<<else>>_femaleLeader.name leaves<</if>> satisfied.</p>
<</if>>
<div class="choice-container">
<<vchoice "Leave quickly" "Travel_Continue" "action" "run">>
</div><<setBackground "reclaimed-ambush">>
<<advanceTime 0 20>>
<<set _femaleRaiders to $journey.encounter.enemies>>
<<set _femaleCount to _femaleRaiders.length>>
<<set _femaleLeader to _femaleRaiders[0]>>
<h2><<if _femaleCount > 1>>The Women's Demand<<else>>Her Demand<</if>></h2>
<<if _femaleCount > 1>>
<<set _femaleDemand to setup.randomLine("raider_female_only", "demand_player")>>
<<say _femaleLeader.name _femaleDemand>>
<<else>>
<<say _femaleLeader.name "<<randomLine 'raider_female_only' 'demand_player_one'>>">>
<</if>>
<<say $player.name "If that's what it takes to walk out of here...">>
<<if _femaleCount > 1>>
<<if setup.isOralDemand(_femaleDemand)>>
<<storyVideo "combat/eat_pussy">>
<p class="explicit">_femaleLeader.name doesn't wait for more than that. She gets your face where she wants it and holds it there, and you eat her pussy while the others watch and jeer, licking until her legs shake and she's soaking wet. Then she's done with your tongue and wants your cock.</p>
<</if>>
<</if>>
<<if setup.kiraWithYou()>>
<<if _femaleCount > 1>><p class="explicit"><<randomLine "kira_jealousy" "watching_player">></p>
<<else>><p class="explicit"><<randomLine "kira_jealousy" "watching_player_one">></p><</if>>
<</if>>
<<if _femaleCount > 1>><p class="explicit"><<randomLine "raider_female_only" "player_action">></p><</if>>
<<for _i, _raider range _femaleRaiders>>
<<if _i === 0>>
<<storyVideo "story/travel_raider_negotiation/player_service_wall_ride">>
<p class="explicit"><<if _storyClip is "145320d66880">>_raider.name pushes you into a chair against the wall and rides you aggressively, her nails raking your chest.<<elseif _storyClip is "ca5bde6d679b">>_raider.name shoves you down and rides you aggressively, her nails raking your chest.<<else>>_raider.name pushes you against a wall and rides you aggressively, her nails raking your chest.<</if>></p>
<<else>>
<<switch (_i - 1) % 4>>
<<case 0>>
<<storyVideo "story/travel_raider_negotiation/player_service_eat_ride">>
<p class="explicit">_raider.name takes her turn next, demanding you eat her pussy before fucking her.</p>
<<case 1>>
<<storyVideo "story/travel_raider_negotiation/player_service_facesit_ride">>
<p class="explicit">_raider.name doesn't let you catch your breath. She shoves you down onto your back, sits on your face until she's dripping on your chin, then slides down and rides your cock hard.</p>
<<case 2>>
<<storyVideo "story/travel_raider_negotiation/player_service_hair_reverse">>
<p class="explicit">_raider.name grabs a fistful of your hair and drags your mouth between her thighs. She grinds on your tongue until her legs shake, then turns round and sinks onto you, her ass slapping into your lap.</p>
<<default>>
<<storyVideo "story/travel_raider_negotiation/player_service_watched">>
<p class="explicit"><<if _storyClip is "696d804d0e57">>_raider.name lies back next, soaked from watching. She makes you lick her first, then pulls you on top of her and makes you fuck her slow and deep while the others look on and laugh.<<else>>_raider.name climbs on next, soaked from watching. She makes you lick her first, then fucks you slow and deep while the others look on and laugh.<</if>></p>
<</switch>>
<</if>>
<</for>>
<<if _femaleCount > 1>>
<<if _femaleCount > 3>><p class="explicit">You lose count of how many times you've cum.</p><</if>>
<<if setup.kiraWithYou() && random(1, 100) <= 40>>
<p class="explicit">While you recover, the raiders turn their attention to Kira.</p>
<p class="explicit"><<randomLine "raider_female_only" "kira_use">></p>
<<lineMedia "kira-use-video">>
<<clampStat "companions[0].lust" 25>>
<<set $stats.sexScenes.kira.oral_given += _femaleCount>>
<</if>>
<</if>>
<<set $player.lust to 15>><<run setup.playerReleased()>>
<<set $stats.sexScenes.player.total += _femaleCount>>
<<set $stats.sexScenes.player.vaginal += _femaleCount>>
<<for _e range _femaleRaiders>>
<<set _e.lust to 10>>
<</for>>
<<if _femaleCount > 1>>
<p class="explicit"><<randomLine "raider_female_only" "aftermath">></p>
<<say _femaleLeader.name "Worth the ambush. Get out of here.">>
<<else>>
<p class="explicit"><<randomLine "raider_female_only" "aftermath_one">></p>
<<say _femaleLeader.name "Not bad. You can go.">>
<</if>>
<<if setup.kiraWithYou()>>
<<if _femaleCount > 1>>
<<if $companions[0].lust >= 60>>
<p class="explicit"><<randomLine "kira_jealousy" "aroused_watching">></p>
<<say "Kira" "<<randomLine 'kira_jealousy' 'wants_turn'>>">>
<<else>>
<<say "Kira" "<<randomLine 'kira_jealousy' 'teasing_after'>>">>
<</if>>
<<else>>
<<if $companions[0].lust >= 60>>
<p class="explicit"><<randomLine "kira_jealousy" "aroused_watching_one">></p>
<<say "Kira" "<<randomLine 'kira_jealousy' 'wants_turn_one'>>">>
<<else>>
<<say "Kira" "<<randomLine 'kira_jealousy' 'teasing_after_one'>>">>
<</if>>
<</if>>
<</if>>
<div class="choice-container">
<<vchoice "Leave (exhausted)" "Travel_Continue" "action" "run">>
</div><<setBackground "reclaimed-ambush">>
<<set _leadRaider to $journey.encounter.enemies[0]>>
<<set _raiderCount to $journey.encounter.enemies.length>>
<<set _raidKira to setup.kiraWithYou()>>
<h2>Threat</h2>
<<say $player.name "You should reconsider. I've killed a lot of people in the Reclaimed. You really want to be next?">>
<<set _intimidateChance to ($player.strength + $player.dominance) - (_raiderCount * 15)>>
<<if Math.random() * 100 < _intimidateChance>>
<p class="narrator">Something in your eyes gives them pause. The lead raider hesitates.</p>
<<say _leadRaider.name "...Shit. You're serious.">>
<<say $player.name "Very.">>
<<say _leadRaider.name "Let's go. This isn't worth it.">>
<p class="narrator">They back off, melting into the ruins. You got lucky.</p>
<div class="choice-container">
<<vchoice "Continue" "Travel_Continue" "action" "map">>
</div>
<<else>>
<<say _leadRaider.name "Big talk from someone outnumbered.">>
<p class="narrator">They're not intimidated. If anything, you just pissed them off.</p>
<<if _raidKira>><<say _leadRaider.name "Kill him. Take the woman.">><<else>><<say _leadRaider.name "Kill him. Take his pack.">><</if>>
<div class="choice-container">
<<vchoice "FIGHT!" "Travel_Raider_Combat" "action" "attack">>
</div>
<</if>><<setBackground "reclaimed-ambush">>
<<set _leadRaider to $journey.encounter.enemies[0]>>
<h2>Offering More</h2>
<<say $player.name "What else do you want?">>
<<say _leadRaider.name "You know what we want.">>
<<if $journey.encounter.enemies.some(function (e) { return e.gender === "male"; })>><<storyVideo "story/travel_raider_negotiation/escalate">><</if>>
<<if _storyFamily is "sf_cg_travel_raider_negotiation_04">><p class="narrator">Their eyes are on Kira. The one in the checked shirt leans in until his mouth is an inch from hers, breathing on her, and his hand drops to his belt buckle. Nobody is talking about supplies any more.</p><<else>><p class="narrator">Their eyes are on Kira. There's no mistaking their intent.</p><</if>>
<div class="choice-container">
<<vchoice "Let them touch her" "Travel_Raider_Negotiate_KiraGrope" "intimate" "hand">>
<<vchoice "Offer her mouth" "Travel_Raider_Negotiate_KiraOral" "intimate" "lips">>
<<vchoice "Let them have her completely" "Travel_Raider_Negotiate_KiraUsed" "intimate" "seduce">>
<<vchoice "No. FIGHT!" "Travel_Raider_Combat_Aroused" "action" "attack">>
</div><<setBackground "reclaimed-combat">>
<<advanceTime 0 5>>
<<set _raidKira to setup.kiraWithYou()>>
<h2>Fight!</h2>
<p class="narrator">Negotiations have failed. But the raiders are... distracted. Their heads are still on what they wanted from you, and it's making them sloppy.</p>
<<if _raidKira && $journey.exposure.companion.naked>>
<p class="explicit">Kira fights naked, her body still showing signs of what just happened. But her fury makes up for her vulnerability.</p>
<</if>>
<p class="explicit">Several of the raiders are fighting with visible erections. It's slowing them down.</p>
<<startCombat $journey.encounter.enemies `setup.roadCombatCompanion()` true>>
<div class="choice-container">
<<vchoice "Continue" "Combat_Start" "action" "forward">>
</div><<setBackground "reclaimed-ruins">>
<h2>Opportunist</h2>
A woman watches from the shadows. Then she steps out, slow, hips first, making a show of sizing you up — whether you're worth the risk, and what you'd pay. She hooks a thumb in the neckline of her top and tugs it just low enough to be a promise.
<<showTravelVideo "encounter_tease">>
<<if $journey.exposure.player.exposed || $journey.exposure.companion.naked>>
<<say "Opportunist" "You look like you've had a rough day.">>
<<if setup.kiraWithYou()>><<say $player.name "We're fine. Move along.">><<else>><<say $player.name "I'm fine. Move along.">><</if>>
<<say "Opportunist" "I could help. For a price.">>
<p class="narrator">Her eyes linger on exposed skin, and she smiles like she's pricing it by the inch.</p>
<<say "Opportunist" "I have supplies. Water. Even some clothing. But nothing's free in the Reclaimed.">>
<<else>>
<<if setup.kiraWithYou()>><<say "Opportunist" "Travelers. Interesting.">><<else>><<say "Opportunist" "On your own out here? Interesting.">><</if>>
<<if setup.kiraWithYou()>><<say $player.name "We don't want any trouble.">><<else>><<say $player.name "I don't want any trouble.">><</if>>
<<say "Opportunist" "Neither do I. But I do want to eat. What have you got to trade?">>
<p class="narrator">She looks more desperate than dangerous. She leans a hip against the rubble anyway, so you get a good look at what else she might trade.</p>
<</if>>
<div class="choice-container">
<<vchoice "Refuse and keep walking" "Journey_Encounter_Refuse" "action" "run">>
<<vchoice "Hear her out" "Journey_Encounter_Negotiate" "talk" "talk">>
<<if $player.lust >= 60 || (setup.kiraWithYou() && $companions[0].lust >= 60)>>
<<vchoice "Consider her offer" "Journey_Encounter_Deal" "intimate" "hand">>
<</if>>
</div><<setBackground "reclaimed-combat">>
<<set _jefToll to previous() === "Travel_CNC_TollDemand">>
<<set _jefFemale to _jefToll || ($journey.encounter && $journey.encounter.scavengerFemale)>>
<<set _jefEnemies to []>>
<<for _jefI to 0; _jefI lt (_jefToll ? 3 : 1); _jefI++>>
<<createEnemy `_jefFemale ? "huntress" : "scout"`>>
<<set _jefE to clone(_returnEnemy)>>
<<set _jefE.name to _jefToll ? "Toll Keeper" : "Scavenger">>
<<run _jefEnemies.push(_jefE)>>
<</for>>
<h2>Fight!</h2>
<<if _jefToll>>
<p class="narrator">You go for the chain. The three of them go for you.</p>
<<elseif previous() === "Journey_Encounter_Scavenger_KiraRefuses" && setup.kiraWithYou()>>
<p class="narrator">Kira's already moving, knife low. You go in beside her.</p>
<<else>>
You attack without hesitation. The element of surprise works in your favor.
<</if>>
<<if $journey.exposure.player.naked>>
<p class="explicit">Fighting naked is awkward as hell, but you manage.</p>
<</if>>
<<if setup.kiraWithYou() && $journey.exposure.companion.naked>>
<p class="explicit">Kira fights with desperate fury, her naked body moving with lethal grace. Her exposure only makes her more dangerous.</p>
<</if>>
<<startCombat _jefEnemies `setup.roadCombatCompanion()` true>>
<div class="choice-container">
<<vchoice "Continue" "Combat_Start" "action" "forward">>
</div><<setBackground "reclaimed-ruins">>
<h2>Negotiation</h2>
<<if previous() === "Journey_Encounter_Opportunist">>
<<if setup.kiraWithYou()>><<say $player.name "We don't want trouble. Name a fair price.">><<else>><<say $player.name "I don't want trouble. Name a fair price.">><</if>>
<<if setup.kiraWithYou() && $journey.exposure.companion.exposed>>
<<say "Opportunist" "Cover her up first. I can't haggle with those in my face — it's bad for business. Mine are the ones for sale.">>
<<say "Kira" "I would if I could!">>
<</if>>
<<storyVideo "story/travel_opportunist/negotiate">>
<<if _storyClip is "84bd807a8d7e">><p>She haggles hard and enjoys every minute of it, talking with her hands, reaching out to brush your arm, laughing when you lose your train of thought. In the end she lets you pass — in exchange for some supplies.</p><<else>><p>She haggles hard and enjoys every minute of it, leaning in close, brushing your arm, laughing when you lose your train of thought. In the end she lets you pass — in exchange for some supplies.</p><</if>>
<<if ($vault.scrap || 0) >= 10>>
<<set $vault.scrap -= 10>>
<<else>>
<p>Ten scrap is more than you've got. She takes what there is, pats your cheek like it's a tip, and waves you through anyway.</p>
<<set $vault.scrap to 0>>
<</if>>
<<say "Opportunist" "Pleasure doing business. Well. Almost.">>
<div class="choice-container">
<<vchoice "Continue" "Travel_Continue" "action" "map">>
</div>
<<else>>
<<set _scvWoman to $journey.encounter && $journey.encounter.scavengerFemale>>
<<set _scvKira to setup.kiraWithYou()>>
<<set _scvCanPay to ($vault.scrap || 0) >= 10>>
<<if _scvKira>><<say $player.name "We don't want trouble. Name a price and we'll be on our way.">><<else>><<say $player.name "I don't want trouble. Name a price and I'll be on my way.">><</if>>
<<if _scvKira && $journey.exposure.companion.exposed>>
<<say "Scavenger" "First, cover her up. That's distracting as hell.">>
<<say "Kira" "I would if I could!">>
<</if>>
<<if _scvWoman>>
<p>She rests the rifle across her forearm, the barrel drifting lazily between your belly and your knees.</p>
<<say "Scavenger" "Ten scrap. That's the road rate.">>
<<else>>
<p>He spits in the dust and doesn't lower the weapon an inch.</p>
<<say "Scavenger" "Ten scrap. Everybody pays.">>
<</if>>
<<if _scvCanPay>>
<p class="narrator">You've got it. Just about.</p>
<<if _scvWoman>>
<<say "Scavenger" "Or keep your scrap.">>
<p>Her eyes drop to your crotch and stay there.</p>
<<say "Scavenger" "I'll take it out of you another way. Your call, handsome.">>
<<elseif _scvKira>>
<<say "Scavenger" "Or I take it out of her. Scrap I can find anywhere.">>
<p>He looks at Kira the way you'd look at water after three days on the road.</p>
<</if>>
<<else>>
<p>You turn out your pack for the scavenger to see. Some cord. A cracked lens. Not ten scrap. Not close.</p>
<<if _scvWoman>>
<<say "Scavenger" "Nothing? No. You've got plenty.">>
<p class="explicit">The muzzle slides down your chest, over your belt, and stops on the bulge of your cock. She taps it there. Twice.</p>
<<say "Scavenger" "The toll's you. Pants down, on your back, and you don't get up till I say. Or I put one through your knee and take my pick of your pack anyway.">>
<<elseif _scvKira>>
<<say "Scavenger" "Then she's the toll.">>
<p>He jerks his chin at Kira. He doesn't even look at you when he says it.</p>
<<say "Scavenger" "One go. Then you walk. Both of you.">>
<<say "Kira" "Say that again and I'll open your throat with a spoon.">>
<<else>>
<<say "Scavenger" "Nothing. Then you're worth nothing to me.">>
<p>He takes a firmer grip on the weapon. So there's the price: your hide, or his.</p>
<</if>>
<</if>>
<div class="choice-container">
<<if _scvCanPay>>
<<vchoice "Pay ten scrap" "Journey_Encounter_Scavenger_Pay" "trade" "scrap">>
<</if>>
<<if _scvWoman>>
<<vchoice `_scvCanPay ? "Pay her the other way" : "Pay her toll"` "Journey_Encounter_Scavenger_TollHer" "intimate" "submission">>
<<elseif _scvKira>>
<<vchoice "Let him take it out of Kira" "Journey_Encounter_Scavenger_TollKira" "intimate" "seduce">>
<</if>>
<<vchoice "Fight them off" "Journey_Encounter_Fight" "action" "attack">>
</div>
<</if>><<setBackground "reclaimed-travel">>
<h2>Walking Away</h2>
<<if setup.kiraWithYou()>><<say $player.name "We're not interested.">><<else>><<say $player.name "I'm not interested.">><</if>>
<<say "Opportunist" "Your loss.">>
<<storyVideo "story/travel_opportunist/refuse">>
<<if _storyClip is "fd9c26c12dec">><p class="narrator">She shrugs and melts back into the ruins, hips swaying, making damn sure you watch her go. At the far wall a second figure falls in beside her, and then they're gone. You keep walking, staying alert.</p><<else>><p class="narrator">She shrugs and melts back into the ruins, hips swaying, making damn sure you watch her go. You keep walking, staying alert.</p><</if>>
<div class="choice-container">
<<vchoice "Continue" "Travel_Continue" "action" "map">>
</div><<setBackground "reclaimed-ruins">>
<h2>Kira Taken</h2>
<p class="narrator">You see the look in Kira's eyes. Fear, yes. But also... want.</p>
<<say $player.name "...take her.">>
<<say "Kira" `"What?! " + $player.name + ", you can't—"`>>
<p class="explicit">The raiders grab her, forcing her to the ground. She struggles, but not as hard as she could.</p>
<<say "Raider1" "Hold her down.">>
<<if $journey.encounter.enemies.some(function (e) { return e.gender === "male"; })>><<storyVideo "story/travel_raider_negotiation/journey_encounter_kira_taken">><</if>>
<<if _storyFamily is "sf_cg_travel_raider_negotiation_04">><p class="explicit">They throw her down on a stained bedroll off one of their packs and take turns, each one shoving her face into it with a hand on her back and pounding her from behind. She screams, moans, cums twice.</p><<else>><p class="explicit">They fuck her right there, in the dirt, both of them taking turns. She screams, moans, cums twice.</p><</if>>
<p class="explicit">You watch. You stroke yourself. You can't help it.</p>
<<say "Kira" "You— you bastard— AH! FUCK!">>
<p class="explicit">When they finish, they leave her there — naked, used, dripping cum.</p>
<<set $companions[0].lust to 30>>
<<addCorruption 5 "kira">>
<<set $flags.kiraTakenByRaiders to true>>
<<addTension "kira" 20>>
<div class="choice-container">
<<vchoice "Help her up" "Travel_Continue" "action" "map">>
</div><<setBackground "reclaimed-ruins">>
<<set _dealKira to setup.kiraWithYou()>>
<h2>The Deal</h2>
<<if _dealKira>>
<<say "Opportunist" "I'll give you water and supplies. In exchange, I get one of you for an hour.">>
<<else>>
<<say "Opportunist" "I'll give you water and supplies. In exchange, I get you for an hour.">>
<</if>>
<<if _dealKira && $companions[0].lust >= 60>>
<<say "Kira" "I'll do it.">>
<<say $player.name "Kira, you don't have to—">>
<<say "Kira" "We need the water. And I'm... I'm already worked up from all this.">>
<p class="explicit">She goes with her. You wait, listening to two women moaning in the ruins, and trying very hard not to picture it. You fail.</p>
<p class="explicit">When she returns, she's satisfied, exhausted, and carrying supplies.</p>
<<say "Kira" "Don't. Say. Anything.">>
<<set $companions[0].lust to 20>>
<<set $vault.water += 20>>
<<clampStat "player.energy" 10 0 $player.maxEnergy>>
<<elseif $player.lust >= 60>>
<<say $player.name "I'll pay the price.">>
<<storyVideo "events/travel/opportunist_deal_player">>
<<if _dealKira>>
<<if _storyClip is "3395e54d13dc" or _storyClip is "fd5f8d1fea4c">><p class="explicit">You go with her. She shoves you onto your back, sinks onto your cock and uses you like something she rented by the hour — cums twice before she lets you finish. When you return to Kira, you're sore, sticky and satisfied.</p><<else>><p class="explicit">You go with her. She shoves you onto your back, rides your face until her thighs shake, then sinks onto your cock and uses you like something she rented by the hour — cums twice before she lets you finish. When you return to Kira, you're sore, sticky and satisfied.</p><</if>>
<<say "Kira" "...you okay?">>
<<say $player.name "Fine. We got what we needed.">>
<<else>>
<<if _storyClip is "3395e54d13dc" or _storyClip is "fd5f8d1fea4c">><p class="explicit">You go with her. She shoves you onto your back, sinks onto your cock and uses you like something she rented by the hour — cums twice before she lets you finish. When you walk back to your pack, you're sore, sticky and satisfied.</p><<else>><p class="explicit">You go with her. She shoves you onto your back, rides your face until her thighs shake, then sinks onto your cock and uses you like something she rented by the hour — cums twice before she lets you finish. When you walk back to your pack, you're sore, sticky and satisfied.</p><</if>>
<p class="narrator">She drops two full canteens and a sack of supplies at your feet, still smelling of you, and is gone into the rubble before you've got your belt done up.</p>
<</if>>
<<set $player.lust to 15>><<run setup.playerReleased()>>
<<set $vault.water += 20>>
<<if _dealKira>><<set $companions[0].energy += 10>><</if>>
<</if>>
<div class="choice-container">
<<vchoice "Continue" "Travel_Continue" "action" "map">>
</div><<setBackground "reclaimed-travel">>
<h2>Continuing Journey</h2>
The encounter resolved, you continue on your way. The Reclaimed stretches endlessly before you.
<<if $journey && $journey.party>><<getJourneyCompanion>><<else>><<set _gc_companion to null>><<set _gc_companionId to null>><</if>>
<<set _tsKira to _gc_companion !== null && _gc_companionId === "kira">>
<<set _tsKiraNaked to _tsKira && $journey.exposure.companion.naked>>
<<if $journey.exposure.player.naked || _tsKiraNaked>>
<p class="explicit">You're still exposed, but at least the immediate danger has passed.</p>
<<if $journey.exposure.player.naked>>
<p class="narrator">Your cock sways with each step, the Reclaimed air a constant reminder of your vulnerability.</p>
<</if>>
<<if _tsKiraNaked>>
<p class="explicit">Kira walks beside you, her naked body drawing your eyes despite the circumstances. Her tits bounce with each step.</p>
<<say "Kira" "Stop staring. We still have a long way to go.">>
<</if>>
<<elseif $journey.exposure.player.exposed || (_tsKira && $journey.exposure.companion.exposed)>>
<p>Your torn clothes offer minimal protection, but you push onward.</p>
<<else>>
<<if setup.fightOnTripAway()>><p>You adjust your gear and press on.</p><<else>><p>You adjust your gear and press on toward the vault.</p><</if>>
<</if>>
<<if _tsKira>>
<<say "Kira" "Let's keep moving. The sooner we're back, the better.">>
<</if>>
<<set _tsAhead to setup.tripAheadName()>>
<<if _tsAhead>><p class="narrator"><<= _tsAhead>> is still ahead. You need to keep going.</p><<else>><p class="narrator">The vault is still ahead. You need to keep going.</p><</if>>
<div class="choice-container">
<<vchoice "Continue traveling" "Travel_Continue" "action" "run">>
</div><<if $journey.active>>
<<set $journey.active to false>>
<<set $journey.currentNode to $journey.destination>>
<<include "Journey_Arrive">>
<<else>>
<<setBackground "vault-entrance">>
<h2>The Vault</h2>
Finally. The vault entrance looms ahead. Safety. Shelter. Home.
<<if $journey.exposure.player.naked || $journey.exposure.companion.naked>>
<p class="explicit">You made it back. Naked, exhausted, but alive.</p>
<div class="choice-container">
<<vchoice "Continue" "Vault_Arrival_Exposed" "action" "forward">>
</div>
<<else>>
<p>You survived the journey. The vault door opens, welcoming you back.</p>
<div class="choice-container">
<<vchoice "Continue" "Vault_Arrival" "action" "forward">>
</div>
<</if>>
<</if>><<getJourneyCompanion>>
<<if !_gc_companion || _gc_companion.present === false || $flags.kiraIsUnconscious || $flags.kiraInComa || ($companions[0] && ($companions[0].status === "unconscious" || ($companions[0].health || 0) <= 1)) || !($extremeContent && $extremeContent.cnc)>>
<<goto "Journey_Event_Continue">>
<<else>>
<<journeyTerrainBackground>>
<<set $flags.lastKiraTravelFeignDay to $time.day>>
<h2><<icon "rest">> Sun Trap</h2>
The road spits you out behind a dead villa, its high walls still standing round a lawn gone shaggy and green and a pool that somehow still holds clear water, glittering in the sun. Somebody dragged a wrought-iron sun lounger onto the grass before the world ended and never came back for it.
Kira drops her pack beside it.
<<say "Kira" "Hour. Not more.">>
She throws a striped towel over the lounger, kicks off her boots and peels off her shirt and trousers. Underneath is a scrap of turquoise string bikini she looted from a dead resort shop. She lies back, reaches behind her neck, tugs the top's strings loose and lets the little cups slide off to either side. Her tits are bare to the sun and she doesn't bother covering them.
<<say "Kira" "Wake me if something tries to eat us.">>
She shuts her eyes and her head rolls back on the towel. Inside a minute her breathing has gone long and slow, sweat beading between her bare tits, one knee fallen loose to the side.
Your cock stirs.
<<set $player.lust to Math.min(100, $player.lust + 10)>>
<div class="choice-container">
<<vchoice "Touch her" "Journey_Kira_FeignNap_Touch" "intimate" "hand">>
<<vchoice "Let her nap" "Journey_Kira_FeignNap_Leave" "action" "rest">>
</div>
<</if>><<getJourneyCompanion>>
<<if !_gc_companion || _gc_companion.present === false || $flags.kiraIsUnconscious || $flags.kiraInComa || ($companions[0] && ($companions[0].status === "unconscious" || ($companions[0].health || 0) <= 1)) || !($extremeContent && $extremeContent.cnc)>>
<<goto "Journey_Event_Continue">>
<<else>>
<<journeyTerrainBackground>>
<<set $flags.kiraTravelFeignPlayed to true>>
<<storyVideo "characters/kira/travel_feigned_touch">>
You crouch at the head of the lounger. Her face is tipped up to the sun, eyes shut, mouth closed, the loose turquoise strings of her top lying across her bare chest.
You cup her tit. Warm from the sun, heavy in your palm. You stroke it slow and drag your thumb over the nipple.
It goes hard under your thumb.
You trail your fingers down the loose strings between her tits. She doesn't move. Her breathing stays long and slow, in through the nose, out through the mouth.
You get up and walk round to the foot of the lounger. Her legs have fallen open and her arms lie loose at her sides. You run your hands up the insides of her thighs, over her belly, back down.
Then you rub her cunt through the turquoise bikini bottom. Slow circles with two fingers. The fabric goes damp under them.
You hook a finger into the crotch and pull it aside. She's shaved, pink and already wet. You spread her lips with your fingers and rub her open.
Her breath catches, one tiny hitch, and then it's long and slow again, so smooth you could have imagined it.
<<set $player.lust to Math.min(100, $player.lust + 15)>>
<div class="choice-container">
<<vchoice "Get the bikini off her" "Journey_Kira_FeignNap_Finger" "intimate" "hand">>
<<vchoice "Back off" "Journey_Kira_FeignNap_Leave" "action" "rest">>
</div>
<</if>><<getJourneyCompanion>>
<<if !_gc_companion || _gc_companion.present === false || $flags.kiraIsUnconscious || $flags.kiraInComa || ($companions[0] && ($companions[0].status === "unconscious" || ($companions[0].health || 0) <= 1)) || !($extremeContent && $extremeContent.cnc)>>
<<goto "Journey_Event_Continue">>
<<else>>
<<journeyTerrainBackground>>
<<storyVideo "characters/kira/travel_feigned_finger">>
You pull the string at her hip. The bow slides loose. You peel the bikini bottom up off her cunt, over her belly, and throw it on the grass.
She's bare now, sprawled with her legs wide on the striped towel and the sun full on her cunt.
You press your palm flat over her mound and grind it. Then you spread her lips with two fingers and rub her clit. She's slick. Your fingers slide through her without any resistance at all.
You push two fingers into her cunt. It's hot and tight and it clenches on you. You turn your hand palm up and fuck her with your fingers, knuckle-deep, the heel of your hand grinding her clit on every stroke. The only sounds in the whole garden are the wet ones you're making.
Her head tips back on the towel and her mouth falls open on a breath that never turns into a sound.
Her hips stay still, the way a sleeper's would. Her thighs stay wide open for you, though, and her cunt gets wetter with every thrust.
<<set $player.lust to Math.min(100, $player.lust + 15)>>
<div class="choice-container">
<<vchoice "Put your cock to her mouth" "Journey_Kira_FeignNap_Mouth" "intimate" "rapid-strikes">>
<<vchoice "Back off" "Journey_Kira_FeignNap_Leave" "action" "rest">>
</div>
<</if>><<getJourneyCompanion>>
<<if !_gc_companion || _gc_companion.present === false || $flags.kiraIsUnconscious || $flags.kiraInComa || ($companions[0] && ($companions[0].status === "unconscious" || ($companions[0].health || 0) <= 1)) || !($extremeContent && $extremeContent.cnc)>>
<<goto "Journey_Event_Continue">>
<<else>>
<<journeyTerrainBackground>>
<<storyVideo "characters/kira/travel_feigned_mouth">>
You pull your fingers out of her and move back up to her head. Her bare tits rise and fall, slow.
Her head has rolled to one side on the towel, eyes shut, and her lips purse, soft, like she's mumbling something in her sleep.
You slide your hand into her hair, cradle her skull and turn her face toward you. She lets it loll, dead weight in your palm.
You pull your cock out, hard as iron, and press the head to her lips.
Her mouth falls open.
The head of your cock slips just between her lips into her warm, wet mouth, and her breath is hot on your shaft.
<<set $player.lust to Math.min(100, $player.lust + 15)>>
<div class="choice-container">
<<vchoice "Finish on her face" "Journey_Kira_FeignNap_Finish" "intimate" "rapid-strikes">>
<<vchoice "Back off" "Journey_Kira_FeignNap_Leave" "action" "rest">>
</div>
<</if>><<getJourneyCompanion>>
<<if !_gc_companion || _gc_companion.present === false || $flags.kiraIsUnconscious || $flags.kiraInComa || ($companions[0] && ($companions[0].status === "unconscious" || ($companions[0].health || 0) <= 1)) || !($extremeContent && $extremeContent.cnc)>>
<<goto "Journey_Event_Continue">>
<<else>>
<<journeyTerrainBackground>>
<<storyVideo "characters/kira/travel_feigned_facial">>
She rolls onto her side on the towel, face toward you, cheek squashed into the terry cloth, still breathing like she's out cold.
You kneel by the lounger and stroke your cock inches above her face. Her lashes don't flicker. Her lips stay soft.
You come in thick ropes across her cheek and temple, right up to the corner of her eye. It runs down her cheekbone and one drop catches in her lashes.
She lies there with your cum on her face, breathing slow.
Then one eye opens. The one without cum in it.
<<say "Kira" "Took you long enough.">>
She wipes a thumb through the mess on her cheek, sucks it clean, and reaches for her shirt.
<<set $player.lust to 0>><<run setup.playerReleased()>>
<<set $companions[0].lust to Math.max(0, ($companions[0].lust || 0) - 20)>>
<<set $companions[0].tension to Math.max(0, ($companions[0].tension || 0) - 30)>>
<<relationChange "kira" "trust" 1>>
<<relationChange "kira" "affection" 2>>
<<journeyEventReturn>>
<</if>><<if $flags.kiraIsUnconscious || $flags.kiraInComa || ($companions[0] && $companions[0].status === "unconscious")>>
<<goto "Journey_Event_Continue">>
<<else>>
<<journeyTerrainBackground>>
You leave her to it. You sit in the shade by the wall and watch the gate.
An hour later she sits up, ties her top and looks straight at you.
<<say "Kira" "Coward.">>
<<journeyEventReturn>>
<</if>><div data-x9></div>
<<script>>setTimeout(function(){$(document).trigger(':vt')},0)<</script>><<widget "icon">>
<<set _iconName to _args[0]>>
<<set _size to _args[1] || "medium">>
<<set _colorClass to _args[2] || "">>
<<if setup.iconRegistry && setup.iconRegistry[_iconName]>>
<<set _iconData to setup.iconRegistry[_iconName]>>
<span @class="'gi gi-' + _iconName + ' gi-' + _size + (_colorClass ? ' icon-' + _colorClass : '')"
@data-icon="_iconName"></span>
<<else>>
<span class="gi gi-missing" title="Missing icon">?</span>
<</if>>
<</widget>>
<<widget "listIcons">>
<div class="icon-gallery">
<h3>Available Icons</h3>
<<for _category to setup.getIconCategories()>>
<div class="icon-category">
<h4>_category</h4>
<div class="icon-grid">
<<for _iconObj to setup.getIconsByCategory(_category)>>
<div class="icon-item">
<<icon _iconObj.name "large">>
<span class="icon-name">_iconObj.name</span>
</div>
<</for>>
</div>
</div>
<</for>>
</div>
<</widget>><<widget "loadMediaManifest">>
<<set _lmmPath to _args[0]>>
<<set _lmmFullPath to $media.root + _lmmPath + "/manifest.json">>
<<if typeof _lmmPath !== "string" || !setup.isMediaFolderPath(_lmmPath)>>
<<run console.warn("loadMediaManifest: refusing non-folder argument", State.temporary.lmmPath)>>
<<elseif !setup.mediaManifestCache[_lmmPath]>>
<<run setup.loadMediaManifest(_lmmPath)>>
<</if>>
<</widget>>
<<widget "selectMediaFromPool">>
<<set _smpPath to typeof _args[0] === "string" ? _args[0] : "">>
<<set _smpFilters to _args[1] || {}>>
<<if !setup.mediaManifestCache[_smpPath]>>
<<loadMediaManifest _smpPath>>
<</if>>
<<set _smpManifest to setup.mediaManifestCache[_smpPath]>>
<<if _smpManifest && _smpManifest.media && _smpManifest.media.length > 0>>
<<set _smpPool to _smpManifest.media.filter(function(m) {
if (_smpFilters.file) {
return m.file === _smpFilters.file;
}
for (var key in _smpFilters) {
if (_smpFilters.hasOwnProperty(key)) {
var filterVal = _smpFilters[key];
var mediaVal = m.tags ? m.tags[key] : undefined;
if (mediaVal !== filterVal && mediaVal !== "any" && filterVal !== "any") {
return false;
}
}
}
return true;
})>>
<<set _smpRelaxed to []>>
<<set _smpWasRelaxed to false>>
<<if _smpPool.length === 0>>
<<for _smpFk, _smpFv range _smpFilters>>
<<if _smpManifest.media.every(function (m) { return !m.tags || m.tags[_smpFk] !== _smpFv; })>>
<<run _smpRelaxed.push(_smpFk)>>
<</if>>
<</for>>
<<set _smpPool to _smpManifest.media>>
<<set _smpWasRelaxed to true>>
<</if>>
<<set _smpKey to setup.mediaPickKey(_smpPath, _smpWasRelaxed ? null : _smpFilters)>>
<<set _smpPoolSize to _smpPool.length>>
<<set _smpPool to setup.mediaNoRepeatPool(_smpKey, _smpPool)>>
<<set _smpTotalWeight to _smpPool.reduce(function(sum, m) { return sum + (m.weight || 1); }, 0)>>
<<set _smpRoll to setup.mediaRandom() * _smpTotalWeight>>
<<set _smpSelected to _smpPool[0]>>
<<for _smpI, _smpM range _smpPool>>
<<set _smpRoll -= (_smpM.weight || 1)>>
<<if _smpRoll <= 0>>
<<set _smpSelected to _smpM>>
<<break>>
<</if>>
<</for>>
<<run setup.mediaNoRepeatRecord(_smpKey, _smpSelected.file, _smpPoolSize, _smpWasRelaxed)>>
<<run setup.mediaShownNote(_smpKey, _smpSelected.file)>>
<<set _smpIsRooted to _smpSelected.file.indexOf("/") !== -1>>
<<set _result to {
file: _smpIsRooted ? _smpSelected.file : $media.root + _smpPath + "/" + _smpSelected.file,
format: _smpSelected.format || "webp",
tags: _smpSelected.tags || {},
fallback: false,
relaxed: _smpRelaxed
}>>
<<else>>
<<set _smpPhType to _smpPath.split("/")[0]>>
<<if !$media.fallbacks[_smpPhType] && $media.fallbacks[_smpPhType.replace(/s$/, "")]>>
<<set _smpPhType to _smpPhType.replace(/s$/, "")>>
<</if>>
<<set _smpFallbackFile to $media.fallbacks[_smpPhType] || $media.fallbacks.background>>
<<set _result to {
file: $media.root + _smpFallbackFile,
format: "webp",
tags: {},
fallback: true
}>>
<</if>>
<</widget>>
<<widget "setBackground">>
<<set _locationId to _args[0]>>
<<set _filters to _args[1]>>
<<if typeof _locationId !== "string" || !_locationId>>
<<set _locationId to "reclaimed-travel">>
<</if>>
<<set _bgKey to _locationId>>
<<if VaultUI.bgAliases[_locationId]>>
<<set _locationId to VaultUI.bgAliases[_locationId]>>
<</if>>
<<if typeof _filters !== "object" || _filters === null>>
<<set _filters to {}>>
<</if>>
<<if !_filters.time && State.variables.time && State.variables.time.phase>>
<<set _filters.time to VaultUI.lookPhase()>>
<</if>>
<<set _parts to _locationId.split("/")>>
<<set _specificFile to null>>
<<if _parts.length >= 2>>
<<set _folder to _parts[0]>>
<<set _specificFile to _parts.slice(1).join("/")>>
<<else>>
<<set _folder to _locationId>>
<</if>>
<<if _locationId === "current" || _locationId === "current_location">>
<<run VaultUI.backgroundSetThisPassage = true>>
<<elseif _bgKey.startsWith("vault/")>>
<<run VaultUI.setBackground(_bgKey)>>
<<elseif _locationId.startsWith("vault-") || _locationId.startsWith("vault_") || _locationId.startsWith("vault/") || _locationId.startsWith("reclaimed-") || _locationId.startsWith("terrain-") || _locationId.startsWith("location:")>>
<<run VaultUI.setBackground(_locationId)>>
<<else>>
<<if _locationId.startsWith("wasteland-") || _locationId.startsWith("wasteland_")>>
<<set _folder to _locationId.replace(/^wasteland[-_]/, "")>>
<<set _path to "backgrounds/wasteland/" + _folder>>
<<set _specificFile to null>>
<<else>>
<<set _path to "backgrounds/vault/" + _folder>>
<</if>>
<<if _specificFile>>
<<set _filters.file to _specificFile + ".webp">>
<</if>>
<<selectMediaFromPool _path _filters>>
<<set $media.current.background to _result>>
<<run VaultUI.sceneLayers()>>
<<if $time && $time.phase>>
<<run $('.time-filter').attr('data-time', VaultUI.lookPhase())>>
<</if>>
<<run (function() {
var bg = document.getElementById('scene-background');
var resultFile = _result.file;
var transitionDuration = State.variables.media.settings.transitionSpeed / 2;
VaultUI.notePicture(resultFile);
if (bg) {
bg.style.opacity = '0';
setTimeout(function() {
VaultUI.paintBackground(resultFile);
bg.style.opacity = '1';
}, transitionDuration);
}
})()>>
<</if>>
<</widget>>
<<widget "showCharacter">>
<<set _charId to _args[0]>>
<<set _position to _args[1] || "center">>
<<set _expression to _args[2] || "neutral">>
<<set _clothingOverride to _args[3] || null>>
<<if _clothingOverride>>
<<set _clothing to _clothingOverride>>
<<elseif _charId === "kira" && State.variables.clothing && State.variables.clothing.kira>>
<<set _clothing to setup.kiraClothingState($clothing.kira)>>
<<elseif _charId === "player" && State.variables.clothing && State.variables.clothing.player>>
<<set _c to $clothing.player>>
<<if _c.dickExposed>>
<<set _clothing to "exposed_dick">>
<<else>>
<<set _clothing to "base">>
<</if>>
<<else>>
<<set _clothing to "base">>
<</if>>
<<if _clothing === "dressed">><<set _clothing to "base">><</if>>
<<set _filters to {
expression: _expression
}>>
<<set _path to "characters/" + _charId + "/" + _clothing>>
<<selectMediaFromPool _path _filters>>
<<run VaultUI.showCharacter(_charId, _position, _expression, null, _clothingOverride)>>
<<if !_result || !_result.file>>
<<else>>
<<set _spriteData to {
id: _charId,
position: _position,
file: _result.file,
clothing: _clothing,
mood: _expression,
tags: _result.tags
}>>
<<set _existingIndex to $media.current.characters.findIndex(function(c) { return c.id === _charId; })>>
<<if _existingIndex >= 0>>
<<set $media.current.characters[_existingIndex] to _spriteData>>
<<else>>
<<run $media.current.characters.push(_spriteData)>>
<</if>>
<<run (function() {
var existingSprite = document.querySelector('.character-sprite[data-character="' + _charId + '"]');
if (existingSprite) {
existingSprite.remove();
}
})()>>
<div @class="'character-sprite ' + _position"
@data-character="_charId"
@data-clothing="_clothing"
@data-mood="_expression">
<<if _result.format === "mp4" || _result.format === "webm">>
<video class="character-video" @src="_result.file"
preload="auto" autoplay loop muted playsinline></video>
<<else>>
<img @src="_result.file" @alt="_charId">
<</if>>
</div>
<</if>>
<</widget>>
<<widget "showEventMedia">>
<<set _semId to _args[0]>>
<<set _semFilters to _args[1] || {}>>
<<set _semPath to "events/" + _semId>>
<<selectMediaFromPool _semPath _semFilters>>
<<set $media.current.event to _result>>
<<set _semManifest to setup.mediaManifestCache[_semPath]>>
<<set $media.current.reaction to null>>
<<if _semManifest && _semManifest.secondary_pool && $media.settings.showReactions>>
<<selectMediaFromPool _semManifest.secondary_pool>>
<<set $media.current.reaction to _result>>
<</if>>
<<if $media.current.event && $media.current.event.file>>
<div class="event-media-container explicit">
<<if $media.current.event.format === "mp4" || $media.current.event.format === "webm">>
<video class="primary-media event-video"
@src="$media.current.event.file"
preload="auto" autoplay loop muted playsinline></video>
<<else>>
<img class="primary-media event-image"
@src="$media.current.event.file" alt="">
<</if>>
<<if $media.current.reaction && $media.current.reaction.file>>
<div class="secondary-media">
<img class="reaction-image"
@src="$media.current.reaction.file" alt="">
</div>
<</if>>
</div>
<</if>>
<</widget>>
<<widget "showCombatEvent">>
<<set _sceType to _args[0]>>
<<set _sceFilters to _args[1] || {}>>
<<getEventFolderForAttack _sceType>>
<<set _sceEventId to "combat/" + _eventFolder>>
<<showEventMedia _sceEventId _sceFilters>>
<</widget>>
<<widget "getEventFolderForAttack">>
<<set _gefaType to _args[0]>>
<<switch _gefaType>>
<<case "punch_face">>
<<set _eventFolder to "punch_face">>
<<case "punch_gut">>
<<set _eventFolder to "punch_gut">>
<<case "grapple">>
<<set _eventFolder to "grapple">>
<<case "kick_leg">>
<<set _eventFolder to "kick_leg">>
<<case "pipe_swing_high" "pipe_swing_low" "pipe_swing">>
<<set _eventFolder to "pipe_swing">>
<<case "overhead_smash">>
<<set _eventFolder to "bat_swing">>
<<case "belt_whip">>
<<set _eventFolder to "belt_whip">>
<<case "strike_clothed">>
<<set _eventFolder to "belt_whip">>
<<case "knife_slash_torso" "knife_slash_limb" "knife_slash">>
<<set _eventFolder to "knife_slash">>
<<case "rip_top">>
<<set _eventFolder to "rip_top">>
<<case "rip_bottom">>
<<set _eventFolder to "rip_bottom">>
<<case "bat_swing_torso" "bat_swing_legs" "bat_swing">>
<<set _eventFolder to "bat_swing">>
<<case "bat_overhead">>
<<set _eventFolder to "bat_swing">>
<<case "grope_tits">>
<<set _eventFolder to "grope_tits">>
<<case "grope_pussy">>
<<set _eventFolder to "grope_pussy">>
<<case "grope_ass">>
<<set _eventFolder to "grope_ass">>
<<case "grope_dick">>
<<set _eventFolder to "grope_dick">>
<<case "knockdown" "kick_sweep">>
<<set _eventFolder to "knockdown">>
<<case "force_kneel">>
<<set _eventFolder to "force_kneel">>
<<case "pin_down">>
<<set _eventFolder to "pin_down">>
<<case "chain_swing">>
<<set _eventFolder to "chain_strike">>
<<case "chain_wrap" "chain_bind">>
<<set _eventFolder to "chain_strike">>
<<case "chain_choke">>
<<set _eventFolder to "chain_strike">>
<<case "machete_slash" "machete_chop">>
<<set _eventFolder to "knife_slash">>
<<case "clothes_cut">>
<<set _eventFolder to "rip_top">>
<<case "crop_strike" "crop_tits" "crop_ass">>
<<set _eventFolder to "belt_whip">>
<<case "crop_pussy">>
<<set _eventFolder to "belt_whip">>
<<case "rope_lash">>
<<set _eventFolder to "belt_whip">>
<<case "rope_bind_wrists" "rope_bind_ankles">>
<<set _eventFolder to "grapple">>
<<case "rope_leash">>
<<set _eventFolder to "chain_strike">>
<<case "strike">>
<<set _eventFolder to "punch_gut">>
<<default>>
<<set _eventFolder to "punch_face">>
<</switch>>
<</widget>>
<<widget "getCombatVideoFilters">>
<<set _gcvfWho to _args[0]>>
<<set _gcvfDamage to _args[1] || 5>>
<<set _videoFilters to {}>>
<<clothingFilter _gcvfWho>>
<<if _clothingFilter>>
<<set _videoFilters.clothing to _clothingFilter>>
<</if>>
<<if _gcvfDamage >= 12>>
<<set _videoFilters.intensity to "hard">>
<<elseif _gcvfDamage >= 7>>
<<set _videoFilters.intensity to "medium">>
<<else>>
<<set _videoFilters.intensity to "light">>
<</if>>
<<if $combat && $combat.positions>>
<<if _gcvfWho === "kira" && $combat.positions.kira>>
<<set _videoFilters.position to $combat.positions.kira>>
<<elseif _gcvfWho === "player" && $combat.positions.player>>
<<set _videoFilters.position to $combat.positions.player>>
<</if>>
<</if>>
<</widget>>
<<widget "showCombatAttackVideo">>
<<set _scavType to _args[0]>>
<<set _scavWho to _args[1]>>
<<set _scavDamage to _args[2] || 5>>
<<getEventFolderForAttack _scavType>>
<<getCombatVideoFilters _scavWho _scavDamage>>
<div class="combat-video-container">
<<showCombatEvent _eventFolder _videoFilters>>
</div>
<</widget>>
<<widget "showKnockdownVideo">>
<<set _skvWho to _args[0]>>
<<set _skvPos to _args[1]>>
<<set _skvFolder to setup.knockdownVideoFolders && setup.knockdownVideoFolders[_skvWho]>>
<<if _skvFolder>>
<<set _skvSeq to (_skvSeq || 0) + 1>>
<<if _skvWho === "kira">>
<<kiraMediaTarget>>
<<set _skvTarget to _kiraMediaTarget>>
<<else>>
<<playerMediaTarget>>
<<set _skvTarget to _playerMediaTarget>>
<</if>>
<div @id="'knockdown-video-' + _skvSeq" class="card-video-container combat-action-video knockdown-video" style="display:none"></div>
<<fillCombatVideoBox `"knockdown-video-" + _skvSeq` _skvFolder _skvTarget>>
<</if>>
<</widget>>
<<widget "selectMediaWithRace">>
<<set _smwrBase to _args[0]>>
<<set _smwrFilters to _args[1] || {}>>
<<set _smwrEnemy to _args[2]>>
<<set _smwrFound to false>>
<<if _smwrEnemy && (_smwrEnemy.race || _smwrEnemy.class)>>
<<set _smwrArch to (_smwrEnemy.class || "generic").toLowerCase()>>
<<set _smwrRace to (_smwrEnemy.race || "white").toLowerCase()>>
<<set _smwrResolved to setup.resolveCombatPath(_smwrBase, _smwrArch, _smwrRace)>>
<<if setup.mediaManifestCache[_smwrResolved] && setup.mediaManifestCache[_smwrResolved].media && setup.mediaManifestCache[_smwrResolved].media.length > 0>>
<<selectMediaFromPool _smwrResolved _smwrFilters>>
<<if _result && _result.file>>
<<set _smwrFound to true>>
<</if>>
<</if>>
<</if>>
<<if !_smwrFound>>
<<selectMediaFromPool _smwrBase _smwrFilters>>
<</if>>
<</widget>>
<<widget "selectCombatMedia">>
<<set _scmAction to _args[0]>>
<<set _scmArch to _args[1] || "generic">>
<<set _scmRace to _args[2] || "white">>
<<set _scmFilters to _args[3] || {}>>
<<set _scmBase to "combat/attacks/" + _scmAction>>
<<set _scmResolved to setup.resolveCombatPath(_scmBase, _scmArch, _scmRace)>>
<<selectMediaFromPool _scmResolved _scmFilters>>
<</widget>>
<<widget "selectCharacterMedia">>
<<set _schmType to _args[0]>>
<<set _schmArch to _args[1] || "generic">>
<<set _schmRace to _args[2] || "white">>
<<set _schmExpr to _args[3] || "neutral">>
<<set _schmResolved to setup.resolveCharacterPath(_schmType, _schmArch, _schmRace)>>
<<selectMediaFromPool _schmResolved `{expression: _schmExpr}`>>
<</widget>>
<<widget "weaponVideoFolder">>
<<set _wvfWeapon to _args[0]>>
<<set _wvfSide to _args[1] || "player">>
<<set _wvfOutcome to _args[2] || "hit">>
<<set _wvfBase to (_wvfOutcome === "miss" ? _wvfWeapon.videoFolderMiss : _wvfWeapon.videoFolder) || "">>
<<set _wvfFolder to _wvfBase>>
<<if _wvfSide === "enemy" && _wvfBase>>
<<set _wvfOverride to (_wvfOutcome === "miss" ? _wvfWeapon.enemyVideoFolderMiss : _wvfWeapon.enemyVideoFolder)>>
<<if _wvfOverride>>
<<set _wvfFolder to _wvfOverride>>
<<else>>
<<set _wvfFolder to _wvfBase.replace(/^combat\//, "combat/enemy_")>>
<</if>>
<</if>>
<</widget>>
<<widget "showActionMedia">>
<<set _amFolder to _args[0]>>
<<set _amCaption to _args[1] || "">>
<<set _amFilters to _args[2] || {}>>
<<selectMediaFromPool _amFolder _amFilters>>
<<if _result && _result.file>>
<div class="action-media-container">
<<if _result.format === "mp4" || _result.format === "webm">>
<video class="primary-media action-video"
@src="_result.file"
preload="auto" autoplay loop muted playsinline></video>
<<else>>
<img class="primary-media action-image" @src="_result.file" alt="">
<</if>>
<<if _amCaption>>
<div class="video-caption"><<print _amCaption>></div>
<</if>>
</div>
<</if>>
<</widget>>
<<widget "storyVideo">>
<<set _svSeq to (_svSeq || 0) + 1>>
<<set _svBox to _args[1] || ("story-video-" + _svSeq)>>
<div @id="_svBox" class="card-video-container story-video-container" @data-story-folder="_args[0]" style="display:none"></div>
<<if _args[0] && !setup.mediaManifestCache[_args[0]]>><<loadMediaManifest _args[0]>><</if>>
<<set _svPin to setup.storyClipReplay(_args[0], _svSeq)>>
<<run setup.mediaStoryPick(true, _svPin, _args[0])>>
<<if _svPin>>
<<set _svFamAvoid to null>><<set _svRepeat to []>>
<<run setup.mediaAvoidBegin(_args[0], _svPin.own)>>
<<if _svPin.source !== _args[0]>><<run setup.mediaAvoidBegin(_svPin.source, _svPin.sourceAvoid)>><<else>><<run setup.mediaAvoidBegin(_args[0], _svPin.sourceAvoid)>><</if>>
<<else>>
<<set _svFamAvoid to _args[0] ? setup.storyFamilyAvoid(_args[0], _args[3]) : null>>
<<if _svFamAvoid>><<run setup.mediaAvoidBegin(_args[0], _svFamAvoid)>><</if>>
<<set _svRepeat to _args[2] ? setup.storyRepeatAvoid(_args[0], _args[2]) : []>>
<<if _svRepeat.length>><<run setup.mediaAvoidBegin(_args[0], _svRepeat)>><</if>>
<</if>>
<<if _args[2]>>
<<fillCombatVideoBox _svBox _args[0] null _args[2]>>
<<else>>
<<fillCombatVideoBox _svBox _args[0]>>
<</if>>
<<if _svRepeat.length>><<run setup.mediaAvoidEnd(_args[0])>><</if>>
<<if _svFamAvoid>><<run setup.mediaAvoidEnd(_args[0])>><</if>>
<<if _svPin>><<if _svPin.source !== _args[0]>><<run setup.mediaAvoidEnd(_svPin.source)>><<else>><<run setup.mediaAvoidEnd(_args[0])>><</if>><<run setup.mediaAvoidEnd(_args[0])>><</if>>
<<run setup.storyClipRecord(_args[0], _svSeq, _cvbFile, _cvbSource)>>
<<if _cvbFile && _cvbSource && _cvbSource !== _args[0]>><<run setup.mediaShownRemember(_args[0], _cvbFile)>><</if>>
<<run setup.storyFamilyNote(_cvbTags, _args[3])>>
<<run setup.mediaStoryPick(false)>>
<<set _storyClip to _cvbFile ? _cvbFile.split("/").pop().replace(/\.[^.]+$/, "") : null>>
<<set _storyFamily to (_cvbFile && _cvbTags && _cvbTags.family) ? String(_cvbTags.family) : null>>
<</widget>>
<<widget "showEnemyCombatMedia">>
<<set _secmType to _args[0]>>
<<set _secmIdx to _args[1]>>
<<if typeof _secmIdx === "undefined">>
<<set _secmIdx to $combat.currentEnemyIndex || 0>>
<</if>>
<<set _secmEnemy to $combat.enemies[_secmIdx]>>
<<set _secmArch to _secmEnemy.class || "generic">>
<<set _secmRace to _secmEnemy.race || "white">>
<<getCombatVideoFilters "player" 5>>
<<selectCombatMedia _secmType _secmArch _secmRace _videoFilters>>
<<if _result && _result.file>>
<div class="combat-video-container enemy-action-video">
<<if _result.format === "mp4" || _result.format === "webm">>
<video class="primary-media combat-video"
@src="_result.file"
preload="auto" autoplay loop muted playsinline></video>
<<else>>
<img class="primary-media combat-image"
@src="_result.file" alt="">
<</if>>
</div>
<</if>>
<</widget>><<widget "clothingFilter">>
<<set _clothingFilter to "">>
<<set _cfState to ($clothing && _args[0]) ? $clothing[_args[0]] : null>>
<<if _cfState>>
<<if _cfState.titsExposed && _cfState.pussyExposed>>
<<set _clothingFilter to "naked">>
<<elseif _cfState.titsExposed>>
<<set _clothingFilter to "exposed_tits">>
<<elseif _cfState.pussyExposed>>
<<set _clothingFilter to "exposed_pussy">>
<<elseif _cfState.dickExposed>>
<<set _clothingFilter to "exposed_dick">>
<<elseif _cfState.top <= 50 || _cfState.bottom <= 50>>
<<set _clothingFilter to "torn">>
<<else>>
<<set _clothingFilter to "dressed">>
<</if>>
<</if>>
<</widget>><<set $saveCompat to { from: "new" }>><<widget "terminal" container>>
<div class="terminal-container terminal-boot">
<div class="terminal-header">
<span class="terminal-header-title">_args[0]</span>
<<if _args[1]>>
<span class="terminal-header-status">_args[1]</span>
<</if>>
</div>
<div class="terminal-text">
<div class="terminal-vignette"></div>
<div class="terminal-grain"></div>
<div class="terminal-content">
_contents
</div>
</div>
</div>
<</widget>>
<<widget "terminalRow">>
<div class="terminal-row">
<span class="terminal-label">_args[0]</span>
<<if _args[1]>>
<<if _args[2]>>
<span @class="'terminal-value status-' + _args[2]">_args[1]</span>
<<else>>
<span class="terminal-value">_args[1]</span>
<</if>>
<</if>>
</div>
<</widget>>
<<widget "terminalSection">>
<div class="terminal-section-title">_args[0]</div>
<</widget>>
<<widget "terminalDivider">>
<hr class="terminal-divider">
<</widget>>
<<widget "terminalPrompt">>
<div class="terminal-prompt">_args[0]<span class="terminal-cursor"></span></div>
<</widget>>
<<widget "terminalEntry" container>>
<div class="terminal-log-entry">
<<if _args[0]>>
<div class="terminal-log-id">_args[0]</div>
<</if>>
_contents
</div>
<</widget>><<widget "randomLine">>
<<set _rlCategory to _args[0]>>
<<set _rlType to _args[1]>>
<<set _rlEnemyName to _args[2] || null>>
<<set _rlPool to setup.textPoolLines(_rlCategory, _rlType)>>
<<if _rlPool.length>>
<<set _rlLine to setup.pickFresh(_rlPool)>>
<<set _rlLine to _rlLine.replace(/\[Player\]/g, $player.name)>>
<<if _rlEnemyName>>
<<set _rlLine to _rlLine.replace(/\[Enemy\]/g, _rlEnemyName)>>
<<elseif tags().includes("postbattle") && $postBattle && $postBattle.defeatedEnemies && $postBattle.defeatedEnemies[$postBattle.currentEnemy]>>
<<set _rlLine to setup.fillEnemyName(_rlLine, $postBattle.defeatedEnemies[$postBattle.currentEnemy])>>
<<elseif $combat && $combat.enemies && $combat.currentEnemyIndex !== undefined && $combat.enemies[$combat.currentEnemyIndex]>>
<<set _rlLine to setup.fillEnemyName(_rlLine, $combat.enemies[$combat.currentEnemyIndex])>>
<</if>>
<<print _rlLine>>
<<else>>
[MISSING TEXT: <<print _rlCategory>>/<<print _rlType>>]
<</if>>
<</widget>>
<<widget "narrativePrint">>
<<set _npText to _args[0]>>
<<set _npEnemyName to _args[1] || null>>
<<if _npText>>
<<set _npText to _npText.replace(/\[Player\]/g, $player.name)>>
<<if !_npEnemyName && $combat && $combat.enemies && $combat.currentEnemyIndex !== undefined>>
<<set _npEnemyName to $combat.enemies[$combat.currentEnemyIndex] ? $combat.enemies[$combat.currentEnemyIndex].name : "The enemy">>
<</if>>
<<set _npEnemyName to _npEnemyName || "The enemy">>
<<set _npText to _npText.replace(/\[Enemy\]/g, _npEnemyName)>>
<<print _npText>>
<</if>>
<</widget>><<widget "updateTimePhase">>
<<if $time.hour >= 5 && $time.hour < 7>>
<<set $time.phase to "dawn">>
<<elseif $time.hour >= 7 && $time.hour < 12>>
<<set $time.phase to "morning">>
<<elseif $time.hour >= 12 && $time.hour < 17>>
<<set $time.phase to "afternoon">>
<<elseif $time.hour >= 17 && $time.hour < 20>>
<<set $time.phase to "evening">>
<<elseif $time.hour >= 20 && $time.hour < 24>>
<<set $time.phase to "night">>
<<else>>
<<set $time.phase to "late_night">>
<</if>>
<<set $time.isNight to ($time.phase === "night" || $time.phase === "late_night")>>
<<if $time.hour === 0>>
<<set $time.displayHour to 12>>
<<set $time.ampm to "AM">>
<<elseif $time.hour < 12>>
<<set $time.displayHour to $time.hour>>
<<set $time.ampm to "AM">>
<<elseif $time.hour === 12>>
<<set $time.displayHour to 12>>
<<set $time.ampm to "PM">>
<<else>>
<<set $time.displayHour to $time.hour - 12>>
<<set $time.ampm to "PM">>
<</if>>
<<if $time.hour >= 12 && !$timeFlags.passedNoon>>
<<set $timeFlags.passedNoon to true>>
<</if>>
<<if $time.hour >= 17 && !$timeFlags.passedEvening>>
<<set $timeFlags.passedEvening to true>>
<</if>>
<<if $time.hour >= 0 && $time.hour < 5 && !$timeFlags.passedMidnight>>
<<set $timeFlags.passedMidnight to true>>
<</if>>
<</widget>>
<<widget "advanceTime">>
<<set _hours to $args[0] || 0>>
<<set _minutes to $args[1] || 0>>
<<set $time.minute += _minutes>>
<<set _hours += Math.floor($time.minute / 60)>>
<<set $time.minute to $time.minute % 60>>
<<set $time.hour += _hours>>
<<set $time.totalHours += _hours>>
<<if $time.hour >= 24>>
<<set $time.day += Math.floor($time.hour / 24)>>
<<set $time.hour to $time.hour % 24>>
<<set $timeFlags.passedNoon to false>>
<<set $timeFlags.passedEvening to false>>
<<set $timeFlags.passedMidnight to false>>
<<if $clothing && $clothing.player>>
<<set $clothing.player.dickOut to false>>
<<updateExposure "player" true>>
<</if>>
<<set _weatherRoll to random(1, 100)>>
<<if _weatherRoll <= 30>>
<<set $weather to "clear">>
<<elseif _weatherRoll <= 60>>
<<set $weather to "cloudy">>
<<elseif _weatherRoll <= 80>>
<<set $weather to "rain">>
<<elseif _weatherRoll <= 90>>
<<set $weather to "fog">>
<<else>>
<<set $weather to "storm">>
<</if>>
<</if>>
<<updateTimePhase>>
<<clothingStateArousal>>
<<exposureArousal>>
<</widget>>
<<widget "sleepHeal">>
<<set $player.health to Math.min($player.maxHealth, $player.health + 20)>>
<<run setup.countSleep()>>
<<if $companions && $companions[0] && !$flags.kiraIsUnconscious && !$flags.kiraInComa && $companions[0].health < $companions[0].maxHealth>>
<<set $companions[0].health to Math.min($companions[0].maxHealth, $companions[0].health + 25)>>
<</if>>
<</widget>>
<<widget "setTime">>
<<set $time.hour to $args[0]>>
<<set $time.minute to $args[1] || 0>>
<<updateTimePhase>>
<</widget>>
<<widget "advanceToHour">>
<<set _athTarget to $args[0]>>
<<set _athHours to ((_athTarget - $time.hour) % 24 + 24) % 24>>
<<if _athHours is 0 and ($time.minute || 0) > 0>><<set _athHours to 24>><</if>>
<<if _athHours > 0>>
<<advanceTime _athHours `0 - ($time.minute || 0)`>>
<</if>>
<<setTime _athTarget 0>>
<</widget>>
<<widget "advanceToPhase">>
<<set _targetPhase to $args[0]>>
<<set _targetHour to 8>>
<<switch _targetPhase>>
<<case "dawn">>
<<set _targetHour to 5>>
<<case "morning">>
<<set _targetHour to 7>>
<<case "afternoon">>
<<set _targetHour to 12>>
<<case "evening">>
<<set _targetHour to 17>>
<<case "night">>
<<set _targetHour to 20>>
<<case "late_night">>
<<set _targetHour to 0>>
<</switch>>
<<if _targetHour > $time.hour>>
<<set _hoursToAdd to _targetHour - $time.hour>>
<<else>>
<<set _hoursToAdd to (24 - $time.hour) + _targetHour>>
<</if>>
<<advanceTime _hoursToAdd 0>>
<</widget>>
<<widget "displayTime">>
<<set _minuteStr to ($time.minute < 10) ? "0" + $time.minute : $time.minute>>
<<print $time.displayHour + ":" + _minuteStr + " " + $time.ampm>>
<</widget>>
<<widget "displayFullTime">>
<<set _minuteStr to ($time.minute < 10) ? "0" + $time.minute : $time.minute>>
<<print "Day " + $time.day + ", " + $time.displayHour + ":" + _minuteStr + " " + $time.ampm>>
<</widget>>
<<widget "doActivity">>
<<set _activity to $args[0]>>
<<set _hours to $args[1] || 0>>
<<set _minutes to $args[2] || 0>>
<<advanceTime _hours _minutes>>
<<if !$activitiesToday>>
<<set $activitiesToday to {}>>
<</if>>
<<set $activitiesToday[_activity] to ($activitiesToday[_activity] || 0) + 1>>
<<if $player.energy !== undefined>>
<<set _energyCost to (_hours * 5) + Math.floor(_minutes / 15)>>
<<set _negEnergyCost to -_energyCost>>
<<clampStat "player.energy" _negEnergyCost 0 $player.maxEnergy>>
<</if>>
<</widget>><div id="left-sidebar-content">
<!-- Player Section -->
<div class="sidebar-section player-section">
<div class="player-name"><<print $player.name>></div>
<div class="time-display">
<span class="day">Day <<print $time.day>> -</span> <<switch $time.phase>><<case "dawn">><<icon "sunrise" "small">><<case "morning">><<icon "sun" "small">><<case "afternoon">><<icon "sun" "small">><<case "evening">><<icon "sunset" "small">><<case "night">><<icon "night" "small">><<case "late_night">><<icon "night" "small">><<default>><<icon "sun" "small">><</switch>> <span class="phase"><<print $time.phase.replace(/_/g, ' ').replace(/\b\w/g, function(c) { return c.toUpperCase(); })>></span>
</div>
<div class="time-hour-display">
<<icon "clock" "medium">> <<displayTime>>
</div>
</div>
<!-- Vital Stats -->
<div class="sidebar-section vital-stats">
<div class="section-header">Vitals</div>
<div class="stat-row">
<span class="stat-label">Health</span>
<div class="stat-bar health-bar" @title="$player.health + ' / ' + $player.maxHealth">
<div class="stat-fill" @style="'width:' + Math.floor($player.health / $player.maxHealth * 100) + '%'"></div>
</div>
</div>
<div class="stat-row">
<span class="stat-label">Energy</span>
<div class="stat-bar energy-bar" @title="$player.energy + ' / ' + $player.maxEnergy">
<div class="stat-fill" @style="'width:' + Math.floor($player.energy / $player.maxEnergy * 100) + '%'"></div>
</div>
</div>
<<set _sbHunger to setup.hungerStateOf($player.hunger)>>
<div @class="'stat-row hunger-' + _sbHunger">
<span class="stat-label">Food</span>
<div class="stat-bar hunger-bar" @title="'Food: ' + $player.hunger + ' / ' + $player.maxHunger">
<div @class="'stat-fill' + (_sbHunger === 'starving' ? ' critical hunger-danger' : _sbHunger === 'very_hungry' ? ' hunger-warning' : '')" @style="'width:' + Math.floor($player.hunger / $player.maxHunger * 100) + '%'"></div>
</div>
</div>
</div>
<!-- Special Meters (Conditional) -->
<<if $uiVisible.lustMeter || $uiVisible.corruptionMeter>>
<div class="sidebar-section special-meters">
<div class="section-header">Inner State</div>
<<if $uiVisible.lustMeter>>
<div class="stat-row">
<span class="stat-label">Lust</span>
<div class="stat-bar lust-bar" @title="$player.lust + ' / 100'">
<div @class="'stat-fill' + ($player.lust >= 80 ? ' critical' : '')" @style="'width:' + $player.lust + '%'"></div>
</div>
</div>
<</if>>
<<if $uiVisible.corruptionMeter>>
<div class="stat-row">
<span class="stat-label">Corrupt</span>
<div class="stat-bar corruption-bar" @title="$player.corruption + ' / ' + ($player.maxCorruption || setup.CORRUPTION_MAX)">
<div class="stat-fill" @style="'width:' + Math.min(100, Math.round($player.corruption * 100 / ($player.maxCorruption || setup.CORRUPTION_MAX))) + '%'"></div>
</div>
</div>
<</if>>
</div>
<</if>>
<!-- Resources -->
<<if $vault.discovered>>
<div class="sidebar-section resources">
<div class="section-header">Vault Resources</div>
<div class="resource-grid">
<div @class="'resource-item' + (!setup.vaultPowerLive ? ' offline' : $vault.power < 20 ? ' low' : '')" @title="setup.vaultPowerLive ? 'Power' : 'Power (not in use yet)'">
<<icon "power" "medium">>
<span class="resource-value"><<print $vault.power>>/<<print $vault.maxPower>></span>
</div>
<div class="resource-item" title="Crystals">
<<icon "crystal" "medium">>
<span class="resource-value"><<print $vault.magicCrystals>></span>
</div>
<div @class="'resource-item' + ($vault.food < 10 ? ' low' : '')" @title="'Food: ' + setup.vaultDaysLeftText('food')">
<<icon "food" "medium">>
<span class="resource-value"><<print $vault.food>></span>
</div>
<div @class="'resource-item' + ($vault.water < 10 ? ' low' : '')" @title="'Water: ' + setup.vaultDaysLeftText('water')">
<<icon "water" "medium">>
<span class="resource-value"><<print $vault.water>></span>
</div>
</div>
</div>
<</if>>
<!-- Quick Actions -->
<div class="sidebar-section quick-actions">
<<link '<span class="btn-label">Journal</span>'>><<run setup.menuOverlay.toggle("Journal")>><</link>>
<<link '<span class="btn-label">Companions</span>'>><<run setup.menuOverlay.toggle("Companions_Menu")>><</link>>
<<link '<span class="btn-label">Backpack</span>'>><<run setup.menuOverlay.toggle("Inventory_Menu")>><</link>>
<<link '<span class="btn-label">Settings</span>'>><<run setup.menuOverlay.toggle("Settings_Menu")>><</link>>
<span class="qa-under-settings" data-x9e hidden><<link '<span class="btn-label">Cheats</span>'>><<run setup.menuOverlay.toggle("Settings_System")>><</link>></span>
<<script>>setTimeout(function(){$(document).trigger(':vb')},0)<</script>>
</div>
<!-- Active Effects -->
<<if $denial.active || ($supernaturals && $supernaturals.succubus && $supernaturals.succubus.hasMarkedPlayer) || ($tantric && $tantric.canHarvest)>>
<div class="sidebar-section active-effects">
<div class="section-header">Active</div>
<div class="effects-list">
<<if $denial.active>>
<div class="effect-item negative">
<span class="effect-name">Denial</span>
<span class="effect-duration">Day <<print $denial.daysDenied>></span>
</div>
<</if>>
<<if $supernaturals && $supernaturals.succubus && $supernaturals.succubus.hasMarkedPlayer>>
<div class="effect-item supernatural">
<span class="effect-name">Succubus Mark</span>
</div>
<</if>>
<<if $tantric && $tantric.canHarvest && $tantric.energy > 0>>
<div class="effect-item positive">
<span class="effect-name">Tantric</span>
<span class="effect-duration"><<print $tantric.energy>></span>
</div>
<</if>>
</div>
</div>
<</if>>
</div><h1>Settings</h1>
<div class="settings-section">
<div class="section-header">Display</div>
<<set _viewInfo to setup.viewModeInfo()>>
<div class="setting-row" id="setting-view-mode">
<div class="setting-info">
<div class="setting-label">View</div>
<div class="setting-description">Mobile view is made for phones. Auto picks it on a phone. Now showing: <<= _viewInfo.mode === "mobile" ? "Mobile" : "PC">> view.</div>
</div>
<div class="setting-control view-mode-choices">
<<for _vmChoice range ["Auto", "Mobile", "PC"]>>
<<capture _vmChoice>>
<<set _vmLabel to _vmChoice === "Auto" ? "Auto (" + (_viewInfo.device === "mobile" ? "Mobile" : "PC") + ")" : _vmChoice>>
<<if _viewInfo.choice === _vmChoice>>
<span @class="'view-mode-choice view-mode-current view-mode-' + _vmChoice.toLowerCase()"><<print _vmLabel>> <<icon "check">></span>
<<else>>
<span @class="'view-mode-choice view-mode-' + _vmChoice.toLowerCase()"><<link _vmLabel>>
<<set settings.viewMode to _vmChoice>>
<<run Setting.save()>>
<<run setup.applyViewMode()>>
<<menuGo "Settings_Menu">>
<</link>></span>
<</if>>
<</capture>>
<</for>>
</div>
</div>
<div class="setting-row">
<div class="setting-info">
<div class="setting-label">Player Name</div>
<div class="setting-description">How you're addressed in dialogue</div>
</div>
<div class="setting-control">
<<textbox "$player.name" $player.name>>
</div>
</div>
<div class="setting-row">
<div class="setting-info">
<div class="setting-label">Text Size</div>
</div>
<div class="setting-control text-size-control">
<<link "A-">>
<<set $preferences.textSize to Math.max(0.8, $preferences.textSize - 0.1)>>
<<menuGo "Settings_Menu">>
<</link>>
<span class="text-size-value"><<print Math.round($preferences.textSize * 100)>>%</span>
<<link "A+">>
<<set $preferences.textSize to Math.min(1.4, $preferences.textSize + 0.1)>>
<<menuGo "Settings_Menu">>
<</link>>
</div>
</div>
<div class="setting-row">
<div class="setting-info">
<div class="setting-label">Fullscreen Mode</div>
<div class="setting-description">Play in fullscreen for immersive experience</div>
</div>
<div class="setting-control">
<<link "Toggle Fullscreen">>
<<run (function() {
var doc = document;
var elem = doc.documentElement;
var isFullscreen = doc.fullscreenElement || doc.webkitFullscreenElement || doc.mozFullScreenElement || doc.msFullscreenElement;
if (isFullscreen) {
if (doc.exitFullscreen) doc.exitFullscreen();
else if (doc.webkitExitFullscreen) doc.webkitExitFullscreen();
else if (doc.mozCancelFullScreen) doc.mozCancelFullScreen();
else if (doc.msExitFullscreen) doc.msExitFullscreen();
} else {
if (elem.requestFullscreen) elem.requestFullscreen();
else if (elem.webkitRequestFullscreen) elem.webkitRequestFullscreen();
else if (elem.mozRequestFullScreen) elem.mozRequestFullScreen();
else if (elem.msRequestFullscreen) elem.msRequestFullscreen();
}
})()>>
<</link>>
</div>
</div>
<div class="setting-row">
<div class="setting-info">
<div class="setting-label">Keyboard Shortcuts</div>
<div class="setting-description">Enable keyboard shortcuts in combat (press keys to select actions)</div>
</div>
<div class="setting-control">
<<if $settings.keyboardShortcutsEnabled>>
<<link "Enabled <<icon \"check\">>">>
<<set $settings.keyboardShortcutsEnabled to false>>
<<menuGo "Settings_Menu">>
<</link>>
<<else>>
<<link "Disabled">>
<<set $settings.keyboardShortcutsEnabled to true>>
<<menuGo "Settings_Menu">>
<</link>>
<</if>>
</div>
</div>
<div class="setting-row" id="setting-combat-menu">
<div class="setting-info">
<div class="setting-label">Combat menu</div>
<div class="setting-description">Classic shows every move at once. Tabs sorts them by the flow of a fight: Fight, Take Down, Strip & Tease, Break Her, Use Her. Same moves either way.</div>
</div>
<div class="setting-control view-mode-choices">
<<for _cmChoice range ["classic", "tabs"]>>
<<capture _cmChoice>>
<<set _cmLabel to _cmChoice === "tabs" ? "Tabs" : "Classic">>
<<if ($settings.combatMenu || "tabs") === _cmChoice>>
<span @class="'view-mode-choice view-mode-current combat-menu-' + _cmChoice"><<print _cmLabel>> <<icon "check">></span>
<<else>>
<span @class="'view-mode-choice combat-menu-' + _cmChoice"><<link _cmLabel>>
<<set $settings.combatMenu to _cmChoice>>
<<menuGo "Settings_Menu">>
<</link>></span>
<</if>>
<</capture>>
<</for>>
</div>
</div>
<div class="setting-row">
<div class="setting-info">
<div class="setting-label">Video Audio</div>
<div class="setting-description">Enable sound on scene videos (starts muted by default)</div>
</div>
<div class="setting-control">
<<if !$media.settings.muted>>
<<link "Enabled <<icon \"check\">>">>
<<set $media.settings.muted to true>>
<<run setup.clipSound.applyIn(document)>>
<<menuGo "Settings_Menu">>
<</link>>
<<else>>
<<link "Muted">>
<<set $media.settings.muted to false>>
<<run setup.clipSound.applyIn(document)>>
<<menuGo "Settings_Menu">>
<</link>>
<</if>>
</div>
</div>
<div class="setting-row">
<div class="setting-info">
<div class="setting-label">Static Enemy Portraits</div>
<div class="setting-description">Use still images instead of video loops for enemy portraits (may improve performance)</div>
</div>
<div class="setting-control">
<<if $settings.staticEnemyPortraits>>
<<link "Static <<icon \"check\">>">>
<<set $settings.staticEnemyPortraits to false>>
<<menuGo "Settings_Menu">>
<</link>>
<<else>>
<<link "Animated">>
<<set $settings.staticEnemyPortraits to true>>
<<menuGo "Settings_Menu">>
<</link>>
<</if>>
</div>
</div>
</div>
<<if setup.denIsOpen()>>
<div class="settings-section">
<div class="section-header">The Den</div>
<div class="setting-row">
<div class="setting-info">
<div class="setting-label">Trip colours</div>
<div class="setting-description">Tints and slowly shifts the colours of Den videos while you trip. No flashing. Your device's reduce-motion setting stops the movement either way.</div>
</div>
<div class="setting-control" id="setting-den-trip-screen">
<<if settings.denTripScreen !== false>>
<<link "On <<icon \"check\">>">>
<<set settings.denTripScreen to false>>
<<run Setting.save()>>
<<menuGo "Settings_Menu">>
<</link>>
<<else>>
<<link "Off">>
<<set settings.denTripScreen to true>>
<<run Setting.save()>>
<<menuGo "Settings_Menu">>
<</link>>
<</if>>
</div>
</div>
</div>
<</if>>
<div class="settings-section">
<div class="section-header">Online</div>
<div class="setting-row">
<div class="setting-info">
<div class="setting-label">Online features</div>
<div class="setting-description">Update check and anonymous play stats. Turn off to play fully offline.</div>
</div>
<div class="setting-control" id="setting-online-features">
<<if settings.onlineFeatures>>
<<link "On <<icon \"check\">>">>
<<set settings.onlineFeatures to false>>
<<run Setting.save()>>
<<menuGo "Settings_Menu">>
<</link>>
<<else>>
<<link "Off">>
<<set settings.onlineFeatures to true>>
<<run Setting.save()>>
<<menuGo "Settings_Menu">>
<</link>>
<</if>>
</div>
</div>
</div>
<div class="settings-section">
<div class="section-header">Advanced</div>
<div class="setting-row">
<div class="setting-info">
<div class="setting-label">Cheats</div>
<div class="setting-description" data-x9d></div>
</div>
<div class="setting-control">
<<link "Open">><<menuGo "Settings_System">><</link>>
</div>
</div>
<<script>>setTimeout(function(){var d=document.querySelector('[data-'+atob('eDlk')+']');if(d){var f=window[atob('X3N1')];if(f)d.textContent=f();}},0)<</script>>
</div>
<div class="settings-section version-section">
<div class="version-info">
<span class="version-label">Version</span>
<span class="version-number"><<print setup.version || "0.1.0-alpha">></span>
</div>
</div>
<div class="settings-buttons">
<<link "Return">><<menuReturn>><</link>>
</div><h1>Companions</h1>
<<if $companions.length === 0>>
<p class="no-companions">You have no companions yet.</p>
<<else>>
<div class="companion-grid">
<<for _i, _comp range $companions>>
<div @class="'companion-card' + (!_comp.alive ? ' deceased' : '')">
<div class="companion-info">
<div class="companion-name"><<print _comp.name>></div>
<div class="companion-status">
<<if !_comp.alive>>
Deceased
<<elseif _comp.inParty>>
In Party
<<else>>
At Vault
<</if>>
</div>
<div class="companion-quick-stats">
<span title="Affection">Affection: <<print _comp.affection>></span>
<span title="Trust">Trust: <<print _comp.trust>></span>
<<if _comp.tension >= 30>>
<span title="Tension" class="tension-indicator">Tension: <<print _comp.tension>>%</span>
<</if>>
</div>
</div>
<<if _comp.alive>>
<<capture _comp>>
<<link "View">>
<<set $tempCompanion to _comp>>
<<menuGo "Companion_Detail">>
<</link>>
<</capture>>
<</if>>
</div>
<</for>>
</div>
<</if>>
<div class="menu-buttons">
<<link "Return">><<menuReturn>><</link>>
</div><<if $tempCompanion>>
<h1><<print $tempCompanion.name>></h1>
<div class="companion-detail">
<p><<print $tempCompanion.description || "A companion in your journey.">></p>
<div class="sidebar-section vitals-meters">
<div class="section-header">Vitals</div>
<div class="stat-row">
<span class="stat-label">Health</span>
<div class="stat-bar health-bar" @title="$tempCompanion.health + ' / ' + $tempCompanion.maxHealth">
<div @class="'stat-fill' + ($tempCompanion.health <= $tempCompanion.maxHealth * 0.25 ? ' critical' : $tempCompanion.health <= $tempCompanion.maxHealth * 0.5 ? ' warning' : '')" @style="'width:' + ($tempCompanion.health / $tempCompanion.maxHealth * 100) + '%'"></div>
</div>
<span class="stat-value"><<print $tempCompanion.health>>/<<print $tempCompanion.maxHealth>></span>
</div>
<div class="stat-row">
<span class="stat-label">Energy</span>
<div class="stat-bar energy-bar" @title="$tempCompanion.energy + ' / 100'">
<div @class="'stat-fill' + ($tempCompanion.energy <= 25 ? ' critical' : $tempCompanion.energy <= 50 ? ' warning' : '')" @style="'width:' + $tempCompanion.energy + '%'"></div>
</div>
<span class="stat-value"><<print $tempCompanion.energy>></span>
</div>
</div>
<div class="sidebar-section relationship-meters">
<div class="section-header">Relationship</div>
<div class="stat-row">
<span class="stat-label">Trust</span>
<div class="stat-bar trust-bar" @title="'Trust: ' + $tempCompanion.trust + ' / 100'">
<div @class="'stat-fill' + ($tempCompanion.trust < 0 ? ' negative' : '')" @style="'width:' + Math.max(0, $tempCompanion.trust) + '%'"></div>
</div>
</div>
<div class="stat-row">
<span class="stat-label">Affection</span>
<div class="stat-bar affection-bar" @title="'Affection: ' + $tempCompanion.affection + ' / 100'">
<div @class="'stat-fill' + ($tempCompanion.affection < 0 ? ' negative' : '')" @style="'width:' + Math.max(0, $tempCompanion.affection) + '%'"></div>
</div>
</div>
<div class="stat-row">
<span class="stat-label">Lust</span>
<div class="stat-bar lust-bar" @title="$tempCompanion.lust + ' / 100'">
<div class="stat-fill" @style="'width:' + $tempCompanion.lust + '%'"></div>
</div>
</div>
<<if $tempCompanion.tension >= 30>>
<div class="stat-row">
<span class="stat-label">Tension</span>
<div class="stat-bar tension-bar" @title="$tempCompanion.tension + ' / 100'">
<div @class="'stat-fill' + ($tempCompanion.tension >= 70 ? ' critical' : '')" @style="'width:' + $tempCompanion.tension + '%'"></div>
</div>
</div>
<</if>>
<<if $tempCompanion.submission && $tempCompanion.submission != 50>>
<div class="stat-row">
<span class="stat-label">Submission</span>
<div class="stat-bar submission-bar" @title="$tempCompanion.submission + ' / 100'">
<div class="stat-fill" @style="'width:' + $tempCompanion.submission + '%'"></div>
</div>
</div>
<</if>>
<<if $tempCompanion.jealousy && $tempCompanion.jealousy > 0>>
<div class="stat-row">
<span class="stat-label">Jealousy</span>
<div class="stat-bar jealousy-bar" @title="$tempCompanion.jealousy + ' / 100'">
<div @class="'stat-fill' + ($tempCompanion.jealousy >= 50 ? ' warning' : '')" @style="'width:' + $tempCompanion.jealousy + '%'"></div>
</div>
</div>
<</if>>
<<if $tempCompanion.fear && $tempCompanion.fear > 0>>
<div class="stat-row">
<span class="stat-label">Fear</span>
<div class="stat-bar fear-bar" @title="$tempCompanion.fear + ' / 100'">
<div @class="'stat-fill' + ($tempCompanion.fear >= 50 ? ' critical' : '')" @style="'width:' + $tempCompanion.fear + '%'"></div>
</div>
</div>
<</if>>
</div>
<<if $tempCompanion.combat || $tempCompanion.scavenging || $tempCompanion.medical>>
<div class="sidebar-section skills-section">
<div class="section-header">Skills</div>
<div class="skills-grid">
<<if $tempCompanion.combat>><span class="skill-item"><<icon "attack" "small">> Combat: <<print $tempCompanion.combat>></span><</if>>
<<if $tempCompanion.scavenging>><span class="skill-item"><<icon "search" "small">> Scavenging: <<print $tempCompanion.scavenging>></span><</if>>
<<if $tempCompanion.medical>><span class="skill-item"><<icon "medical" "small">> Medical: <<print $tempCompanion.medical>></span><</if>>
</div>
</div>
<</if>>
<<if $tempCompanion.claimed>>
<div class="claimed-indicator">
Claimed
</div>
<</if>>
</div>
<</if>>
<div class="choice-container">
<<link '<span class="choice-button action"><span class="gi gi-return gi-large"></span><span class="label">Return</span></span>'>><<menuGo "Companions_Menu">><</link>>
</div><h1>Backpack</h1>
<<if typeof UInv !== 'undefined' && UInv.BagExists("player equipped")>>
<!-- Equipment Section - UInv Powered -->
<div class="inventory-section">
<div class="section-header">Equipped</div>
<div class="equipment-grid">
<<set _equippedWeapon to null>>
<<set _equippedArmor to null>>
<<set _equippedItems to UInv.GetItemsArray("player equipped")>>
<<for _eqItem range _equippedItems>>
<<set _eqTypes to UInv.GetItemPropertyValue("player equipped", _eqItem, "type") || []>>
<<if _eqTypes.includes("weapon") && !_equippedWeapon>>
<<set _equippedWeapon to _eqItem>>
<<elseif (_eqTypes.includes("armor") || _eqTypes.includes("wearable")) && !_equippedArmor>>
<<set _equippedArmor to _eqItem>>
<</if>>
<</for>>
<div class="equipment-slot" data-slot="weapon">
<div class="slot-label">Weapon</div>
<<if _equippedWeapon>>
<<set _wpnName to (UInv.GetItemPropertyValue("player equipped", _equippedWeapon, "singular") || _equippedWeapon).replace(/^a |^an /i, "")>>
<<set _wpnDmg to UInv.GetItemPropertyValue("player equipped", _equippedWeapon, "damage")>>
<div class="item-image">
<img @src="setup.itemImage(_equippedWeapon, 'player equipped')" alt="" onerror="this.style.display='none'">
</div>
<div class="slot-item">
<<print _wpnName>>
<<if _wpnDmg>><span class="stat-badge">DMG: <<print _wpnDmg>></span><</if>>
</div>
<div class="slot-actions">
<<capture _equippedWeapon>>
<<link "[Unequip]">>
<<uinvUnequip _equippedWeapon>>
<<menuGo "Inventory_Menu">>
<</link>>
<</capture>>
</div>
<<elseif $equipped && $equipped.weapon>>
<div class="item-image">
<img @src="setup.itemImage(String($equipped.weapon.id || $equipped.weapon.name))" alt="" onerror="this.style.display='none'">
</div>
<div class="slot-item">
<<print $equipped.weapon.name>>
<<if $equipped.weapon.damage>><span class="stat-badge">DMG: <<print $equipped.weapon.damage>></span><</if>>
</div>
<<else>>
<div class="slot-empty">Empty</div>
<</if>>
</div>
<div class="equipment-slot" data-slot="armor">
<div class="slot-label">Armor</div>
<<set _wornArm to setup.wornArmor()>>
<<if _wornArm>>
<<set _armName to String(_wornArm.name || "").replace(/^a |^an /i, "")>>
<<set _armDef to _wornArm.defense>>
<<set _armImageSrc to _wornArm.image || setup.itemImage(String(_wornArm.id || _wornArm.name || ""), "player armor")>>
<div class="item-image">
<img @src="_armImageSrc" alt="" onerror="this.style.display='none'">
</div>
<div class="slot-item">
<<print _armName>>
<<if _armDef>><span class="stat-badge">DEF: +<<print _armDef>></span><</if>>
<span class="stat-badge armor-durability"><<print setup.armorDurability().percent>>%</span>
</div>
<div class="slot-actions">
<<link "[Unequip]">>
<<uinvUnequipArmor>>
<<menuGo "Inventory_Menu">>
<</link>>
</div>
<<else>>
<div class="slot-empty">Empty</div>
<</if>>
</div>
</div>
</div>
<!-- Inventory Grid - UInv powered -->
<div class="inventory-section">
<<set _items to UInv.GetItemsArray("player")>>
<<set _maxSlots to UInv.GetBagPropertyValue("player", "maxSlots") || setup.BACKPACK_SLOTS>>
<div class="section-header">Backpack (<<print _maxSlots - setup.bagFree("player")>>/<<print _maxSlots>>)</div>
<<if _items.length === 0>>
<p class="no-items">Your backpack is empty.</p>
<<else>>
<div class="inventory-grid">
<<for _itemName range _items>>
<<set _qty to UInv.GetItemPropertyValue("player", _itemName, "UInvQuantity") || 1>>
<<set _singular to (UInv.GetItemPropertyValue("player", _itemName, "singular") || _itemName).replace(/^a |^an /i, "")>>
<<set _plural to (UInv.GetItemPropertyValue("player", _itemName, "plural") || _itemName).replace(/^a |^an /i, "")>>
<<set _desc to UInv.GetItemPropertyValue("player", _itemName, "description") || "">>
<<set _types to UInv.GetItemPropertyValue("player", _itemName, "type") || []>>
<<set _rarity to UInv.GetItemPropertyValue("player", _itemName, "rarity") || "common">>
<<set _defense to UInv.GetItemPropertyValue("player", _itemName, "defense")>>
<<set _damage to UInv.GetItemPropertyValue("player", _itemName, "damage")>>
<<set _healAmount to UInv.GetItemPropertyValue("player", _itemName, "healAmount")>>
<<set _isEquippable to _types.includes("weapon") || _types.includes("armor") || _types.includes("wearable")>>
<<set _isConsumable to _types.includes("consumable") || _types.includes("medical") || _types.includes("food") || _types.includes("drink") || _types.includes("water")>>
<<if _types.includes("quest")>><<set _isConsumable to false>><</if>>
<<set _imageSrc to setup.itemImage(_itemName, "player")>>
<div @class="'inventory-slot ' + (_rarity)" @data-item-id="(_itemName)">
<div class="item-image">
<img @src="_imageSrc" alt="" onerror="this.style.display='none'">
</div>
<div class="item-header">
<<if _qty > 1>>
<span class="item-name"><<print _plural>></span>
<span class="item-quantity-badge">x<<print _qty>></span>
<<else>>
<span class="item-name"><<print _singular>></span>
<</if>>
</div>
<div class="item-details">
<<if _defense>><span class="item-stat">DEF +<<print _defense>></span><</if>>
<<if _damage>><span class="item-stat">DMG <<print _damage>></span><</if>>
<<if _healAmount>><span class="item-stat">HEAL +<<print _healAmount>></span><</if>>
</div>
<div class="item-actions">
<<if _isEquippable>>
<<capture _itemName>>
<<link "[Equip]">>
<<uinvEquip _itemName>>
<<menuGo "Inventory_Menu">>
<</link>>
<</capture>>
<</if>>
<<if _isConsumable>>
<<capture _itemName, _healAmount>>
<<link "[Use]">>
<<uinvUseItem _itemName>>
<<menuGo "Inventory_Menu">>
<</link>>
<</capture>>
<</if>>
<<if setup.tearable(_itemName)>>
<<set _tearId to "tear-" + _items.indexOf(_itemName)>>
<<capture _itemName, _tearId, _singular>>
<span @id="_tearId" class="item-drop">
<<link "[Tear into cloth]">>
<<replace `"#" + _tearId`>>
<span class="drop-confirm">Tear the <<print _singular>> into scrap cloth? Once torn, it is no use as clothing.</span>
<<link "[Tear it]">><<run setup.tearIntoCloth(_itemName)>><<menuGo "Inventory_Menu">><</link>>
<<link "[Keep]">><<menuGo "Inventory_Menu">><</link>>
<</replace>>
<</link>>
</span>
<</capture>>
<</if>>
<<if !setup.keepItem(_itemName)>>
<<set _dropId to "drop-" + _items.indexOf(_itemName)>>
<<set _dropName to (_qty > 1 ? _plural : _singular)>>
<<capture _itemName, _qty, _dropId, _dropName>>
<span @id="_dropId" class="item-drop">
<<link "[Drop]">>
<<replace `"#" + _dropId`>>
<span class="drop-confirm">Drop <<if _qty > 1>>how many <<print _dropName>>?<<else>>the <<print _dropName>>?<</if>> Gone for good.</span>
<<link "[Drop 1]">><<run setup.dropItem(_itemName, 1)>><<toast `"Dropped 1 " + _dropName + "."` "info">><<menuGo "Inventory_Menu">><</link>>
<<if _qty > 1>><<link `"[Drop all " + _qty + "]"`>><<run setup.dropItem(_itemName, _qty)>><<toast `"Dropped " + _qty + " " + _dropName + "."` "info">><<menuGo "Inventory_Menu">><</link>><</if>>
<<link "[Keep]">><<menuGo "Inventory_Menu">><</link>>
<</replace>>
<</link>>
</span>
<</capture>>
<</if>>
</div>
<div class="item-tooltip">
<div class="tooltip-name"><<if _qty > 1>><<print _plural>><<else>><<print _singular>><</if>></div>
<div class="tooltip-desc"><<print _desc>></div>
</div>
</div>
<</for>>
</div>
<</if>>
</div>
<<else>>
<!-- Fallback to old system -->
<div class="inventory-section">
<div class="section-header">Equipped</div>
<div class="equipment-grid">
<div class="equipment-slot">
<div class="slot-label">Weapon</div>
<<if $equipped && $equipped.weapon>>
<div class="slot-item"><<print $equipped.weapon.name>></div>
<<else>>
<div class="slot-empty">Empty</div>
<</if>>
</div>
<div class="equipment-slot">
<div class="slot-label">Armor</div>
<<if $equipped && $equipped.armor>>
<div class="slot-item"><<print $equipped.armor.name>></div>
<<else>>
<div class="slot-empty">Empty</div>
<</if>>
</div>
</div>
</div>
<div class="inventory-section">
<div class="section-header">Items</div>
<p class="no-items">Inventory system not available.</p>
</div>
<</if>>
<<if $inventoryFull>>
<div class="feedback-message error">Your backpack is full!</div>
<<set $inventoryFull to false>>
<</if>>
<<if $itemUsed && $useFeedback>>
<div class="feedback-message success"><<print $useFeedback>></div>
<<set $itemUsed to false>>
<<set $useFeedback to "">>
<<set $healAmount to 0>>
<</if>>
<div id="use-feedback" class="feedback-message"></div>
<div class="menu-buttons">
<<link "Return">><<menuReturn>><</link>>
</div><h1>Journal</h1>
<div class="journal-section">
<div class="section-header">Current Objectives</div>
<<if !$flags.preludeComplete>>
<p>• Find shelter before you die.</p>
<<else>>
<p>• Survive in the vault. Explore. Adapt.</p>
<<if $prelude && $prelude.seraFate === "taken" && !($grove && ($grove.selene.seraHint || ($grove.market && $grove.market.ledgerSeen) || setup.groveDenLead()))>>
<p>• Find Sera - the Convergence took her.</p>
<</if>>
<<if $flags.kiraIntroduced && !$flags.kiraAwakened && $flags.kiraInComa>>
<p>• Wait for Kira to recover.</p>
<</if>>
<<if setup.kiraRunDue()>>
<p>• Kira should be back from <<= setup.kiraRunSiteName($companions[0].away.site)>> by now.</p>
<<elseif setup.kiraOnRun()>>
<p>• Kira is out scavenging at <<= setup.kiraRunSiteName($companions[0].away.site)>>. She'll be back by evening.</p>
<</if>>
<<if setup.day4RuinsPending()>>
<p>• Something is calling you to the Overgrown Ruins. Set out from the Vault Entrance.</p>
<</if>>
<<if setup.velithGoalOpen()>>
<p>• Learn more about the succubus Velith.</p>
<</if>>
<<if $flags.supernaturalAwakening>>
<p>• Understand your awakening powers.</p>
<</if>>
<<if $flags.alchemyLabUnlocked>>
<p>• The alchemist Lysara may have answers.</p>
<</if>>
<<if $grove && $grove.chapter === "patrol" && !$grove.patrolSeen && setup.groveSummonDue()>>
<p>• Green-clad women have been seen on the roads. Traders say they keep a walled estate in the deep woods east of the old Clinic, and that nobody finds it on their own: their patrols find you, on whatever road you take.</p>
<</if>>
<<if $grove && $grove.chapter !== "none" && $discoveries && $discoveries.greenhollow>>
<<if $grove.arrived && !setup.groveAtLeast("Guest") && !setup.groveHostile() && !setup.groveClosed()>>
<p>• Get the Covenant to let me in as a Guest: the wardens at the Grove give work to anyone who asks, once a day.</p>
<</if>>
<<if !$grove.selene.met>>
<p>• Meet Lady Selene at the Grove.</p>
<</if>>
<<if $grove.pendingBreach>>
<p>• The Covenant's charge against me: "You <<print (setup.COVENANT.crimes[$grove.pendingBreach.kind] || { label: "broke the Law" }).label>>." The Lady's sentence waits at the Grove's gate, and if I stay away her wardens will come to the vault for me.</p>
<</if>>
<<if setup.groveDaysLeft() !== null>>
<p>• <<if $grove.pendingBreach && $grove.pendingBreach.kind === "skipped">>Next Covenant assignment<<else>>Covenant assignment<</if>> due in <<print Math.max(0, setup.groveDaysLeft())>> day<<if setup.groveDaysLeft() !== 1>>s<</if>>.</p>
<</if>>
<<if setup.groveSeleneAudienceDue(2) || setup.groveSeleneAudienceDue(3)>>
<p>• Lady Selene has sent for you again. Answer her summons at the Grove.</p>
<</if>>
<<if setup.grovePlantingDaysLeft() !== null>>
<p>• <<if setup.grovePlantingDaysLeft() === 0>>The Planting is tonight at the Main House.<<else>>The Planting is in <<print setup.grovePlantingDaysLeft()>> day<<if setup.grovePlantingDaysLeft() !== 1>>s<</if>>.<</if>> Every ten days the Covenant's women gather at the Main House for a night of breeding, and the Lady expects her Trusted men there. It counts as my assignment; missing it costs standing.</p>
<</if>>
<<if setup.grovePayoffOpen()>>
<p>• Lady Selene knows where the Den is. She'll name her price in her rooms at the Grove.</p>
<</if>>
<<if setup.groveBountyActive()>>
<p>• There's a price on your head with the Covenant: <<print setup.groveBountyFine()>> scrap at the Grove's gate.<<if setup.groveClosed()>> The Grove itself is shut to you for good.<</if>></p>
<</if>>
<<if setup.groveDenLead() && $grove.den.seraPaid>>
<p>• Sera isn't at the Den any more. Madam Silk sold her to a woman in grey who buys only healers and pays in medicine. Her women call her the Sister. Find out who she is.</p>
<<elseif setup.groveDenLead() && $grove.den.seraAsked>>
<<if setup.denIsOpen()>>
<p>• Madam Silk has named her price for Sera's trail, but nobody gets up her stairs now. (Work in progress: the rest comes in a later update.)</p>
<<else>>
<p>• Madam Silk at the Den knows who has Sera now. Her price: <<print setup.groveSeraPrice()>> scrap.</p>
<</if>>
<<elseif setup.groveDenLead()>>
<p>• Find Sera at the Den.</p>
<<elseif $grove.market && $grove.market.ledgerSeen>>
<p>• Sera was sold on to "the Den", to a Madam Silk. Find out where the Den is.</p>
<<elseif $grove.selene.seraHint && setup.groveSeraKnown()>>
<p>• Sera passed through the Grove: Crimson raiders sold her to the Covenant, and the Lady sold her on south. Find out where.</p>
<<elseif $grove.selene.seraHint>>
<p>• The Covenant sold on a red-haired healer bought from raiders. Find out where, and whether she was Sera.</p>
<</if>>
<<if setup.denIsOpen() && setup.groveDenLead()>>
<<if $den && $den.stairs>>
<p>• Find a way up Madam Silk's stairs. Hulda's word on it: "Madam sees men who are worth something." (Work in progress: the rest comes in a later update.)</p>
<<elseif !$grove.den.seraAsked && !$grove.den.seraPaid>>
<p>• Reach Madam Silk at the Den. The door, the drinks and the bartender stand in the way.</p>
<</if>>
<</if>>
<<if setup.groveKiraDenTalkDue()>>
<p>• Kira hasn't said a word about what happened in the Lady's rooms. She'll talk in her room at the vault.</p>
<</if>>
<<if setup.kiraAtCenter()>>
<p>• Kira is at the Covenant's Center (<<print setup.groveKiraDaysLeft()>> day<<if setup.groveKiraDaysLeft() !== 1>>s<</if>>).</p>
<</if>>
<</if>>
<</if>>
<<if $flags.trainingLead && !$flags.yardDoorSeen>>
<p>• The yard outside the vault could be a place to train. Its door is up on the surface: the Training Yard.</p>
<</if>>
</div>
<div class="journal-section">
<div class="section-header">My Journal</div>
<<if $journal && $journal.length > 0>>
<<set _dayGroups to {}>>
<<set _maxDay to 0>>
<<for _i, _entry range $journal>>
<<set _day to _entry.day>>
<<if _day > _maxDay>><<set _maxDay to _day>><</if>>
<<if !_dayGroups[_day]>><<set _dayGroups[_day] to []>><</if>>
<<run _dayGroups[_day].push(_entry)>>
<</for>>
<<for _d to _maxDay; _d >= 0; _d-->>
<<if _dayGroups[_d] && _dayGroups[_d].length > 0>>
<<set _daysOld to _maxDay - _d>>
<<set _isOld to _daysOld >= 5>>
<<set _detailsClass to _isOld ? "journal-day journal-old" : "journal-day">>
<<set _openAttr to _isOld ? "" : " open">>
<<set _html to '<details class="' + _detailsClass + '"' + _openAttr + '>'>>
<<set _html to _html + '<summary class="journal-day-header">Day ' + _d + ' <span class="entry-count">(' + _dayGroups[_d].length + ' entries)</span></summary>'>>
<<set _html to _html + '<div class="journal-day-entries">'>>
<<for _j, _entry range _dayGroups[_d]>>
<<set _html to _html + '<p class="journal-entry journal-' + _entry.category + '">' + _entry.text + '</p>'>>
<</for>>
<<set _html to _html + '</div></details>'>>
<<= _html>>
<</if>>
<</for>>
<<else>>
<p><em>No entries yet. Your story is just beginning.</em></p>
<</if>>
</div>
<div class="journal-section">
<div class="section-header">Key Discoveries</div>
<<set _hasDiscoveries to false>>
<<if $flags.supernaturalAwakening>>
<<set _hasDiscoveries to true>>
<p>• Magic is real. You can feel supernatural energy.</p>
<</if>>
<<if $supernaturals && $supernaturals.succubus && $supernaturals.succubus.hasMarkedPlayer>>
<<set _hasDiscoveries to true>>
<p>• Velith has marked you. She visits your dreams.</p>
<</if>>
<<if $vault.libraryAccessed>>
<<set _hasDiscoveries to true>>
<p>• The vault library contains ancient knowledge.</p>
<</if>>
<<if $flags.previousDwellerHint>>
<<set _hasDiscoveries to true>>
<p>• Others lived here before. The Groundskeeper watched them too.</p>
<</if>>
<<if $flags.alchemyLabUnlocked>>
<<set _hasDiscoveries to true>>
<p>• An alchemy lab exists deeper in the archives. Lysara works there.</p>
<</if>>
<<if $flags.sexCurrencyIntroduced>>
<<set _hasDiscoveries to true>>
<p>• The factions use intimacy as currency. A strange new world.</p>
<</if>>
<<if !_hasDiscoveries>>
<p><em>Nothing significant discovered yet.</em></p>
<</if>>
</div>
<div class="journal-section">
<div class="section-header">Relationships</div>
<<if $companions.length > 0>>
<<for _i, _comp range $companions>>
<p><strong><<print _comp.name>></strong> -
<<if _comp.romanceStage >= 3>>Intimate<<elseif _comp.romanceStage >= 2>>Close<<elseif _comp.trust > 50>>Trusted<<elseif _comp.trust > 25>>Friendly<<else>>Wary<</if>>
</p>
<</for>>
<<else>>
<p><em>No companions yet.</em></p>
<</if>>
<<if $supernaturals && $supernaturals.succubus && $supernaturals.succubus.met>>
<p><strong>Velith</strong> - <<if $supernaturals.succubus.affection > 50>>Bonded<<elseif $supernaturals.succubus.hasMarkedPlayer>>Claimed<<else>>Interested<</if>></p>
<</if>>
<<if $flags.canVisitLysara>>
<p><strong>Lysara</strong> - <<if $flags.lysaraAntidoteRelationship>>Allied<<else>>Acquainted<</if>></p>
<</if>>
</div>
<div class="journal-section">
<div class="section-header">Statistics</div>
<p>Day: <<print $time.day>> | Phase: <<print $time.phase.replace('_', ' ')>></p>
<p>Companions: <<print $companions.length>></p>
<<if $player.corruption > 0>><p>Corruption: <<print $player.corruption>>%</p><</if>>
<<if $stats>>
<p>Encounters: <<print $stats.sex.totalEncounters || 0>></p>
<p>Women used: <<print $stats.sex.womenUsed || 0>></p>
<p>Women claimed: <<print $stats.sex.womenClaimed || 0>></p>
<<if $stats.combat.enemiesDefeated>><p>Enemies defeated: <<print $stats.combat.enemiesDefeated>></p><</if>>
<</if>>
<<if $grove && $grove.arrived>>
<p>Covenant standing: <<print setup.groveRank()>> (<<print setup.factionRepOf("verdant")>>)</p>
<<if $breeding>><p>Covenant yield: <<print $breeding.yield || 0>> conceived, <<print $breeding.marks || 0>> marks</p><</if>>
<<if $grove.favours && ($grove.favours.skip > 0 || $grove.favours.kiraHalf)>><p>Commissary favours: <<if $grove.favours.skip > 0>><<print $grove.favours.skip>> skip pass<<if $grove.favours.skip !== 1>>es<</if>><</if>><<if $grove.favours.skip > 0 && $grove.favours.kiraHalf>>, <</if>><<if $grove.favours.kiraHalf>>Kira's next stay halved<</if>></p><</if>>
<</if>>
</div>
<div class="menu-buttons">
<<link "Return">><<menuReturn>><</link>>
</div><<set _comp to $tempCompanion>>
<<if _comp>>
<div class="right-sidebar-header">
<h2 class="right-sidebar-title"><<print _comp.name>></h2>
</div>
<!-- Portrait -->
<div class="sidebar-section">
<div class="companion-mood">
<<if _comp.affection >= 70>>Devoted
<<elseif _comp.affection >= 40>>Warm
<<elseif _comp.affection >= 10>>Friendly
<<elseif _comp.affection >= -10>>Neutral
<<else>>Distant
<</if>>
</div>
<p class="companion-description"><<print _comp.description || "A companion in your journey.">></p>
</div>
<!-- Relationship Meters -->
<div class="sidebar-section relationship-meters">
<div class="section-header">Relationship</div>
<div class="stat-row">
<span class="stat-label">Trust</span>
<div class="stat-bar trust-bar" @title="'Trust: ' + (_comp.trust) + ' / 100'">
<div @class="'stat-fill' + (_comp.trust < 0 ? ' negative' : '')" @style="'width: ' + (Math.max(0, _comp.trust)) + '%'"></div>
</div>
</div>
<div class="stat-row">
<span class="stat-label">Affection</span>
<div class="stat-bar affection-bar" @title="'Affection: ' + (_comp.affection) + ' / 100'">
<div @class="'stat-fill' + (_comp.affection < 0 ? ' negative' : '')" @style="'width: ' + (Math.max(0, _comp.affection)) + '%'"></div>
</div>
</div>
<div class="stat-row">
<span class="stat-label">Lust</span>
<div class="stat-bar lust-bar">
<div class="stat-fill" @style="'width: ' + (_comp.lust) + '%'"></div>
</div>
<span class="stat-value"><<print _comp.lust>></span>
</div>
<<if $uiVisible.tensionMeter && _comp.tension >= 30>>
<div class="stat-row">
<span class="stat-label">Tension</span>
<div class="stat-bar tension-bar">
<div @class="'stat-fill' + (_comp.tension >= 70 ? ' critical' : '')" @style="'width: ' + (_comp.tension) + '%'"></div>
</div>
<span class="stat-value"><<print _comp.tension>>%</span>
</div>
<</if>>
<<if _comp.jealousy >= 20>>
<div class="stat-row">
<span class="stat-label">Jealousy</span>
<div class="stat-bar jealousy-bar">
<div class="stat-fill" @style="'width: ' + (_comp.jealousy) + '%'"></div>
</div>
<span class="stat-value"><<print _comp.jealousy>></span>
</div>
<</if>>
</div>
<!-- Romance Stage -->
<div class="sidebar-section">
<div class="romance-stage">
Romance:
<<switch _comp.romanceStage>>
<<case 0>>Strangers
<<case 1>>Acquaintances
<<case 2>>Friends
<<case 3>>Close
<<case 4>>Intimate
<<case 5>>Devoted
<</switch>>
</div>
<<if _comp.claimed>>
<div class="claimed-indicator">
Claimed
</div>
<</if>>
</div>
<!-- Known Preferences -->
<<if _comp.triggersDiscovered && _comp.triggersDiscovered.length > 0>>
<div class="sidebar-section preferences-section">
<div class="section-header">Discovered</div>
<<for _trigger range _comp.triggersDiscovered>>
<div class="preference-item known">
<span class="pref-name"><<print _trigger>></span>
</div>
<</for>>
<div class="preference-item unknown">
<span class="pref-name">More to discover...</span>
</div>
</div>
<</if>>
<</if>><!-- Story Sidebar - Shows characters present in current scene -->
<!-- Auto-hides during combat when combat sidebar is active -->
<div id="story-sidebar" class="right-sidebar collapsible">
<div class="sidebar-header">
<h2><<icon "users" "small">> PRESENT</h2>
<span id="sidebar-location" class="location-tag"></span>
<button class="collapse-btn" onclick="toggleSidebarSection('story-sidebar')">−</button>
</div>
<div id="sidebar-characters">
<!-- Dynamically populated by StorySidebar.render() -->
</div>
</div><div id="combat-sidebar" class="right-sidebar collapsible">
<!-- Header -->
<div class="sidebar-header">
<h2><<icon "crossed-swords" "small">> COMBAT</h2>
<span class="round-counter">Round <<print $combat.turn>></span>
<button class="collapse-btn" onclick="toggleSidebarSection('combat-sidebar')">−</button>
</div>
<!-- Kira Section (if in combat) — TOP -->
<<if $combat.companionInCombat === "kira" && $companions && $companions.length > 0 && $companions[0]>>
<div class="sidebar-section companion-combat">
<!-- Video Portrait -->
<div class="portrait-container">
<<combatPortrait "kira">>
</div>
<!-- Name + Position Row -->
<div class="name-position-row">
<span class="combatant-name">KIRA</span>
<<displayPosition "kira">>
</div>
<!-- Health Bar -->
<div class="stat-row">
<span class="stat-icon" data-tooltip="Health"><<icon "health" "small">></span>
<div class="stat-bar health-bar">
<div class="stat-fill" @style="'width: ' + (Math.floor($companions[0].health / $companions[0].maxHealth * 100)) + '%'"></div>
</div>
<span class="stat-value"><<print $companions[0].health>>/<<print $companions[0].maxHealth>></span>
</div>
<!-- Tension Bar -->
<div class="stat-row">
<span class="stat-icon" data-tooltip="Tension"><<icon "lightning" "small">></span>
<div class="stat-bar tension-bar">
<div @class="'stat-fill' + ($companions[0].tension >= 70 ? ' critical' : '')"
@style="'width: ' + ($companions[0].tension) + '%'"></div>
</div>
<span class="stat-value"><<print $companions[0].tension>>%</span>
</div>
<!-- Clothing Status -->
<<displayClothingStatus "kira">>
<!-- Buff/Debuff Icons -->
<<displayBuffDebuffs "kira">>
</div>
<</if>>
<!-- Player Section — BOTTOM -->
<div class="sidebar-section player-combat">
<!-- Video Portrait -->
<div class="portrait-container">
<<combatPortrait "player">>
</div>
<!-- Name + Position Row -->
<div class="name-position-row">
<span class="combatant-name">YOU</span>
<<displayPosition "player">>
</div>
<!-- Health Bar -->
<div class="stat-row">
<span class="stat-icon" data-tooltip="Health"><<icon "health" "small">></span>
<div class="stat-bar health-bar">
<div class="stat-fill" @style="'width: ' + (Math.floor($player.health / $player.maxHealth * 100)) + '%'"></div>
</div>
<span class="stat-value"><<print $player.health>>/<<print $player.maxHealth>></span>
</div>
<!-- Energy Bar -->
<div class="stat-row">
<span class="stat-icon" data-tooltip="Energy"><<icon "lightning" "small">></span>
<div class="stat-bar energy-bar">
<div class="stat-fill" @style="'width: ' + (Math.floor($player.energy / $player.maxEnergy * 100)) + '%'"></div>
</div>
<span class="stat-value"><<print $player.energy>>/<<print $player.maxEnergy>></span>
</div>
<!-- Lust Bar -->
<<if $uiVisible.lustMeter>>
<div class="stat-row">
<span class="stat-icon" data-tooltip="Lust"><<icon "lust" "small">></span>
<div class="stat-bar lust-bar">
<div @class="'stat-fill' + ($player.lust >= 80 ? ' critical' : '')"
@style="'width: ' + ($player.lust) + '%'"></div>
</div>
<span class="stat-value"><<print $player.lust>>%</span>
</div>
<</if>>
<!-- Clothing Status -->
<<displayClothingStatus "player">>
<!-- Buff/Debuff Icons -->
<<displayBuffDebuffs "player">>
</div>
<!-- Combat Log (Collapsible) -->
<div class="sidebar-section combat-log collapsible-section">
<div class="section-header">
<span><<icon "scroll" "small">> Combat Log</span>
<button class="collapse-btn" onclick="toggleSidebarSection('combat-log')">−</button>
</div>
<div class="log-content">
<<for _i, _entry range $combat.log>>
<div @class="'log-entry ' + (_entry.type)">
• <<print _entry.text>>
</div>
<</for>>
</div>
</div>
</div><!-- Intimate scene UI for right sidebar -->
<<set _partner to $tempCompanion>>
<<if _partner>>
<div class="sidebar-section arousal-section">
<div class="partner-name"><<print _partner.name>></div>
<div class="arousal-meter">
<span class="arousal-label">Arousal</span>
<div class="stat-bar lust-bar">
<div @class="'stat-fill' + (_partner.lust >= 80 ? ' close' : '')" @style="'width: ' + (_partner.lust) + '%'"></div>
</div>
</div>
<div class="partner-state">
<<if _partner.lust >= 90>>
On the edge...
<<elseif _partner.lust >= 70>>
Breathing heavily
<<elseif _partner.lust >= 50>>
Clearly aroused
<<elseif _partner.lust >= 30>>
Warming up
<<else>>
Composed
<</if>>
</div>
</div>
<</if>>
<!-- Player State -->
<div class="sidebar-section arousal-section">
<div class="partner-name">You</div>
<div class="arousal-meter">
<span class="arousal-label">Arousal</span>
<div class="stat-bar lust-bar">
<div @class="'stat-fill' + ($player.lust >= 80 ? ' close' : '')" @style="'width: ' + ($player.lust) + '%'"></div>
</div>
</div>
<<if $denial && $denial.active>>
<div class="denial-indicator">
<span class="denial-text">Denial: Day <<print $denial.daysDenied>></span>
<span class="denial-multiplier">x<<print $denial.intensityMultiplier.toFixed(1)>></span>
</div>
<</if>>
</div>
<!-- CNC indicator -->
<<if $cnc && $cnc.activeScene>>
<div class="sidebar-section scene-controls">
<div class="cnc-indicator">
Safe word: <<print $cnc.safeWord>>
</div>
</div>
<</if>><<widget "intimateVideo">>
<<set _src to _args[0]>>
<<set _caption to _args[1] || "">>
<<set _loop to _args[2] !== false>>
<div class="video-container video-intimate">
<<if $media.settings && $media.settings.muted>>
<video class="intimate-video" preload="auto" autoplay muted playsinline controls>
<source @src="(_src)" @type="setup.videoMime(_src)">
Your browser doesn't support video playback.
</video>
<<else>>
<video class="intimate-video" preload="auto" autoplay playsinline controls>
<source @src="(_src)" @type="setup.videoMime(_src)">
Your browser doesn't support video playback.
</video>
<</if>>
<<if _caption>>
<div class="video-caption"><<print _caption>></div>
<</if>>
</div>
<<if _loop>><<run $(document).one(':passagerender', function() { $('.intimate-video').last().attr('loop', '') })>><</if>>
<</widget>>
<<widget "combatVideo">>
<<set _src to _args[0]>>
<<set _loop to _args[1] || false>>
<div class="combat-action-visual">
<<if $media.settings && $media.settings.muted>>
<video class="combat-video" preload="auto" autoplay muted playsinline>
<source @src="(_src)" @type="setup.videoMime(_src)">
</video>
<<else>>
<video class="combat-video" preload="auto" autoplay playsinline>
<source @src="(_src)" @type="setup.videoMime(_src)">
</video>
<</if>>
</div>
<<if _loop>><<run $(document).one(':passagerender', function() { $('.combat-video').last().attr('loop', '') })>><</if>>
<</widget>><<widget "setTimeOfDay">>
<<set _time to _args[0]>>
<<run VaultUI.setTimeOfDay(_time)>>
<</widget>>
<<widget "characterSpeaks">>
<<set _id to _args[0]>>
<<run $(".character-sprite").removeClass("speaking").addClass("not-speaking")>>
<<run $(".character-sprite[data-character='" + _id + "']").removeClass("not-speaking").addClass("speaking")>>
<</widget>>
<<widget "say">>
<<set _speaker to _args[0]>>
<<set _text to _args[1]>>
<<set _speakerClass to _speaker.toLowerCase().replace(/\s+/g, '-').replace(/[^a-z0-9-]/g, '')>>
<<set _colors to setup.getSpeakerColors(_speaker)>>
<<set _borderColor to setup.hexToRgba(_colors.color, 0.6)>>
<<set _boxStyle to "border-left-color: " + _borderColor + "; background: linear-gradient(135deg, " + _colors.bg + " 0%, rgba(20, 20, 35, 0.8) 100%);">>
<<set _plateStyle to "color: " + _colors.color + ";">>
<div @class="'dialogue-box speaker-' + _speakerClass" @style="_boxStyle">
<<if _speaker>>
<div class="speaker-plate" @style="_plateStyle"><<print _speaker>></div>
<<characterSpeaks `_speaker.toLowerCase().replace(/\s+/g, '')`>>
<</if>>
<div class="dialogue-text"><<print _text>></div>
</div>
<</widget>>
<<widget "vchoice">>
<<set _text to _args[0]>>
<<set _target to _args[1]>>
<<set _type to _args[2] || "action">>
<<set _iconName to _args[3] || "">>
<<set _iconHTML to "">>
<<if _iconName>>
<<set _iconHTML to '<span class="gi gi-' + _iconName + ' gi-large"></span>'>>
<</if>>
<<link `'<span class="choice-button ' + _type + '">' + _iconHTML + '<span class="label">' + _text + '</span></span>'` _target>><</link>>
<</widget>>
<<widget "vchoiceDisabled">>
<<set _text to _args[0]>>
<<set _type to _args[1] || "action">>
<<set _iconName to _args[2] || "">>
<<set _iconHTML to "">>
<<if _iconName>>
<<set _iconHTML to '<span class="gi gi-' + _iconName + ' gi-large"></span>'>>
<</if>>
<span @class="'choice-button disabled ' + (_type)"><<print _iconHTML>><span class="label"><<print _text>></span></span>
<</widget>>
<<widget "toggleImmersive">>
<<run VaultUI.toggleImmersive()>>
<</widget>><<run VaultUI.setBackground("wardrobe")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<<uinvGetEquippedArmor>>
<<uinvGetAvailableArmor>>
<h2>Armor Management</h2>
<div class="armor-container">
<div class="armor-section">
<h3>Currently Equipped</h3>
<<if $equippedArmor>>
<div class="armor-display">
<div class="armor-name"><<print $equippedArmorData.displayName>></div>
<div class="armor-stats">
<div class="stat-line">
<span class="stat-label">Defense:</span>
<span class="stat-value"><<print "+" + $equippedArmorData.defense>></span>
</div>
<div class="stat-line">
<span class="stat-label">Durability:</span>
<span class="stat-value"><<print $equippedArmorData.durability>>/<<print $equippedArmorData.maxDurability>></span>
</div>
</div>
<div class="durability-bar">
<<set _durPercent to Math.round(($equippedArmorData.durability / $equippedArmorData.maxDurability) * 100)>>
<div class="durability-fill" @style="'width: ' + (_durPercent) + '%'"></div>
</div>
<span class="durability-percent"><<print _durPercent>>%</span>
<<if _durPercent >= 75>>
<p class="armor-condition good">In good condition</p>
<<elseif _durPercent >= 50>>
<p class="armor-condition worn">Showing wear</p>
<<elseif _durPercent >= 25>>
<p class="armor-condition damaged">Heavily damaged</p>
<<else>>
<p class="armor-condition critical">Critical condition</p>
<</if>>
<<if $equippedArmorData.magicResist || $equippedArmorData.magicBonus>>
<div class="armor-effects">
<h4>Effects:</h4>
<<if $equippedArmorData.magicResist>>
<p class="effect-item">Magic resistance</p>
<</if>>
<<if $equippedArmorData.magicBonus>>
<p class="effect-item">Magic power</p>
<</if>>
</div>
<</if>>
<div class="armor-actions">
<div class="choice-container">
<<vchoice "Unequip" "Armor_Unequip" "action" "check">>
</div>
<<if _durPercent < 100>>
<div class="choice-container">
<<vchoice "Repair" "Armor_Repair" "action" "armor">>
</div>
<</if>>
<div class="choice-container">
<<vchoice "More Info" "Armor_Info" "action" "scroll">>
</div>
</div>
</div>
<<else>>
<p class="no-armor">No armor equipped</p>
<div class="choice-container">
<<vchoice "Equip armor" "Armor_Equip" "action" "check">>
</div>
<</if>>
</div>
<div class="armor-section">
<h3>Available Armor</h3>
<<if $availableArmor.length > 0>>
<div class="armor-list">
<<for _armor range $availableArmor>>
<div class="armor-item">
<div class="item-name"><<print _armor.displayName>></div>
<div class="item-stats">
<span class="defense">DEF <<print "+" + _armor.defense>></span>
<span class="durability"><<print Math.round((_armor.durability / _armor.maxDurability) * 100)>>%</span>
</div>
<<capture _armor>>
<<link "Equip">>
<<uinvEquipArmor _armor.name>>
<<goto "Wardrobe_Armor_Menu">>
<</link>>
<</capture>>
</div>
<</for>>
</div>
<<else>>
<p class="no-items">No other armor in inventory</p>
<</if>>
</div>
<div class="armor-section">
<h3>Reference - Available Armor Types</h3>
<div class="armor-reference">
<div class="armor-ref-item">
<div class="ref-name">Leather Jacket</div>
<div class="ref-stats">DEF +3 | Dur 50 | No penalties</div>
</div>
<div class="armor-ref-item">
<div class="ref-name">Reinforced Vest</div>
<div class="ref-stats">DEF +6 | Dur 75 | -5% Mobility</div>
</div>
<div class="armor-ref-item">
<div class="ref-name">Military Armor</div>
<div class="ref-stats">DEF +10 | Dur 100 | -10% Mobility</div>
</div>
<div class="armor-ref-item">
<div class="ref-name">Mage Robes</div>
<div class="ref-stats">DEF +2 | Dur 40 | Magic resistance, magic power</div>
</div>
<div class="armor-ref-item">
<div class="ref-name">Raider Scraps</div>
<div class="ref-stats">DEF +4 | Dur 30 | Intimidating</div>
</div>
<div class="armor-ref-item">
<div class="ref-name">Vault Security Gear</div>
<div class="ref-stats">DEF +5 | Dur 60 | +Trust with Groundskeeper</div>
</div>
</div>
</div>
</div>
<div class="action-buttons">
<div class="choice-container">
<<vchoice "Back to Quarters" "Player_Quarters" "action" "return">>
</div>
</div><<run VaultUI.setBackground("wardrobe")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<<uinvGetAvailableArmor>>
<h2>Equip Armor</h2>
<<if $availableArmor.length === 0>>
<p>You don't have any armor in your inventory.</p>
<div class="choice-container">
<<vchoice "Back" "Wardrobe_Armor_Menu" "action" "return">>
</div>
<<else>>
<div class="armor-equip-list">
<<for _armor range $availableArmor>>
<<capture _armor>>
<div class="armor-equip-item">
<div class="armor-header">
<h3><<print _armor.displayName>></h3>
</div>
<div class="armor-details">
<div class="stat-group">
<div class="stat">
<span class="label">Defense Bonus:</span>
<span class="value"><<print "+" + _armor.defense>></span>
</div>
<div class="stat">
<span class="label">Durability:</span>
<span class="value"><<print _armor.durability>>/<<print _armor.maxDurability>></span>
</div>
</div>
</div>
<div class="armor-action">
<<link "Equip This">>
<<set $tempSelectedArmor to _armor>>
<<goto "Armor_Equip_Specific">>
<</link>>
</div>
</div>
<</capture>>
<</for>>
</div>
<div class="choice-container">
<<vchoice "Cancel" "Wardrobe_Armor_Menu" "action" "check">>
</div>
<</if>><<run VaultUI.setBackground("wardrobe")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<<uinvGetEquippedArmor>>
<h2>Unequip Armor</h2>
<<if $equippedArmor>>
<p>You carefully remove the <<print $equippedArmorData.displayName>>.</p>
<div class="armor-display">
<div class="armor-name"><<print $equippedArmorData.displayName>></div>
<div class="armor-stats">
<div class="stat-line">
<span class="stat-label">Defense:</span>
<span class="stat-value"><<print "+" + $equippedArmorData.defense>></span>
</div>
<div class="stat-line">
<span class="stat-label">Durability:</span>
<span class="stat-value"><<print $equippedArmorData.durability>>/<<print $equippedArmorData.maxDurability>></span>
</div>
</div>
</div>
<p>The armor will be moved to your inventory.</p>
<<link "Confirm">>
<<uinvUnequipArmor>>
<<goto "Wardrobe_Armor_Menu">>
<</link>>
<div class="choice-container">
<<vchoice "Wait, put it back on" "Wardrobe_Armor_Menu" "action" "return">>
</div>
<<else>>
<p>You're not wearing any armor.</p>
<div class="choice-container">
<<vchoice "Back" "Wardrobe_Armor_Menu" "action" "return">>
</div>
<</if>><<run VaultUI.setBackground("wardrobe")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<<uinvGetEquippedArmor>>
<h2>Repair Armor</h2>
<<if !$equippedArmor>>
<p>You need armor equipped to repair it.</p>
<div class="choice-container">
<<vchoice "Back" "Wardrobe_Armor_Menu" "action" "return">>
</div>
<<else>>
<<set _repairOptions to [25, 50, 75]>>
<<set _scrapCost to 10>>
<h3><<print $equippedArmorData.displayName>></h3>
<p>Repair this armor using scrap materials.</p>
<div class="repair-options">
<<for _amount range _repairOptions>>
<<capture _amount>>
<<set _finalDur to Math.min($equippedArmorData.maxDurability, $equippedArmorData.durability + _amount)>>
<<set _actualRepair to _finalDur - $equippedArmorData.durability>>
<<set _cost to Math.ceil((_actualRepair / 25) * _scrapCost)>>
<<if _actualRepair > 0>>
<div class="repair-option">
<div class="repair-info">
<h4>Repair <<print "+" + _actualRepair>> Durability</h4>
<p class="cost">Cost: <<print _cost>> scrap</p>
<p class="result">Result: <<print _finalDur>>/<<print $equippedArmorData.maxDurability>></p>
</div>
<<if $vault.scrap >= _cost>>
<<capture _actualRepair, _cost>>
<<link "Repair">>
<<uinvRepairArmor _actualRepair>>
<<set $vault.scrap -= _cost>>
<<goto "Armor_Repair_Complete">>
<</link>>
<</capture>>
<<else>>
<p class="insufficient">Need <<print _cost - $vault.scrap>> more scrap</p>
<</if>>
</div>
<</if>>
<</capture>>
<</for>>
</div>
<p class="scrap-available">Scrap available: <<print $vault.scrap>></p>
<div class="choice-container">
<<vchoice "Cancel" "Wardrobe_Armor_Menu" "action" "check">>
</div>
<</if>><<run VaultUI.setBackground("wardrobe")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<<uinvGetEquippedArmor>>
<h2>Armor Repaired</h2>
<<set _durPercent to Math.round(($equippedArmorData.durability / $equippedArmorData.maxDurability) * 100)>>
<p>The repairs are complete. Your <<print $equippedArmorData.displayName>> is now in better condition.</p>
<div class="armor-display">
<div class="armor-name"><<print $equippedArmorData.displayName>></div>
<div class="durability-bar">
<div class="durability-fill" @style="'width: ' + (_durPercent) + '%'"></div>
</div>
<span class="durability-percent"><<print _durPercent>>%</span>
</div>
<div class="choice-container">
<<vchoice "Continue" "Wardrobe_Armor_Menu" "action" "map">>
</div><<run VaultUI.setBackground("wardrobe")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<<uinvGetEquippedArmor>>
<h2>Armor Information</h2>
<<if $equippedArmor>>
<div class="armor-info-panel">
<h3><<print $equippedArmorData.displayName>></h3>
<div class="info-section">
<h4>Stats</h4>
<dl>
<dt>Defense Bonus:</dt>
<dd><<print "+" + $equippedArmorData.defense>></dd>
<dt>Current Durability:</dt>
<dd><<print $equippedArmorData.durability>>/<<print $equippedArmorData.maxDurability>></dd>
<<set _durPercent to Math.round(($equippedArmorData.durability / $equippedArmorData.maxDurability) * 100)>>
<dt>Condition:</dt>
<dd>
<<if _durPercent >= 75>>
Excellent
<<elseif _durPercent >= 50>>
Good
<<elseif _durPercent >= 25>>
Fair
<<else>>
Poor
<</if>>
</dd>
</dl>
</div>
<<if $equippedArmorData.magicResist || $equippedArmorData.magicBonus>>
<div class="info-section">
<h4>Special Effects</h4>
<ul>
<<if $equippedArmorData.magicResist>>
<li><strong>Magic Resistance:</strong> wards off magic</li>
<</if>>
<<if $equippedArmorData.magicBonus>>
<li><strong>Magic Power:</strong> strengthens magic you use</li>
<</if>>
</ul>
</div>
<</if>>
<div class="info-section">
<h4>How Armor Works</h4>
<p>Armor absorbs damage before it reaches your clothing. When you take damage, your armor durability decreases first. Only excess damage affects your clothes.</p>
<p>If your armor is completely destroyed in combat, it breaks apart and is removed. You'll need to repair it or find new armor.</p>
<p>Use the repair function to restore durability using scrap materials.</p>
</div>
</div>
<div class="choice-container">
<<vchoice "Back" "Wardrobe_Armor_Menu" "action" "return">>
</div>
<<else>>
<p>You have no armor equipped to get information about.</p>
<div class="choice-container">
<<vchoice "Back" "Wardrobe_Armor_Menu" "action" "return">>
</div>
<</if>><<run VaultUI.setBackground("wardrobe")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<<set _selectedArmor to $tempSelectedArmor>>
<h2>Confirm Equip</h2>
<p>Equip the <<print _selectedArmor.name>>?</p>
<div class="armor-comparison">
<<if $equipped.armor>>
<div class="armor-col">
<h4>Currently Equipped</h4>
<div class="armor-item-display">
<strong><<print $equipped.armor.name>></strong>
<p>DEF <<print "+" + $equipped.armor.defense>></p>
<p>Dur: <<print setup.armorDurability().current>>/<<print setup.armorDurability().max>></p>
</div>
</div>
<div class="armor-col">
<h4>New Armor</h4>
<div class="armor-item-display">
<strong><<print _selectedArmor.name>></strong>
<p>DEF <<print "+" + _selectedArmor.defense>></p>
<p>Dur: <<print _selectedArmor.durability>>/<<print _selectedArmor.maxDurability>></p>
</div>
</div>
<<else>>
<div class="armor-item-display">
<strong><<print _selectedArmor.name>></strong>
<p>DEF <<print "+" + _selectedArmor.defense>></p>
<p>Dur: <<print _selectedArmor.durability>>/<<print _selectedArmor.maxDurability>></p>
</div>
<</if>>
</div>
<div class="confirm-actions">
<<link "Equip">>
<<if _selectedArmor && _selectedArmor.name>>
<<uinvEquipArmor _selectedArmor.name>>
<</if>>
<<set $flags.newArmorEquipped to true>>
<<goto "Wardrobe_Armor_Menu">>
<</link>>
<div class="choice-container">
<<vchoice "Cancel" "Armor_Equip" "action" "check">>
</div>
</div><h2>Wardrobe Management</h2>
<p>Your personal storage for clothing and equipment. Everything a survivor needs to look the part—or fall apart trying.</p>
<div class="wardrobe-container">
<div class="wardrobe-section">
<h3>Your Outfit</h3>
<div class="current-outfit-display">
<<set _topState to $clothing.player.top>>
<<set _bottomState to $clothing.player.bottom>>
<<set _underState to $clothing.player.underwear>>
<<if $equipped.armor>>
<p><strong>Armor:</strong> $equipped.armor.name
<<if setup.armorDurability().current < 50>>
<span class="clothing-state ruined">(Damaged)</span>
<<elseif setup.armorDurability().current < 75>>
<span class="clothing-state worn">(Worn)</span>
<<else>>
<span class="clothing-state good">(Good)</span>
<</if>>
</p>
<<else>>
<p><span class="disabled">No armor equipped</span></p>
<</if>>
<<if _topState > 0>>
<p><strong>Top:</strong>
<<if _topState >= 76>>
<span class="clothing-state good">Good</span>
<<elseif _topState >= 51>>
<span class="clothing-state worn">Worn</span>
<<elseif _topState >= 26>>
<span class="clothing-state ripped">Ripped</span>
<<elseif _topState >= 1>>
<span class="clothing-state ruined">Ruined</span>
<</if>>
<span class="durability-value">(<<= _topState>>%)</span>
</p>
<<else>>
<p><strong>Top:</strong> <span class="clothing-state gone">Exposed</span></p>
<</if>>
<<if _bottomState > 0>>
<p><strong>Bottom:</strong>
<<if _bottomState >= 76>>
<span class="clothing-state good">Good</span>
<<elseif _bottomState >= 51>>
<span class="clothing-state worn">Worn</span>
<<elseif _bottomState >= 26>>
<span class="clothing-state ripped">Ripped</span>
<<elseif _bottomState >= 1>>
<span class="clothing-state ruined">Ruined</span>
<</if>>
<span class="durability-value">(<<= _bottomState>>%)</span>
</p>
<<else>>
<p><strong>Bottom:</strong> <span class="clothing-state gone">Exposed</span></p>
<</if>>
</div>
</div>
<div class="wardrobe-section actions">
<h3>Quick Actions</h3>
<div class="choice-container">
<<vchoice "View/Change Clothes" "Wardrobe_Player_Clothes" "action" "cycle">>
</div>
<div class="choice-container">
<<vchoice "Change Underwear" "Wardrobe_Change_Underwear" "action" "cycle">>
</div>
<div class="choice-container">
<<vchoice "Equip/Remove Armor" "Wardrobe_Armor_Management" "action" "armor">>
</div>
<div class="choice-container">
<<vchoice "Repair All" "Wardrobe_Repair_All" "action" "armor">>
</div>
<div class="choice-container">
<<vchoice "Outfit Presets" "Wardrobe_Outfit_Presets" "action" "shirt">>
</div>
</div>
</div>
<div class="choice-container">
<<vchoice "Return to Quarters" "Player_Quarters" "action" "door">>
</div><h2>Change Clothes</h2>
<p>Select what you want to wear. Your current outfit is shown below.</p>
<div class="wardrobe-info">
<<set _topState to $clothing.player.top>>
<<set _bottomState to $clothing.player.bottom>>
<<uinvGetWornClothing "top" "player">>
<<set _equippedTop to $wornItem>>
<<uinvGetWornClothing "bottom" "player">>
<<set _equippedBottom to $wornItem>>
<<set _topData to _equippedTop ? $clothingDatabase.tops[_equippedTop.replace(/ /g, "_")] : null>>
<<set _bottomData to _equippedBottom ? $clothingDatabase.bottoms[_equippedBottom.replace(/ /g, "_")] : null>>
<div class="current-outfit-display">
<div class="outfit-item">
<h4>Top: <<if _topData>><<= _topData.name>><<else>>None<</if>></h4>
<<if _topData && _topData.image>><<print '<img src="' + _topData.image + '" class="clothing-thumbnail" alt="' + _topData.name + '">'>>
<</if>>
<p class="condition">
<<if _topState >= 76>>
<span class="clothing-state good">Good</span> (<<= _topState>>%)
<<elseif _topState >= 51>>
<span class="clothing-state worn">Worn</span> (<<= _topState>>%)
<<elseif _topState >= 26>>
<span class="clothing-state ripped">Ripped</span> (<<= _topState>>%)
<<elseif _topState >= 1>>
<span class="clothing-state ruined">Ruined</span> (<<= _topState>>%)
<<else>>
<span class="clothing-state gone">Exposed</span>
<</if>>
</p>
</div>
<div class="outfit-item">
<h4>Bottom: <<if _bottomData>><<= _bottomData.name>><<else>>None<</if>></h4>
<<if _bottomData && _bottomData.image>><<print '<img src="' + _bottomData.image + '" class="clothing-thumbnail" alt="' + _bottomData.name + '">'>>
<</if>>
<p class="condition">
<<if _bottomState >= 76>>
<span class="clothing-state good">Good</span> (<<= _bottomState>>%)
<<elseif _bottomState >= 51>>
<span class="clothing-state worn">Worn</span> (<<= _bottomState>>%)
<<elseif _bottomState >= 26>>
<span class="clothing-state ripped">Ripped</span> (<<= _bottomState>>%)
<<elseif _bottomState >= 1>>
<span class="clothing-state ruined">Ruined</span> (<<= _bottomState>>%)
<<else>>
<span class="clothing-state gone">Exposed</span>
<</if>>
</p>
</div>
</div>
</div>
<div class="clothing-options">
<h3>Top Actions</h3>
<<if _topState > 0>>
<<link "Remove top" "Wardrobe_Player_Clothes">><<set $clothing.player.top to 0>><</link>>
<<if _topState < 100>>
<<if setup.hasRepairMaterial()>>
| <<link "Repair top" "Wardrobe_Player_Clothes">><<set $clothing.player.top to Math.min(100, $clothing.player.top + 50)>><<run setup.useRepairMaterial()>><</link>>
<<else>>
| <span class="disabled">Repair top (nothing to mend with)</span>
<</if>>
<</if>>
<<else>>
<<link "Put on top" "Wardrobe_Player_Clothes">><<set $clothing.player.top to 100>><</link>>
<</if>>
<h3>Bottom Actions</h3>
<<if _bottomState > 0>>
<<link "Remove bottom" "Wardrobe_Player_Clothes">><<set $clothing.player.bottom to 0>><</link>>
<<if _bottomState < 100>>
<<if setup.hasRepairMaterial()>>
| <<link "Repair bottom" "Wardrobe_Player_Clothes">><<set $clothing.player.bottom to Math.min(100, $clothing.player.bottom + 50)>><<run setup.useRepairMaterial()>><</link>>
<<else>>
| <span class="disabled">Repair bottom (nothing to mend with)</span>
<</if>>
<</if>>
<<else>>
<<link "Put on bottom" "Wardrobe_Player_Clothes">><<set $clothing.player.bottom to 100>><</link>>
<</if>>
</div>
<div class="choice-container">
<<vchoice "Back to Wardrobe" "Wardrobe_Hub" "action" "return">>
</div><h2>Select Underwear</h2>
<p>Choose what underwear to wear.</p>
<<if !$wardrobe.player.intimate || $wardrobe.player.intimate.length === 0>>
<p class="system-alert">You don't own any underwear.</p>
<<else>>
<<set _currentUnderwear to $wardrobe.player.equipped || "none">>
<<set _currentItem to ($intimateApparel && $intimateApparel.player) ? $intimateApparel.player[_currentUnderwear] : null>>
<<set _underwearFallback to {
"standard": { name: "Standard Briefs", image: "media/clothing/intimate/player/standard_v2.webp", description: "Basic underwear." },
"reinforced": { name: "Reinforced Shorts", image: "media/clothing/intimate/player/reinforced_v2.webp", description: "Extra padding." },
"tight": { name: "Tight Briefs", image: "media/clothing/intimate/player/tight_v2.webp", description: "Form-fitting." }
}>>
<h3>Available Underwear</h3>
<div class="wardrobe-card-grid">
<<if _currentUnderwear && _currentUnderwear !== "none" && _currentUnderwear !== "commando">>
<<set _currData to _currentItem || _underwearFallback[_currentUnderwear] || null>>
<<set _fallback to _underwearFallback[_currentUnderwear]>>
<<if _currData>>
<<set _currImage to (_currData.image) ? _currData.image : (_fallback ? _fallback.image : "")>>
<div class="wardrobe-card equipped">
<div class="equipped-badge">Wearing</div>
<div class="item-image">
<<if _currImage>>
<img @src="_currImage" alt="" onerror="this.style.display='none'">
<</if>>
</div>
<div class="item-name"><<= _currData.name>></div>
</div>
<</if>>
<<elseif _currentUnderwear === "commando">>
<div class="wardrobe-card equipped">
<div class="equipped-badge">Wearing</div>
<div class="item-image"><img class="item-icon" src="assets/icons/body/no-underwear.svg" alt=""></div>
<div class="item-name">Commando</div>
</div>
<</if>>
<<for _itemId range $wardrobe.player.intimate>>
<<if _itemId !== _currentUnderwear>>
<<set _itemRaw to ($intimateApparel && $intimateApparel.player) ? $intimateApparel.player[_itemId] : null>>
<<set _itemFallback to _underwearFallback[_itemId]>>
<<set _item to _itemRaw || _itemFallback || null>>
<<if _item>>
<<set _itemImage to (_item.image) ? _item.image : (_itemFallback ? _itemFallback.image : "")>>
<<capture _itemId, _item, _itemImage>>
<div class="wardrobe-card">
<div class="item-image">
<<if _itemImage>>
<img @src="_itemImage" alt="" onerror="this.style.display='none'">
<</if>>
</div>
<div class="item-name"><<= _item.name>></div>
<div class="item-meta"><<= _item.description || "">></div>
<div class="item-actions">
<<link "[Wear]">>
<<equipIntimate "player" _itemId>>
<<goto "Wardrobe_Change_Underwear">>
<</link>>
</div>
</div>
<</capture>>
<</if>>
<</if>>
<</for>>
<<if $storage && $storage.spareClothes && $storage.spareClothes.underwear && $storage.spareClothes.underwear.length > 0>>
<<for _i, _underwearId range $storage.spareClothes.underwear>>
<<capture _i, _underwearId>>
<<set _spareRaw to ($intimateApparel && $intimateApparel.player) ? $intimateApparel.player[_underwearId] : null>>
<<set _spareFB to _underwearFallback[_underwearId]>>
<<set _spareData to _spareRaw || _spareFB || null>>
<<set _spareImage to (_spareData && _spareData.image) ? _spareData.image : (_spareFB ? _spareFB.image : "")>>
<<set _spareName to (_spareData && _spareData.name) ? _spareData.name : _underwearId>>
<div class="wardrobe-card">
<div class="spare-badge">Spare</div>
<div class="item-image">
<<if _spareImage>>
<img @src="_spareImage" alt="" onerror="this.style.display='none'">
<</if>>
</div>
<div class="item-name"><<= _spareName>></div>
<div class="item-meta">from storage</div>
<div class="item-actions">
<<link "[Take & Wear]">>
<<set $clothing.player.underwear to 100>>
<<set $wardrobe.player.equipped to _underwearId>>
<<run $storage.spareClothes.underwear.splice(_i, 1)>>
<<goto "Wardrobe_Change_Underwear">>
<</link>>
</div>
</div>
<</capture>>
<</for>>
<</if>>
<div class="wardrobe-card">
<div class="item-image"><img class="item-icon" src="assets/icons/body/no-underwear.svg" alt=""></div>
<div class="item-name">Go Commando</div>
<div class="item-meta">exposed</div>
<div class="item-actions">
<<link "[Select]">>
<<equipIntimate "player" "commando">>
<<goto "Wardrobe_Change_Underwear">>
<</link>>
</div>
</div>
</div>
<</if>>
<div class="choice-container">
<<vchoice "Back to Wardrobe" "Storage_Player_Wardrobe" "action" "return">>
</div><<uinvGetEquippedArmor>>
<<uinvGetAvailableArmor>>
<h2>Select Armor</h2>
<p>Choose your protective gear.</p>
<h3>Available Armor</h3>
<div class="wardrobe-card-grid">
<<if $equippedArmor && $equippedArmorData>>
<<set _eqMax to $equippedArmorData.maxDurability || 100>>
<<set _eqDur to setup.clothingValue($equippedArmorData.durability, _eqMax)>>
<<set _eqPercent to Math.round((_eqDur / _eqMax) * 100)>>
<div class="wardrobe-card equipped">
<div class="equipped-badge">Wearing</div>
<div class="item-image">
<img @src="setup.itemImage(String($equippedArmor))" alt="" onerror="this.style.display='none'">
</div>
<div class="item-name"><<= $equippedArmorData.displayName>></div>
<div class="item-meta">DEF +<<= $equippedArmorData.defense>> | <<= _eqPercent>>%</div>
</div>
<</if>>
<<if $availableArmor.length === 0 && !$equippedArmor>>
<p class="system-info">You don't have any armor.</p>
<<else>>
<<for _armor range $availableArmor>>
<<set _durPercent to Math.round((_armor.durability / _armor.maxDurability) * 100)>>
<<capture _armor, _durPercent>>
<div class="wardrobe-card">
<div class="item-image">
<img @src="setup.itemImage(String(_armor.name))" alt="" onerror="this.style.display='none'">
</div>
<div class="item-name"><<= _armor.displayName>></div>
<div class="item-meta">DEF +<<= _armor.defense>> | <<= _durPercent>>%</div>
<div class="item-actions">
<<link "[Equip]">>
<<uinvEquipArmor _armor.name>>
<<goto "Wardrobe_Armor_Management">>
<</link>>
</div>
</div>
<</capture>>
<</for>>
<</if>>
<<if $equippedArmor>>
<div class="wardrobe-card">
<div class="item-image"><img class="item-icon" src="assets/icons/equipment/no-armor.svg" alt=""></div>
<div class="item-name">No Armor</div>
<div class="item-meta">unprotected</div>
<div class="item-actions">
<<link "[Remove]">>
<<uinvUnequipArmor>>
<<goto "Wardrobe_Armor_Management">>
<</link>>
</div>
</div>
<</if>>
</div>
<div class="choice-container">
<<vchoice "Back to Wardrobe" "Storage_Player_Wardrobe" "action" "return">>
</div><h2>Repair All Clothing and Armor</h2>
<p>Restore all your equipment to full condition.</p>
<<set _hasClothingDamage to false>>
<<set _hasArmorDamage to false>>
<<if $clothing.player.top < 100 || $clothing.player.bottom < 100>>
<<set _hasClothingDamage to true>>
<</if>>
<<if setup.armorDurability() && setup.armorDurability().current < setup.armorDurability().max>>
<<set _hasArmorDamage to true>>
<</if>>
<<if !_hasClothingDamage && !_hasArmorDamage>>
<p class="system-info">All your clothing and armor are in excellent condition. Nothing needs repair.</p>
<<else>>
<div class="repair-status">
<<if _hasClothingDamage>>
<h3>Clothing</h3>
<p>Top: <<print $clothing.player.top>>% <<icon "forward">> </p>
<<set $clothing.player.top to 100>>
<p><strong>100%</strong> <span class="clothing-state good">Repaired</span></p>
<p>Bottom: <<print $clothing.player.bottom>>% <<icon "forward">> </p>
<<set $clothing.player.bottom to 100>>
<p><strong>100%</strong> <span class="clothing-state good">Repaired</span></p>
<<set $clothing.player.dickOut to false>>
<<updateExposure "player" true>>
<</if>>
<<if _hasArmorDamage>>
<h3>Armor</h3>
<p><<print $equipped.armor.name>>: <<print setup.armorDurability().current>>/<<print setup.armorDurability().max>> <<icon "forward">> </p>
<<run setup.repairArmor(setup.armorDurability().max)>>
<p><strong><<print setup.armorDurability().max>>/<<print setup.armorDurability().max>></strong> <span class="clothing-state good">Repaired</span></p>
<</if>>
</div>
<p class="system-success">All equipment has been fully repaired.</p>
<</if>>
<div class="choice-container">
<<vchoice "Back to Wardrobe" "Wardrobe_Hub" "action" "return">>
</div><h2>Outfit Presets</h2>
<p>Save and load complete outfit combinations for quick access.</p>
<<run setup.compat.apply("saved-outfits-object")>>
<<if $savedOutfits.player.length > 0>>
<h3>Saved Outfits</h3>
<div class="outfit-grid">
<<for _i, _outfit range $savedOutfits.player>>
<<capture _i, _outfit>>
<div class="outfit-card">
<h4><<print _outfit.name>></h4>
<div class="outfit-details">
<<if _outfit.top>>
<<set _topData to $clothingDatabase.tops[_outfit.top]>>
<div class="outfit-item-row">
<<if _topData && _topData.image>><<print '<img src="' + _topData.image + '" class="clothing-thumbnail" alt="Top">'>>
<</if>>
<span><strong>Top:</strong> <<if _topData>><<= _topData.name>><<else>><<= _outfit.top>><</if>></span>
</div>
<</if>>
<<if _outfit.bottom>>
<<set _bottomData to $clothingDatabase.bottoms[_outfit.bottom]>>
<div class="outfit-item-row">
<<if _bottomData && _bottomData.image>><<print '<img src="' + _bottomData.image + '" class="clothing-thumbnail" alt="Bottom">'>>
<</if>>
<span><strong>Bottom:</strong> <<if _bottomData>><<= _bottomData.name>><<else>><<= _outfit.bottom>><</if>></span>
</div>
<</if>>
<<if _outfit.armor>>
<<set _armorId to _outfit.armor.name.toLowerCase().replace(/ /g, "_")>>
<<set _armorImage to _outfit.armor.image || "media/clothing/armor/" + _armorId + "_v2.webp">>
<div class="outfit-item-row">
<<print '<img src="' + _armorImage + '" class="clothing-thumbnail" alt="Armor">'>>
<span><strong>Armor:</strong> <<print _outfit.armor.name>></span>
</div>
<<else>>
<p><span class="disabled">No armor</span></p>
<</if>>
<<if _outfit.intimate && $intimateApparel && $intimateApparel.player && $intimateApparel.player[_outfit.intimate]>>
<<set _intimateItem to $intimateApparel.player[_outfit.intimate]>>
<div class="outfit-item-row">
<<if _intimateItem.image>><<print '<img src="' + _intimateItem.image + '" class="clothing-thumbnail" alt="Underwear">'>>
<</if>>
<span><strong>Underwear:</strong> <<print _intimateItem.name>></span>
</div>
<</if>>
<<if _outfit.description>>
<p class="outfit-desc"><em><<print _outfit.description>></em></p>
<</if>>
</div>
<div class="outfit-actions">
<<link "Load Outfit">>
<<loadOutfit "player" _i>>
<<goto "Wardrobe_Hub">>
<</link>>
<<link "Delete">>
<<run $savedOutfits.player.splice(_i, 1)>>
<<goto "Wardrobe_Outfit_Presets">>
<</link>>
</div>
</div>
<</capture>>
<</for>>
</div>
<<else>>
<p class="system-info">No saved outfits yet.</p>
<</if>>
<h3>Save Current Outfit</h3>
<div class="save-outfit-form">
<p>Create a new outfit preset from what you're currently wearing.</p>
<<link "Save Current Outfit">>
<<set _name to prompt("Outfit name:", "")>>
<<if _name && _name.trim() !== "">>
<<saveOutfit "player" _name.trim()>>
<<toast "Outfit saved successfully." "success">>
<<goto "Wardrobe_Outfit_Presets">>
<</if>>
<</link>>
</div>
<div class="choice-container">
<<vchoice "Back to Wardrobe" "Wardrobe_Hub" "action" "return">>
</div><h3>Select Your Underwear</h3>
<p>You browse through your intimate apparel options.</p>
<div class="intimate-selection">
<<for _itemId range $wardrobe.player.intimate>>
<<capture _itemId>>
<<set _item to $intimateApparel.player[_itemId]>>
<div @class="'intimate-card' + ($wardrobe.player.equipped === _itemId ? ' equipped' : '')">
<div class="intimate-header">
<strong><<print _item.name>></strong>
<<if $wardrobe.player.equipped === _itemId>>
<span class="equipped-badge">(Equipped)</span>
<</if>>
</div>
<div class="intimate-description">
<<print _item.description>>
</div>
<div class="intimate-stats">
<div class="stat-line">
<span class="stat-label">Durability:</span>
<span class="stat-value"><<print _item.durability>></span>
</div>
<<if _item.effects && Object.keys(_item.effects).length > 0>>
<div class="stat-line effects-header">Effects:</div>
<<if _item.effects.defense>>
<div class="stat-line">
<span class="stat-label">• Defense:</span>
<span class="stat-value positive"><<print "+" + _item.effects.defense>></span>
</div>
<</if>>
<<if _item.effects.lustGain>>
<div class="stat-line">
<span class="stat-label">• Lust gain:</span>
<span @class="'stat-value' + (_item.effects.lustGain > 1 ? ' negative' : ' positive')">
<<if _item.effects.lustGain > 1>>+<</if>><<print Math.round((_item.effects.lustGain - 1) * 100)>>%
</span>
</div>
<</if>>
<<if _item.effects.visibleBulge>>
<div class="stat-line">
<span class="stat-label">• Your hard cock shows through when aroused</span>
</div>
<</if>>
<<if _item.effects.exposureThreshold>>
<div class="stat-line">
<span class="stat-label">• Exposed at <<print _item.effects.exposureThreshold>>% instead of 25%</span>
</div>
<</if>>
<<else>>
<div class="stat-line">
<span class="stat-label">No special effects</span>
</div>
<</if>>
</div>
<div class="intimate-actions">
<<if $wardrobe.player.equipped !== _itemId>>
<<link "Equip">>
<<equipIntimate "player" _itemId>>
<<goto "Wardrobe_Player_Intimate">>
<</link>>
<</if>>
<<link "Details">>
<<set $temp.intimateView to {who: "player", itemId: _itemId}>>
<<goto "Intimate_Info">>
<</link>>
</div>
</div>
<</capture>>
<</for>>
</div>
<div class="choice-container">
<<vchoice "Back to wardrobe" "Vault_Hub" "action" "return">>
</div><h3>Suggest Kira's Underwear</h3>
<<getExhibTier "kira">>
<<if $companions[0].trust < 35>>
<p>You think about suggesting different underwear for Kira, but... that seems way too personal for your current relationship.</p>
<<say "thought" "She'd probably punch me if I even brought it up.">>
<div class="choice-container">
<<vchoice "Better not" "Vault_Hub" "action" "check">>
</div>
<<else>>
<p>You approach Kira about her... undergarments. This could go well or very poorly.</p>
<<say $player.name "So, uh... the vault storage has different... options. For clothing. All kinds.">>
<<if $companions[0].trust >= 60>>
<<say "Kira" "She raises an eyebrow, a slight smirk forming. \"Are you suggesting I change my underwear? Bold.\"">>
<<elseif $companions[0].trust >= 45>>
<<say "Kira" "...Okay. I'll hear you out. This better be practical.">>
<<else>>
<<say "Kira" "She narrows her eyes. \"This better not be weird.\"">>
<</if>>
<div id="kira-intimate-choices">
<div class="intimate-selection">
<<for _itemId range $wardrobe.kira.intimate>>
<<capture _itemId>>
<<set _item to $intimateApparel.kira[_itemId]>>
<div @class="'intimate-card' + ($wardrobe.kira.equipped === _itemId ? ' equipped' : '')">
<div class="intimate-header">
<strong><<print _item.name>></strong>
<<if $wardrobe.kira.equipped === _itemId>>
<span class="equipped-badge">(Currently wearing)</span>
<</if>>
</div>
<div class="intimate-description">
<<print _item.description>>
</div>
<div class="intimate-stats">
<div class="stat-line">
<span class="stat-label">Durability:</span>
<span class="stat-value"><<print _item.durability>></span>
</div>
<<if _item.requires>>
<div class="stat-line requirements-header">Requirements:</div>
<<if _item.requires.exhibitionism>>
<div class="stat-line">
<span class="stat-label">• Exhibitionism:</span>
<span @class="'stat-value' + ($exhibitionism.kira >= _item.requires.exhibitionism ? ' met' : ' unmet')">
<<print _item.requires.exhibitionism>> (Current: <<print $exhibitionism.kira>>)
</span>
</div>
<</if>>
<<if _item.requires.trust>>
<div class="stat-line">
<span class="stat-label">• Trust:</span>
<span @class="'stat-value' + ($companions[0].trust >= _item.requires.trust ? ' met' : ' unmet')">
<<print _item.requires.trust>> (Current: <<print $companions[0].trust>>)
</span>
</div>
<</if>>
<</if>>
<<if _item.effects && Object.keys(_item.effects).length > 0>>
<div class="stat-line effects-header">Effects:</div>
<<if _item.effects.defense>>
<div class="stat-line">
<span class="stat-label">• Defense:</span>
<span class="stat-value positive"><<print "+" + _item.effects.defense>></span>
</div>
<</if>>
<<if _item.effects.mobility>>
<div class="stat-line">
<span class="stat-label">• Mobility:</span>
<span class="stat-value positive"><<print "+" + Math.round((_item.effects.mobility - 1) * 100)>>%</span>
</div>
<</if>>
<<if _item.effects.seduction>>
<div class="stat-line">
<span class="stat-label">• Seduction:</span>
<span class="stat-value positive"><<print "+" + Math.round((_item.effects.seduction - 1) * 100)>>%</span>
</div>
<</if>>
<<if _item.effects.tensionGain>>
<div class="stat-line">
<span class="stat-label">• Tension gain:</span>
<span class="stat-value negative"><<print "+" + Math.round((_item.effects.tensionGain - 1) * 100)>>%</span>
</div>
<</if>>
<<if _item.effects.tensionWhenSeen>>
<div class="stat-line">
<span class="stat-label">• <<print "+" + _item.effects.tensionWhenSeen>> tension when you see it</span>
</div>
<</if>>
<<if _item.effects.accessible>>
<div class="stat-line">
<span class="stat-label">• Strategically accessible</span>
</div>
<</if>>
<<if _item.effects.seeThrough>>
<div class="stat-line">
<span class="stat-label">• See-through effect</span>
</div>
<</if>>
<<if _item.effects.exposureThreshold>>
<div class="stat-line">
<span class="stat-label">• Exposed at <<print _item.effects.exposureThreshold>>% instead of 25%</span>
</div>
<</if>>
<</if>>
</div>
<div class="intimate-actions">
<<if $wardrobe.kira.equipped !== _itemId>>
<<set _canEquip to true>>
<<set _whyNot to "">>
<<if _item.requires>>
<<if _item.requires.exhibitionism && $exhibitionism.kira < _item.requires.exhibitionism>>
<<set _canEquip to false>>
<<set _whyNot to "Not comfortable enough yet">>
<</if>>
<<if _item.requires.trust && $companions[0].trust < _item.requires.trust>>
<<set _canEquip to false>>
<<set _whyNot to "Not enough trust">>
<</if>>
<</if>>
<<if _canEquip>>
<<link "Suggest this">>
<<set $temp.suggestedIntimate to _itemId>>
<<goto "Wardrobe_Kira_Intimate_React">>
<</link>>
<<else>>
<span class="disabled-link" title="_whyNot">Unavailable</span>
<</if>>
<</if>>
<<link "Details">>
<<set $temp.intimateView to {who: "kira", itemId: _itemId}>>
<<goto "Intimate_Info">>
<</link>>
</div>
</div>
<</capture>>
<</for>>
</div>
<div class="intimate-choice-alt">
<p>Or...</p>
<<link "Let her choose">>
<<replace "#kira-intimate-choices">>
<<say $player.name "Actually, you know what? Your call. Wear what you're comfortable with.">>
<<kiraChoosesOwnClothes>>
<<relationChange "kira" "trust" 1>>
<div class="choice-container">
<<vchoice "Continue" "Vault_Hub" "action" "forward">>
</div>
<</replace>>
<</link>>
</div>
<div class="choice-container">
<<vchoice "Never mind" "Vault_Hub" "action" "check">>
</div>
</div>
<</if>><<set _itemId to $temp.suggestedIntimate>>
<<set _item to $intimateApparel.kira[_itemId]>>
<<getExhibTier "kira">>
<h3>Kira's Response</h3>
<<say $player.name "Maybe... the <<print _item.name.toLowerCase()>>?">>
<<switch _itemId>>
<<case "standard">>
<<say "Kira" "The basic set? Sure, practical. Nothing wrong with that.">>
<p>She seems satisfied with the practical choice.</p>
<<equipIntimate "kira" "standard">>
<<addTrust "kira" 1>>
<<case "sports">>
<<say "Kira" "The sports wrap? Good call. Better support for combat.">>
<p>She approves of the functional choice.</p>
<<equipIntimate "kira" "sports">>
<<addTrust "kira" 1>>
<<case "reinforced">>
<<say "Kira" "Reinforced? Very practical. Not pretty, but we're surviving, not modeling.">>
<p>She appreciates the tactical thinking.</p>
<<equipIntimate "kira" "reinforced">>
<<addTrust "kira" 2>>
<<case "lingerie">>
<<if _exhibTier >= 3>>
<<say "Kira" "She picks up the delicate lace, examining it. \"Feeling bold, are we?\"">>
<p>A slow smile crosses her face.</p>
<<say "Kira" "Fine. But you owe me.">>
<<equipIntimate "kira" "lingerie">>
<<addTension "kira" 10>>
<<set $companions[0].affection += 2>>
<<clampStat "player.lust" 5>>
<<elseif _exhibTier >= 2>>
<<say "Kira" "She hesitates, fingers brushing the silk. \"That's... pretty forward.\"">>
<p>A long pause. Then she nods.</p>
<<say "Kira" "...Okay. But only because you asked.">>
<<equipIntimate "kira" "lingerie">>
<<addTension "kira" 5>>
<<set $companions[0].affection += 1>>
<<else>>
<<say "Kira" "\"That's...\" Her face reddens. \"I'm not... not yet. Okay?\"">>
<p>Too much, too soon.</p>
<<set $companions[0].trust -= 2>>
<</if>>
<<case "cutaway">>
<<if _exhibTier >= 4>>
<<say "Kira" "She picks up the cutaway set, examining the strategic openings. \"Oh, you want easy access?\"">>
<p>She laughs, but there's heat in her eyes.</p>
<<say "Kira" "I can do that.">>
<<equipIntimate "kira" "cutaway">>
<<addTension "kira" 15>>
<<addAffection "kira" 1>>
<<clampStat "player.lust" 10>>
<<elseif _exhibTier >= 2>>
<<say "Kira" "\"That's...\" She bites her lip, studying the accessible design. \"Pretty forward.\"">>
<p>A pause. She's considering it.</p>
<<say "Kira" "...Okay.">>
<<equipIntimate "kira" "cutaway">>
<<addTension "kira" 10>>
<<set $companions[0].affection += 1>>
<<else>>
<<say "Kira" "\"Absolutely not.\" Her voice is firm, but she's blushing.">>
<p>Not ready for that level of intimacy.</p>
<<set $companions[0].trust -= 1>>
<</if>>
<<case "commando">>
<<if _exhibTier >= 5>>
<<say "Kira" "Her eyes widen slightly. Then she smirks. \"I was hoping you'd ask.\"">>
<p>She starts removing her underwear right there, maintaining eye contact.</p>
<<say "Kira" "There. Happy?">>
<<equipIntimate "kira" "commando">>
<<addTension "kira" 20>>
<<addAffection "kira" 1>>
<<clampStat "player.lust" 15>>
<<elseif _exhibTier >= 4>>
<<say "Kira" "She hesitates, then nods slowly. \"...Okay. This is new.\"">>
<p>She turns away to change, but you notice the flush on her neck.</p>
<<equipIntimate "kira" "commando">>
<<addTension "kira" 15>>
<<set $companions[0].affection += 2>>
<<else>>
<<say "Kira" "I'm not there yet. Sorry.">>
<p>Too far beyond her comfort zone.</p>
<<set $companions[0].trust -= 2>>
<</if>>
<<case "sheer">>
<<if _exhibTier >= 3>>
<<say "Kira" "She holds up the sheer fabric. \"See-through, huh?\"">>
<p>A slow smile spreads across her face.</p>
<<say "Kira" "Why not.">>
<<equipIntimate "kira" "sheer">>
<<addTension "kira" 8>>
<<set $companions[0].affection += 2>>
<<clampStat "player.lust" 5>>
<<elseif _exhibTier >= 2>>
<<say "Kira" "\"That's pretty revealing...\" She examines it. \"But... okay.\"">>
<<equipIntimate "kira" "sheer">>
<<addTension "kira" 5>>
<<else>>
<<say "Kira" "That's way too revealing. No.">>
<<set $companions[0].trust -= 1>>
<</if>>
<</switch>>
<div class="choice-container">
<<vchoice "Continue" "Vault_Hub" "action" "map">>
</div><<set _who to $temp.intimateView.who>>
<<set _itemId to $temp.intimateView.itemId>>
<<if _who === "player">>
<<set _item to $intimateApparel.player[_itemId]>>
<h3><<print _item.name>> (Player)</h3>
<<else>>
<<set _item to $intimateApparel.kira[_itemId]>>
<h3><<print _item.name>> (Kira)</h3>
<</if>>
<div class="intimate-detail-view">
<div class="intimate-image-placeholder">
[Item visual representation would go here]
</div>
<div class="intimate-full-description">
<p><<print _item.description>></p>
</div>
<div class="intimate-stats-detailed">
<h4>Statistics</h4>
<div class="stat-block">
<div class="stat-line">
<span class="stat-label">Base Durability:</span>
<span class="stat-value"><<print _item.durability>></span>
</div>
</div>
<<if _item.requires>>
<h4>Requirements</h4>
<div class="stat-block">
<<if _item.requires.exhibitionism>>
<div class="stat-line">
<span class="stat-label">Exhibitionism:</span>
<span class="stat-value"><<print _item.requires.exhibitionism>>+</span>
</div>
<</if>>
<<if _item.requires.trust>>
<div class="stat-line">
<span class="stat-label">Trust:</span>
<span class="stat-value"><<print _item.requires.trust>>+</span>
</div>
<</if>>
</div>
<</if>>
<<if _item.effects && Object.keys(_item.effects).length > 0>>
<h4>Special Effects</h4>
<div class="stat-block">
<<if _item.effects.defense>>
<div class="stat-line">
<span class="stat-label">Defense Bonus:</span>
<span class="stat-value positive"><<print "+" + _item.effects.defense>></span>
</div>
<p class="effect-explanation">Provides additional protection in combat.</p>
<</if>>
<<if _item.effects.mobility>>
<div class="stat-line">
<span class="stat-label">Mobility Bonus:</span>
<span class="stat-value positive"><<print "+" + Math.round((_item.effects.mobility - 1) * 100)>>%</span>
</div>
<p class="effect-explanation">Improves movement and agility in combat.</p>
<</if>>
<<if _item.effects.seduction>>
<div class="stat-line">
<span class="stat-label">Seduction Bonus:</span>
<span class="stat-value positive"><<print "+" + Math.round((_item.effects.seduction - 1) * 100)>>%</span>
</div>
<p class="effect-explanation">Increases effectiveness of seduction attempts.</p>
<</if>>
<<if _item.effects.lustGain>>
<div class="stat-line">
<span class="stat-label">Lust Gain Modifier:</span>
<span @class="'stat-value' + (_item.effects.lustGain > 1 ? ' negative' : ' positive')">
<<if _item.effects.lustGain > 1>>+<</if>><<print Math.round((_item.effects.lustGain - 1) * 100)>>%
</span>
</div>
<p class="effect-explanation">
<<if _item.effects.lustGain > 1>>
Increases lust buildup from friction and arousal.
<<else>>
Reduces lust buildup.
<</if>>
</p>
<</if>>
<<if _item.effects.tensionGain>>
<div class="stat-line">
<span class="stat-label">Tension Gain:</span>
<span class="stat-value negative"><<print "+" + Math.round((_item.effects.tensionGain - 1) * 100)>>%</span>
</div>
<p class="effect-explanation">Increases constant tension while worn.</p>
<</if>>
<<if _item.effects.tensionWhenSeen>>
<div class="stat-line">
<span class="stat-label">Tension When Seen:</span>
<span class="stat-value"><<print "+" + _item.effects.tensionWhenSeen>></span>
</div>
<p class="effect-explanation">Kira gains tension when you see her wearing this.</p>
<</if>>
<<if _item.effects.visibleBulge>>
<div class="stat-line">
<span class="stat-label">Hard Cock Shows</span>
</div>
<p class="effect-explanation">Kira will notice when you're aroused. May trigger reactions.</p>
<</if>>
<<if _item.effects.accessible>>
<div class="stat-line">
<span class="stat-label">Strategically Accessible</span>
</div>
<p class="effect-explanation">Certain intimate acts don't require removing this item.</p>
<</if>>
<<if _item.effects.seeThrough>>
<div class="stat-line">
<span class="stat-label">See-Through</span>
</div>
<p class="effect-explanation">Provides social effects of exposure without actual exposure. Very noticeable when wet.</p>
<</if>>
<<if _item.effects.exposureThreshold>>
<div class="stat-line">
<span class="stat-label">Early Exposure</span>
</div>
<p class="effect-explanation">You become exposed when clothing reaches <<print _item.effects.exposureThreshold>>% durability instead of the normal 25%.</p>
<</if>>
</div>
<<else>>
<h4>Special Effects</h4>
<div class="stat-block">
<p class="effect-explanation">No special effects. Basic protection only.</p>
</div>
<</if>>
</div>
<<if _who === "player" && $wardrobe.player.equipped === _itemId>>
<p class="currently-equipped">Currently equipped</p>
<<elseif _who === "kira" && $wardrobe.kira.equipped === _itemId>>
<p class="currently-equipped">Kira is currently wearing this</p>
<</if>>
</div>
<<if _who === "player">>
<div class="choice-container">
<<vchoice "Back" "Wardrobe_Player_Intimate" "action" "return">>
</div>
<<else>>
<div class="choice-container">
<<vchoice "Back" "Wardrobe_Kira_Intimate" "action" "return">>
</div>
<</if>><<widget "kiraReactsToClothingDamage">>
<<getExhibTier "kira">>
<<if $flags.newArmorEquipped>>
<<switch _exhibTier>>
<<case 0 1>>
<<say "Kira" "Smart. That'll keep you safer.">>
<<case 2 3>>
<<say "Kira" "Wearing armor? Expecting trouble?">>
<<case 4 5>>
<<say "Kira" "Armor, huh? Shame to hide that body...">>
<</switch>>
<<set $flags.newArmorEquipped to false>>
<</if>>
<<set _topState to "">>
<<set _bottomState to "">>
<<if $clothing.player.top > 75>>
<<set _topState to "good">>
<<elseif $clothing.player.top > 50>>
<<set _topState to "worn">>
<<elseif $clothing.player.top > 25>>
<<set _topState to "ripped">>
<<elseif $clothing.player.top > 0>>
<<set _topState to "ruined">>
<<else>>
<<set _topState to "gone">>
<</if>>
<<if $clothing.player.bottom > 75>>
<<set _bottomState to "good">>
<<elseif $clothing.player.bottom > 50>>
<<set _bottomState to "worn">>
<<elseif $clothing.player.bottom > 25>>
<<set _bottomState to "ripped">>
<<elseif $clothing.player.bottom > 0>>
<<set _bottomState to "ruined">>
<<else>>
<<set _bottomState to "gone">>
<</if>>
<<set _reactions to []>>
<<if _topState === "good" && _bottomState === "good">>
<<if _exhibTier >= 4>>
<<set _reactions to [
"Kira's eyes linger on you for just a moment longer than necessary.",
"She appreciates the view, even when you're fully clothed.",
"\"You clean up okay,\" Kira says offhandedly."
]>>
<<else>>
<<set _reactions to [
"Kira nods approvingly. You look presentable.",
"\"At least you're not falling apart,\" she comments.",
"She barely glances your way. Everything's in order."
]>>
<</if>>
<<elseif (_topState === "worn" || _bottomState === "worn")>>
<<if _exhibTier >= 3>>
<<set _reactions to [
"Kira's gaze traces the worn fabric, a slight smirk on her face.",
"\"Rough day?\" She sounds amused more than concerned.",
"She watches how the loose fabric shifts against your skin."
]>>
<<else>>
<<set _reactions to [
"\"You could use a change of clothes,\" Kira says.",
"She glances at the frayed edges with mild concern.",
"\"That's not going to last much longer,\" she observes."
]>>
<</if>>
<<elseif (_topState === "ripped" || _bottomState === "ripped")>>
<<if _exhibTier >= 4>>
<<set _reactions to [
"Kira's eyes drop to the tears in your clothing, lingering on the exposed skin. \"So that happened,\" she says, voice lower.",
"She stares openly at what's visible through the tears. \"Not complaining,\" she adds with a slight smile.",
"\"Nice look on you,\" Kira murmurs, her gaze unblinking. \"Suits you.\"",
"She takes a step closer, watching the gaps in your torn clothing with clear interest."
]>>
<<elseif _exhibTier >= 2>>
<<set _reactions to [
"Kira's eyes flick to the tears in your clothes, then quickly back to your face. She's blushing slightly.",
"\"You're... pretty torn up,\" she says quietly, not quite meeting your eyes.",
"She notices the rips immediately and looks away, embarrassed.",
"Kira keeps stealing glances at the exposed skin, caught between looking away and looking."
]>>
<<else>>
<<set _reactions to [
"\"What happened to your clothes?\" Kira looks concerned and flustered.",
"She's definitely noticing what's showing. Her face is red.",
"\"Maybe you should... I mean, that's a lot of showing,\" she stammers.",
"Kira turns away, but keeps glancing back, worried and flustered."
]>>
<</if>>
<<elseif (_topState === "ruined" || _bottomState === "ruined")>>
<<if _exhibTier >= 4>>
<<set _reactions to [
"Kira's pupils dilate as she takes in just how much of you is barely covered. \"Holy shit,\" she breathes.",
"She's not even pretending not to stare anymore. Her breathing has gotten heavier.",
"\"You're barely holding it together,\" Kira says, voice thick. She's aroused and not hiding it.",
"She reaches out slightly, drawn toward the gaps in your ruined clothing, before catching herself."
]>>
<<elseif _exhibTier >= 2>>
<<set _reactions to [
"Kira's face is completely red. She can barely look at you without shaking.",
"\"That's... you need to change. Now,\" she says breathlessly, flustered and overwhelmed.",
"She's trying very hard not to look at all the exposed skin. She's failing.",
"\"I can't— you need to cover up,\" Kira says, her voice strained."
]>>
<<else>>
<<set _reactions to [
"\"Oh my god, put clothes on!\" Kira covers her eyes with her hand.",
"She turns away completely, trembling slightly. \"This is too much.\"",
"\"You can't be like that! Someone could see!\" She's panicking slightly.",
"Kira's whole body is shaking. She can't handle how exposed you are."
]>>
<</if>>
<<elseif _topState === "gone" || _bottomState === "gone">>
<<if _exhibTier >= 4>>
<<set _reactions to [
"Kira's breath catches. Her eyes are fixed on you, hungry. \"Fuck,\" she whispers.",
"She's staring unabashedly at your exposed body. Her hand trembles slightly.",
"\"You're... completely exposed,\" Kira says slowly, eyes dark with desire.",
"She steps closer, unable to look away. Her exhibitionism feeds off yours. Her tension spikes.",
"<<clampStat \"companions[0].tension\" 15>>"
]>>
<<elseif _exhibTier >= 2>>
<<set _reactions to [
"Kira can't form words. Her face is crimson, her body rigid.",
"\"You— that's— you're completely—\" She can't even finish. She's shaking.",
"She covers her face with her hands, peeking through her fingers. Too embarrassed to look away.",
"\"This is insane,\" Kira gasps, flustered beyond coherence.",
"<<clampStat \"companions[0].tension\" 10>>"
]>>
<<else>>
<<set _reactions to [
"Kira screams and covers her eyes. \"WHAT THE FUCK!\"",
"\"Clothes! NOW!\" She's hysteria mixed with genuine distress.",
"She spins away, trembling, unable to process what she's seeing.",
"\"I can't— you can't— oh my god, this is—\" Kira is nearly incoherent.",
"<<clampStat \"companions[0].tension\" 20>>"
]>>
<</if>>
<</if>>
<<if $clothing.player.top <= 0 && !$clothing.player.dickExposed>>
<<getExhibTier "kira">>
<<if _exhibTier <= 1>>
<<say "Kira" "You're... you should put a shirt on.">>
<<elseif _exhibTier === 2>>
<<say "Kira" "Showing off?">> Her eyes linger.
<<elseif _exhibTier >= 3>>
<<say "Kira" "I like the view.">>
<<addTension "kira" 5>>
<</if>>
<</if>>
<<if $clothing.player.underwearType === "tight" && $player.lust >= 60 && !$clothing.player.dickExposed>>
<<getExhibTier "kira">>
<<if _exhibTier <= 1>>
<<say "Kira" "Are you... is that...?">> She looks away quickly.
<<elseif _exhibTier === 2>>
Her eyes drop. "I can see you're... enjoying something."
<<addTension "kira" 3>>
<<elseif _exhibTier >= 3>>
<<say "Kira" "Someone's excited.">> She doesn't look away.
<<clampStat "companions[0].lust" 5>>
<</if>>
<</if>>
<<if _reactions.length > 0>>
<p class="kira-reaction"><<print _reactions.random()>></p>
<</if>>
<</widget>>
<<widget "kiraReactsToOwnClothing">>
<<getExhibTier "kira">>
<<set _topState to "">>
<<set _exposure to "">>
<<if $clothing.kira.top > 75>>
<<set _topState to "good">>
<<elseif $clothing.kira.top > 50>>
<<set _topState to "worn">>
<<elseif $clothing.kira.top > 25>>
<<set _topState to "ripped">>
<<elseif $clothing.kira.top > 0>>
<<set _topState to "ruined">>
<<else>>
<<set _topState to "gone">>
<</if>>
<<if $clothing.kira.titsExposed>>
<<set _exposure to "tits">>
<<elseif $clothing.kira.pussyExposed>>
<<set _exposure to "pussy">>
<<elseif $clothing.kira.assExposed>>
<<set _exposure to "ass">>
<<else>>
<<set _exposure to "none">>
<</if>>
<<set _reactions to []>>
<<if _topState === "good">>
<<set _reactions to [
"Kira adjusts her top. Everything's in order.",
"She checks herself quickly. No problems there.",
"Kira glances down briefly, satisfied. Clothes are fine."
]>>
<<elseif _topState === "worn">>
<<if _exhibTier <= 1>>
<<set _reactions to [
"Kira tugs at the worn fabric nervously, trying to keep things covered.",
"She pulls her top closer, checking for tears. Getting anxious.",
"\"This is wearing thin,\" she mutters, pulling the fabric tighter.",
"She's holding her top, worried it's going to fall apart."
]>>
<<elseif _exhibTier >= 3>>
<<set _reactions to [
"Kira glances down at her worn top, unbothered.",
"\"It's holding,\" she says casually, not concerned about the wear.",
"She adjusts it absently, not particularly worried.",
"Kira doesn't seem bothered by the visible wear on her clothes."
]>>
<<else>>
<<set _reactions to [
"Kira tugs at the worn places with some concern.",
"\"Definitely seen better days,\" she mutters.",
"She checks the fabric, hoping it lasts a bit longer."
]>>
<</if>>
<<elseif _topState === "ripped">>
<<if _exhibTier <= 1>>
<<set _reactions to [
"Kira's face turns red. She immediately crosses her arms over her torn top.",
"\"No no no no...\" She's frantically trying to cover the tears.",
"She can see her own skin through the rips. She's humiliated.",
"Kira hunches forward, desperately trying to hide the damage.",
"Her hands shake as she tries to hold the ripped fabric together."
]>>
<<elseif _exhibTier === 2>>
<<set _reactions to [
"Kira glances down at the tear, face flushing. \"Fuck,\" she mutters.",
"She tries to hold the torn fabric together, clearly uncomfortable.",
"\"I need to fix this,\" she says quietly, looking away.",
"She angles her body away from you, one arm across the tear.",
"Kira's free hand hovers near the tear, unsure what to do."
]>>
<<elseif _exhibTier === 3>>
<<set _reactions to [
"Kira acknowledges the tear with a sigh. \"Great.\"",
"She holds her arm loosely over the torn spot. Not ideal.",
"\"Guess I'll be getting fixed soon,\" she says matter-of-factly.",
"She's not happy about the tear, but she can function."
]>>
<<elseif _exhibTier === 4>>
<<set _reactions to [
"Kira glances at the tear and shrugs. \"Adds character.\"",
"She doesn't bother covering the torn spot.",
"\"Could be worse,\" she says casually.",
"She adjusts the torn fabric absently, not particularly concerned."
]>>
<<else>>
<<set _reactions to [
"Kira deliberately doesn't cover the tear, almost showcasing it.",
"She runs her finger along the edge of the tear, a slight smile on her face.",
"\"Makes it easy to see what's underneath,\" she says, voice low.",
"She adjusts the tear to show more, not less."
]>>
<</if>>
<<elseif _topState === "ruined">>
<<if _exhibTier <= 1>>
<<set _reactions to [
"Kira's entire body is shaking. Her top is barely functional.",
"\"Oh god, oh god...\" She's trying to hold it together with both hands.",
"She won't meet your eyes. The humiliation is overwhelming.",
"Her hands frantically try to keep the ruined fabric covering her.",
"She looks like she might cry from the embarrassment."
]>>
<<elseif _exhibTier === 2>>
<<set _reactions to [
"\"This is... I need new clothes now,\" Kira says breathlessly.",
"She's holding her ruined top together with both hands, face scarlet.",
"\"Don't look at me,\" she says, her voice shaky.",
"She's trying very hard to keep covered, barely managing it.",
"\"Please tell me we have spare clothes,\" she pleads quietly."
]>>
<<elseif _exhibTier === 3>>
<<set _reactions to [
"Kira sighs heavily. \"Okay, this definitely needs replacing.\"",
"She holds the ruined top in place, clearly uncomfortable but functional.",
"\"Not ideal,\" she mutters, one hand keeping everything covered.",
"\"I'll find something else to wear,\" she says without panic."
]>>
<<elseif _exhibTier === 4>>
<<set _reactions to [
"Kira looks at her ruined top with amusement. \"Well, that's done.\"",
"She barely bothers holding it. It's falling off anyway.",
"\"Might as well just take it off,\" she says casually.",
"She doesn't seem bothered by how much of her is exposed.",
"<<set $clothing.kira.top to 0>>"
]>>
<<else>>
<<set _reactions to [
"Kira deliberately lets the ruined top fall away completely.",
"\"Finally an excuse,\" she says, her eyes dark with excitement.",
"She removes the ruined fabric, fully exposing herself, and doesn't care.",
"\"Much better,\" she breathes, clearly enjoying the exposure.",
"<<set $clothing.kira.top to 0>>"
]>>
<</if>>
<<elseif _topState === "gone">>
<<if _exhibTier <= 1>>
<<set _reactions to [
"Kira's hands clamp over her exposed chest, face completely crimson.",
"She's crouching, trying to make herself smaller, shaking violently.",
"\"This isn't happening. This is NOT happening,\" she gasps.",
"She can barely breathe from the overwhelming embarrassment.",
"Her eyes are squeezed shut. She can't even look at you."
]>>
<<elseif _exhibTier === 2>>
<<set _reactions to [
"Kira's hands are locked over her breasts, face burning.",
"\"Don't look! Please just... don't look,\" she says desperately.",
"She's standing rigidly, barely breathing, completely exposed.",
"\"I need clothes. NOW,\" she demands through gritted teeth.",
"\"This is... I can't... oh god...\" She can't form coherent sentences."
]>>
<<elseif _exhibTier === 3>>
<<set _reactions to [
"Kira keeps one hand positioned to provide minimal cover.",
"\"This is going to take some getting used to,\" she says quietly.",
"She's aware of her exposure but trying to manage it.",
"\"Where are the spare clothes?\" she asks, with only mild panic.",
"She's self-conscious but functional."
]>>
<<elseif _exhibTier === 4>>
<<set _reactions to [
"Kira doesn't bother covering her exposed chest.",
"\"Well, that happened,\" she says casually, looking down at herself.",
"She stretches, completely unbothered by her full exposure.",
"\"At least the view is nice,\" she says with a slight smirk.",
"She stands naturally, fully aware and unbothered."
]>>
<<else>>
<<set _reactions to [
"Kira's exposed breasts rise and fall as her breathing deepens.",
"\"This is... actually kind of exciting,\" she admits, voice low.",
"She doesn't cover herself. She stretches, displaying herself deliberately.",
"\"You like what you see?\" she asks, confidence radiating from her.",
"Her nipples are hard. She wants you to notice.",
"<<clampStat \"companions[0].tension\" 10>>"
]>>
<</if>>
<</if>>
<<if _reactions.length > 0>>
<<set _kiraClothingReactionText to _reactions.random()>>
<<set $tempKiraClothingReaction to _kiraClothingReactionText>>
<<if !$combat || !$combat.active || !$combat.useCardUI>>
<p class="kira-own-reaction"><<print _kiraClothingReactionText>></p>
<</if>>
<<else>>
<<set $tempKiraClothingReaction to "">>
<</if>>
<</widget>>
<<widget "groundskeeperReactsToExposure">>
<<getExhibTier "player">>
<<set _playerExposed to ($clothing.player.dickExposed || $clothing.player.assExposed)>>
<<set _currentLocation to _args[0] || "vault">>
<<if !_playerExposed>>
<<set _reaction to "The Groundskeeper nods approvingly. You're appropriately dressed.">>
<<elseif _exhibTier <= 2>>
<<switch _currentLocation>>
<<case "vault">>
<<set _reaction to "The Groundskeeper's expression grows stern. \"You cannot walk around the vault in that state. There are standards. I will fetch appropriate clothing from storage.\"">>
<<case "commons">>
<<set _reaction to "\"Absolutely not. Not in the Commons. Too many residents. You will return to your quarters immediately or change into proper attire.\"">>
<<case "vault">>
<<set _reaction to "The Groundskeeper steps forward, blocking your path. \"Clothing. Now. I will not have residents exposed in shared spaces.\"">>
<</switch>>
<<elseif _exhibTier <= 3>>
<<switch _currentLocation>>
<<case "vault">>
<<set _reaction to "The Groundskeeper gives you a long, disapproving look. \"While I would prefer you were more... covered... I cannot compel you. This is a vault, not a prison.\"">>
<<case "commons">>
<<set _reaction to "\"I must advise against displaying yourself in the Commons. Other residents may have... reactions.\" He says it with barely concealed disapproval.">>
<</switch>>
<<else>>
<<set _reaction to "The Groundskeeper observes your exposed state with clinical detachment. \"Your choices are your own. I trust your judgment.\"">>
<</if>>
<<if _reaction>>
<p class="groundskeeper-reaction"><<say "Groundskeeper" "<<print _reaction>>">></p>
<</if>>
<</widget>>
<<widget "kiraCommentOnSpecificExposure">>
<<set _part to _args[0]>>
<<getExhibTier "kira">>
<<set _reactions to []>>
<<switch _part>>
<<case "tits">>
<<if _exhibTier === 0>>
<<set _reactions to [
"Kira clamps her arms over her chest, face burning red.",
"She hunches forward, desperately trying to hide herself.",
"Her hands shake as she tries to cover her exposed breasts."
]>>
<<elseif _exhibTier === 1>>
<<set _reactions to [
"Kira crosses her arms over her chest, cheeks pink.",
"She keeps glancing down, adjusting what's left of her top.",
"She angles her body away from you, but can't cover everything."
]>>
<<elseif _exhibTier === 2>>
<<set _reactions to [
"She sighs, not bothering to fully cover up.",
"Kira shrugs slightly. \"Not like you haven't seen them.\"",
"She holds her arms loosely across her chest — more habit than hiding."
]>>
<<elseif _exhibTier === 3>>
<<set _reactions to [
"Kira doesn't bother covering up.",
"She catches you looking. Doesn't say anything.",
"Her exposed chest rises and falls steadily. She's gotten used to this."
]>>
<<elseif _exhibTier === 4>>
<<set _reactions to [
"Kira stretches, making no effort to hide anything.",
"She notices your gaze. Smirks slightly.",
"\"Eyes up here. Or don't. I don't care anymore.\""
]>>
<<else>>
<<set _reactions to [
"She arches her back deliberately. Knows exactly what she's doing.",
"\"Like what you see?\" She doesn't wait for an answer.",
"Kira adjusts her ruined top to show MORE, not less."
]>>
<</if>>
<<case "pussy">>
<<if _exhibTier === 0>>
<<set _reactions to [
"Kira's hands fly between her legs, face scarlet.",
"She crouches, thighs pressed together, shaking.",
"\"Oh god, oh god...\" She can barely breathe from embarrassment."
]>>
<<elseif _exhibTier === 1>>
<<set _reactions to [
"She presses her thighs together tightly, hand covering herself.",
"\"Don't— just don't look, okay?\"",
"Her face burns as she tries to find something to cover with."
]>>
<<elseif _exhibTier === 2>>
<<set _reactions to [
"She keeps one hand casually positioned, not quite covering.",
"\"I really need to find some pants,\" she mutters.",
"She's aware of her exposure but not panicking about it."
]>>
<<elseif _exhibTier === 3>>
<<set _reactions to [
"She doesn't bother trying to hide anymore.",
"\"At this point, modesty seems pointless.\"",
"She walks naturally, apparently unbothered."
]>>
<<elseif _exhibTier === 4>>
<<set _reactions to [
"She spreads her stance slightly when she catches you looking.",
"\"Getting a good look?\" Her voice is teasing.",
"She runs a hand down her stomach, drawing your eye lower."
]>>
<<else>>
<<set _reactions to [
"She shifts her hips, giving you a better angle.",
"\"I know you want to touch. Just ask.\"",
"Her pussy is wet and her nipples are hard. She wants you to see it."
]>>
<</if>>
<<case "ass">>
<<if _exhibTier === 0>>
<<set _reactions to [
"Kira tries to cover her ass with her hands, completely mortified.",
"She turns away, hands clamped over her exposed backside.",
"\"Don't look!\" She's panicked and embarrassed."
]>>
<<elseif _exhibTier <= 2>>
<<set _reactions to [
"Kira tugs her ruined pants up, flustered.",
"She angles away from you, self-conscious.",
"\"Could you not stare?\" she says quietly."
]>>
<<elseif _exhibTier <= 3>>
<<set _reactions to [
"Kira doesn't bother pulling her pants up.",
"\"You've seen worse,\" she says offhandedly.",
"She stretches casually, not hiding her exposed ass."
]>>
<<else>>
<<set _reactions to [
"She deliberately stretches, showing off her exposed backside.",
"\"Getting an eyeful?\" she asks with amusement.",
"She shifts her hips, fully aware of what's on display."
]>>
<</if>>
<</switch>>
<<if _reactions.length > 0>>
<p class="kira-exposure-reaction"><<print _reactions.random()>></p>
<</if>>
<</widget>>
<<widget "playerExposedDickReaction">>
<<getExhibTier "player">>
<<set _reactions = {
mortified: [
"You cup yourself desperately, face burning.",
"Your hands aren't big enough to hide everything.",
"Every instinct screams to find cover. There is none.",
"You're frozen, exposed and helpless.",
"Your enemy's eyes drop to your cock and stay there. You want the ground to swallow you."
],
embarrassed: [
"You cover yourself with one hand, cheeks red.",
"You're very aware of how exposed you are.",
"You turn side-on to hide your cock. It swings free anyway.",
"Your face burns. Your cock is out, in the middle of a fight."
],
uncomfortable: [
"You cup yourself loosely. It's something.",
"Not ideal, but you can function like this.",
"It's awkward, but manageable.",
"Your cock swings with every step. You fight on anyway."
],
tolerant: [
"You've stopped bothering to cover.",
"You walk normally, exposed but unbothered.",
"It is what it is.",
"Cock out, blade up. You've got bigger problems than modesty."
],
shameless: [
"You stretch, not hiding anything.",
"\"Enjoying the view?\" you ask casually.",
"Let them look. Your cock hangs out and you don't give a damn.",
"You're half-hard and you don't care who sees it."
],
exhibitionist: [
"You're fully hard now, and you want them to see it.",
"You square up, cock jutting out. Let them get a good look.",
"You stroke yourself once, slowly, right in front of your enemy."
]
}>>
<<set _withKira = {
mortified: [
"You can't meet Kira's eyes. She's definitely looking."
],
embarrassed: [
"You try to angle away from Kira. Doesn't really work.",
"\"Sorry, I— this is—\" You can't finish the sentence.",
"You catch Kira glancing. She looks away quickly. Mostly."
],
uncomfortable: [
"\"We should probably find me some pants.\"",
"You notice Kira noticing. Pretend you don't."
],
tolerant: [
"Kira's seen it all by now anyway.",
"When Kira looks, you just shrug."
],
shameless: [
"You catch Kira staring. Let her.",
"If she's going to look, might as well give her something to see.",
"You're half-hard. You don't care if she notices."
],
exhibitionist: [
"You're fully hard now. You want her to see.",
"You shift your stance, giving her a better look.",
"\"You can touch it if you want.\"",
"Her eyes on you feels good. Really good.",
"You stroke yourself once, slowly. She's watching."
]
}>>
<<set _pedrLines to _reactions[_exhibName] || []>>
<<if setup.kiraWithYou() && _withKira[_exhibName]>>
<<set _pedrLines to _pedrLines.concat(_withKira[_exhibName])>>
<</if>>
<<print _pedrLines.random()>>
<</widget>>
<<widget "kiraReactsToClothingStyle">>
<<uinvGetWornClothing "top" "player">>
<<set _equippedTop to $wornItem>>
<<set _topStyle to "">>
<<if _equippedTop>>
<<set _topDbKey to _equippedTop.replace(/ /g, "_")>>
<<if $clothingDatabase and $clothingDatabase.tops and $clothingDatabase.tops[_topDbKey]>>
<<set _topStyle to $clothingDatabase.tops[_topDbKey].style>>
<</if>>
<</if>>
<<if _topStyle>>
<<getExhibTier "kira">>
<<set _reactions to []>>
<<switch _topStyle>>
<<case "tactical">>
<<set _reactions to [
"Kira nods approvingly at your tactical gear. \"Smart choice. Ready for anything.\"",
"\"Military style suits you,\" Kira observes. \"You look capable.\"",
"She eyes your tactical shirt with respect. \"At least one of us is taking this seriously.\"",
"\"Good gear,\" Kira says. \"Practical. I like it.\""
]>>
<<if $companions[0]>>
<<clampStat "companions[0].trust" 1>>
<</if>>
<<case "formal">>
<<if _exhibTier >= 3 && $companions[0].tension >= 60>>
<<set _reactions to [
"Kira's breath catches. \"Shit. You actually look... really good in that.\" Her eyes linger on how the shirt fits your body.",
"She steps closer, tugging at your collar. \"Where are we going dressed like this? Because I have ideas...\"",
"\"Fuck,\" she breathes out, looking you up and down. \"I want to rip that shirt off you.\"",
"Her fingers brush your chest. \"Formal wear shouldn't be this hot. You're making it hard to concentrate.\""
]>>
<<if $companions[0]>>
<<clampStat "companions[0].tension" 4>>
<<clampStat "companions[0].lust" 3>>
<</if>>
<<elseif _exhibTier >= 3>>
<<set _reactions to [
"Kira smirks at your formal attire. \"Trying to impress someone?\"",
"\"Dressed up for the apocalypse?\" she teases, her eyes lingering.",
"She looks you up and down slowly. \"Not bad. Cleans up well.\""
]>>
<<if $companions[0]>>
<<clampStat "companions[0].tension" 2>>
<</if>>
<<else>>
<<set _reactions to [
"Kira blinks at your formal shirt. \"That's... very nice. Are we going somewhere?\"",
"\"Formal wear in the Reclaimed,\" she mutters. \"Bold choice.\"",
"She seems uncertain how to react to your dressed-up appearance. \"You look... good.\""
]>>
<</if>>
<<case "revealing">>
<<if _exhibTier <= 1>>
<<set _reactions to [
"Kira's face reddens as she notices your revealing top. She quickly looks away.",
"\"That's... um...\" She can't quite meet your eyes. \"It's showing a lot.\"",
"She glances at your exposed skin, then immediately turns her head. Flustered."
]>>
<<elseif _exhibTier === 2>>
<<set _reactions to [
"Kira notices your revealing outfit and blushes slightly. \"Comfortable?\"",
"\"That's pretty revealing,\" she observes, trying to sound casual.",
"Her eyes drop to what's showing, then back up. \"Confident choice.\""
]>>
<<elseif _exhibTier >= 3 && $companions[0].tension < 60>>
<<set _reactions to [
"\"I like the view,\" Kira says openly, eyes on your revealed skin.",
"She stares at what's exposed. \"Not complaining about the outfit choice.\"",
"\"Showing off?\" she asks with a slight smirk. \"It's working.\""
]>>
<<if $companions[0]>>
<<clampStat "companions[0].tension" 3>>
<<clampStat "companions[0].lust" 2>>
<</if>>
<<elseif _exhibTier >= 3 && $companions[0].tension >= 60>>
<<set _reactions to [
"Kira's eyes drag over your body. \"Fuck. That tank top is... distracting.\" Her breathing changes.",
"\"You trying to make me lose focus?\" she asks, staring at your exposed arms and chest. \"Because it's fucking working.\"",
"She bites her lip, eyes locked on your revealed skin. \"Keep wearing that and I'm not responsible for what happens.\"",
"\"Christ,\" she mutters, gaze lingering. \"Do you have ANY idea what you look like in that?\""
]>>
<<if $companions[0]>>
<<clampStat "companions[0].tension" 5>>
<<clampStat "companions[0].lust" 4>>
<</if>>
<</if>>
<<case "rugged">>
<<set _reactions to [
"Kira nods at your practical outfit. \"Solid choice for the Reclaimed.\"",
"\"Practical,\" she says approvingly. \"You'll survive longer in that.\"",
"She gives your rugged clothing a quick once-over. \"Works.\""
]>>
<<case "casual">>
<<set _reactions to [
"Kira glances at your casual wear without much reaction.",
"\"Comfortable?\" she asks about your outfit.",
"She doesn't comment on your casual clothing. Seems normal to her."
]>>
<</switch>>
<<if _reactions.length > 0>>
<p class="kira-clothing-reaction"><<print _reactions.random()>></p>
<</if>>
<</if>>
<</widget>><<run VaultUI.setBackground("wardrobe")>>
<h2>Vault Storage Room</h2>
Rows of metal shelves line the walls, filled with salvaged supplies. One section is dedicated to clothing and gear.
<<if $clothing.player.dickExposed || $clothing.kira.titsExposed || $clothing.kira.pussyExposed>>
<<say "Groundskeeper" "Ah, good. You're here for clothes, I assume. Please, help yourselves.">>
<</if>>
<div class="wardrobe-card-grid" style="grid-template-columns: repeat(2, 1fr); margin-bottom: var(--space-2xl);">
<div class="wardrobe-card" style="padding: var(--space-xl);">
<div class="item-image"><img class="item-icon" src="assets/icons/items/shirt.svg" alt=""></div>
<h3 style="color: var(--accent-gold); margin-bottom: var(--space-lg);">Your Clothing</h3>
<div class="item-actions">
<<link "[Browse Wardrobe]" "Storage_Player_Wardrobe">><</link>>
</div>
</div>
<<getCompanion "kira">>
<<if $tempCompanion && $tempCompanion.trust >= 20>>
<div class="wardrobe-card" style="padding: var(--space-xl);">
<div class="item-image"><img class="item-icon" src="assets/icons/items/dress.svg" alt=""></div>
<h3 style="color: var(--accent-gold); margin-bottom: var(--space-lg);">Kira's Clothing</h3>
<div class="item-actions">
<<if setup.kiraOnRun()>>
<<vchoiceDisabled "Browse Wardrobe (Kira is out scavenging)" "action" "armor">>
<<else>>
<<link "[Browse Wardrobe]" "Storage_Kira_Wardrobe">><</link>>
<</if>>
</div>
</div>
<</if>>
</div>
<h3 style="color: var(--accent-gold); margin: var(--space-xl) 0 var(--space-lg);">Repair Station</h3>
<<if isNaN($clothing.player.top)>><<set $clothing.player.top to 0>><</if>>
<<if isNaN($clothing.player.bottom)>><<set $clothing.player.bottom to 0>><</if>>
<<if $clothing.kira>>
<<if isNaN($clothing.kira.top)>><<set $clothing.kira.top to 0>><</if>>
<<if isNaN($clothing.kira.bottom)>><<set $clothing.kira.bottom to 0>><</if>>
<</if>>
<<set _hasCloth to setup.hasRepairMaterial()>>
<<set _clothCount to setup.repairsLeft()>>
<<uinvGetWornClothing "top" "player">>
<<set _wornTop to $wornItem>>
<<set _playerTopDur to ($clothing.player.top ?? 100)>>
<<uinvGetWornClothing "bottom" "player">>
<<set _wornBottom to $wornItem>>
<<set _playerBottomDur to ($clothing.player.bottom ?? 100)>>
<<if _hasCloth>>
<p class="system-info" style="margin-bottom: 0.5rem;">Cloth and thread for <<= _clothCount>> repair<<if _clothCount !== 1>>s<</if>></p>
<</if>>
<h4 style="margin: 0.5rem 0; color: var(--text-muted);">Your Clothing</h4>
<div class="wardrobe-card-grid" style="margin-bottom: 1rem;">
<div class="wardrobe-card">
<<if _wornTop && typeof _wornTop === "string">>
<<set _topSingular to UInv.GetItemPropertyValue("player worn", _wornTop, "singular")>>
<<set _topName to (_topSingular || _wornTop).replace(/^a |^an /i, "")>>
<<set _topImage to UInv.GetItemPropertyValue("player worn", _wornTop, "image") || "">>
<<set _topImageId to setup.itemImageId(_wornTop)>>
<div class="item-image">
<<if _topImage>>
<img @src="_topImage" alt="" onerror="this.style.display='none'">
<<else>>
<img @src="'assets/images/items/' + _topImageId + '.webp'" alt="" onerror="this.style.display='none'">
<</if>>
</div>
<div class="item-name"><<= _topName>></div>
<<else>>
<div class="item-image"><img class="item-icon" src="assets/icons/body/bare-torso.svg" alt=""></div>
<div class="item-name">No Top</div>
<</if>>
<div class="durability-bar">
<<if _playerTopDur >= 76>><<set _dc to "good">><<elseif _playerTopDur >= 51>><<set _dc to "worn">><<elseif _playerTopDur >= 26>><<set _dc to "ripped">><<else>><<set _dc to "ruined">><</if>>
<div @class="'durability-fill ' + _dc" @style="'width: ' + _playerTopDur + '%'"></div>
<span class="durability-text"><<= _playerTopDur>>%</span>
</div>
<<if _playerTopDur < 100 && _hasCloth>>
<div class="item-actions"><<link "[Repair]">><<uinvRepairClothing "top" 50 "player">><<run setup.useRepairMaterial()>><<goto "Vault_Storage">><</link>></div>
<<elseif _playerTopDur < 100>>
<div class="item-meta" style="color: var(--danger);">Needs cloth to repair</div>
<</if>>
</div>
<div class="wardrobe-card">
<<if _wornBottom && typeof _wornBottom === "string">>
<<set _bottomSingular to UInv.GetItemPropertyValue("player worn", _wornBottom, "singular")>>
<<set _bottomName to (_bottomSingular || _wornBottom).replace(/^a |^an /i, "")>>
<<set _bottomImage to UInv.GetItemPropertyValue("player worn", _wornBottom, "image") || "">>
<<set _bottomImageId to setup.itemImageId(_wornBottom)>>
<div class="item-image">
<<if _bottomImage>>
<img @src="_bottomImage" alt="" onerror="this.style.display='none'">
<<else>>
<img @src="'assets/images/items/' + _bottomImageId + '.webp'" alt="" onerror="this.style.display='none'">
<</if>>
</div>
<div class="item-name"><<= _bottomName>></div>
<<else>>
<div class="item-image"><img class="item-icon" src="assets/icons/body/bare-legs.svg" alt=""></div>
<div class="item-name">No Bottom</div>
<</if>>
<div class="durability-bar">
<<if _playerBottomDur >= 76>><<set _dc to "good">><<elseif _playerBottomDur >= 51>><<set _dc to "worn">><<elseif _playerBottomDur >= 26>><<set _dc to "ripped">><<else>><<set _dc to "ruined">><</if>>
<div @class="'durability-fill ' + _dc" @style="'width: ' + _playerBottomDur + '%'"></div>
<span class="durability-text"><<= _playerBottomDur>>%</span>
</div>
<<if _playerBottomDur < 100 && _hasCloth>>
<div class="item-actions"><<link "[Repair]">><<uinvRepairClothing "bottom" 50 "player">><<run setup.useRepairMaterial()>><<goto "Vault_Storage">><</link>></div>
<<elseif _playerBottomDur < 100>>
<div class="item-meta" style="color: var(--danger);">Needs cloth to repair</div>
<</if>>
</div>
<<repairUnderwearCard "player">>
</div>
<<if $clothing.kira>>
<<if setup.kiraOnRun()>>
<h4 style="margin: 0.5rem 0; color: var(--text-muted);">Kira's Clothing</h4>
<<vchoiceDisabled "Repair her clothes (Kira is out scavenging)" "action" "armor">>
<<else>>
<<uinvGetWornClothing "top" "kira">>
<<set _kiraWornTop to $wornItem>>
<<set _kiraTopDur to ($clothing.kira.top ?? 100)>>
<<uinvGetWornClothing "bottom" "kira">>
<<set _kiraWornBottom to $wornItem>>
<<set _kiraBottomDur to ($clothing.kira.bottom ?? 100)>>
<h4 style="margin: 0.5rem 0; color: var(--text-muted);">Kira's Clothing</h4>
<div class="wardrobe-card-grid">
<div class="wardrobe-card">
<<if _kiraWornTop && typeof _kiraWornTop === "string">>
<<set _kTopSingular to UInv.GetItemPropertyValue("kira worn", _kiraWornTop, "singular")>>
<<set _kTopName to (_kTopSingular || _kiraWornTop).replace(/^a |^an /i, "")>>
<<set _kTopImage to UInv.GetItemPropertyValue("kira worn", _kiraWornTop, "image") || "">>
<<set _kTopImageId to setup.itemImageId(_kiraWornTop)>>
<div class="item-image">
<<if _kTopImage>>
<img @src="_kTopImage" alt="" onerror="this.style.display='none'">
<<else>>
<img @src="'assets/images/items/' + _kTopImageId + '.webp'" alt="" onerror="this.style.display='none'">
<</if>>
</div>
<div class="item-name"><<= _kTopName>></div>
<<else>>
<div class="item-image"><img class="item-icon" src="assets/icons/body/bare-torso-female.svg" alt=""></div>
<div class="item-name">No Top</div>
<</if>>
<div class="durability-bar">
<<if _kiraTopDur >= 76>><<set _dc to "good">><<elseif _kiraTopDur >= 51>><<set _dc to "worn">><<elseif _kiraTopDur >= 26>><<set _dc to "ripped">><<else>><<set _dc to "ruined">><</if>>
<div @class="'durability-fill ' + _dc" @style="'width: ' + _kiraTopDur + '%'"></div>
<span class="durability-text"><<= _kiraTopDur>>%</span>
</div>
<<if _kiraTopDur < 100 && _hasCloth>>
<div class="item-actions"><<link "[Repair]">><<uinvRepairClothing "top" 50 "kira">><<run setup.useRepairMaterial()>><<goto "Vault_Storage">><</link>></div>
<<elseif _kiraTopDur < 100>>
<div class="item-meta" style="color: var(--danger);">Needs cloth to repair</div>
<</if>>
</div>
<div class="wardrobe-card">
<<if _kiraWornBottom && typeof _kiraWornBottom === "string">>
<<set _kBottomSingular to UInv.GetItemPropertyValue("kira worn", _kiraWornBottom, "singular")>>
<<set _kBottomName to (_kBottomSingular || _kiraWornBottom).replace(/^a |^an /i, "")>>
<<set _kBottomImage to UInv.GetItemPropertyValue("kira worn", _kiraWornBottom, "image") || "">>
<<set _kBottomImageId to setup.itemImageId(_kiraWornBottom)>>
<div class="item-image">
<<if _kBottomImage>>
<img @src="_kBottomImage" alt="" onerror="this.style.display='none'">
<<else>>
<img @src="'assets/images/items/' + _kBottomImageId + '.webp'" alt="" onerror="this.style.display='none'">
<</if>>
</div>
<div class="item-name"><<= _kBottomName>></div>
<<else>>
<div class="item-image"><img class="item-icon" src="assets/icons/body/bare-legs-female.svg" alt=""></div>
<div class="item-name">No Bottom</div>
<</if>>
<div class="durability-bar">
<<if _kiraBottomDur >= 76>><<set _dc to "good">><<elseif _kiraBottomDur >= 51>><<set _dc to "worn">><<elseif _kiraBottomDur >= 26>><<set _dc to "ripped">><<else>><<set _dc to "ruined">><</if>>
<div @class="'durability-fill ' + _dc" @style="'width: ' + _kiraBottomDur + '%'"></div>
<span class="durability-text"><<= _kiraBottomDur>>%</span>
</div>
<<if _kiraBottomDur < 100 && _hasCloth>>
<div class="item-actions"><<link "[Repair]">><<uinvRepairClothing "bottom" 50 "kira">><<run setup.useRepairMaterial()>><<goto "Vault_Storage">><</link>></div>
<<elseif _kiraBottomDur < 100>>
<div class="item-meta" style="color: var(--danger);">Needs cloth to repair</div>
<</if>>
</div>
<<repairUnderwearCard "kira">>
</div>
<</if>>
<</if>>
<div class="choice-container">
<<vchoice "Leave" "Vault_Hub" "action" "return">>
</div><h2>Your Wardrobe</h2>
<p>Your personal collection of clothing and armor.</p>
<<if typeof UInv !== 'undefined' && UInv.BagExists("player worn")>>
<<uinvGetWornClothing "top" "player">>
<<set _wornTop to $wornItem>>
<<set _topDur to $wornItemDurability>>
<<uinvGetWornClothing "bottom" "player">>
<<set _wornBottom to $wornItem>>
<<set _bottomDur to $wornItemDurability>>
<<set _underwearId to $wardrobe.player.equipped || "none">>
<<set _underwearDur to setup.clothingValue($clothing.player.underwear)>>
<<set _underwearData to $intimateApparel && $intimateApparel.player ? $intimateApparel.player[_underwearId] : null>>
<h3>Currently Wearing</h3>
<div class="clothing-slot-grid">
<div class="clothing-slot" data-slot="top">
<div class="slot-label">Top</div>
<<if _wornTop && typeof _wornTop === "string">>
<<set _topSingular to UInv.GetItemPropertyValue("player worn", _wornTop, "singular")>>
<<set _topName to (_topSingular || _wornTop).replace(/^a |^an /i, "")>>
<<set _topImage to UInv.GetItemPropertyValue("player worn", _wornTop, "image") || "">>
<<set _topImageId to setup.itemImageId(_wornTop)>>
<div class="item-image">
<<if _topImage>>
<img @src="_topImage" alt="" onerror="this.style.display='none'">
<<else>>
<img @src="'assets/images/items/' + _topImageId + '.webp'" alt="" onerror="this.style.display='none'">
<</if>>
</div>
<div class="slot-item"><<= _topName>></div>
<div class="durability-bar">
<<if _topDur >= 76>><<set _durClass to "good">>
<<elseif _topDur >= 51>><<set _durClass to "worn">>
<<elseif _topDur >= 26>><<set _durClass to "ripped">>
<<else>><<set _durClass to "ruined">><</if>>
<div @class="'durability-fill ' + _durClass" @style="'width: ' + _topDur + '%'"></div>
<span class="durability-text"><<= _topDur>>%</span>
</div>
<div class="slot-actions">
<<link "[Change]" "Storage_Player_Change_Top">><</link>>
<<link "[Remove]">>
<<uinvRemoveClothing "top" "player">>
<<goto "Storage_Player_Wardrobe">>
<</link>>
</div>
<<else>>
<div class="item-image"><img class="item-icon" src="assets/icons/body/bare-torso.svg" alt=""></div>
<div class="slot-empty">Not wearing</div>
<div class="slot-actions">
<<link "[Equip]" "Storage_Player_Change_Top">><</link>>
</div>
<</if>>
</div>
<div class="clothing-slot" data-slot="bottom">
<div class="slot-label">Bottom</div>
<<if _wornBottom && typeof _wornBottom === "string">>
<<set _bottomSingular to UInv.GetItemPropertyValue("player worn", _wornBottom, "singular")>>
<<set _bottomName to (_bottomSingular || _wornBottom).replace(/^a |^an /i, "")>>
<<set _bottomImage to UInv.GetItemPropertyValue("player worn", _wornBottom, "image") || "">>
<<set _bottomImageId to setup.itemImageId(_wornBottom)>>
<div class="item-image">
<<if _bottomImage>>
<img @src="_bottomImage" alt="" onerror="this.style.display='none'">
<<else>>
<img @src="'assets/images/items/' + _bottomImageId + '.webp'" alt="" onerror="this.style.display='none'">
<</if>>
</div>
<div class="slot-item"><<= _bottomName>></div>
<div class="durability-bar">
<<if _bottomDur >= 76>><<set _durClass to "good">>
<<elseif _bottomDur >= 51>><<set _durClass to "worn">>
<<elseif _bottomDur >= 26>><<set _durClass to "ripped">>
<<else>><<set _durClass to "ruined">><</if>>
<div @class="'durability-fill ' + _durClass" @style="'width: ' + _bottomDur + '%'"></div>
<span class="durability-text"><<= _bottomDur>>%</span>
</div>
<div class="slot-actions">
<<link "[Change]" "Storage_Player_Change_Bottom">><</link>>
<<link "[Remove]">>
<<uinvRemoveClothing "bottom" "player">>
<<goto "Storage_Player_Wardrobe">>
<</link>>
</div>
<<else>>
<div class="item-image"><img class="item-icon" src="assets/icons/body/bare-legs.svg" alt=""></div>
<div class="slot-empty">Not wearing</div>
<div class="slot-actions">
<<link "[Equip]" "Storage_Player_Change_Bottom">><</link>>
</div>
<</if>>
</div>
<div class="clothing-slot" data-slot="underwear">
<div class="slot-label">Underwear</div>
<<if _underwearId && typeof _underwearId === "string" && _underwearId !== "none" && _underwearId !== "commando">>
<<set _underwearName to (_underwearData && _underwearData.name) ? _underwearData.name : _underwearId>>
<<set _underwearImage to setup.underwearImage("player", _underwearId)>>
<div class="item-image">
<<if _underwearImage>>
<img @src="_underwearImage" alt="" onerror="this.style.display='none'">
<</if>>
</div>
<div class="slot-item"><<= _underwearName>></div>
<div class="durability-bar">
<<if _underwearDur >= 76>><<set _durClass to "good">>
<<elseif _underwearDur >= 51>><<set _durClass to "worn">>
<<elseif _underwearDur >= 26>><<set _durClass to "ripped">>
<<else>><<set _durClass to "ruined">><</if>>
<div @class="'durability-fill ' + _durClass" @style="'width: ' + _underwearDur + '%'"></div>
<span class="durability-text"><<= _underwearDur>>%</span>
</div>
<div class="slot-actions">
<<link "[Change]" "Wardrobe_Change_Underwear">><</link>>
<<link "[Remove]">>
<<equipIntimate "player" "commando">>
<<goto "Storage_Player_Wardrobe">>
<</link>>
</div>
<<elseif _underwearId === "commando">>
<div class="item-image"><img class="item-icon" src="assets/icons/body/no-underwear.svg" alt=""></div>
<div class="slot-item">Commando</div>
<div class="slot-actions">
<<link "[Change]" "Wardrobe_Change_Underwear">><</link>>
</div>
<<else>>
<div class="item-image"><img class="item-icon" src="assets/icons/body/no-underwear.svg" alt=""></div>
<div class="slot-empty">None</div>
<div class="slot-actions">
<<link "[Equip]" "Wardrobe_Change_Underwear">><</link>>
</div>
<</if>>
</div>
</div>
<h3>Armor</h3>
<<uinvGetEquippedArmor>>
<div class="clothing-slot-grid" style="grid-template-columns: 1fr;">
<div class="clothing-slot" data-slot="armor">
<div class="slot-label">Body Armor</div>
<<if $equippedArmor && $equippedArmorData>>
<<set _armorName to $equippedArmorData.displayName || $equippedArmor>>
<<set _armorDef to $equippedArmorData.defense || 0>>
<div class="item-image">
<img @src="setup.itemImage(String($equippedArmor))" alt="" onerror="this.style.display='none'">
</div>
<div class="slot-item"><<= _armorName>> <span class="stat-badge">DEF +<<= _armorDef>></span></div>
<div class="slot-actions">
<<link "[Manage]" "Wardrobe_Armor_Management">><</link>>
<<link "[Unequip]">>
<<uinvUnequipArmor>>
<<goto "Storage_Player_Wardrobe">>
<</link>>
</div>
<<else>>
<div class="item-image"><img class="item-icon" src="assets/icons/equipment/no-armor.svg" alt=""></div>
<div class="slot-empty">None equipped</div>
<div class="slot-actions">
<<link "[Equip]" "Wardrobe_Armor_Management">><</link>>
</div>
<</if>>
</div>
</div>
<<else>>
<p class="system-info">Wardrobe system not available.</p>
<</if>>
<div class="choice-container">
<<vchoice "Back to Storage" "Vault_Storage" "action" "return">>
</div><h2>Change Clothing</h2>
<p>Select what you want to wear from your collection.</p>
<div class="change-options">
<h3>Clothing Options</h3>
<div class="choice-container">
<<vchoice "Change top" "Storage_Player_Change_Top" "action" "cycle">>
</div>
<div class="choice-container">
<<vchoice "Change bottom" "Storage_Player_Change_Bottom" "action" "cycle">>
</div>
<div class="choice-container">
<<vchoice "Change underwear" "Wardrobe_Change_Underwear" "action" "cycle">>
</div>
<h3>Undress Options</h3>
<<link "Remove top">>
<<set $clothing.player.top to 0>>
<<updateExposure "player">>
<<goto "Storage_Player_Change">>
<</link>>
<<link "Remove bottom">>
<<set $clothing.player.bottom to 0>>
<<updateExposure "player">>
<<goto "Storage_Player_Change">>
<</link>>
</div>
<div class="choice-container">
<<vchoice "Back to Storage" "Vault_Storage" "action" "return">>
</div><h2>Select Top</h2>
<p>Choose what to wear on top.</p>
<<if typeof UInv !== 'undefined' && UInv.BagExists("player wardrobe")>>
<<uinvGetWornClothing "top" "player">>
<<set _currentTop to $wornItem>>
<<uinvGetWardrobeItems "top" "player">>
<h3>Available Tops</h3>
<div class="wardrobe-card-grid">
<<if _currentTop && typeof _currentTop === "string">>
<<set _currSingularRaw to UInv.GetItemPropertyValue("player worn", _currentTop, "singular")>>
<<set _currSingular to (_currSingularRaw || _currentTop).replace(/^a |^an /i, "")>>
<<set _currImage to UInv.GetItemPropertyValue("player worn", _currentTop, "image") || "">>
<<set _currImageId to setup.itemImageId(_currentTop)>>
<div class="wardrobe-card equipped">
<div class="equipped-badge">Wearing</div>
<div class="item-image">
<<if _currImage>>
<img @src="_currImage" alt="" onerror="this.style.display='none'">
<<else>>
<img @src="'assets/images/items/' + _currImageId + '.webp'" alt="" onerror="this.style.display='none'">
<</if>>
</div>
<div class="item-name"><<= _currSingular>></div>
</div>
<</if>>
<<for _itemName range $wardrobeItems>>
<<set _singularRaw to UInv.GetItemPropertyValue("player wardrobe", _itemName, "singular")>>
<<set _singular to (_singularRaw || _itemName).replace(/^a |^an /i, "")>>
<<set _style to UInv.GetItemPropertyValue("player wardrobe", _itemName, "style") || "casual">>
<<set _image to UInv.GetItemPropertyValue("player wardrobe", _itemName, "image") || "">>
<<set _imageId to setup.itemImageId(_itemName)>>
<<capture _itemName, _singular, _style, _image, _imageId>>
<div class="wardrobe-card">
<div class="item-image">
<<if _image>>
<img @src="_image" alt="" onerror="this.style.display='none'">
<<else>>
<img @src="'assets/images/items/' + _imageId + '.webp'" alt="" onerror="this.style.display='none'">
<</if>>
</div>
<div class="item-name"><<= _singular>></div>
<div class="item-meta"><<= _style>></div>
<div class="item-actions">
<<link "[Wear]">>
<<uinvWearClothing _itemName "player">>
<<goto "Storage_Player_Wardrobe">>
<</link>>
</div>
</div>
<</capture>>
<</for>>
<<if $storage && $storage.spareClothes && $storage.spareClothes.tops && $storage.spareClothes.tops.length > 0>>
<<for _i, _topId range $storage.spareClothes.tops>>
<<capture _i, _topId>>
<<set _topData to $clothingDatabase.tops[_topId]>>
<<set _topImage to (_topData && _topData.image) ? _topData.image : "">>
<<set _topName to (_topData && _topData.name) ? _topData.name : _topId>>
<div class="wardrobe-card">
<div class="spare-badge">Spare</div>
<div class="item-image">
<<if _topImage>>
<img @src="_topImage" alt="" onerror="this.style.display='none'">
<</if>>
</div>
<div class="item-name"><<= _topName>></div>
<div class="item-meta">from storage</div>
<div class="item-actions">
<<link "[Take & Wear]">>
<<addClothingToWardrobe _topId "top" "player">>
<<set _uinvName to _topId.replace(/_/g, " ")>>
<<uinvWearClothing _uinvName "player">>
<<run $storage.spareClothes.tops.splice(_i, 1)>>
<<goto "Storage_Player_Wardrobe">>
<</link>>
</div>
</div>
<</capture>>
<</for>>
<</if>>
<div class="wardrobe-card">
<div class="item-image"><img class="item-icon" src="assets/icons/body/bare-torso.svg" alt=""></div>
<div class="item-name">Go Shirtless</div>
<div class="item-meta">exposed</div>
<div class="item-actions">
<<link "[Remove]">>
<<uinvRemoveClothing "top" "player">>
<<goto "Storage_Player_Wardrobe">>
<</link>>
</div>
</div>
</div>
<<else>>
<p class="system-info">Wardrobe system not available.</p>
<</if>>
<div class="choice-container">
<<vchoice "Back to Wardrobe" "Storage_Player_Wardrobe" "action" "return">>
</div><h2>Select Bottom</h2>
<p>Choose what to wear on bottom.</p>
<<if typeof UInv !== 'undefined' && UInv.BagExists("player wardrobe")>>
<<uinvGetWornClothing "bottom" "player">>
<<set _currentBottom to $wornItem>>
<<uinvGetWardrobeItems "bottom" "player">>
<h3>Available Bottoms</h3>
<div class="wardrobe-card-grid">
<<if _currentBottom && typeof _currentBottom === "string">>
<<set _currSingularRaw to UInv.GetItemPropertyValue("player worn", _currentBottom, "singular")>>
<<set _currSingular to (_currSingularRaw || _currentBottom).replace(/^a |^an /i, "")>>
<<set _currImage to UInv.GetItemPropertyValue("player worn", _currentBottom, "image") || "">>
<<set _currImageId to setup.itemImageId(_currentBottom)>>
<div class="wardrobe-card equipped">
<div class="equipped-badge">Wearing</div>
<div class="item-image">
<<if _currImage>>
<img @src="_currImage" alt="" onerror="this.style.display='none'">
<<else>>
<img @src="'assets/images/items/' + _currImageId + '.webp'" alt="" onerror="this.style.display='none'">
<</if>>
</div>
<div class="item-name"><<= _currSingular>></div>
</div>
<</if>>
<<for _itemName range $wardrobeItems>>
<<set _singularRaw to UInv.GetItemPropertyValue("player wardrobe", _itemName, "singular")>>
<<set _singular to (_singularRaw || _itemName).replace(/^a |^an /i, "")>>
<<set _style to UInv.GetItemPropertyValue("player wardrobe", _itemName, "style") || "casual">>
<<set _image to UInv.GetItemPropertyValue("player wardrobe", _itemName, "image") || "">>
<<set _imageId to setup.itemImageId(_itemName)>>
<<capture _itemName, _singular, _style, _image, _imageId>>
<div class="wardrobe-card">
<div class="item-image">
<<if _image>>
<img @src="_image" alt="" onerror="this.style.display='none'">
<<else>>
<img @src="'assets/images/items/' + _imageId + '.webp'" alt="" onerror="this.style.display='none'">
<</if>>
</div>
<div class="item-name"><<= _singular>></div>
<div class="item-meta"><<= _style>></div>
<div class="item-actions">
<<link "[Wear]">>
<<uinvWearClothing _itemName "player">>
<<goto "Storage_Player_Wardrobe">>
<</link>>
</div>
</div>
<</capture>>
<</for>>
<<if $storage && $storage.spareClothes && $storage.spareClothes.bottoms && $storage.spareClothes.bottoms.length > 0>>
<<for _i, _bottomId range $storage.spareClothes.bottoms>>
<<capture _i, _bottomId>>
<<set _bottomData to $clothingDatabase.bottoms[_bottomId]>>
<<set _bottomImage to (_bottomData && _bottomData.image) ? _bottomData.image : "">>
<<set _bottomName to (_bottomData && _bottomData.name) ? _bottomData.name : _bottomId>>
<div class="wardrobe-card">
<div class="spare-badge">Spare</div>
<div class="item-image">
<<if _bottomImage>>
<img @src="_bottomImage" alt="" onerror="this.style.display='none'">
<</if>>
</div>
<div class="item-name"><<= _bottomName>></div>
<div class="item-meta">from storage</div>
<div class="item-actions">
<<link "[Take & Wear]">>
<<addClothingToWardrobe _bottomId "bottom" "player">>
<<set _uinvName to _bottomId.replace(/_/g, " ")>>
<<uinvWearClothing _uinvName "player">>
<<run $storage.spareClothes.bottoms.splice(_i, 1)>>
<<goto "Storage_Player_Wardrobe">>
<</link>>
</div>
</div>
<</capture>>
<</for>>
<</if>>
<div class="wardrobe-card">
<div class="item-image"><img class="item-icon" src="assets/icons/body/bare-legs.svg" alt=""></div>
<div class="item-name">Go Bottomless</div>
<div class="item-meta">exposed</div>
<div class="item-actions">
<<link "[Remove]">>
<<uinvRemoveClothing "bottom" "player">>
<<goto "Storage_Player_Wardrobe">>
<</link>>
</div>
</div>
</div>
<<else>>
<p class="system-info">Wardrobe system not available.</p>
<</if>>
<div class="choice-container">
<<vchoice "Back to Wardrobe" "Storage_Player_Wardrobe" "action" "return">>
</div><h2>Spare Clothes Storage</h2>
<p>Extra clothing items stored for emergencies. Taking an item will equip it immediately.</p>
<<if !$storage || !$storage.spareClothes || (Object.values($storage.spareClothes).reduce((sum, cat) => sum + cat.length, 0) === 0)>>
<p class="system-info">No spare clothes in storage.</p>
<<else>>
<<if $storage.spareClothes.tops && $storage.spareClothes.tops.length > 0>>
<h3>Tops</h3>
<div class="wardrobe-card-grid">
<<for _i, _topId range $storage.spareClothes.tops>>
<<capture _i, _topId>>
<<set _topData to $clothingDatabase.tops[_topId]>>
<<set _topImage to (_topData && _topData.image) ? _topData.image : "">>
<<set _topName to (_topData && _topData.name) ? _topData.name : _topId>>
<div class="wardrobe-card">
<div class="item-image">
<<if _topImage>>
<img @src="_topImage" alt="" onerror="this.style.display='none'">
<</if>>
</div>
<div class="item-name"><<= _topName>></div>
<div class="item-meta">100% condition</div>
<div class="item-actions">
<<link "[Take & Wear]">>
<<addClothingToWardrobe _topId "top" "player">>
<<set _uinvName to _topId.replace(/_/g, " ")>>
<<uinvWearClothing _uinvName "player">>
<<run $storage.spareClothes.tops.splice(_i, 1)>>
<<goto "Storage_Browse_Spare_Clothes">>
<</link>>
</div>
</div>
<</capture>>
<</for>>
</div>
<</if>>
<<if $storage.spareClothes.bottoms && $storage.spareClothes.bottoms.length > 0>>
<h3>Bottoms</h3>
<div class="wardrobe-card-grid">
<<for _i, _bottomId range $storage.spareClothes.bottoms>>
<<capture _i, _bottomId>>
<<set _bottomData to $clothingDatabase.bottoms[_bottomId]>>
<<set _bottomImage to (_bottomData && _bottomData.image) ? _bottomData.image : "">>
<<set _bottomName to (_bottomData && _bottomData.name) ? _bottomData.name : _bottomId>>
<div class="wardrobe-card">
<div class="item-image">
<<if _bottomImage>>
<img @src="_bottomImage" alt="" onerror="this.style.display='none'">
<</if>>
</div>
<div class="item-name"><<= _bottomName>></div>
<div class="item-meta">100% condition</div>
<div class="item-actions">
<<link "[Take & Wear]">>
<<addClothingToWardrobe _bottomId "bottom" "player">>
<<set _uinvName to _bottomId.replace(/_/g, " ")>>
<<uinvWearClothing _uinvName "player">>
<<run $storage.spareClothes.bottoms.splice(_i, 1)>>
<<goto "Storage_Browse_Spare_Clothes">>
<</link>>
</div>
</div>
<</capture>>
<</for>>
</div>
<</if>>
<<if $storage.spareClothes.underwear && $storage.spareClothes.underwear.length > 0>>
<<set _underwearFallback to {
"standard": { name: "Standard Briefs", image: "media/clothing/intimate/player/standard_v2.webp" },
"reinforced": { name: "Reinforced Shorts", image: "media/clothing/intimate/player/reinforced_v2.webp" },
"tight": { name: "Tight Briefs", image: "media/clothing/intimate/player/tight_v2.webp" }
}>>
<h3>Underwear</h3>
<div class="wardrobe-card-grid">
<<for _i, _underwearId range $storage.spareClothes.underwear>>
<<capture _i, _underwearId>>
<<set _underwearRaw to ($intimateApparel && $intimateApparel.player) ? $intimateApparel.player[_underwearId] : null>>
<<set _underwearFB to _underwearFallback[_underwearId]>>
<<set _underwearData to _underwearRaw || _underwearFB || null>>
<<set _underwearImage to (_underwearData && _underwearData.image) ? _underwearData.image : (_underwearFB ? _underwearFB.image : "")>>
<<set _underwearName to (_underwearData && _underwearData.name) ? _underwearData.name : _underwearId>>
<div class="wardrobe-card">
<div class="item-image">
<<if _underwearImage>>
<img @src="_underwearImage" alt="" onerror="this.style.display='none'">
<</if>>
</div>
<div class="item-name"><<= _underwearName>></div>
<div class="item-meta">100% condition</div>
<div class="item-actions">
<<link "[Take & Wear]">>
<<set $clothing.player.underwear to 100>>
<<set $wardrobe.player.equipped to _underwearId>>
<<run $storage.spareClothes.underwear.splice(_i, 1)>>
<<goto "Storage_Browse_Spare_Clothes">>
<</link>>
</div>
</div>
<</capture>>
<</for>>
</div>
<</if>>
<</if>>
<div class="choice-container">
<<vchoice "Back to Storage" "Vault_Storage" "action" "return">>
</div><h2>Kira's Wardrobe</h2>
<p>Browse what Kira has available to wear.</p>
<<getCompanion "kira">>
<<if !$tempCompanion>>
<p class="system-error">Kira is not available.</p>
<<elseif setup.kiraOnRun()>>
<p class="system-info">Kira is out scavenging. Her clothes went with her.</p>
<<elseif typeof UInv === 'undefined' || !UInv.BagExists("kira worn")>>
<p class="system-info">Wardrobe system not available.</p>
<<else>>
<<uinvGetWornClothing "top" "kira">>
<<set _kiraTop to $wornItem>>
<<set _kiraTopDur to $wornItemDurability>>
<<uinvGetWornClothing "bottom" "kira">>
<<set _kiraBottom to $wornItem>>
<<set _kiraBottomDur to $wornItemDurability>>
<h3>Currently Wearing</h3>
<div class="clothing-slot-grid">
<div class="clothing-slot" data-slot="top">
<div class="slot-label">Top</div>
<<if _kiraTop && typeof _kiraTop === "string">>
<<set _topSingular to UInv.GetItemPropertyValue("kira worn", _kiraTop, "singular")>>
<<set _topName to (_topSingular || _kiraTop).replace(/^a |^an /i, "")>>
<<set _topImage to UInv.GetItemPropertyValue("kira worn", _kiraTop, "image") || "">>
<<set _topImageId to setup.itemImageId(_kiraTop)>>
<div class="item-image">
<<if _topImage>>
<img @src="_topImage" alt="" onerror="this.style.display='none'">
<<else>>
<img @src="'assets/images/items/' + _topImageId + '.webp'" alt="" onerror="this.style.display='none'">
<</if>>
</div>
<div class="slot-item"><<= _topName>></div>
<div class="durability-bar">
<<if _kiraTopDur >= 76>><<set _durClass to "good">>
<<elseif _kiraTopDur >= 51>><<set _durClass to "worn">>
<<elseif _kiraTopDur >= 26>><<set _durClass to "ripped">>
<<else>><<set _durClass to "ruined">><</if>>
<div @class="'durability-fill ' + _durClass" @style="'width: ' + _kiraTopDur + '%'"></div>
<span class="durability-text"><<= _kiraTopDur>>%</span>
</div>
<div class="slot-actions">
<<link "[Change]" "Storage_Kira_Change_Top">><</link>>
</div>
<<else>>
<div class="item-image"><img class="item-icon" src="assets/icons/body/bare-torso-female.svg" alt=""></div>
<div class="slot-empty">Exposed</div>
<div class="slot-actions">
<<link "[Equip]" "Storage_Kira_Change_Top">><</link>>
</div>
<</if>>
</div>
<div class="clothing-slot" data-slot="bottom">
<div class="slot-label">Bottom</div>
<<if _kiraBottom && typeof _kiraBottom === "string">>
<<set _bottomSingular to UInv.GetItemPropertyValue("kira worn", _kiraBottom, "singular")>>
<<set _bottomName to (_bottomSingular || _kiraBottom).replace(/^a |^an /i, "")>>
<<set _bottomImage to UInv.GetItemPropertyValue("kira worn", _kiraBottom, "image") || "">>
<<set _bottomImageId to setup.itemImageId(_kiraBottom)>>
<div class="item-image">
<<if _bottomImage>>
<img @src="_bottomImage" alt="" onerror="this.style.display='none'">
<<else>>
<img @src="'assets/images/items/' + _bottomImageId + '.webp'" alt="" onerror="this.style.display='none'">
<</if>>
</div>
<div class="slot-item"><<= _bottomName>></div>
<div class="durability-bar">
<<if _kiraBottomDur >= 76>><<set _durClass to "good">>
<<elseif _kiraBottomDur >= 51>><<set _durClass to "worn">>
<<elseif _kiraBottomDur >= 26>><<set _durClass to "ripped">>
<<else>><<set _durClass to "ruined">><</if>>
<div @class="'durability-fill ' + _durClass" @style="'width: ' + _kiraBottomDur + '%'"></div>
<span class="durability-text"><<= _kiraBottomDur>>%</span>
</div>
<div class="slot-actions">
<<link "[Change]" "Storage_Kira_Change_Bottom">><</link>>
</div>
<<else>>
<div class="item-image"><img class="item-icon" src="assets/icons/body/bare-legs-female.svg" alt=""></div>
<div class="slot-empty">Exposed</div>
<div class="slot-actions">
<<link "[Equip]" "Storage_Kira_Change_Bottom">><</link>>
</div>
<</if>>
</div>
</div>
<<if $tempCompanion.trust < 25>>
<p class="trust-locked">You need more trust with Kira to suggest what she wears. (Requires 25 trust)</p>
<</if>>
<</if>>
<div class="choice-container">
<<if setup.kiraOwnChoiceOpen()>>
<<vchoice "Let her choose" "Storage_Kira_Own_Choice" "talk" "talk">>
<</if>>
<<vchoice "Back to Storage" "Vault_Storage" "action" "return">>
</div><<if setup.kiraOwnChoiceOpen()>>
<h2>Kira's Wardrobe</h2>
<<say $player.name "Actually, you know what? Your call. Wear what you're comfortable with.">>
<<set _kocPick to setup.kiraOwnOutfit()>>
<<if _kocPick.top>><<uinvWearClothing _kocPick.top "kira">><</if>>
<<if _kocPick.bottom>><<uinvWearClothing _kocPick.bottom "kira">><</if>>
<<if _kocPick.kind === "revealing">>
<p>Kira picks out the <<= _kocPick.revealing.join(" and the ")>>. "Might as well look good," she says.</p>
<<elseif _kocPick.kind === "standard">>
<p>Kira picks out her standard outfit and gets dressed.</p>
<<else>>
<p>Kira picks out the <<= _kocPick.pieces.join(" and the ")>> and gets dressed.</p>
<</if>>
<<if $flags.kiraOwnChoiceDay !== $time.day>>
<<set $flags.kiraOwnChoiceDay to $time.day>>
<<relationChange "kira" "trust" 1>>
<</if>>
<div class="choice-container">
<<vchoice "Continue" "Storage_Kira_Wardrobe" "action" "forward">>
</div>
<<else>>
<<include "Storage_Kira_Wardrobe">>
<</if>><h2>Select Top for Kira</h2>
<p>Choose what Kira should wear on top.</p>
<<getCompanion "kira">>
<<if !$tempCompanion || $tempCompanion.trust < 25>>
<p class="trust-locked">You need more trust with Kira to change her clothes. (Requires 25 trust)</p>
<<elseif typeof UInv !== 'undefined' && UInv.BagExists("kira wardrobe")>>
<<uinvGetWornClothing "top" "kira">>
<<set _currentTop to $wornItem>>
<<uinvGetWardrobeItems "top" "kira">>
<h3>Available Tops</h3>
<div class="wardrobe-card-grid">
<<if _currentTop && typeof _currentTop === "string">>
<<set _currSingularRaw to UInv.GetItemPropertyValue("kira worn", _currentTop, "singular")>>
<<set _currSingular to (_currSingularRaw || _currentTop).replace(/^a |^an /i, "")>>
<<set _currImage to UInv.GetItemPropertyValue("kira worn", _currentTop, "image") || "">>
<<set _currImageId to setup.itemImageId(_currentTop)>>
<div class="wardrobe-card equipped">
<div class="equipped-badge">Wearing</div>
<div class="item-image">
<<if _currImage>>
<img @src="_currImage" alt="" onerror="this.style.display='none'">
<<else>>
<img @src="'assets/images/items/' + _currImageId + '.webp'" alt="" onerror="this.style.display='none'">
<</if>>
</div>
<div class="item-name"><<= _currSingular>></div>
</div>
<</if>>
<<for _itemName range $wardrobeItems>>
<<set _singularRaw to UInv.GetItemPropertyValue("kira wardrobe", _itemName, "singular")>>
<<set _singular to (_singularRaw || _itemName).replace(/^a |^an /i, "")>>
<<set _style to UInv.GetItemPropertyValue("kira wardrobe", _itemName, "style") || "casual">>
<<set _image to UInv.GetItemPropertyValue("kira wardrobe", _itemName, "image") || "">>
<<set _imageId to setup.itemImageId(_itemName)>>
<<capture _itemName, _singular, _style, _image, _imageId>>
<div class="wardrobe-card">
<div class="item-image">
<<if _image>>
<img @src="_image" alt="" onerror="this.style.display='none'">
<<else>>
<img @src="'assets/images/items/' + _imageId + '.webp'" alt="" onerror="this.style.display='none'">
<</if>>
</div>
<div class="item-name"><<= _singular>></div>
<div class="item-meta"><<= _style>></div>
<div class="item-actions">
<<link "[Suggest]">>
<<uinvWearClothing _itemName "kira">>
<<goto "Storage_Kira_Wardrobe">>
<</link>>
</div>
</div>
<</capture>>
<</for>>
</div>
<<else>>
<p class="system-info">Wardrobe system not available.</p>
<</if>>
<div class="choice-container">
<<vchoice "Back to Wardrobe" "Storage_Kira_Wardrobe" "action" "return">>
</div><h2>Select Bottom for Kira</h2>
<p>Choose what Kira should wear on bottom.</p>
<<getCompanion "kira">>
<<if !$tempCompanion || $tempCompanion.trust < 25>>
<p class="trust-locked">You need more trust with Kira to change her clothes. (Requires 25 trust)</p>
<<elseif typeof UInv !== 'undefined' && UInv.BagExists("kira wardrobe")>>
<<uinvGetWornClothing "bottom" "kira">>
<<set _currentBottom to $wornItem>>
<<uinvGetWardrobeItems "bottom" "kira">>
<h3>Available Bottoms</h3>
<div class="wardrobe-card-grid">
<<if _currentBottom && typeof _currentBottom === "string">>
<<set _currSingularRaw to UInv.GetItemPropertyValue("kira worn", _currentBottom, "singular")>>
<<set _currSingular to (_currSingularRaw || _currentBottom).replace(/^a |^an /i, "")>>
<<set _currImage to UInv.GetItemPropertyValue("kira worn", _currentBottom, "image") || "">>
<<set _currImageId to setup.itemImageId(_currentBottom)>>
<div class="wardrobe-card equipped">
<div class="equipped-badge">Wearing</div>
<div class="item-image">
<<if _currImage>>
<img @src="_currImage" alt="" onerror="this.style.display='none'">
<<else>>
<img @src="'assets/images/items/' + _currImageId + '.webp'" alt="" onerror="this.style.display='none'">
<</if>>
</div>
<div class="item-name"><<= _currSingular>></div>
</div>
<</if>>
<<for _itemName range $wardrobeItems>>
<<set _singularRaw to UInv.GetItemPropertyValue("kira wardrobe", _itemName, "singular")>>
<<set _singular to (_singularRaw || _itemName).replace(/^a |^an /i, "")>>
<<set _style to UInv.GetItemPropertyValue("kira wardrobe", _itemName, "style") || "casual">>
<<set _image to UInv.GetItemPropertyValue("kira wardrobe", _itemName, "image") || "">>
<<set _imageId to setup.itemImageId(_itemName)>>
<<capture _itemName, _singular, _style, _image, _imageId>>
<div class="wardrobe-card">
<div class="item-image">
<<if _image>>
<img @src="_image" alt="" onerror="this.style.display='none'">
<<else>>
<img @src="'assets/images/items/' + _imageId + '.webp'" alt="" onerror="this.style.display='none'">
<</if>>
</div>
<div class="item-name"><<= _singular>></div>
<div class="item-meta"><<= _style>></div>
<div class="item-actions">
<<link "[Suggest]">>
<<uinvWearClothing _itemName "kira">>
<<goto "Storage_Kira_Wardrobe">>
<</link>>
</div>
</div>
<</capture>>
<</for>>
</div>
<<else>>
<p class="system-info">Wardrobe system not available.</p>
<</if>>
<div class="choice-container">
<<vchoice "Back to Wardrobe" "Storage_Kira_Wardrobe" "action" "return">>
</div><h2>Repair Station</h2>
<p>Use cloth, scrap cloth or a sewing kit to restore damaged clothing. Each repair uses a piece of cloth or one of a kit's two uses, and restores 50 durability.</p>
<<set _hasCloth to setup.hasRepairMaterial()>>
<<set _clothCount to setup.repairsLeft()>>
<<if _hasCloth>>
<p class="system-info">You have cloth and thread for <strong><<= _clothCount>></strong> repair<<if _clothCount !== 1>>s<</if>>.</p>
<<else>>
<p class="system-warning">You don't have any cloth for repairs. Find cloth while scavenging.</p>
<</if>>
<<uinvGetWornClothing "top" "player">>
<<set _playerTop to $wornItem>>
<<set _playerTopDur to setup.clothingValue($clothing.player.top)>>
<<set _playerTopData to _playerTop ? $clothingDatabase.tops[_playerTop.replace(/ /g, "_")] : null>>
<<uinvGetWornClothing "bottom" "player">>
<<set _playerBottom to $wornItem>>
<<set _playerBottomDur to setup.clothingValue($clothing.player.bottom)>>
<<set _playerBottomData to _playerBottom ? $clothingDatabase.bottoms[_playerBottom.replace(/ /g, "_")] : null>>
<h3>Your Clothing</h3>
<div class="wardrobe-card-grid">
<div class="wardrobe-card">
<<if _playerTopData && _playerTopData.image>>
<div class="item-image">
<img @src="_playerTopData.image" alt="" onerror="this.style.display='none'">
</div>
<<else>>
<div class="item-image"></div>
<</if>>
<div class="item-name"><<if _playerTopData>><<= _playerTopData.name>><<else>>Top<</if>></div>
<div class="durability-bar">
<<if _playerTopDur >= 76>><<set _durClass to "good">>
<<elseif _playerTopDur >= 51>><<set _durClass to "worn">>
<<elseif _playerTopDur >= 26>><<set _durClass to "ripped">>
<<else>><<set _durClass to "ruined">><</if>>
<div @class="'durability-fill ' + _durClass" @style="'width: ' + _playerTopDur + '%'"></div>
<span class="durability-text"><<= _playerTopDur>>%</span>
</div>
<<if _playerTopDur < 100 && _hasCloth>>
<div class="item-actions">
<<link "[Repair +50%]">>
<<uinvRepairClothing "top" 50 "player">>
<<run setup.useRepairMaterial()>>
<<goto "Storage_Repair_Station">>
<</link>>
</div>
<<elseif _playerTopDur >= 100>>
<div class="item-meta">Good condition</div>
<<else>>
<div class="item-meta" style="color: var(--danger);">Needs cloth to repair</div>
<</if>>
</div>
<div class="wardrobe-card">
<<if _playerBottomData && _playerBottomData.image>>
<div class="item-image">
<img @src="_playerBottomData.image" alt="" onerror="this.style.display='none'">
</div>
<<else>>
<div class="item-image"></div>
<</if>>
<div class="item-name"><<if _playerBottomData>><<= _playerBottomData.name>><<else>>Bottom<</if>></div>
<div class="durability-bar">
<<if _playerBottomDur >= 76>><<set _durClass to "good">>
<<elseif _playerBottomDur >= 51>><<set _durClass to "worn">>
<<elseif _playerBottomDur >= 26>><<set _durClass to "ripped">>
<<else>><<set _durClass to "ruined">><</if>>
<div @class="'durability-fill ' + _durClass" @style="'width: ' + _playerBottomDur + '%'"></div>
<span class="durability-text"><<= _playerBottomDur>>%</span>
</div>
<<if _playerBottomDur < 100 && _hasCloth>>
<div class="item-actions">
<<link "[Repair +50%]">>
<<uinvRepairClothing "bottom" 50 "player">>
<<run setup.useRepairMaterial()>>
<<goto "Storage_Repair_Station">>
<</link>>
</div>
<<elseif _playerBottomDur >= 100>>
<div class="item-meta">Good condition</div>
<<else>>
<div class="item-meta" style="color: var(--danger);">Needs cloth to repair</div>
<</if>>
</div>
</div>
<<if $clothing.kira>>
<<set _kiraTopDur to ($clothing.kira.top ?? 100)>>
<<set _kiraBottomDur to ($clothing.kira.bottom ?? 100)>>
<<uinvGetWornClothing "top" "kira">>
<<set _kiraWornTopName to $wornItem>>
<<set _kiraTopData to _kiraWornTopName ? $clothingDatabase.tops[_kiraWornTopName.replace(/ /g, "_")] : null>>
<<uinvGetWornClothing "bottom" "kira">>
<<set _kiraWornBottomName to $wornItem>>
<<set _kiraBottomData to _kiraWornBottomName ? $clothingDatabase.bottoms[_kiraWornBottomName.replace(/ /g, "_")] : null>>
<h3>Kira's Clothing</h3>
<div class="wardrobe-card-grid">
<div class="wardrobe-card">
<<if _kiraTopData && _kiraTopData.image>>
<div class="item-image">
<img @src="_kiraTopData.image" alt="" onerror="this.style.display='none'">
</div>
<<else>>
<div class="item-image"></div>
<</if>>
<div class="item-name"><<if _kiraTopData>><<= _kiraTopData.name>><<else>>Top<</if>></div>
<div class="durability-bar">
<<if _kiraTopDur >= 76>><<set _durClass to "good">>
<<elseif _kiraTopDur >= 51>><<set _durClass to "worn">>
<<elseif _kiraTopDur >= 26>><<set _durClass to "ripped">>
<<else>><<set _durClass to "ruined">><</if>>
<div @class="'durability-fill ' + _durClass" @style="'width: ' + _kiraTopDur + '%'"></div>
<span class="durability-text"><<= _kiraTopDur>>%</span>
</div>
<<if _kiraTopDur < 100 && _hasCloth>>
<div class="item-actions">
<<link "[Repair +50%]">>
<<uinvRepairClothing "top" 50 "kira">>
<<run setup.useRepairMaterial()>>
<<goto "Storage_Repair_Station">>
<</link>>
</div>
<<elseif _kiraTopDur >= 100>>
<div class="item-meta">Good condition</div>
<<else>>
<div class="item-meta" style="color: var(--danger);">Needs cloth to repair</div>
<</if>>
</div>
<div class="wardrobe-card">
<<if _kiraBottomData && _kiraBottomData.image>>
<div class="item-image">
<img @src="_kiraBottomData.image" alt="" onerror="this.style.display='none'">
</div>
<<else>>
<div class="item-image"></div>
<</if>>
<div class="item-name"><<if _kiraBottomData>><<= _kiraBottomData.name>><<else>>Bottom<</if>></div>
<div class="durability-bar">
<<if _kiraBottomDur >= 76>><<set _durClass to "good">>
<<elseif _kiraBottomDur >= 51>><<set _durClass to "worn">>
<<elseif _kiraBottomDur >= 26>><<set _durClass to "ripped">>
<<else>><<set _durClass to "ruined">><</if>>
<div @class="'durability-fill ' + _durClass" @style="'width: ' + _kiraBottomDur + '%'"></div>
<span class="durability-text"><<= _kiraBottomDur>>%</span>
</div>
<<if _kiraBottomDur < 100 && _hasCloth>>
<div class="item-actions">
<<link "[Repair +50%]">>
<<uinvRepairClothing "bottom" 50 "kira">>
<<run setup.useRepairMaterial()>>
<<goto "Storage_Repair_Station">>
<</link>>
</div>
<<elseif _kiraBottomDur >= 100>>
<div class="item-meta">Good condition</div>
<<else>>
<div class="item-meta" style="color: var(--danger);">Needs cloth to repair</div>
<</if>>
</div>
</div>
<</if>>
<div class="choice-container">
<<vchoice "Back to Storage" "Vault_Storage" "action" "return">>
</div><h2>Store Items in Vault</h2>
<p>Place items from your backpack into vault storage for later use.</p>
<<if $vaultFull>>
<div class="feedback-message error">Vault storage is full!</div>
<<set $vaultFull to false>>
<</if>>
<<if typeof UInv !== 'undefined' && UInv.BagExists("player")>>
<<set _playerItems to UInv.GetItemsArray("player")>>
<<uinvGetVaultCount>>
<<if _playerItems.length === 0>>
<p class="system-info">Your backpack is empty.</p>
<<else>>
<div class="storage-transfer">
<h3>Your Backpack (<<print _playerItems.length>> items)</h3>
<div class="inventory-grid">
<<for _itemName range _playerItems>>
<<set _qty to UInv.GetItemPropertyValue("player", _itemName, "UInvQuantity") || 1>>
<<set _singular to UInv.GetItemPropertyValue("player", _itemName, "singular") || _itemName>>
<<set _types to UInv.GetItemPropertyValue("player", _itemName, "type") || []>>
<<set _rarity to UInv.GetItemPropertyValue("player", _itemName, "rarity") || "common">>
<<capture _itemName, _qty, _singular>>
<div @class="'inventory-slot ' + (_rarity)">
<div class="item-header">
<span class="item-name"><<print _singular>></span>
<<if _qty > 1>><span class="item-quantity-badge">x<<print _qty>></span><</if>>
</div>
<div class="item-actions">
<<link "[Store]">>
<<uinvStoreInVault _itemName 1>>
<<goto "Storage_Store_Items">>
<</link>>
<<if _qty > 1>>
<<link "[Store All]">>
<<uinvStoreInVault _itemName _qty>>
<<goto "Storage_Store_Items">>
<</link>>
<</if>>
</div>
</div>
<</capture>>
<</for>>
</div>
</div>
<</if>>
<<else>>
<p class="system-info">Inventory system not available.</p>
<</if>>
<div class="choice-container">
<<vchoice "Back to Storage" "Vault_Storage" "action" "return">>
</div><h2>Retrieve Items from Vault</h2>
<p>Take items from vault storage into your backpack.</p>
<<if $inventoryFull>>
<div class="feedback-message error">Your backpack is full!</div>
<<set $inventoryFull to false>>
<</if>>
<<if typeof UInv !== 'undefined' && UInv.BagExists("vault")>>
<<set _vaultItems to UInv.GetItemsArray("vault")>>
<<set _playerItems to UInv.GetItemsArray("player")>>
<<set _maxSlots to UInv.GetBagPropertyValue("player", "maxSlots") || setup.BACKPACK_SLOTS>>
<p class="storage-info">Your backpack: <<print _maxSlots - setup.bagFree("player")>>/<<print _maxSlots>> used</p>
<<if _vaultItems.length === 0>>
<p class="system-info">Vault storage is empty.</p>
<<else>>
<div class="storage-transfer">
<h3>Vault Storage (<<print _vaultItems.length>> items)</h3>
<div class="inventory-grid">
<<for _itemName range _vaultItems>>
<<set _qty to UInv.GetItemPropertyValue("vault", _itemName, "UInvQuantity") || 1>>
<<set _singular to UInv.GetItemPropertyValue("vault", _itemName, "singular") || _itemName>>
<<set _types to UInv.GetItemPropertyValue("vault", _itemName, "type") || []>>
<<set _rarity to UInv.GetItemPropertyValue("vault", _itemName, "rarity") || "common">>
<<set _desc to UInv.GetItemPropertyValue("vault", _itemName, "description") || "">>
<<capture _itemName, _qty, _singular>>
<div @class="'inventory-slot ' + (_rarity)">
<div class="item-header">
<span class="item-name"><<print _singular>></span>
<<if _qty > 1>><span class="item-quantity-badge">x<<print _qty>></span><</if>>
</div>
<div class="item-actions">
<<link "[Take]">>
<<uinvRetrieveFromVault _itemName 1>>
<<goto "Storage_Retrieve_Items">>
<</link>>
<<if _qty > 1>>
<<link "[Take All]">>
<<uinvRetrieveFromVault _itemName _qty>>
<<goto "Storage_Retrieve_Items">>
<</link>>
<</if>>
</div>
</div>
<</capture>>
<</for>>
</div>
</div>
<</if>>
<<else>>
<p class="system-info">Inventory system not available.</p>
<</if>>
<div class="choice-container">
<<vchoice "Back to Storage" "Vault_Storage" "action" "return">>
</div><<widget "addClothingToWardrobe">>
<<set _itemId to _args[0]>>
<<set _slot to _args[1]>>
<<set _owner to _args[2] || "player">>
<<set _bag to _owner + " wardrobe">>
<<set _name to _itemId.replace(/_/g, " ")>>
<<if typeof UInv !== 'undefined' && UInv.BagExists(_bag)>>
<<if !UInv.BagHasItem(_bag, _name)>>
<<set _dbKey to _itemId>>
<<set _dbEntry to $clothingDatabase[_slot + "s"][_dbKey]>>
<<run UInv.AddItem(_bag, _name, 1)>>
<<run UInv.SetItemPropertyValue(_bag, _name, "slot", _slot)>>
<<run UInv.SetItemPropertyValue(_bag, _name, "durability", 100)>>
<<run UInv.SetItemPropertyValue(_bag, _name, "maxDurability", 100)>>
<<if _dbEntry>>
<<run UInv.SetItemPropertyValue(_bag, _name, "style", _dbEntry.style || "casual")>>
<<run UInv.SetItemPropertyValue(_bag, _name, "image", _dbEntry.image || "")>>
<<run UInv.SetItemPropertyValue(_bag, _name, "singular", _dbEntry.name || _name)>>
<</if>>
<<set _addedToWardrobe to true>>
<<else>>
<<set _addedToWardrobe to false>>
<</if>>
<</if>>
<</widget>>
<<widget "addClothingToWorn">>
<<set _itemId to _args[0]>>
<<set _slot to _args[1]>>
<<set _owner to _args[2] || "player">>
<<set _bag to _owner + " worn">>
<<set _name to _itemId.replace(/_/g, " ")>>
<<if typeof UInv !== 'undefined' && UInv.BagExists(_bag)>>
<<if !UInv.BagHasItem(_bag, _name)>>
<<set _dbKey to _itemId>>
<<set _dbEntry to $clothingDatabase[_slot + "s"][_dbKey]>>
<<run UInv.AddItem(_bag, _name, 1)>>
<<run UInv.SetItemPropertyValue(_bag, _name, "slot", _slot)>>
<<run UInv.SetItemPropertyValue(_bag, _name, "durability", 100)>>
<<run UInv.SetItemPropertyValue(_bag, _name, "maxDurability", 100)>>
<<if _dbEntry>>
<<run UInv.SetItemPropertyValue(_bag, _name, "style", _dbEntry.style || "casual")>>
<<run UInv.SetItemPropertyValue(_bag, _name, "image", _dbEntry.image || "")>>
<<run UInv.SetItemPropertyValue(_bag, _name, "singular", _dbEntry.name || _name)>>
<</if>>
<</if>>
<</if>>
<</widget>>
<<widget "redressFromStores">>
<<set _rfsOwner to _args[0] || "player">>
<<for _rfsSlot range ["top", "bottom"]>>
<<uinvGetWornClothing _rfsSlot _rfsOwner>>
<<if !$wornItem>>
<<uinvGetWardrobeItems _rfsSlot _rfsOwner>>
<<if $wardrobeItems.length>>
<<uinvWearClothing $wardrobeItems[0] _rfsOwner>>
<<else>>
<<addClothingToWorn `_rfsSlot === "top" ? (_rfsOwner === "kira" ? "tank_top" : "survivor_shirt") : "cargo_pants"` _rfsSlot _rfsOwner>>
<</if>>
<</if>>
<<uinvRepairClothing _rfsSlot 100 _rfsOwner>>
<</for>>
<<if typeof UInv === "undefined" || !UInv.BagExists(_rfsOwner + " worn")>>
<<set $clothing[_rfsOwner].top to 100>>
<<set $clothing[_rfsOwner].bottom to 100>>
<</if>>
<<set $clothing[_rfsOwner].underwear to 100>>
<<if _rfsOwner === "player">><<set $clothing.player.dickOut to false>><</if>>
<<updateExposure _rfsOwner true>>
<</widget>>
<<widget "damageClothingWithArmor">>
<<set _who to _args[0]>>
<<set _part to _args[1]>>
<<set _damage to Number(_args[2]) || 15>>
<<if _who === "player" && setup.armorDurability() && setup.armorDurability().current gt 0>>
<<set _armorHit to setup.damageArmor(_damage)>>
<<set _remainingDamage to _damage - _armorHit.absorbed>>
<<if _armorHit.broken>>
<<set _brokenArmor to _armorHit.broken>>
<p class="system-alert">Your <<print _brokenArmor.name>> breaks apart!</p>
<</if>>
<<if _remainingDamage > 0>>
<<damageClothing _who _part _remainingDamage>>
<</if>>
<<else>>
<<damageClothing _who _part _damage>>
<</if>>
<</widget>>
<<widget "equipIntimate">>
<<set _who to _args[0]>>
<<set _itemId to _args[1]>>
<<if _who === "player">>
<<if $wardrobe.player.intimate.includes(_itemId) || _itemId === "commando">>
<<set $wardrobe.player.equipped to _itemId>>
<<set $clothing.player.underwearType to _itemId>>
<<set _item to $intimateApparel.player[_itemId]>>
<<set $clothing.player.underwear to _item.durability>>
<<updateExposure "player" true>>
<</if>>
<<elseif _who === "kira">>
<<if $wardrobe.kira.intimate.includes(_itemId)>>
<<set _item to $intimateApparel.kira[_itemId]>>
<<set _canEquip to true>>
<<if _item.requires>>
<<if _item.requires.exhibitionism && $exhibitionism.kira < _item.requires.exhibitionism>>
<<set _canEquip to false>>
<</if>>
<<if _item.requires.trust && $companions[0].trust < _item.requires.trust>>
<<set _canEquip to false>>
<</if>>
<</if>>
<<if _canEquip>>
<<set $wardrobe.kira.equipped to _itemId>>
<<set $clothing.kira.underwearType to _itemId>>
<<set $clothing.kira.underwear to _item.durability>>
<</if>>
<</if>>
<</if>>
<</widget>>
<<widget "getExhibTier">>
<<set _who to _args[0]>>
<<set _val to $exhibitionism[_who]>>
<<if _val <= 15>>
<<set _exhibTier to 0>>
<<set _exhibName to "mortified">>
<<elseif _val <= 35>>
<<set _exhibTier to 1>>
<<set _exhibName to "embarrassed">>
<<elseif _val <= 55>>
<<set _exhibTier to 2>>
<<set _exhibName to "uncomfortable">>
<<elseif _val <= 75>>
<<set _exhibTier to 3>>
<<set _exhibName to "tolerant">>
<<elseif _val <= 90>>
<<set _exhibTier to 4>>
<<set _exhibName to "shameless">>
<<else>>
<<set _exhibTier to 5>>
<<set _exhibName to "exhibitionist">>
<</if>>
<</widget>>
<<widget "gainExhibitionism">>
<<set _who to _args[0]>>
<<set _amount to _args[1] || 1>>
<<set _reason to _args[2] || "">>
<<set $exhibitionism[_who] to Math.min(100, $exhibitionism[_who] + _amount)>>
<<if _who === "player">><<set $flags.exhibitionismGain to true>><</if>>
<<set $flags.exposedToday to true>>
<<set $flags.exposedDuringDay to true>>
<</widget>>
<<widget "updateExhibitionism">>
<<set _oldPlayerTier to 0>>
<<set _oldKiraTier to 0>>
<<getExhibTier "player">>
<<set _oldPlayerTier to _exhibTier>>
<<getExhibTier "kira">>
<<set _oldKiraTier to _exhibTier>>
<<if $clothing.player.dickExposed || $clothing.player.assExposed>>
<<set $exhibitionism.player to Math.min(100, $exhibitionism.player + 1)>>
<</if>>
<<if $clothing.kira.titsExposed || $clothing.kira.pussyExposed || $clothing.kira.assExposed>>
<<set $exhibitionism.kira to Math.min(100, $exhibitionism.kira + 1)>>
<</if>>
<<getExhibTier "player">>
<<if _exhibTier > _oldPlayerTier>>
<<set $flags.playerTierUpPending to true>>
<</if>>
<<getExhibTier "kira">>
<<if _exhibTier > _oldKiraTier>>
<<set $flags.kiraTierUpPending to true>>
<</if>>
<<if !$clothing.player.dickExposed && !$clothing.player.assExposed>>
<<set $exhibitionism.player to Math.max(0, $exhibitionism.player - 1)>>
<</if>>
<<if !$clothing.kira.titsExposed && !$clothing.kira.pussyExposed && !$clothing.kira.assExposed>>
<<set $exhibitionism.kira to Math.max(0, $exhibitionism.kira - 1)>>
<</if>>
<</widget>>
<<widget "playerExposedReaction">>
<<getExhibTier "player">>
<<switch _exhibTier>>
<<case 0>>
<p class="thought">This is humiliating. You can barely function like this.</p>
<<case 1>>
<p class="thought">You're intensely aware of how exposed you are. Your face burns.</p>
<<case 2>>
<p class="thought">You're uncomfortable, but trying to manage it.</p>
<<case 3>>
<p class="thought">You've gotten used to this. It's not ideal, but it's bearable.</p>
<<case 4>>
<p class="thought">Honestly? You don't care that much anymore.</p>
<<case 5>>
<p class="thought">Part of you actually enjoys this. The exposure. The attention. The freedom.</p>
<</switch>>
<</widget>>
<<widget "kiraClothingPreference">>
<<getExhibTier "kira">>
<<set $kiraClothingPref to {
prefersRevealing: (_exhibTier >= 4),
toleratesRevealing: (_exhibTier >= 2),
wantsRepairsASAP: (_exhibTier <= 2),
enjoysBeingSeen: (_exhibTier >= 4),
willChooseCommando: (_exhibTier >= 5)
}>>
<</widget>>
<<widget "kiraChoosesOwnClothes">>
<<kiraClothingPreference>>
<<if $kiraClothingPref.willChooseCommando && $wardrobe.kira.intimate.includes("commando")>>
<<equipIntimate "kira" "commando">>
<p>Kira chooses to go without underwear today. She catches your look and shrugs.</p>
<<elseif $kiraClothingPref.prefersRevealing && $wardrobe.kira.intimate.includes("lingerie")>>
<<equipIntimate "kira" "lingerie">>
<p>Kira picks out the lingerie. "Might as well look good," she says.</p>
<<else>>
<<equipIntimate "kira" "standard">>
<p>Kira picks out her standard outfit and gets dressed.</p>
<</if>>
<</widget>>
<<widget "applyArmorEffects">>
<<set $combat.armorEffects = {
defense: 0,
mobilityPenalty: 0,
magicResist: 0,
magicBonus: 0,
intimidation: false
}>>
<<if $equipped.armor>>
<<set _armor to $equipped.armor>>
<<set $combat.armorEffects.defense to _armor.defense>>
<<if _armor.effects>>
<<if _armor.effects.mobilityPenalty>>
<<set $combat.armorEffects.mobilityPenalty to _armor.effects.mobilityPenalty>>
<</if>>
<<if _armor.effects.magicResist>>
<<set $combat.armorEffects.magicResist to _armor.effects.magicResist>>
<</if>>
<<if _armor.effects.magicBonus>>
<<set $combat.armorEffects.magicBonus to _armor.effects.magicBonus>>
<</if>>
<<if _armor.effects.intimidation>>
<<set $combat.armorEffects.intimidation to true>>
<</if>>
<</if>>
<<if setup.armorDurability().current <= (setup.armorDurability().max * 0.25)>>
<<set $flags.armorDamagedWarning to true>>
<</if>>
<</if>>
<</widget>>
<<widget "checkWardrobeMalfunction">>
<<set _who to _args[0]>>
<<set _action to _args[1]>>
<<set _chance to 0>>
<<if _who === "player">>
<<set _topState to $clothing.player.top>>
<<set _bottomState to $clothing.player.bottom>>
<<elseif _who === "kira">>
<<set _topState to $clothing.kira.top>>
<<set _bottomState to $clothing.kira.bottom>>
<</if>>
<<if _topState > 0 && _topState <= 25>>
<<switch _action>>
<<case "running" "climbing">>
<<set _chance to 20>>
<<case "combat">>
<<set _chance to 25>>
<<case "swimming">>
<<set _chance to 40>>
<</switch>>
<<if random(1, 100) <= _chance>>
<<damageClothing _who "top" 25>>
<p class="wardrobe-malfunction">Wardrobe malfunction! <<if _who === "player">>Your shirt tears completely!<<else>>Kira's top gives out completely!<</if>></p>
<</if>>
<</if>>
<<if _bottomState > 0 && _bottomState <= 25>>
<<switch _action>>
<<case "running" "climbing">>
<<set _chance to 20>>
<<case "combat">>
<<set _chance to 25>>
<<case "swimming">>
<<set _chance to 40>>
<</switch>>
<<if random(1, 100) <= _chance>>
<<damageClothing _who "bottom" 25>>
<p class="wardrobe-malfunction">Wardrobe malfunction! <<if _who === "player">>Your pants tear apart!<<else>>Kira's pants fall apart!<</if>></p>
<</if>>
<</if>>
<</widget>>
<<widget "saveOutfit">>
<<set _who to _args[0]>>
<<set _name to _args[1]>>
<<uinvGetWornClothing "top" _who>>
<<set _savedTop to $wornItem>>
<<uinvGetWornClothing "bottom" _who>>
<<set _savedBottom to $wornItem>>
<<set _outfit to {
name: _name,
armor: clone($equipped.armor),
top: _savedTop,
bottom: _savedBottom,
intimate: $wardrobe[_who].equipped,
description: "Saved on Day " + $time.day
}>>
<<run $savedOutfits[_who].push(_outfit)>>
<</widget>>
<<widget "loadOutfit">>
<<set _who to _args[0]>>
<<set _index to _args[1]>>
<<set _outfit to $savedOutfits[_who][_index]>>
<<if _who === "player">>
<<if _outfit.armor && _outfit.armor.name>>
<<uinvEquipArmor _outfit.armor.name>>
<<elseif $equipped.armor>>
<<uinvUnequipArmor>>
<</if>>
<<if _outfit.top>>
<<uinvWearClothing _outfit.top "player">>
<</if>>
<<if _outfit.bottom>>
<<uinvWearClothing _outfit.bottom "player">>
<</if>>
<<equipIntimate "player" _outfit.intimate>>
<<set $clothing.player.top to 100>>
<<set $clothing.player.bottom to 100>>
<<updateExposure "player" true>>
<<set $flags.lastKiraStyleReactionDay to 0>>
<</if>>
<</widget>>
<<widget "checkFirstExposure">>
<<set _who to _args[0]>>
<<if _who === "player">>
<<if $clothing.player.dickExposed && !$flags.playerFirstExposure>>
<<set $flags.playerFirstExposure to true>>
<<set $flags.exposureEventPending to "Event_First_Exposure_Player">>
<</if>>
<<elseif _who === "kira">>
<<set _cfeForfeit to setup.fishingGame.kiraForfeit()>>
<<if $clothing.kira.titsExposed && !$flags.kiraFirstTitsExposure && !_cfeForfeit>>
<<set $flags.kiraFirstTitsExposure to true>>
<<if !$clothing.kira.pussyExposed>>
<<set $flags.exposureEventPending to "Event_First_Exposure_Kira">>
<</if>>
<</if>>
<<if $clothing.kira.pussyExposed && !$flags.kiraFirstPussyExposure && _cfeForfeit !== "naked">>
<<set $flags.kiraFirstPussyExposure to true>>
<<set $flags.exposureEventPending to "Event_First_Exposure_Kira_Pussy">>
<</if>>
<</if>>
<</widget>>
<<widget "repairUnderwearCard">>
<<set _ruwOwner to _args[0] || "player">>
<<set _ruwDur to setup.clothingValue($clothing[_ruwOwner] && $clothing[_ruwOwner].underwear)>>
<<set _ruwId to ($wardrobe && $wardrobe[_ruwOwner] && $wardrobe[_ruwOwner].equipped) || "standard">>
<<set _ruwImage to _ruwDur > 0 ? setup.underwearImage(_ruwOwner, _ruwId) : "">>
<<set _ruwData to $intimateApparel && $intimateApparel[_ruwOwner] ? $intimateApparel[_ruwOwner][_ruwId] : null>>
<<set _ruwNone to _ruwId === "commando">>
<div class="wardrobe-card" @data-repair="_ruwOwner + '-underwear'">
<<if _ruwImage>>
<div class="item-image"><img @src="_ruwImage" alt="" onerror="this.style.display='none'"></div>
<div class="item-name"><<= (_ruwData && _ruwData.name) || "Underwear">></div>
<<else>>
<div class="item-image"><img class="item-icon" src="assets/icons/body/no-underwear.svg" alt=""></div>
<div class="item-name">No Underwear</div>
<</if>>
<div class="durability-bar">
<<if _ruwDur >= 76>><<set _dc to "good">><<elseif _ruwDur >= 51>><<set _dc to "worn">><<elseif _ruwDur >= 26>><<set _dc to "ripped">><<else>><<set _dc to "ruined">><</if>>
<div @class="'durability-fill ' + _dc" @style="'width: ' + _ruwDur + '%'"></div>
<span class="durability-text"><<= _ruwDur>>%</span>
</div>
<<if _ruwNone>>
<<elseif _ruwDur < 100 && _hasCloth>>
<<capture _ruwOwner>>
<div class="item-actions"><<link "[Repair]">><<uinvRepairClothing "underwear" 50 _ruwOwner>><<run setup.useRepairMaterial()>><<goto "Vault_Storage">><</link>></div>
<</capture>>
<<elseif _ruwDur < 100>>
<div class="item-meta" style="color: var(--danger);">Needs cloth to repair</div>
<</if>>
</div>
<</widget>><<widget "entityHPBar">>
<<set _hpEntity to _args[0]>>
<div class="stat-row">
<span class="stat-label">HP:</span>
<div class="stat-bar health-bar">
<div class="stat-fill" @style="'width: ' + Math.floor((_hpEntity.health / _hpEntity.maxHealth) * 100) + '%'"></div>
</div>
<span class="stat-value"><<print _hpEntity.health>>/<<print _hpEntity.maxHealth>></span>
</div>
<</widget>>
<<widget "entityPosition">>
<<set _posEntity to _args[0]>>
<<if _posEntity.position && _posEntity.position !== "standing">>
<div class="card-position">
<<getPositionIcon _posEntity>>
<<icon _positionIcon "medium">>
Position: <<print _posEntity.position.replace("_", " ").toUpperFirst()>>
</div>
<</if>>
<</widget>>
<<widget "entityExposure">>
<<set _expEntity to _args[0]>>
<<if _expEntity.clothing && (_expEntity.clothing.titsExposed || _expEntity.clothing.pussyExposed)>>
<div class="card-exposure">
<<icon "hazard-sign" "medium">>
<<if _expEntity.clothing.titsExposed>>Tits Exposed<</if>>
<<if _expEntity.clothing.titsExposed && _expEntity.clothing.pussyExposed>> · <</if>>
<<if _expEntity.clothing.pussyExposed>>Pussy Exposed<</if>>
</div>
<</if>>
<</widget>>
<<widget "enemyCardStats">>
<<set _statsEntity to _args[0]>>
<div class="card-stats">
<<entityHPBar _statsEntity>>
<<entityPosition _statsEntity>>
<<entityExposure _statsEntity>>
</div>
<</widget>>