<<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.seenKiraTits>>
<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">
<<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>
<div class="choice-container">
<<link "Get up and face the day" $currentLocation || "Vault_Hub">>
<</link>>
</div><<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 _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>>
<<switch _kiraTopState>>
<<case "worn">>
<<addTension "kira" _wornVal>>
<<case "ripped">>
<<addTension "kira" _rippedVal>>
<<case "ruined">>
<<addTension "kira" _ruinedVal>>
<</switch>>
<<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>>
<<switch _playerBottomState>>
<<case "worn">>
<<addTension "kira" _wornVal>>
<<case "ripped">>
<<clampStat "player.lust" (Math.floor(_rippedVal * 0.6))>>
<<addTension "kira" _rippedVal>>
<<case "ruined">>
<<clampStat "player.lust" (Math.floor(_ruinedVal * 0.5))>>
<<addTension "kira" _ruinedVal>>
<</switch>>
<</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 $clothing.kira && $clothing.kira.titsExposed>>
<<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>>
<</if>>
<<if $clothing.kira && $clothing.kira.pussyExposed>>
<<set _val to _kiraCfg && _kiraCfg.pussyExposed ? _kiraCfg.pussyExposed : { tension: 20 }>>
<<addTension "kira" _val.tension>>
<</if>>
<<if $clothing.kira && $clothing.kira.assExposed>>
<<set _val to _kiraCfg && _kiraCfg.assExposed ? _kiraCfg.assExposed : { tension: 5 }>>
<<addTension "kira" _val.tension>>
<</if>>
<<if $clothing.player && $clothing.player.dickExposed>>
<<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>>
<</if>>
<<if $clothing.player && $clothing.player.assExposed>>
<<set _val to _playerCfg && _playerCfg.assExposed ? _playerCfg.assExposed : { playerLust: 3 }>>
<<if _val.playerLust>>
<<clampStat "player.lust" _val.playerLust>>
<</if>>
<</if>>
<</if>>
<</widget>><<if $player.lust >= 60>>
<div class="edging-option">
<h3>Arousal Management</h3>
<<if $arousal.player.edging>>
<div class="status-edging">
<p><strong>Current Status:</strong> EDGING ACTIVE</p>
<p>You're riding the edge of pleasure, denying yourself release. Your body is sensitive, responsive.</p>
</div>
<div class="edging-bonuses">
<h4>Active Bonuses While Edging:</h4>
<ul>
<li>+15% Damage (increased aggression)</li>
<li>+20% Seduction (heightened sensitivity makes you more alluring)</li>
<li>+15% Intimidation (raw presence intensified by arousal)</li>
</ul>
<p class="bonus-note">Days at high arousal: $arousal.player.daysAtHigh / 5 (forced release triggers at 5)</p>
</div>
<div class="choice-container">
<<vchoice "Stop edging and release" "Edging_Toggle_Option" "action" "shower">>
</div>
<<script>>
if ($arousal.player.edging) {
$arousal.player.edging = false;
$player.lust = Math.max(10, $player.lust - 20);
$arousal.player.daysAtHigh = 0;
}
<</script>>
<<else>>
<div class="status-normal">
<p><strong>Current Status:</strong> NORMAL</p>
<p>You could control your arousal through careful edging, building power for later.</p>
</div>
<div class="edging-bonuses">
<h4>Bonuses While Edging:</h4>
<ul>
<li>+15% Damage (increased aggression)</li>
<li>+20% Seduction (heightened sensitivity makes you more alluring)</li>
<li>+15% Intimidation (raw presence intensified by arousal)</li>
</ul>
<p class="warning-note">Warning: Edging for 5+ days at high arousal will trigger forced wet dream</p>
</div>
<div class="choice-container">
<<vchoice "Start edging" "Edging_Toggle_Option" "action" "rapid-strikes">>
</div>
<<script>>
if (!$arousal.player.edging && $player.lust >= 60) {
$arousal.player.edging = true;
$arousal.player.daysAtHigh = 0;
}
<</script>>
<</if>>
</div>
<<else>>
<div class="edging-option">
<p class="unavailable">Arousal Management unavailable. Lust must be at least 60 to edge. (Current: $player.lust)</p>
</div>
<</if>><<setBackground "vault-bedroom">>
<h2>The Breaking Point</h2>
<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 $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>>
<p class="explicit"><<randomLine "wet_dream" "kira_appears" true>></p>
<p class="explicit">Her voice is breathy, desperate. "I can feel how much you need this," she whispers.</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>
<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>>
<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. The sheets are soaked. Your heart pounds as reality slowly reasserts itself.</p>
<<set $player.lust to 30>>
<<set $arousal.player.edging to false>>
<<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 50>>
<<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>
<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><<widget "checkForcedRelease">>
<<if $arousal.player.edging && $arousal.player.daysAtHigh >= 5 && $player.lust >= 80>>
<<goto "Event_Forced_Release">>
<</if>>
<</widget>><<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_quarters">>
<<elseif $currentLocation === "training_yard">>
<<setBackground "training_yard">>
<<elseif $currentLocation === "bathroom">>
<<setBackground "bathroom">>
<<else>>
<<setBackground "vault_corridor">>
<</if>>
<<showCharacter "kira" "center" "desperate">>
Kira corners you. Her eyes are wild.
<<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—">>
She breaks off. Her hand fists in your shirt.
<<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.
<<say "Kira" "Finally—">>
She kisses you like she's drowning and you're air.
Her hands are everywhere. Desperate. Demanding.
<<say "Kira" "Now. Right now.">>
<<if $currentLocation === "kira_room" || $currentLocation === "quarters">>
<<goto "Kira_Sex_TensionRelease_Bedroom">>
<<else>>
<<goto "Kira_Sex_TensionRelease_Wherever">>
<</if>><<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.">>
She turns and walks away. Fast. Doesn't look back.
<<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" "action" "forward">>
<<elseif $currentLocation === "bathroom">>
<<vchoice "Continue" "Bathroom" "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_quarters">>
<<elseif $currentLocation === "training_yard">>
<<setBackground "training_yard">>
<<elseif $currentLocation === "bathroom">>
<<setBackground "bathroom">>
<<else>>
<<setBackground "vault_corridor">>
<</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.
<<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" "action" "forward">>
<<elseif $currentLocation === "bathroom">>
<<vchoice "Continue" "Bathroom" "action" "forward">>
<<else>>
<<vchoice "Continue" "Kira_Room" "action" "forward">>
<</if>>
</div><<setBackground "kira_quarters">>
<<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.
<<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">>
She pulls you down onto the narrow mattress, legs wrapping around you immediately.
<<say "Kira" "I've needed this. Needed YOU.">>
<<performSexAct "penetration_hard">>
You enter her in one hard thrust. She cries out, back arching.
<<say "Kira" "Yes— fuck— don't stop—">>
There's no buildup. No teasing. Just raw need finally getting satisfied.
<<performSexAct "sex_hard">>
The bed creaks violently under you. Her nails rake down your back. You fuck her hard into the mattress.
<<say "Kira" "Harder— I'm— fuck, I'm—">>
She comes apart under you, convulsing around your cock. 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">>
You slam into her. She takes it eagerly, meeting each thrust.
<<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)>>
<<set $companions[0].tension to Math.max(20, $companions[0].tension - 55)>>
<<addAffection "kira" 2>>
<<addTrust "kira" 5>>
<<set $flags.sleptWithKira 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>>
<<set $arousal.player.edging to false>>
<<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 "vault_storage">>
<<else>>
<<setBackground "vault_corridor">>
<</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">>
You lift her. She wraps her legs around you. You enter her against the wall.
<<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">>
She buries her face in your shoulder to muffle her scream as she comes.
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.
<<goto "Kira_Sex_Wherever_Aftermath">>
<</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">><<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)>>
<<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.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>>
<<set $arousal.player.edging to false>>
<<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" "action" "forward">>
<<elseif $currentLocation === "bathroom">>
<<vchoice "Continue" "Bathroom" "action" "forward">>
<<else>>
<<vchoice "Continue" "Kira_Room" "action" "forward">>
<</if>>
</div>SECTION 6: LUST & TENSION COMBAT WIDGETS
============================================================= */
<<widget "applyLustPenalties">>
<<if $player.lust >= 40 && $player.lust < 60>>
<<set $player.lustPenalty to 1>>
<<set $player.lustState to "distracted">>
<<elseif $player.lust >= 60 && $player.lust < 80>>
<<set $player.lustPenalty to 3>>
<<set $player.lustState to "aroused">>
<<elseif $player.lust >= 80>>
<<set $player.lustPenalty to 5>>
<<set $player.lustState to "overwhelmed">>
<<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 $combat.companionInCombat === "kira" || ($companions && $companions[0])>>
<p class="narrator-subtle"><<print setup.randomLine(setup.textPools.player_accidental_orgasm.kira_reaction)>></p>
<<clampStat "companions[0].tension" random(5, 10)>>
<</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)>>
<<if _inCombat>>
<<set $combat.playerDazed to true>>
<<set $combat.playerDazedTurns to 1>>
<<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(setup.textPools.arousal_narrative.player_cock_exposed)>></p>
<<else>>
<p class="narrator-subtle"><<print setup.randomLine(setup.textPools.arousal_narrative.player_cock_strain)>></p>
<</if>>
</div>
<<if ($combat.companionInCombat === "kira" || ($companions && $companions[0])) && !$flags.kiraNoticedArousal>>
<<clampStat "companions[0].tension" random(2, 5)>>
<<set $flags.kiraNoticedArousal to true>>
<</if>>
<</widget>>
<<widget "handleCompanionOrgasm">>
<<getCompanion $combat.companionInCombat>>
<<if !$tempCompanion>><<return>><</if>>
<<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 += random(10, 20)>>
<<if $combat && $combat.active>>
<<set $combat.kiraInRefractory to true>>
<<set $combat.kiraRefractoryTurns to 2>>
<<logCombat "Kira orgasms involuntarily!" "critical">>
<</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>><<setBackground "current">>
<<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" $currentLocation "action" "return">>
</div><<setBackground "current">>
<<showCharacter "kira" "center" "aroused">>
<<showEventMedia "arousal_grinding">>
<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>><<setBackground "current">>
<<showCharacter "kira" "center" "aroused">>
<<showEventMedia "arousal_just_tip">>
<<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 entrance. 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.">>
<p class="explicit">She sinks down slowly. Just the tip. Just the first inch. Her pussy grips you like a vice.</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>>
<<goto "Kira_JustTheTip_Escalates">>
<<else>>
<<goto "Kira_JustTheTip_Holds">>
<</if>><<showCharacter "kira" "center" "strained">>
<<advanceTime 0 30>>
<p class="narrator">You both hold still. Trembling. Every nerve screaming to move.</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.">>
Neither of you moves.
<<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.">>
She rolls off you, lying on her back, chest heaving.
<<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. "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>>
<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>>
<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.">>
You guide her to lie back on the bed. Your hands work her pants off slowly.
<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">You keep the pressure steady, your thumb finding her clit. She cries out, her pussy clenching around your fingers as she comes.</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 and dark eyes.
<<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 the obvious bulge in your pants and smirks.
<<say "Kira" "I can see that. Come here.">>
You move to the bed. She pushes you to sit, then kneels between your legs.
<<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">She starts stroking. Slow at first, then faster. Her grip is firm, her technique practiced. She knows exactly what she's doing.</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)>>
<<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" "flushed">>
<<advanceTime 0 30>>
<<say "Kira" "Let me take care of you.">>
She guides you to sit on the edge of the bed. Her hands work your pants open.
<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 length. 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">She picks up the pace, bobbing her head faster. You feel the pressure building. Your hands tangle in her hair.</p>
<<say $player.name "I'm going to—">>
<p class="explicit">She doesn't pull away. She takes you all the way through it as you come, swallowing everything.</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)>>
<<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><<run VaultUI.setBackground("kira_room")>>
<<run VaultUI.setTimeOfDay("intimate")>>
<<showCharacter "kira" "center" "aroused">>
<<advanceTime 0 30>>
<<say $player.name "Your turn.">>
You guide her to sit back, working her pants off.
<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">You slide two fingers into her while your tongue continues its work. She cries out, her whole body tensing.</p>
<<say "Kira" "Yes—right there—I'm gonna—">>
<p class="explicit">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.</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><<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.
<<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. Your hand tangles in her hair, pulling her head back so you can bite the column of her throat. She gasps, arching into you.
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]]<<showEventMedia "arousal/mutual_snap" {intensity: "hard", mood: "desperate"}>>
<<advanceTime 1 30>>
<h2>Devastation</h2>
There's no tenderness in this. No patience. Just raw, overwhelming <em>need</em>.
You don't make it to a bed. Don't even try.
Your back hits the wall—or maybe it's hers—and then she's pulling you down onto the floor. Metal grating digs into your knees. 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 floor, 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.">>
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.
You flip her over—still inside her—and take her from behind. She presses her cheek against the cold metal floor and spreads her legs wider.
"<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.
You lose track of positions. 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.
[[Collapse together|Mutual_Snap_Aftermath]]<<showCharacter "kira" "center" "post_sex">>
<<run $("body").removeClass("scene-mode-intense")>>
<h2>Aftermath</h2>
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">>
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>>
<<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 _kira.tensionFloor to 20>>
<<clampStat "player.energy" (-30) 0 50>>
You help each other clean up—finding scattered clothes, wiping away evidence. 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 $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 >= 30>>
<<set _tensionDecay to random(2, 5)>>
<<set _negTensionDecay to -_tensionDecay>>
<<clampStat "companions[0].tension" _negTensionDecay>>
<<elseif $companions[0].trust >= 50>>
<<set _tensionDecay to random(3, 7)>>
<<set _negTensionDecay to -_tensionDecay>>
<<clampStat "companions[0].tension" _negTensionDecay>>
<</if>>
<</if>>
<<updateBlueballCounters>>
<</widget>>
<<widget "updateBlueballCounters">>
<<if $player && $player.lust >= 80>>
<<set $arousal.player.daysAtHigh += 1>>
<<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>>
<<set $flags.kiraSnapPending to true>>
<</if>>
<</widget>>
<<widget "checkMutualSnap">>
<<if $arousal && $arousal.mutual && $arousal.mutual.daysAtHigh >= 3 && !$arousal.mutual.snapTriggered>>
<<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 $arousal.player.daysAtHigh to 0>>
<<set $arousal.player.lastRelease to $time.day>>
<<set $arousal.player.edging to false>>
<<set $arousal.player.blueBallsActive to false>>
<</widget>>
<<widget "deepConversationEffect">>
<<clampStat "player.lust" -10>>
<<clampStat "companions[0].tension" -8>>
<<addTrust "kira" 2>>
<<set $companions[0].affection += 1>>
<</widget>><<silently>><<include "WeaponDatabase">><</silently>>
<<if $currentLocation && $worldMap && $worldMap.nodes[$currentLocation]>>
<<set _node to $worldMap.nodes[$currentLocation]>>
<<set _terrain to _node.terrain || "reclaimed">>
<<set $combat.terrain to _terrain>>
<<elseif $journey && $journey.terrain>>
<<set $combat.terrain to $journey.terrain>>
<<else>>
<<set $combat.terrain to "reclaimed">>
<</if>>
<<run (function() {
var terrain = State.variables.combat.terrain;
var counts = { forest: 15, reclaimed: 11, highway: 9, ruins: 10, urban: 8 };
var count = counts[terrain] || 11;
var num = Math.floor(Math.random() * count) + 1;
State.variables.combat.backgroundImage = 'media/backgrounds/travel/terrain/' + terrain + '/' + terrain + '_' + num + '.webp';
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>>
<<set $combat.active to true>>
<<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.combo to {
count: 0,
lastAction: "",
target: -1,
bonus: 0
}>>
<<set $combat.playerBleeding to false>>
<<set $combat.playerStunned to 0>>
<<set $combat.playerDazed to false>>
<<set $combat.playerDazedTurns to 0>>
<<set $combat.playerVulnerable to false>>
<<set $combat.playerWristsBound 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>>
<<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.playerStunned === undefined>>
<<set $combat.playerStunned 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>>
<<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"
})>>
<</if>>
<</if>>
<<for _initIdx, _initEnemy range $combat.enemies>>
<<if _initEnemy>>
<<initHumiliation _initIdx>>
<<initArousalState _initIdx>>
<<initEnemyPosition _initIdx>>
<<initResistance _initIdx>>
<<initPainPleasure _initIdx>>
<<initClothingTactics _initIdx>>
<<initEnemyAbilityState _initEnemy>>
<</if>>
<</for>>
<<if !$combat.returnPassage>>
<<set $combat.returnPassage to "Travel_Continue">>
<</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-ready")>>
<<say "Kira" "Here we go. Watch my back!">>
<</if>>
<div class="choice-container">
<<vchoice "Begin Combat" "Combat_Actions" "action" "attack">>
</div><<validateKiraHealth>>
<<applyLustPenalties>>
<<checkTensionPenalty>>
<<checkLustEvent>>
<<handleLustEvents>>
<<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/unconscious.webp" alt="Kira Unconscious">
</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">
<<getCombatPortrait "kira">>
<video class="combat-portrait" autoplay loop muted playsinline>
<source @src="_portraitPath" type="video/webm">
</video>
</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 <<if $companions[0].tension >= 70>>critical<</if>>" @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 <<if _kiraLust >= 80>>critical<</if>>" @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">
<<getCombatPortrait "player">>
<video class="combat-portrait" autoplay loop muted playsinline>
<source @src="_portraitPath" type="video/webm">
</video>
</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 <<if _playerLust >= 80>>critical<</if>>" @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>>
<<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 + ')'">
<<set _enemySprite to "attacking">>
<<if _enemy.id === "raider_scout">>
<<set _enemySprite to "threatening">>
<</if>>
<<if _enemy.gender === "female" && _enemy.clothing>>
<<if _enemy.clothing.titsExposed && _enemy.clothing.pussyExposed>>
<<set _enemySprite to "naked">>
<<elseif _enemy.clothing.titsExposed>>
<<set _enemySprite to "exposed_tits">>
<<elseif _enemy.clothing.pussyExposed>>
<<set _enemySprite to "exposed_pussy">>
<<elseif _enemy.clothing.top <= 25 || _enemy.clothing.bottom <= 25>>
<<set _enemySprite to "torn">>
<</if>>
<</if>>
<<if _i === $combat.currentTarget>>
<div class="target-indicator"><<icon "crossed-swords" "small">> TARGET</div>
<</if>>
<<if _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>>
<img @src="'assets/images/char/raider/' + _enemySprite + '.webp'" @alt="_enemy.name">
<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"><<icon "hazard-sign" "small">> Fully Exposed</div><<elseif _enemy.clothing.titsExposed>><div class="enemy-exposure"><<icon "female" "small">> Tits Exposed</div><<elseif _enemy.clothing.pussyExposed>><div class="enemy-exposure severe"><<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 _lustPct to Math.min(100, Math.floor(_enemyLust))>>
<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)>></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 (-30% accuracy)
</div>
<</if>>
</div>
</details>
<</if>>
<<if _enemy.humiliationState === "embarrassed">>
<div class="enemy-humiliation embarrassed" title="Embarrassed: -10% accuracy, vulnerable to seduction"><<icon "flushed" "small">> Embarrassed</div>
<<elseif _enemy.humiliationState === "degraded">>
<div class="enemy-humiliation degraded" title="Degraded: -25% accuracy, -15% damage, highly vulnerable"><<icon "submission" "small">> Degraded</div>
<<elseif _enemy.humiliationState === "broken">>
<div class="enemy-humiliation broken" title="BROKEN: Cannot fight back, can be captured"><<icon "broken-heart" "small">> BROKEN</div>
<</if>>
<<if _enemy.position && _enemy.position !== "standing">>
<<set _posClass to (_enemy.position === "pinned") ? "position-pinned" : "position-vulnerable">>
<div class="enemy-position <<print _posClass>>">
<<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">
<<if _maleDickOut>>
<span class="buff-icon male-exposed" title="Dick Out - ready to assault"><<icon "hazard-sign" "medium">></span>
<<elseif _maleDesperate>>
<span class="buff-icon male-desperate" title="Desperate - will force immediately"><<icon "desperate" "medium">></span>
<<elseif _maleIntent>>
<span class="buff-icon sexual-intent" title="Sexual Intent - targeting Kira"><<icon "eye-target" "medium">></span>
<<elseif _maleAroused>>
<span class="buff-icon male-aroused" title="Visibly Aroused - bulge visible"><<icon "high-arousal" "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 (-30% accuracy)"><<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 $combat.playerDazedTurns === undefined || isNaN($combat.playerDazedTurns)>>
<<set $combat.playerDazedTurns to 0>>
<</if>>
<<if $combat.playerDazed && $combat.playerDazedTurns <= 0>>
<<set $combat.playerDazed to false>>
<</if>>
<<if $combat.playerDazed>>
<div class="player-dazed-notice">
<p class="dazed-text">You're still recovering from your orgasm... (<<print $combat.playerDazedTurns>> turn<<if $combat.playerDazedTurns gt 1>>s<</if>> remaining)</p>
<<set $combat.playerDazedTurns -= 1>>
<<if $combat.playerDazedTurns lte 0>>
<<set $combat.playerDazed to false>>
<p class="recover-text">You shake off the post-nut haze and ready yourself.</p>
<</if>>
<<vchoice "End Turn" "Combat_Enemy_Turn" "action" "clock">>
</div>
<<else>>
<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</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 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>>
<<combatAction "Block" "Combat_Player_Block" "action" "block" true>>
<</if>>
<<canParry>>
<<if _canParry>>
<<combatAction "Parry" "Combat_Player_Parry" "action" "parry" true>>
<</if>>
<<canRiposte>>
<<if _canRiposte>>
<<combatAction "Riposte" "Combat_Player_Riposte" "action" "riposte" true>>
<</if>>
<<canDodge>>
<<if _canDodge>>
<<combatAction "Evade" "Combat_Player_Dodge" "action" "run" true>>
<</if>>
<<canRest>>
<<if _canRest>>
<<combatAction "Rest" "Combat_Player_Rest" "action" "rest" true>>
<</if>>
</div>
<<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 50>>
<<combatAction "Twist Nipples" "Combat_Twist_Nipples" "exploit" "hand" true>>
<</if>>
<<if $player.lust gte 70>>
<<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 60>>
<<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 60>>
<<combatAction "Finger Her" "Combat_Finger_Pussy" "exploit" "hand" true>>
<</if>>
<<if $player.lust gte 80>>
<<combatAction "Eat Her Out" "Combat_Eat_Pussy" "exploit" "lips" true>>
<</if>>
<</if>>
</div>
<</if>>
<<if _isFemaleTarget && $player.lust gte 50 && !_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 _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")>>
<<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 80 && _playerDickOut>>
<<combatAction "Throat Fuck" "Combat_Deepthroat_Pinned" "pinned" "lips" true>>
<</if>>
<<if _targetTitsExposed && _targetPussyExposed && $player.lust gte 85>>
<<if _playerDickOut>>
<<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 (_target && _target.beenUsed)>>
<<if _isFemaleTarget && _targetBeenUsed && !_playerBound>>
<div class="action-category used-category">
<span class="category-label">She's Yours</span>
<<if _playerDickOut>>
<<combatAction "Throat Fuck" "Combat_Used_Throat" "used" "lips" true>>
<<else>>
<<combatAction "Make Her Suck" "Combat_Used_Oral" "used" "lips" true>>
<</if>>
<<if _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 40>>
<<combatAction "Press Against Lips" "Combat_Press_Lips" "tease" "lips" true>>
<</if>>
<<if $player.lust gte 60>>
<<combatAction "Slap Lips With Cock" "Combat_Slap_Lips" "tease" "lips" true>>
<</if>>
<<if $player.lust gte 70>>
<<combatAction "Make Her Suck" "Combat_Make_Suck" "dominate" "lips" true>>
<</if>>
<<if $player.lust gte 80>>
<<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>>
<<if $player.lust gte 50>>
<<combatAction "Hotdog Her Ass" "Combat_Hotdog_Ass" "tease" "lust" true>>
<</if>>
<</if>>
<<if _targetPos === "bent_over" || _targetPos === "prone_front">>
<<combatAction "Rub Against Ass" "Combat_Rub_Ass" "tease" "lust" true>>
<<if $player.lust gte 50>>
<<combatAction "Hotdog Her" "Combat_Hotdog_Prone" "tease" "lust" true>>
<</if>>
<<if $player.lust gte 70 && (_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 50>>
<<combatAction "Rub Between Thighs" "Combat_Rub_Thighs" "tease" "lust" true>>
<</if>>
<<if $player.lust gte 70 && _targetPussyExposed>>
<<combatAction "Tease Her Pussy" "Combat_Tease_Pussy" "dominate" "lust" true>>
<</if>>
<</if>>
</div>
<</if>>
<<if _isFemaleTarget && $player.lust gte 90 && !_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>>
<<else>>
<<combatAction "Unzip & Throat" "Combat_Unzip_Throat" "ultra" "lips" true>>
<</if>>
<</if>>
<<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 _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)>>
<<if _canSeduce>>
<div class="action-category">
<span class="category-label">Seduce</span>
<<combatAction "Sultry Gaze" "Combat_Sultry_Gaze" "seduction" "eye" true>>
<<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 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 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: 2,
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/player/basic/light_strike",
videoFolderMiss: "combat/player/basic/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/player/basic/heavy_strike",
videoFolderMiss: "combat/player/basic/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/player/basic/power_strike",
videoFolderMiss: "combat/player/basic/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/brutal-stab.png",
narrativeKey: "brutal_stab_hit",
narrativeFallback: "You stab brutally!",
missNarrativeKey: "brutal_stab_miss",
missFallback: "Your stab misses!",
videoFolder: "combat/player/basic/brutal_stab",
videoFolderMiss: "combat/player/basic/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/slash-upper.png",
narrativeKey: "slash_upper_hit",
narrativeFallback: "You slash upward, cutting fabric!",
missNarrativeKey: "slash_upper_miss",
missFallback: "Your slash misses!",
videoFolder: "combat/player/basic/slash_upper",
videoFolderMiss: "combat/player/basic/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/slash-lower.png",
narrativeKey: "slash_lower_hit",
narrativeFallback: "You slash downward, tearing fabric!",
missNarrativeKey: "slash_lower_miss",
missFallback: "Your slash misses!",
videoFolder: "combat/player/basic/slash_lower",
videoFolderMiss: "combat/player/basic/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: 4,
max: 8,
tornBonusMin: 3,
tornBonusMax: 6
},
exposureBurst: {
tits: { min: 12, max: 18 },
pussy: { min: 15, max: 22 },
ass: { min: 10, max: 15 }
},
passivePerTurn: {
titsExposed: 3,
pussyExposed: 8,
assExposed: 4,
vulnerablePosition: 2,
kiraVisiblyAroused: 3
},
knockdown: { min: 5, max: 8 },
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 !$combat.kiraIncapacitated>>
<<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 to Math.min(95, _targetKiraChance)>>
<<if random(1, 100) <= _targetKiraChance>>
<<set _enemyTarget to "kira">>
<</if>>
<</if>>
<</widget>>
<<widget "initClothingDamageConfig">>
<</widget>><<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",
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",
videoPathSuccubus: "assets/videos/combat/player-vs-succubus-defend.mp4",
videoPathDream: "assets/videos/combat/player-vs-dream-defend.mp4",
logText: "You raise your guard to block."
},
parry: {
name: "Parry",
actionType: "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",
videoPathSuccubus: "assets/videos/combat/player-vs-succubus-defend.mp4",
videoPathDream: "assets/videos/combat/player-vs-dream-defend.mp4",
logText: "You prepare to parry."
},
riposte: {
name: "Riposte",
actionType: "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-riposte-stance.png",
logText: "You enter riposte stance, ready to counter."
},
dodge: {
name: "Dodge",
actionType: "dodge",
energyCost: 3,
hpMinPercent: 0,
blockedPositions: [],
positionPenalties: {},
stanceToSet: "dodging",
stancesToClear: [],
penaltyVariable: null,
hasEnemySpecificImages: true,
imagePrefix: "combat/player-vs-",
imagePath: "combat/player-dodge.png",
videoPathSuccubus: "assets/videos/combat/player-vs-succubus-dodge.mp4",
videoPathDream: "assets/videos/combat/player-vs-dream-dodge.mp4",
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/player/dick_out/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/player/dick_out/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/player/dick_out/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/player/dick_out/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/player/dick_out/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/player/dick_out/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/player/dick_out/grind_behind",
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/player/dick_out/hotdog_ass",
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 entrance!",
fallbackClothed: "You rub your cock along her clothed ass, letting her feel your heat through the fabric!",
videoFolder: "combat/player/dick_out/rub_ass",
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/player/dick_out/hotdog_prone",
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 entrance, teasing but not entering! She whimpers!",
fallbackClothed: null,
videoFolder: "combat/player/dick_out/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 folds!",
fallbackClothed: "You grind your cock against her clothed crotch! She squirms beneath you!",
videoFolder: "combat/player/dick_out/grind_back",
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/player/dick_out/rub_thighs",
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 entrance mercilessly!",
fallbackClothed: null,
videoFolder: "combat/player/dick_out/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 entrance!"
]>>
<<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 entrance!",
"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 entrance!",
"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 entrance, teasing but not entering! She whimpers!",
"Your cockhead presses against her hole but doesn't push in! 'Please!' she begs!",
"You tease her entrance with your tip! She tries to push back but you pull away!",
"The head of your cock rests against her opening! She squirms, desperate for more!",
"You rub your cockhead against her entrance! 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 mound! 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 folds!",
"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 folds! 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 entrance mercilessly!",
"Your cockhead parts her lips, teasing her opening! She begs for more!",
"You rub your tip through her wet folds! 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 through her folds but never entering!"
]>><<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/player/domination/intimidate",
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/player/domination/verbal_degradation",
kneeling: "combat/player/domination/verbal_degradation_kneeling",
bent_over: "combat/player/domination/verbal_degradation_bent",
prone_front: "combat/player/domination/verbal_degradation_prone",
prone_back: "combat/player/domination/verbal_degradation_prone",
pinned: "combat/player/domination/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/player/domination/break_will_female",
male: "combat/player/domination/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/player/domination/force_beg_female",
male: "combat/player/domination/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— she stumbles backward, eyes wide with fear!",
"You step forward, voice dropping to a deadly growl. She FREEZES.",
"The killing intent in your eyes is unmistakable. She knows she's outmatched— TERRIFIED!",
"You lock eyes with her and let the darkness show. She whimpers and backs away!",
"A primal snarl escapes you. Her bravado shatters— she's AFRAID!",
"You tower over her, radiating dominance. She shrinks back, trembling!",
"Your intimidating aura is overwhelming. She can barely hold her weapon steady!"
]>>
<<set setup.combatNarrative.intimidate_failure to [
"You try to intimidate her, but she stands firm, unimpressed.",
"She meets your glare with her own— not backing down!",
"Your attempt to frighten her falls flat. She smirks mockingly.",
"She's not scared of you. \"That all you got?\" she taunts.",
"Your roar echoes out, but she doesn't flinch. Tough one.",
"She looks you up and down, unimpressed. \"Try harder.\"",
"Your intimidation attempt fails— she's seen worse than you!",
"She 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.break_will_male to [
"You lean in close, voice low and commanding. Your hands assert dominance over his body. \"Stop fighting. Submit.\" His resolve wavers visibly.",
"\"Give in,\" you command, pressing your advantage. \"You can't win. You're mine.\" He trembles under your control.",
"Your dominance is overwhelming. \"Resistance is pointless. Your body already knows who's in charge.\" His will begins to crumble.",
"\"Feel that?\" you murmur, asserting control. \"Your body responds. Your mind will follow.\" He gasps, weakening.",
"You press close, dominating his space. \"Stop pretending you can resist. I know you're breaking.\" His resistance falters.",
"\"Your will is breaking,\" you tell him firmly. \"Accept it. Submit to me.\" His defiance cracks.",
"Your control is absolute, claiming dominance. \"You can't resist forever. Your body knows its master.\" He groans, resolve shattering.",
"\"Look at you, still trying to fight,\" you taunt. \"But we both know you're already mine.\" His 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.force_beg_male to [
"\"Beg for it,\" you command. After a long, trembling pause, the words come: \"Please... please, I need it...\"",
"\"Say it. Beg me.\" His voice shakes. \"Please... I'm begging... just give it to me...\"",
"\"I want to hear you beg.\" He groans: \"Please... I'll do anything... just please...\"",
"\"Beg properly, or you get nothing.\" His voice breaks: \"Please! I'm begging you! I need it...\"",
"\"Let me hear it.\" He gasps: \"Please... please, I'm begging... I can't take it...\"",
"\"Beg for what you want. Say it.\" He pants: \"Please... I need it... I'm begging...\"",
"\"I'm waiting. Beg.\" His resistance crumbles: \"Please, please, PLEASE... I'll beg...\"",
"\"Louder. Beg like you mean it.\" He cries out: \"PLEASE! I'm begging! 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 most intimate parts!",
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 "initOrgasmControlConfigs">>
<<run setup.orgasmControlConfigs = {}>>
<<run setup.orgasmControlConfigs.allow_orgasm = {
name: "Allow Orgasm",
actionType: "allow_orgasm",
energyCost: 4,
effects: {
stunTurns: 1,
lustReduction: [40, 60],
resetDenialTurns: true,
incrementOrgasmCount: true
},
submissionThreshold: 2,
narrativePools: {
beggingFemale: "enemy_begging_release_female",
beggingMale: "enemy_begging_release_male",
orgasmFemale: "enemy_allowed_orgasm_female",
orgasmMale: "enemy_allowed_orgasm_male"
},
videoFolders: {
beggingFemale: "combat/player/orgasm_control/enemy_begging_release_female",
beggingMale: "combat/player/orgasm_control/enemy_begging_release_male",
orgasmFemale: "combat/player/orgasm_control/enemy_allowed_orgasm_female",
orgasmMale: "combat/player/orgasm_control/enemy_allowed_orgasm_male"
},
secondaryVideoFolder: null,
fallbackText: {
female: "You give her what she needs. Her back arches as the orgasm washes over her.",
male: "You give him what he needs. His body shudders as he cums."
},
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",
deniedMale: "enemy_denied_male",
beggingFemale: "enemy_begging_female",
beggingMale: "enemy_begging_male"
},
videoFolders: {
deniedFemale: "combat/player/orgasm_control/enemy_denied_female",
deniedMale: "combat/player/orgasm_control/enemy_denied_male",
beggingFemale: "combat/player/orgasm_control/enemy_begging_female",
beggingMale: "combat/player/orgasm_control/enemy_begging_male"
},
secondaryVideoFolder: null,
fallbackText: {
deniedFemale: "She whimpers as you pull away. The denial is torture—she needs release.",
deniedMale: "He groans in frustration as you pull away. The denial is torture—his cock throbs painfully.",
beggingFemale: "\"Please...\" she gasps, \"I can't take it anymore. Please just let me...\"",
beggingMale: "\"Please...\" he gasps, \"I can't take it anymore. Just let me cum...\""
}
}>>
<<run setup.orgasmControlConfigs.force_orgasm = {
name: "Force Orgasm",
actionType: "force_orgasm",
effects: {
humiliation: 30,
stunTurns: 2,
lustReduction: 50,
minLustRemaining: 30,
incrementOrgasmCount: true,
resetDenialTurns: true
},
brokenThreshold: 60,
narrativePools: {
female: "enemy_forced_orgasm_female",
male: "enemy_forced_orgasm_male"
},
videoFolders: {
female: "combat/player/orgasm_control/enemy_forced_orgasm_female",
male: "combat/player/orgasm_control/enemy_forced_orgasm_male"
},
secondaryVideoFolder: null,
fallbackText: {
female: "Her body convulses as climax rips through her. She screams, unable to control herself.",
male: "His body convulses as climax rips through him. He groans loudly, cock erupting.",
brokenFemale: "The combination of humiliation and forced pleasure is too much—she's completely broken.",
brokenMale: "The combination of humiliation and forced pleasure is too much—he'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_begging_release_male to [
"\"Please...\" he groans, \"I need to cum... fuck, please...\"",
"\"I can't take it,\" he pants. \"Please... just let me finish...\"",
"His voice desperate: \"Please... I'm begging... I need this...\"",
"\"God, please,\" he moans. \"Let me cum... I need it so bad...\"",
"His cock throbs painfully as he begs: \"Please... let me orgasm... I can't hold back...\"",
"\"I'll do anything,\" he gasps. \"Just please... let me cum...\"",
"\"Please!\" he cries out. \"I'm so close... don't stop now...\"",
"\"I'm begging you,\" he pants. \"Let me finish... please...\""
]>>
<<set setup.combatNarrative.enemy_allowed_orgasm_female to [
"You give her what she needs. Her back arches as the orgasm washes over her, a grateful cry escaping her lips.",
"\"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_allowed_orgasm_male to [
"You give him what he needs. His body shudders as he cums, groaning in relief.",
"\"Thank you...\" he gasps as orgasm hits. His cock erupts, overwhelmed by the release you've granted.",
"The climax crashes through him. He moans, grateful for the mercy you've shown.",
"You let him cum. His eyes roll back, body convulsing as the pent-up pleasure explodes.",
"The relief is palpable as he finally reaches orgasm, gasping \"Thank you...\"",
"He cums hard, body trembling in gratitude. The release is intense— a gift, not forced.",
"You allow his release. He groans in relief as the orgasm takes him, overwhelmed.",
"The climax ripples through his body. He's grateful, submissive, completely yours."
]>>
<<set setup.combatNarrative.enemy_denied_female to [
"She whimpers as you pull away. The denial is torture—she needs release.",
"\"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_denied_male to [
"He groans in frustration as you pull away. The denial is torture—his cock throbs painfully.",
"\"No, don't stop!\" he gasps, but you pull back. His frustration is overwhelming.",
"You stop just as he's about to cum. He groans: \"Fuck! I was right there!\"",
"The denial hits him hard. He trembles, desperate, aching for the release you've withheld.",
"\"Why did you stop?\" he pants, body shaking. The denial is unbearable.",
"You pull away at the crucial moment. His groan of frustration—he NEEDED that.",
"The orgasm denial leaves him trembling, groaning, completely desperate.",
"He gasps as you deny him. \"Please... I can't take it... I need to cum so bad...\" The frustration is overwhelming."
]>>
<<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_begging_male to [
"\"Please...\" he gasps, \"I can't take it anymore. Just let me cum...\"",
"After multiple denials, he breaks: \"I'm begging you... please... I can't stand it!\"",
"\"Please, PLEASE!\" he groans. \"I'll do anything... just let me cum... I'm going insane!\"",
"The frustration overwhelms him: \"I'm begging... I need to cum so bad... please!\"",
"\"I can't take another denial,\" he pants. \"Please... I'm begging... let me finish...\"",
"His voice shakes: \"Please let me cum... I'm begging you... I need it!\"",
"\"I'll do whatever you want,\" he pleads. \"Just please... let me cum... I'm begging!\"",
"Groaning in desperation: \"Please... the denial is torture... let me cum!\""
]>>
<<set setup.combatNarrative.enemy_forced_orgasm_female to [
"Her body convulses as climax rips through her. She screams, unable to control herself.",
"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."
]>>
<<set setup.combatNarrative.enemy_forced_orgasm_male to [
"His body convulses as climax rips through him. He groans loudly, cock erupting.",
"The forced orgasm tears through his body. He cries out, shaking, completely overwhelmed.",
"\"NO! FUCK, I'M—\" His protest cuts off as he cums uncontrollably. He groans.",
"You force him over the edge. His body tenses, convulsing, as he cums hard.",
"The climax hits him powerfully. He groans, body shaking, unable to stop cumming.",
"\"I CAN'T STOP!\" he gasps as the forced orgasm rips through him. His cock pulses relentlessly.",
"Forced past his limit, he cums HARD. His groan is guttural as pleasure overwhelms him.",
"His body convulses in forced ecstasy. He shakes, groans, gasps—completely at the mercy of the climax you've forced."
]>><<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/player/pain_pleasure/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/player/pain_pleasure/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/player/pain_pleasure/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/player/pain_pleasure/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/player/pain_pleasure/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/player/pain_pleasure/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/player/pain_pleasure/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/player/pain_pleasure/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/player/pain_pleasure/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/player/pain_pleasure/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 the abused nub 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 sex.",
"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 core.",
"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/player/pinned/grind",
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/player/pinned/choke",
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/player/pinned/abuse_tits",
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/player/pinned/finger",
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"}
],
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/player/pinned/dick_out",
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/player/pinned/deepthroat",
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/player/pinned/fuck",
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 arousal!",
"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 length!",
"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/player/basic/rapid_strikes_intro",
hit: "combat/player/basic/rapid_strikes_hit",
miss: "combat/player/basic/rapid_strikes_miss",
finale: "combat/player/basic/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 her!",
"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! She takes another hit!",
"Contact! You tag her again!",
"Another hit— she's getting overwhelmed!",
"Your strike connects solidly!",
"Hit after hit— she can't keep up!"
]>>
<<set setup.combatNarrative.rapid_strikes_miss to [
"Miss! That one whiffed!",
"She dodges one strike!",
"Your attack finds only air!",
"She evades this one!",
"That strike goes wide!",
"She slips past your attack!",
"Miss— but more are coming!",
"She 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/player/seduction/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/player/seduction/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/player/seduction/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/player/seduction/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/player/seduction/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/player/seduction/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/player/seduction/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/player/seduction/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",
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",
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"
},
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"
}
}>>
<</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 mound, 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 bulge 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, bulge 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.rip_top_pinned_regular_male to [
"With him pinned beneath you, you grab his shirt and RIP— fabric tears easily! His chest partially exposed, the bastard snarls helplessly!",
"He struggles uselessly as you tear at his top— more of his muscled torso revealed!",
"Pinned and powerless, he can only grunt as you rip his shirt apart!",
"You tear his top while he writhes helplessly— his chest exposed, unable to stop you!",
"He can't fight back as you shred his shirt— his muscles flex uselessly beneath you!"
]>>
<<set setup.combatNarrative.rip_top_pinned_nearly_destroyed_male to [
"Pinned and helpless, you tear the last scraps of his ruined shirt— his bare chest nearly fully exposed!",
"He growls as you rip away more of his destroyed top— just threads left covering this fucker!",
"With him unable to resist, you shred what's left of his shirt— his torso almost completely bare!",
"You tear his ruined top apart while he struggles beneath you— one more rip and he's shirtless!",
"Helpless under your weight, he can only snarl as you destroy what's left of his shirt!"
]>>
<<set setup.combatNarrative.rip_top_pinned_full_exposure_male to [
"You grab his ruined shirt and TEAR it completely away— his bare chest exposed! The pinned bastard snarls as you strip him!",
"RIIIIP! With him helpless beneath you, his top shreds off entirely— his muscled torso on full display!",
"Pinned and powerless, he can only grunt as you rip his shirt away— his naked chest heaves with rage!",
"You tear away the last of his top— he's shirtless and trapped beneath you! His exposed torso glistens with sweat!",
"His shirt is GONE and he can't stop you! His bare chest flexes uselessly as he struggles, completely exposed!"
]>>
<<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 mound, 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.tear_bottom_pinned_regular_male to [
"With him pinned beneath you, you grab his pants and YANK— fabric tears! His thighs exposed, the bastard snarls!",
"He struggles uselessly as you tear at his bottoms— more skin revealed, his underwear peeking through!",
"Pinned and powerless, he can only grunt as you rip his pants apart!",
"You tear his bottoms while he writhes helplessly— fabric gives way under your grip!",
"He can't fight back as you shred his pants— his underwear visible through the growing tears!"
]>>
<<set setup.combatNarrative.tear_bottom_pinned_underwear_only_male to [
"Pinned beneath you, you RIP his pants away completely— just tight briefs left! His hard cock strains against the fabric!",
"He struggles helplessly as you tear his bottoms off— only stretched underwear remains! His bulge impossible to hide!",
"With him unable to resist, his pants shred away— he's left in thin briefs, his cock tenting the material!",
"You strip his pants off while he's pinned— his underwear barely contains his throbbing package!",
"His bottoms are GONE and he can't stop you! Just thin fabric now, his cock obscenely visible through the stretched material!"
]>>
<<set setup.combatNarrative.tear_bottom_pinned_nearly_destroyed_male to [
"Pinned and helpless, you tear the last scraps of his ruined pants— his cock strains through the tears, one rip from exposure!",
"He snarls as you rip away more of his destroyed bottoms— just threads keeping this fucker's dick covered!",
"With him unable to resist, you shred what's left of his pants— his throbbing cock almost visible!",
"You tear his ruined bottoms apart while he struggles beneath you— his bulge clearly outlined through tatters!",
"Helpless under your weight, he can only growl as you destroy what's left of his pants— his cock nearly out!"
]>>
<<set setup.combatNarrative.tear_bottom_pinned_full_exposure_male to [
"You grab his bottoms and TEAR them completely away— his hard cock springs free! The pinned bastard snarls as you expose him completely!",
"RIIIIP! With him helpless beneath you, his pants shred off entirely— his thick cock bounces out, rock-hard and throbbing!",
"Pinned and powerless, he can only grunt as you rip his bottoms away— his naked cock stands rigid, fully exposed!",
"You tear away the last of his clothing— he's naked below the waist and trapped! His exposed cock throbs with rage!",
"His pants are GONE and he can't stop you! His bare cock stands at attention— this bastard's fighting naked now!"
]>>
<<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!"
]>>
<<set setup.combatNarrative.strip_bottom_lust_bonus_male to [
"His face burns with humiliation as his hard cock betrays his arousal!",
"Despite his rage, his cock throbs— the bastard's body enjoying this!",
"He growls, but his rigid dick tells a different story!",
"His exposed cock stands at attention— seems he likes being stripped!",
"His cock bounces with his movements— the fucker can't hide his arousal!"
]>><<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/player/supernatural/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/player/supernatural/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/player/supernatural/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/player/supernatural/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/player/supernatural/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/player/supernatural/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/player/extreme/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/player/extreme/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/player/extreme/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/player/extreme/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/player/extreme/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/player/extreme/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/player/extreme/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/player/extreme/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 entrance 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 entrance 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 arousal is obvious and overwhelming!",
"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/player/use_her/strip",
position: "combat/player/use_her/position",
penetration: "combat/player/use_her/penetration",
victimMoans: "combat/player/use_her/victim_moans",
allyReactions: "combat/player/use_her/ally_reactions",
climax: "combat/player/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>><<set _index to _args[0] || 0>>
<<set _e to $combat.enemies[_index]>>
You grab rope from your pack and bind <<print _e.name.toLowerCase()>>'s hands and feet.
<div class="narrative-image">
<img src="assets/images/combat/enemy-tied.webp" alt="Bound Enemy">
</div>
<<set _e.bound to true>>
<<set _e.canAct to false>>
<<if _e.gender === "female">>
<p class="explicit">She struggles against the bindings, her exposed body writhing helplessly.</p>
<<say _e.name "You think this will hold me? When I get free—">>
<div class="choice-container">
<<vchoice "\"Shut up.\" (gag her)" "Combat_TieDown_Gag" "action" "gagged">>
<<vchoice "Leave her for later" "Combat_Actions" "move" "return">>
<<vchoice "Have some fun with her now..." "Combat_TieDown_Fun" "intimate" "corruption">>
</div>
<<else>>
<p>He's secured. Not going anywhere.</p>
<div class="choice-container">
<<vchoice "Continue fighting" "Combat_Actions" "move" "return">>
</div>
<</if>>You tear a strip of cloth and shove it in her mouth. Silencing her.
<<set _e.gagged to true>>
<<say $player.name "Much better. Quiet now.">>
She glares at you, muffled sounds behind the gag.
<<set $player.dominance += 3>>
<div class="choice-container">
<<vchoice "Leave her" "Combat_Actions" "move" "return">>
<<vchoice "Have fun with her" "Combat_TieDown_Fun" "intimate" "corruption">>
</div><<set _e to $combat.enemies[_index || 0]>>
<p class="explicit">You kneel between her bound legs. She can't stop you now. Helpless.</p>
<<say _e.name "What are you— you wouldn't—">>
But you would.
<<if _e.clothing.pussyExposed>>
<p class="explicit">Her pussy is already wet. She wants this, even if she won't admit it.</p>
<div class="choice-container">
<<vchoice "Finger her" "Combat_TieDown_Finger" "intimate" "hand">>
<<vchoice "Eat her out" "Combat_TieDown_Oral" "intimate" "lips">>
<<if $clothing.player.dickExposed>>
<<vchoice "Fuck her" "Combat_TieDown_Fuck" "intimate" "rapid-strikes">>
<</if>>
</div>
<<else>>
<p>You tear away what's left of her clothing first...</p>
<<damageClothingWithArmor (_index || 0) "bottom" 100>>
<<goto "Combat_TieDown_Fun">>
<</if>>You slide your fingers into her exposed, wet pussy.
<div class="narrative-image intimate">
<img src="assets/images/combat/bound-fingered.webp" alt="Bound and Fingered">
</div>
<<performSexAct "touch_intimate">>
She gasps, hips bucking involuntarily.
<<say _e.name "No— don't— oh fuck—">>
<<performSexAct "fingering">>
You finger-fuck her ruthlessly. Bound. Helpless. Taking it.
<div class="narrative-video intimate">
<<if $preferences.showVideos>>
<video autoplay loop muted playsinline>
<source src="assets/videos/combat/bondage-fingered.mp4" type="video/mp4">
</video>
<</if>>
</div>
<<performSexAct "climax_partner">>
She cums hard around your fingers, screaming, unable to escape the orgasm.
<<set $player.dominance += 5>>
<div class="choice-container">
<<vchoice "Leave her there, trembling" "Combat_Actions" "move" "return">>
</div>You lean down and put your mouth on her exposed pussy.
<div class="narrative-image intimate">
<img src="assets/images/combat/bound-oral.webp" alt="Eating Bound Enemy">
</div>
<<say _e.name "No— stop— you can't—">>
<<performSexAct "oral_give">>
You lick her while she's tied down. She can't escape. Can't stop you.
<div class="narrative-video intimate">
<<if $preferences.showVideos>>
<video autoplay loop muted playsinline>
<source src="assets/videos/combat/bondage-oral.mp4" type="video/mp4">
</video>
<</if>>
</div>
Her protests turn to moans. Her hips grinding against your face despite the bondage.
<<performSexAct "oral_give">>
<<performSexAct "climax_partner">>
She cums hard, screaming, trying to close her legs but can't.
<<set $player.dominance += 8>>
<div class="choice-container">
<<vchoice "Leave her twitching" "Combat_Actions" "move" "return">>
</div>You position yourself between her bound legs. She's helpless to stop you.
<div class="narrative-image intimate">
<img src="assets/images/combat/bound-fuck.webp" alt="Fucking Bound Enemy">
</div>
<<say _e.name "Please don't— I'll do anything—">>
<<say $player.name "You already are.">>
<<sexScene _e.id "bondage" "dominant" "combat">>
<<performSexAct "penetrate">>
You drive into her tied-down pussy. She gasps, arching.
<div class="narrative-video intimate">
<<if $preferences.showVideos>>
<video autoplay loop muted playsinline>
<source src="assets/videos/combat/bondage-fuck.mp4" type="video/mp4">
</video>
<</if>>
</div>
<<performSexAct "thrust_fast">>
You fuck her hard. She's struggling against the ropes. But her pussy is gripping you tight.
<<say _e.name "Oh god— oh FUCK— I hate you— I'm gonna—">>
<<performSexAct "climax_together">>
You both cum. You fill her bound pussy with your seed. She screams, unable to escape the orgasm.
<<endSexScene>>
<<set $player.dominance += 10>>
<<set $player.lust to 20>>
<<set $flags.playerFuckedInCombat to true>>
<div class="choice-container">
<<vchoice "Leave her tied and used" "Combat_Actions" "move" "return">>
</div><<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>>
<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 (placeholder) -->
<div class="card-video-primary" @id="'enemy-video-primary-' + _eabIdx">
<!-- Ability animation video injected during execution -->
</div>
<!-- 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 -->
<div class="card-stats">
<!-- HP Bar -->
<div class="stat-row">
<span class="stat-label">HP:</span>
<div class="stat-bar health-bar">
<div class="stat-fill" @style="'width: ' + Math.floor((_eabEnemy.health / _eabEnemy.maxHealth) * 100) + '%'"></div>
</div>
<span class="stat-value"><<print _eabEnemy.health>>/<<print _eabEnemy.maxHealth>></span>
</div>
<!-- Position -->
<<if _eabEnemy.position && _eabEnemy.position !== "standing">>
<div class="card-position">
<<getPositionIcon _eabEnemy>>
<<icon _positionIcon "medium">>
Position: <<print _eabEnemy.position.replace("_", " ").toUpperFirst()>>
</div>
<</if>>
<!-- Exposure -->
<<if _eabEnemy.clothing && (_eabEnemy.clothing.titsExposed || _eabEnemy.clothing.pussyExposed)>>
<div class="card-exposure">
<<icon "hazard-sign" "medium">>
<<if _eabEnemy.clothing.titsExposed>>Tits Exposed<</if>>
<<if _eabEnemy.clothing.titsExposed && _eabEnemy.clothing.pussyExposed>> · <</if>>
<<if _eabEnemy.clothing.pussyExposed>>Pussy Exposed<</if>>
</div>
<</if>>
</div>
<!-- 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 <<print (_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">
<<for _eabEffect range _eabResult.effects>>
<<print _eabEffect.replace(/_/g, " ").toUpperFirst()>><<if !$loop.last>>, <</if>>
<</for>>
</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>
</div>
<</widget>><<widget "enhancedEnemyAttackCard">>
<<set _eacAction to _args[0]>>
<<set _eacEnemy to _eacAction.enemyRef>>
<<set _eacIdx to _eacAction.enemyIndex>>
<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 === "miniboss">>
<<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 -->
<div class="card-stats">
<!-- HP Bar -->
<div class="stat-row">
<span class="stat-label">HP:</span>
<div class="stat-bar health-bar">
<div class="stat-fill" @style="'width: ' + Math.floor((_eacEnemy.health / _eacEnemy.maxHealth) * 100) + '%'"></div>
</div>
<span class="stat-value"><<print _eacEnemy.health>>/<<print _eacEnemy.maxHealth>></span>
</div>
<!-- Position (if not standing) -->
<<if _eacEnemy.position && _eacEnemy.position !== "standing">>
<div class="card-position">
<<getPositionIcon _eacEnemy.position>>
<<icon _positionIcon "medium">>
Position: <<print _eacEnemy.position.replace("_", " ").toUpperFirst()>>
</div>
<</if>>
<!-- Exposure Status (if applicable) -->
<<if _eacEnemy.clothing && (_eacEnemy.clothing.titsExposed || _eacEnemy.clothing.pussyExposed)>>
<div class="card-exposure">
<<icon "hazard-sign" "medium">>
<<if _eacEnemy.clothing.titsExposed>>Tits Exposed<</if>>
<<if _eacEnemy.clothing.titsExposed && _eacEnemy.clothing.pussyExposed>> · <</if>>
<<if _eacEnemy.clothing.pussyExposed>>Pussy Exposed<</if>>
</div>
<</if>>
</div>
<!-- ACTION LABEL (with weapon if applicable) -->
<div class="card-action">
<<icon "attack" "medium">>
Attacking<<if _eacEnemy.weapon && setup.weapons && setup.weapons[_eacEnemy.weapon]>> <span class="action-weapon">(<<print setup.weapons[_eacEnemy.weapon].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 <<print _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-<<print _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>
<</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>>
<<if _eadResult.effects && _eadResult.effects.length > 0>>
<<applyAbilityEffects _eadEnemy _eadResult.effects _eadTarget>>
<</if>>
<<if _eadResult.damageMultiplier && _eadResult.damageMultiplier > 0>>
<<set _eadWeapon to null>>
<<if _eadEnemy.weapon && setup.weapons && setup.weapons[_eadEnemy.weapon]>>
<<set _eadWeapon to setup.weapons[_eadEnemy.weapon]>>
<</if>>
<<if _eadWeapon>>
<<set _eadBaseDmg to _eadWeapon.damage.base + _eadAction.preRolls.damageVariance>>
<<else>>
<<set _eadBaseDmg to _eadEnemy.damage + _eadAction.preRolls.damageVariance>>
<</if>>
<<set _eadDamage to Math.floor(_eadBaseDmg * _eadResult.damageMultiplier)>>
<<getEnemyDamageModifiers _eadEnemy>>
<<set _eadDamage to Math.floor(_eadDamage * _returnDamageMod)>>
<<set _eadDamage to setup.applyTierScaling(_eadDamage, _eadEnemy.tier)>>
<<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>>
<<for _eadHit to 0; _eadHit lt _eadResult.hits; _eadHit++>>
<<set _eadHitChance to 70 + (_eadResult.accuracyMod || 0) - _eadArousalAccPenalty>>
<<set _eadHitDamage to _eadDamage>>
<<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 && _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>>
<<if _eadTarget === "player">>
<<set _negEadHitDamage to -_eadHitDamage>>
<<clampStat "player.health" _negEadHitDamage 0 100>>
<<set _eadTotalDamage += _eadHitDamage>>
<<elseif _eadTarget === "kira">>
<<getCompanion "kira">>
<<set $tempCompanion.health to Math.max(1, $tempCompanion.health - _eadHitDamage)>>
<<updateCompanion "kira">>
<<set _eadTotalDamage += _eadHitDamage>>
<</if>>
<</if>>
<</for>>
<<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) <= 40>>
<<if _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>>
<<goto "Combat_Defeat">>
<</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;
}
var statusContainer = document.getElementById('enemy-status-' + idx);
if (statusContainer) {
var wrapper = document.querySelector('.weapon-effects-wrapper[data-enemy-idx="' + idx + '"]');
if (wrapper) {
var effects = wrapper.querySelectorAll('.status-applied');
effects.forEach(function(effect) {
statusContainer.appendChild(effect);
});
wrapper.remove();
}
}
}, 50);
})(State.temporary.eadIdx, State.temporary.eadTotalDamage, State.temporary.eadResult.hits)>>
<<injectHealthUpdate _eadIdx _eadTarget>>
<</if>>
<</if>>
<</widget>>
<<widget "executeEnemyAction">>
<<set _eexAction to _args[0]>>
<<set _eexIdx to _eexAction.enemyIndex>>
<<set _eexEnemy to $combat.enemies[_eexIdx]>>
<<run console.log('[EXECUTE] Enemy ' + _eexIdx + ' action: ' + _eexAction.actionType + ' (enemyRef.health=' + (_eexAction.enemyRef ? _eexAction.enemyRef.health : 'null') + ')')>>
<<switch _eexAction.actionType>>
<<case "subdued">>
<<return>>
<<case "sleep">>
<<return>>
<<case "stunned">>
<<run console.log('[STUN DEBUG] Enemy ' + _eexIdx + ' stunnedTurns BEFORE: ' + $combat.enemies[_eexIdx].stunnedTurns)>>
<<set $combat.enemies[_eexIdx].stunnedTurns -= 1>>
<<run console.log('[STUN DEBUG] Enemy ' + _eexIdx + ' stunnedTurns AFTER: ' + $combat.enemies[_eexIdx].stunnedTurns)>>
<<if $combat.enemies[_eexIdx].stunnedTurns lte 0>>
<<set $combat.enemies[_eexIdx].stunned to false>>
<<set $combat.enemies[_eexIdx].stunnedTurns to 0>>
<<run console.log('[STUN DEBUG] Enemy ' + _eexIdx + ' UNSTUNNED')>>
<</if>>
<<return>>
<<case "lust_break">>
<<run console.log('[LUST_BREAK DEBUG] Enemy ' + _eexIdx + ' stunnedTurns BEFORE: ' + $combat.enemies[_eexIdx].stunnedTurns + ', lust: ' + $combat.enemies[_eexIdx].lust)>>
<<if $combat.enemies[_eexIdx].stunnedTurns && $combat.enemies[_eexIdx].stunnedTurns > 0>>
<<set $combat.enemies[_eexIdx].stunnedTurns -= 1>>
<<run console.log('[LUST_BREAK DEBUG] Enemy ' + _eexIdx + ' stunnedTurns AFTER: ' + $combat.enemies[_eexIdx].stunnedTurns)>>
<<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)>>
<<run console.log('[LUST_BREAK DEBUG] Enemy ' + _eexIdx + ' ORGASMED! Lust reduced by ' + _lustDrop + ' to ' + $combat.enemies[_eexIdx].lust)>>
<</if>>
<</if>>
<<return>>
<<case "feared_cower" "feared_fail">>
<<return>>
<<case "feared_fled">>
<<set $combat.enemies[_eexIdx].health to 0>>
<<set $combat.enemies[_eexIdx].fled to true>>
<<return>>
<<case "sex">>
<<set _actualEnemyIdx to _eexAction.enemyIndex>>
<<set $combat.currentEnemyIndex to _actualEnemyIdx>>
<<set _currentEnemyIndex to _actualEnemyIdx>>
<<set $combat.pendingSexAction to {
passage: _eexAction.sexPassage,
intent: _eexAction.sexIntent,
enemyIndex: _actualEnemyIdx,
enemyName: _eexEnemy.name
}>>
<<return>>
<<case "ability">>
<<executeAbilityDamage _eexAction>>
<<return>>
<<case "attack">>
<<executeStandardAttack _eexAction>>
<<return>>
<</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 _esaHitChance to _esaAccuracy + _esaPositionHitBonus>>
<<if _esaAction.preRolls.hitRoll lte _esaHitChance>>
<<if _esaEnemy.weapon && setup.weapons && setup.weapons[_esaEnemy.weapon]>>
<<set _esaWeapon to setup.weapons[_esaEnemy.weapon]>>
<<set _esaDamage to (_esaWeapon.damage.base || 5) + (_esaAction.preRolls.damageVariance || 0)>>
<<else>>
<<set _esaWeapon to null>>
<<set _esaDamage to (_esaEnemy.damage || 5) + (_esaAction.preRolls.damageVariance || 0)>>
<</if>>
<<if isNaN(_esaDamage)>>
<<run console.warn('[DAMAGE] NaN detected, defaulting to 5')>>
<<set _esaDamage to 5>>
<</if>>
<<set _esaDamage to setup.applyTierScaling(_esaDamage, _esaEnemy.tier)>>
<<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>>
<<if _esaEnemy.fearPenalty>>
<<set _esaDamage to Math.floor(_esaDamage * 0.5)>>
<<set _esaEnemy.fearPenalty to false>>
<</if>>
<<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 Number($player.lust) + 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 _esaNegDamage to -_esaDamage>>
<<run console.log('[DAMAGE DEBUG] Player health BEFORE: ' + $player.health + ', damage: ' + _esaDamage + ', negDamage: ' + _esaNegDamage)>>
<<clampStat "player.health" _esaNegDamage 0 100>>
<<run console.log('[DAMAGE DEBUG] Player health AFTER: ' + $player.health)>>
<<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.lust || 0) >= 50>>
<<set _isSexualAttack to true>>
<<set _sexualReason to "exposed_lust">>
<</if>>
<</if>>
<<if _esaEnemy && _esaEnemy.weaponTier === 3>>
<<set _isSexualAttack to true>>
<<set _sexualReason to "weapon_tier3">>
<</if>>
<<if _isSexualAttack && _esaWeapon>>
<<set _sexualFolder to "combat/attacks/sexual/" + (_esaWeapon.id || "unarmed")>>
<<set _videoFilters to {}>>
<<if $clothing && $clothing.player>>
<<set _videoFilters.clothing to ($clothing.player.titsExposed || $clothing.player.pussyExposed ? "exposed" : "clothed")>>
<</if>>
<<selectMediaWithRace _sexualFolder _videoFilters _eexEnemy>>
<<if _result && _result.file>>
<<set _mediaPath to _result.file>>
<<set _mediaFormat to _result.format>>
<</if>>
<</if>>
<<if !_mediaPath && _esaWeapon && _esaWeapon.videoFolder>>
<<set _videoFilters to {}>>
<<if $clothing && $clothing.player>>
<<set _videoFilters.clothing to ($clothing.player.titsExposed || $clothing.player.pussyExposed ? "exposed" : "clothed")>>
<</if>>
<<selectMediaWithRace _esaWeapon.videoFolder _videoFilters _eexEnemy>>
<<if _result && _result.file>>
<<set _mediaPath to _result.file>>
<<set _mediaFormat to _result.format>>
<</if>>
<</if>>
<<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.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;
}
var statusContainer = document.getElementById('enemy-status-' + idx);
if (statusContainer) {
var wrapper = document.querySelector('.weapon-effects-wrapper[data-enemy-idx="' + idx + '"]');
if (wrapper) {
var effects = wrapper.querySelectorAll('.status-applied');
effects.forEach(function(effect) {
statusContainer.appendChild(effect);
});
wrapper.remove();
}
}
var knockdownContainer = document.getElementById('enemy-knockdown-' + idx);
if (knockdownContainer) {
var knockdownVideos = document.querySelectorAll('.knockdown-video');
knockdownVideos.forEach(function(el) {
if (!el.closest('.card-knockdown')) {
knockdownContainer.appendChild(el);
}
});
var positionChanges = document.querySelectorAll('.position-change');
positionChanges.forEach(function(el) {
if (!el.closest('.card-knockdown')) {
knockdownContainer.appendChild(el);
}
});
var explicitTexts = document.querySelectorAll('p.explicit');
explicitTexts.forEach(function(el) {
if (!el.closest('.card-knockdown')) {
knockdownContainer.appendChild(el);
}
});
var narratorThoughts = document.querySelectorAll('.narrator-thought');
narratorThoughts.forEach(function(el) {
if (!el.closest('.card-knockdown')) {
knockdownContainer.appendChild(el);
}
});
var dialogueBoxes = document.querySelectorAll('.dialogue-box');
dialogueBoxes.forEach(function(el) {
if (!el.closest('.card-knockdown')) {
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>>
<<goto "Combat_Defeat">>
<</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 _narrativeResult.text.replace(/\{enemy\}/g, _esaEnemy.name)>>
<</if>>
<<set _mediaPathMiss to null>>
<<if _esaWeapon && _esaWeapon.videoFolderMiss>>
<<selectMediaWithRace _esaWeapon.videoFolderMiss {} _eexEnemy>>
<<if _result && _result.file>>
<<set _mediaPathMiss to _result.file>>
<<set _mediaFormatMiss to _result.format>>
<</if>>
<</if>>
<<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)>>
<<set _esaHitChanceK to _esaAccuracyK + _esaPosHitBonusK>>
<<if _esaAction.preRolls.hitRoll lte _esaHitChanceK>>
<<if _esaEnemy.weapon && setup.weapons && setup.weapons[_esaEnemy.weapon]>>
<<set _esaWeaponK to setup.weapons[_esaEnemy.weapon]>>
<<set _esaDamageK to Math.floor((_esaWeaponK.damage.base + _esaAction.preRolls.damageVariance) * 0.7)>>
<<else>>
<<set _esaWeaponK to null>>
<<set _esaDamageK to Math.floor(_esaEnemy.damage * 0.7)>>
<</if>>
<<set _esaDamageK to setup.applyTierScaling(_esaDamageK, _esaEnemy.tier)>>
<<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>>
<<if _esaEnemy.fearPenalty>>
<<set _esaDamageK to Math.floor(_esaDamageK * 0.5)>>
<<set _esaEnemy.fearPenalty to false>>
<</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 $tempCompanion.health -= _esaDamageK>>
<<updateCompanion "kira">>
<<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>>
<<if _isSexualAttackK && _esaWeaponK>>
<<set _sexualFolderK to "combat/attacks/sexual/" + (_esaWeaponK.id || "unarmed")>>
<<set _videoFiltersK to {}>>
<<if $clothing && $clothing.kira>>
<<set _videoFiltersK.clothing to ($clothing.kira.titsExposed || $clothing.kira.pussyExposed ? "exposed" : "clothed")>>
<</if>>
<<selectMediaWithRace _sexualFolderK _videoFiltersK _eexEnemy>>
<<if _result && _result.file>>
<<set _mediaPathK to _result.file>>
<<set _mediaFormatK to _result.format>>
<</if>>
<</if>>
<<if !_mediaPathK && _esaWeaponK && _esaWeaponK.videoFolder>>
<<set _videoFiltersK to {}>>
<<if $clothing && $clothing.kira>>
<<set _videoFiltersK.clothing to ($clothing.kira.titsExposed || $clothing.kira.pussyExposed ? "exposed" : "clothed")>>
<</if>>
<<selectMediaWithRace _esaWeaponK.videoFolder _videoFiltersK _eexEnemy>>
<<if _result && _result.file>>
<<set _mediaPathK to _result.file>>
<<set _mediaFormatK to _result.format>>
<</if>>
<</if>>
<<injectHealthUpdate _esaIdx _esaTarget>>
<<if $tempCompanion.health lt 1>>
<<set $tempCompanion.health to 1>>
<<updateCompanion "kira">>
<<if !$flags.kiraIsUnconscious>>
<<goto "Combat_Kira_Unconscious">>
<<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(_esaWeaponK.clothingDamage.bottom * _esaCDBonus)>>
<<else>>
<<set _esaCDK to either("top", "bottom")>>
<<damageClothingWithArmor "kira" _esaCDK _esaWeaponK.clothingDamage[_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 random(10, 20)>>
<</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;
}
var statusContainer = document.getElementById('enemy-status-' + idx);
if (statusContainer) {
var wrapper = document.querySelector('.weapon-effects-wrapper[data-enemy-idx="' + idx + '"]');
if (wrapper) {
var effects = wrapper.querySelectorAll('.status-applied');
effects.forEach(function(effect) {
statusContainer.appendChild(effect);
});
wrapper.remove();
}
}
var knockdownContainer = document.getElementById('enemy-knockdown-' + idx);
if (knockdownContainer) {
var knockdownVideos = document.querySelectorAll('.knockdown-video');
knockdownVideos.forEach(function(el) {
if (!el.closest('.card-knockdown')) {
knockdownContainer.appendChild(el);
}
});
var positionChanges = document.querySelectorAll('.position-change');
positionChanges.forEach(function(el) {
if (!el.closest('.card-knockdown')) {
knockdownContainer.appendChild(el);
}
});
var explicitTexts = document.querySelectorAll('p.explicit');
explicitTexts.forEach(function(el) {
if (!el.closest('.card-knockdown')) {
knockdownContainer.appendChild(el);
}
});
var narratorThoughts = document.querySelectorAll('.narrator-thought');
narratorThoughts.forEach(function(el) {
if (!el.closest('.card-knockdown')) {
knockdownContainer.appendChild(el);
}
});
var dialogueBoxes = document.querySelectorAll('.dialogue-box');
dialogueBoxes.forEach(function(el) {
if (!el.closest('.card-knockdown')) {
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" "The attack misses!">>
<</silently>>
<<if _narrativeResult && _narrativeResult.text && _esaEnemy && _esaEnemy.name>>
<<set _narrativeResult.text to _narrativeResult.text.replace(/\{enemy\}/g, _esaEnemy.name)>>
<</if>>
<<set _mediaPathKMiss to null>>
<<if _esaWeaponK && _esaWeaponK.videoFolderMiss>>
<<selectMediaWithRace _esaWeaponK.videoFolderMiss {} _eexEnemy>>
<<if _result && _result.file>>
<<set _mediaPathKMiss to _result.file>>
<<set _mediaFormatKMiss to _result.format>>
<</if>>
<</if>>
<<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>>
<<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 $combat.playerEffects.intimidated && $combat.playerEffects.intimidated > 0>>
<<set $combat.playerEffects.intimidated -= 1>>
<<if $combat.playerEffects.intimidated <= 0>>
<<set $combat.playerEffects.intimidated to 0>>
<</if>>
<</if>>
<</if>>
<<if $combat.kiraEffects && $combat.kiraEffects.bleeding && $companions && $companions[0]>>
<<set _peptBleedDmg to $combat.kiraEffects.bleeding>>
<<damageKira _peptBleedDmg>>
<<if random(1, 100) lte 30>>
<<set $combat.kiraEffects.bleeding -= 1>>
<<if $combat.kiraEffects.bleeding lte 0>>
<<set $combat.kiraEffects.bleeding to 0>>
<</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>>
<<set $combat.enemies to $combat.enemies.filter(function(e) { return e.health > 0; })>>
<<if $combat.enemies.length === 0>>
<<goto "Combat_Victory">>
<</if>>
<</if>>
<</if>>
<<set _peptActiveEnemies to $combat.enemies.filter(function(e) { return e.health > 0 && !e.beenUsed; })>>
<<if $combat.enemies.length gt 0 && _peptActiveEnemies.length === 0>>
<<goto "Combat_Victory">>
<</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>>
<<if _peptTurnEndEnemy.abilityState>>
<<tickAbilityCooldowns>>
<</if>>
<<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>>
<</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>>
<<executeEnemyAction _eaeaAction>>
<<if $player.health <= 0>>
<<goto "Combat_Defeat">>
<</if>>
<</if>>
<</for>>
<<postEnemyTurnProcessing>>
<</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 _cemType to _args[0]>>
<<set _cemPosition to _args[1] || "standing">>
<<set _cemClothing to _args[2] || "dressed">>
<<set _cemPath to "combat/enemies/" + _cemType + "/" + _cemPosition>>
<<selectMediaFromPool _cemPath {clothing: _cemClothing}>>
<<if !_result || !_result.file>>
<<selectMediaFromPool _cemPath {clothing: "dressed"}>>
<</if>>
<<if !_result || !_result.file>>
<<set _result to {
file: "media/placeholders/enemy.webp",
format: "webp"
}>>
<</if>>
<<set _combatEnemyMedia to _result>>
<</widget>>
<<widget "enemyTurnCard" container>>
<<set _etcEnemy to _args[0]>>
<<set _etcIndex to _args[1]>>
<div class="enemy-turn-card" data-enemy-index="<<print _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>>
<<set _portraitClothing to "dressed">>
<<if _etcEnemy.clothing>>
<<if _etcEnemy.clothing.titsExposed && _etcEnemy.clothing.pussyExposed>>
<<set _portraitClothing to "naked">>
<<elseif _etcEnemy.clothing.titsExposed>>
<<set _portraitClothing to "exposed_tits">>
<<elseif _etcEnemy.clothing.pussyExposed>>
<<set _portraitClothing to "exposed_pussy">>
<<elseif (_etcEnemy.clothing.top || 100) < 50>>
<<set _portraitClothing to "torn_top">>
<<elseif (_etcEnemy.clothing.bottom || 100) < 50>>
<<set _portraitClothing to "torn_bottom">>
<</if>>
<</if>>
<div class="portrait-placeholder">
<<if _etcEnemy.gender === "female">>♀<<else>>♂<</if>>
</div>
<<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 <<print _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 _lustPct to Math.floor(_etcEnemy.lust)>>
<<set _lustBars to Math.min(10, Math.floor(_lustPct / 10))>>
<<print "♥".repeat(_lustBars)>><<print "♡".repeat(10 - _lustBars)>>
</span>
<span class="stat-numbers"><<print Math.floor(_etcEnemy.lust)>>/100</span>
</div>
<</if>>
</div>
</div>
<div class="enemy-turn-content">
<<print _contents>>
</div>
</div>
<</widget>>
<<widget "enemyActionLabel">>
<<set _ealType to _args[0]>>
<<set _ealTarget to _args[1]>>
<<set _ealText to _args[2]>>
<div class="enemy-action-label <<print _ealType>>">
<<switch _ealType>>
<<case "attack">>
<span class="action-icon"><<icon "attack" "medium">></span>
<<case "sexual">>
<span class="action-icon"><<icon "corruption" "medium">></span>
<<case "ability">>
<span class="action-icon"><<icon "magic" "medium">></span>
<<case "status">>
<span class="action-icon"><<icon "sleep" "medium">></span>
<</switch>>
<span class="action-text"><<print _ealText || "Acts">></span>
<<if _ealTarget>>
<span class="action-target-arrow">→</span>
<span class="action-target <<print _ealTarget>>">
<<print _ealTarget === "player" ? "YOU" : "KIRA">>
</span>
<</if>>
</div>
<</widget>>
<<widget "hitRollDisplay">>
<<set _hrdRoll to _args[0]>>
<<set _hrdChance to _args[1]>>
<<set _hrdHit to (_hrdRoll <= _hrdChance)>>
<div class="hit-roll-display <<print _hrdHit ? 'hit' : 'miss'>>">
<span class="roll-label">Hit roll:</span>
<span class="roll-value"><<print _hrdRoll>></span>
<span class="roll-vs">vs</span>
<span class="roll-chance"><<print _hrdChance>></span>
<span class="roll-accuracy">accuracy</span>
<span class="roll-equals">=</span>
<span class="roll-result"><<print _hrdHit ? "HIT" : "MISS">></span>
</div>
<</widget>>
<<widget "damageResult">>
<<set _drAmount to _args[0]>>
<<set _drType to _args[1]>>
<<set _drTarget to _args[2]>>
<div class="damage-result <<print _drType>>">
<<switch _drType>>
<<case "physical">>
<span class="damage-icon"><<icon "health" "medium">></span>
<span class="damage-amount">-<<print _drAmount>> HP</span>
<<case "lust">>
<span class="damage-icon"><<icon "corruption" "medium">></span>
<span class="damage-amount"><<print "+" + _drAmount>> Lust</span>
<<case "healing">>
<span class="damage-icon"><<icon "health" "medium">></span>
<span class="damage-amount"><<print "+" + _drAmount>> HP</span>
<</switch>>
<<if _drTarget>>
<span class="damage-to">to <<print _drTarget === "player" ? "you" : _drTarget.toUpperFirst()>></span>
<</if>>
</div>
<</widget>>
<<widget "targetHealthUpdate">>
<<set _thuTarget to _args[0]>>
<<if _thuTarget === "player">>
<<set _thuName to "Your">>
<<set _thuHealth to $player.health>>
<<set _thuMaxHealth to $player.maxHealth>>
<<else>>
<<set _thuName to "Kira's">>
<<if $companions && $companions[0]>>
<<set _thuHealth to $companions[0].health>>
<<set _thuMaxHealth to $companions[0].maxHealth>>
<<else>>
<<set _thuHealth to 0>>
<<set _thuMaxHealth to 60>>
<</if>>
<</if>>
<div class="target-health-update">
<span class="health-label"><<print _thuName>> HP:</span>
<span class="health-bar-inline">
<<set _hpPct to Math.floor((_thuHealth / _thuMaxHealth) * 100)>>
<<set _bars to Math.min(12, Math.floor(_hpPct / 10) + Math.floor(_hpPct / 20))>>
<<set _empty to 12 - _bars>>
<<print "█".repeat(_bars)>><<print "░".repeat(_empty)>>
</span>
<span class="health-numbers"><<print Math.floor(_thuHealth)>>/<<print _thuMaxHealth>></span>
</div>
<</widget>>
<<widget "targetLustUpdate">>
<<set _tluTarget to _args[0]>>
<<if _tluTarget === "player">>
<<set _tluName to "Your">>
<<set _tluLust to $player.lust || 0>>
<<else>>
<<set _tluName to "Kira's">>
<<if $companions && $companions[0]>>
<<set _tluLust to $companions[0].lust || 0>>
<<else>>
<<set _tluLust to 0>>
<</if>>
<</if>>
<div class="target-lust-update">
<span class="lust-label"><<print _tluName>> Lust:</span>
<span class="lust-bar-inline">
<<set _lustPct to Math.floor(_tluLust)>>
<<set _lustBars to Math.min(10, Math.floor(_lustPct / 10))>>
<<print "♥".repeat(_lustBars)>><<print "♡".repeat(10 - _lustBars)>>
</span>
<span class="lust-numbers"><<print Math.floor(_tluLust)>>/100</span>
</div>
<</widget>>
<<widget "interventionPrompt">>
<<set _ipMessage to _args[0] || "DO YOU INTERVENE?">>
<<set _ipWatchPassage to _args[1] || "Combat_Watch_Grope">>
<<set _ipStunned to (
($combat.playerStunned && $combat.playerStunned > 0) ||
($combat.playerDazed && $combat.playerDazedTurns > 0)
)>>
<<set _ipCriticallyWounded to ($player.health <= 5)>>
<<if _ipStunned || _ipCriticallyWounded>>
<div class="intervention-blocked">
<div class="blocked-header">
<<icon "hazard-sign" "medium">> <span class="blocked-text">UNABLE TO INTERVENE</span>
</div>
<p class="blocked-reason">
<<if _ipStunned>>
You're too dazed to react in time!
<<elseif _ipCriticallyWounded>>
You're too wounded to help!
<</if>>
</p>
<p class="blocked-narrative">
You can only watch helplessly as the assault continues...
</p>
</div>
<div class="choice-container">
<<if $extremeContent.dubcon && _ipWatchPassage>>
<<vchoice "Watch..." _ipWatchPassage "intimate" "search">>
<<else>>
<<vchoice "Continue" "Combat_Actions" "move" "map">>
<</if>>
</div>
<<else>>
<div class="intervention-prompt">
<div class="intervention-alert">
<<icon "hazard-sign" "medium">> <span class="intervention-text"><<print _ipMessage>></span>
</div>
<<interventionChoices _ipWatchPassage>>
</div>
<</if>>
<</widget>>
<<widget "enemyTurnSummary">>
<div class="enemy-turn-summary">
<div class="summary-header">
<span class="summary-icon"><<icon "cycle">></span>
<span class="summary-text">END OF ENEMY TURN</span>
<span class="summary-round">Round <<print $combat.turn>></span>
</div>
<div class="summary-stats">
<div class="summary-row player-row">
<span class="char-label">Your Status:</span>
<span class="health-bar-summary">
HP: <<set _pHP to Math.floor(($player.health / $player.maxHealth) * 100)>>
<<print "█".repeat(Math.floor(_pHP / 10))>><<print "░".repeat(10 - Math.floor(_pHP / 10))>>
<<print $player.health>>/<<print $player.maxHealth>>
</span>
<<if $player.lust && $player.lust >= 30>>
<span class="lust-bar-summary">
Lust: <<print "♥".repeat(Math.floor($player.lust / 10))>><<print "♡".repeat(10 - Math.floor($player.lust / 10))>>
<<print Math.floor($player.lust)>>/100
</span>
<</if>>
</div>
<<if $combat.companionInCombat && $companions && $companions[0]>>
<div class="summary-row kira-row">
<span class="char-label">Kira's Status:</span>
<span class="health-bar-summary">
HP: <<set _kHP to Math.floor(($companions[0].health / $companions[0].maxHealth) * 100)>>
<<print "█".repeat(Math.floor(_kHP / 10))>><<print "░".repeat(10 - Math.floor(_kHP / 10))>>
<<print $companions[0].health>>/<<print $companions[0].maxHealth>>
</span>
<<if $companions[0].lust && $companions[0].lust >= 30>>
<span class="lust-bar-summary">
Lust: <<print "♥".repeat(Math.floor($companions[0].lust / 10))>><<print "♡".repeat(10 - Math.floor($companions[0].lust / 10))>>
<<print Math.floor($companions[0].lust)>>/100
</span>
<</if>>
<<if $companions[0].tension && $companions[0].tension >= 40>>
<span class="tension-indicator">
<<icon "electricity" "medium">> Tension: <<print Math.floor($companions[0].tension)>>/100
</span>
<</if>>
</div>
<</if>>
</div>
<div class="summary-continue">
<<if $player.health <= 0>>
<p class="defeat-text">You've been defeated...</p>
<div class="choice-container">
<<vchoice "Continue" "Combat_Defeat" "move" "skull">>
</div>
<<elseif $combat.companionInCombat && $companions[0] && $companions[0].health <= 1>>
<p class="kira-down-text">Kira has fallen!</p>
<div class="choice-container">
<<vchoice "Continue" "Combat_Actions" "move" "map">>
</div>
<<else>>
<div class="choice-container">
<<vchoice "Your Turn" "Combat_Actions" "action" "attack">>
</div>
<</if>>
</div>
</div>
<</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 "combatNarrative">>
<<set _cnPool to _args[0]>>
<<set _cnFallback to _args[1] || "">>
<<set _cnClass to _args[2] || "">>
<<if setup.combatNarrative && setup.combatNarrative[_cnPool]>>
<<set _cnText to setup.combatNarrative[_cnPool].random()>>
<<else>>
<<set _cnText to _cnFallback>>
<</if>>
<<if _cnClass && _cnText>>
<p class="<<print _cnClass>>"><<print _cnText>></p>
<<elseif _cnText>>
<<print _cnText>>
<</if>>
<</widget>>
<<widget "getCombatNarrative">>
<<set _gcnPool to _args[0]>>
<<set _gcnFallback to _args[1] || "">>
<<if setup.combatNarrative[_gcnPool]>>
<<set _return to setup.combatNarrative[_gcnPool].random()>>
<<else>>
<<set _return to _gcnFallback>>
<</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]>>
<<if _peaEnemy.beenUsed>>
<<set _peaAction.actionType to "subdued">>
<<set _peaAction.statusMessage to _peaEnemy.name + " lies subdued, no longer resisting...">>
<<set _peaAction.statusIcon to "submission">>
<<return>>
<</if>>
<<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">>
<<return>>
<</if>>
<<if _peaEnemy.stunned && _peaEnemy.stunnedTurns > 0>>
<<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 _peaEnemy.stunnedTurns>>
<<return>>
<</if>>
<<if _peaEnemy.lust >= (_peaEnemy.lustBreak || 100)>>
<<set _peaEnemy.lustBroken to true>>
<<set _peaAction.actionType to "lust_break">>
<<set _peaAction.statusIcon to "high-arousal">>
<<setPronouns _peaEnemy>>
<<if _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.She + " can't take it anymore. " + _p.Her + " hand slides between " + _p.her + " 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>>
<<run console.log('[LUST_BREAK] Enemy newly lust-stunned, stunnedTurns set to 2')>>
<<else>>
<<run console.log('[LUST_BREAK] Enemy already stunned with ' + _peaEnemy.stunnedTurns + ' turns remaining')>>
<</if>>
<<set _peaAction.stunnedTurnsRemaining to _peaEnemy.stunnedTurns>>
<<return>>
<</if>>
<<set _peaIsFeared to false>>
<<if _peaEnemy.statusEffects>>
<<for _peaStatus range _peaEnemy.statusEffects>>
<<if _peaStatus.id === "fear">>
<<set _peaIsFeared to true>>
<<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">>
<<return>>
<<elseif _peaFearRoll lte 75>>
<<set _peaEnemy.fearPenalty to true>>
<<else>>
<<set _peaFleeRoll to random(1, 100)>>
<<if _peaFleeRoll lte 30>>
<<set _peaAction.actionType to "feared_fled">>
<<set _peaAction.statusMessage to _peaEnemy.name + " panics and flees the battle!">>
<<set _peaAction.statusIcon to "run">>
<<set _peaAction.willFlee to true>>
<<return>>
<<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">>
<<return>>
<</if>>
<</if>>
<</if>>
<<if _peaEnemy.gender === "female" && (_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 $flags.seductionUnlocked && !$combat.sexActionThisTurn>>
<<enemySexDecision _peaEnemy _peaIdx>>
<<if _peaEnemy.sexIntent && !_peaEnemy.stunned>>
<<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 !_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>>
<<return>>
<</if>>
<</if>>
<<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>>
<</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">>
<<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 ($player.health >= ($player.maxHealth * 0.25))>>
<</widget>>
<<widget "executeDefensiveAction">>
<<set _config to _args[0]>>
<<set _playerPos to ($combat.positions && $combat.positions.player) || "standing">>
<<if _config.blockedPositions && _config.blockedPositions.includes(_playerPos)>>
<div class="combat-error">Cannot use <<print _config.name>> from this position!</div>
<<goto "Combat_Actions">>
<</if>>
<<set _positionPenalty to 0>>
<<if _config.positionPenalties && _config.positionPenalties[_playerPos]>>
<<set _positionPenalty to _config.positionPenalties[_playerPos]>>
<</if>>
<<if _config.hpMinPercent && _config.hpMinPercent > 0>>
<<if $player.health lt ($player.maxHealth * _config.hpMinPercent)>>
<div class="combat-error">
<<if setup.defensiveNarratives && setup.defensiveNarratives[_config.actionType + "_error_low_hp"]>>
<<print setup.defensiveNarratives[_config.actionType + "_error_low_hp"]>>
<<else>>
Cannot perform this action at low HP!
<</if>>
</div>
<<goto "Combat_Actions">>
<</if>>
<</if>>
<<if _config.energyCost > 0>>
<<if $player.energy lt _config.energyCost>>
<div class="combat-error">Too tired! (Need <<print _config.energyCost>> energy)</div>
<<goto "Combat_Actions">>
<</if>>
<<clampStat "player.energy" (-(_config.energyCost || 0)) 0 50>>
<</if>>
<<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">
<<if _config.hasEnemySpecificImages>>
<<switch _target.id>>
<<case "raider" "raider_grunt">>
<img @src="'assets/images/' + _config.imagePrefix + 'raider-defend.png'" @alt="_config.name" class="combat-action-img">
<<case "raider_scout">>
<img @src="'assets/images/' + _config.imagePrefix + 'scout-defend.png'" @alt="_config.name" class="combat-action-img">
<<case "raider_brute">>
<img @src="'assets/images/' + _config.imagePrefix + 'brute-defend.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>
<</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 _target.positionHeldTurns to 0>>
<<set $combat.enemies[_targetIndex].positionHeldTurns to 0>>
<<if _config.setEnemyPinned>>
<<set $combat.enemyPinned to _targetIndex>>
<</if>>
<<set _target.lust to (_target.lust || 0) + _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]>>
<<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 (_posModifiedLustDamage > _lustDamage)>>
<<set _lustDamage to _posModifiedLustDamage>>
<</if>>
<<set _painDamage to 0>>
<<if _config.painDamageRange>>
<<set _painDamage to random(_config.painDamageRange[0], _config.painDamageRange[1])>>
<</if>>
<<set _target.lust to (_target.lust || 0) + _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 (_target.lust || 0) + _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>>
<<clampStat "player.health" (-(_config.missDamage || 0)) 0 100>>
<div class="damage-taken">You take <<print _config.missDamage>> damage!</div>
<</if>>
<<else>>
<<set _lustDmg to random(_config.lustDamage.min, _config.lustDamage.max)>>
<<set _target.lust to (_target.lust || 0) + _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">>
<p class="explicit ultra"><<combatNarrative _config.narrativePool "[FALLBACK: " + (_config.actionName || "unnamed") + " - narrative pool '" + (_config.narrativePool || "EMPTY") + "' not found]">></p>
<<if _config.clothingAction === "damage_chance">>
<<if random(1,100) lte _config.clothingChance>>
<<set _clothDmg to random(_config.clothingDamage.min, _config.clothingDamage.max)>>
<<set _target.clothing.bottom to Math.max(0, (_target.clothing.bottom || 100) - _clothDmg)>>
<p class="explicit">The friction tears at her clothes— they're giving way!</p>
<<updateEnemyExposure _targetIndex>>
<</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>>
<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 && _target.lust gte _target.seduceThreshold>>
<p class="explicit victory">She cums HARD— CLAIMED AND CONQUERED!</p>
<<set _target.defeated to true>>
<<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>>
<<initCombatTarget>>
<<if $player.energy lt _config.energyCost>>
<div class="combat-error">
Not enough energy! (Need <<print _config.energyCost>> energy)
</div>
<<goto "Combat_Actions">>
<</if>>
<<clampStat "player.energy" (-(_config.energyCost || 0)) 0 50>>
<<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) - (_target.dodge || 0) + _config.accuracyModifier>>
<<if $clothing && $clothing.player && $clothing.player.dickExposed>>
<<set _baseAccuracy -= 5>>
<</if>>
<div class="combat-action-visual">
<<if _config.imagePath>>
<img @src="'assets/images/' + _config.imagePath" alt="Rapid Strikes" class="combat-action-img">
<</if>>
</div>
<div class="combat-action-result rapid-strikes">
<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 _target.health -= _damage>>
<<set _totalDamage += _damage>>
<<set _hitCount += 1>>
<div class="combat-hit-effect rapid-hit">
<<combatNarrative _config.narrativePools.hit>>
<span class="damage-number">-<<print _damage>></span>
</div>
<<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])>>
<<damageClothingWithArmor _targetIndex "random" _clothingDmg>>
<</if>>
<</if>>
<<if _target.health lte 0>>
<<break>>
<</if>>
<<else>>
<<set _missCount += 1>>
<div class="combat-miss-effect rapid-miss">
<<combatNarrative _config.narrativePools.miss>>
</div>
<</if>>
<</for>>
<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 $combat.enemies.splice(_targetIndex, 1)>>
<<if $combat.enemies.length === 0>>
<<goto "Combat_Victory">>
<</if>>
<</if>>
<<logCombat "Rapid Strikes: " + _hitCount + "/" + _config.numStrikes + " hits for " + _totalDamage + " total damage!" "damage">>
</div>
<div class="choice-container">
<<vchoice "Continue" _config.nextPassage "move" "map">>
</div>
<</widget>>
<<widget "executeVerbalDegrade">>
<<set _config to _args[0]>>
<<initCombatTarget>>
<<if $player.energy lt _config.energyCost>>
<div class="combat-error">
Not enough energy! (Need <<print _config.energyCost>> energy)
</div>
<<goto "Combat_Actions">>
<</if>>
<<clampStat "player.energy" (-(_config.energyCost || 0)) 0 50>>
<<initHumiliation _targetIndex>>
<div class="combat-action-result">
<<set _targetPos to ($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>>
<div class="verbal-degradation">
<<combatNarrative _narrativePool>>
</div>
<<addHumiliation _targetIndex _humAmount "verbal">>
<<set _target.lust to (_target.lust || 0) + _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>
<</widget>>
<<widget "executeAllowOrgasm">>
<<set _config to _args[0]>>
<<initCombatTarget>>
<<if $player.energy lt _config.energyCost>>
<div class="combat-error">
Not enough energy! (Need <<print _config.energyCost>> energy)
</div>
<<goto "Combat_Actions">>
<</if>>
<<clampStat "player.energy" (-(_config.energyCost || 0)) 0 50>>
<div class="combat-action arousal-action allow-orgasm">
<<initArousalState _targetIndex>>
<<set _genderSuffix to setup.genderSuffix(_target.gender, "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>>
<<set _beggingPool to _config.narrativePools["begging" + _genderSuffix]>>
<<combatNarrative _beggingPool "" "explicit enemy-dialogue">>
<<set _orgasmPool to _config.narrativePools["orgasm" + _genderSuffix]>>
<<set _orgasmFallback to _config.fallbackText[_target.gender] || _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">
<<if _target.gender === "female">>
<<icon "submission" "medium">> She's becoming compliant...
<<else>>
<<icon "submission" "medium">> He's becoming compliant...
<</if>>
</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>
<</widget>>
<<widget "executeDrainEssence">>
<<set _config to setup.supernaturalConfigs.drain_essence>>
<<set _target to $combat.enemies[0]>>
<<if $player.energy lt _config.energyCost>>
<div class="combat-error">Not enough energy! (Need <<print _config.energyCost>> energy)</div>
<<goto "Combat_Actions">>
<</if>>
<<clampStat "player.energy" (-(_config.energyCost || 0)) 0 50>>
<div class="combat-action-visual supernatural">
<img src="assets/images/combat/drain-essence.png" alt="Drain Essence" class="combat-action-img">
</div>
<<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 _target.health -= _damage>>
<<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 $combat.enemies.shift()>>
The <<print _target.name.toLowerCase()>> <<print _config.deathText>>
<<if _config.victoryCheck && $combat.enemies.length === 0>>
<<goto "Combat_Victory">>
<</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" "Combat_Companion_Turn" "move" "map">>
</div>
<</widget>>
<<widget "executeSuccubusKiss">>
<<set _config to setup.supernaturalConfigs.succubus_kiss>>
<<set _target to $combat.enemies[0]>>
<<if $player.energy lt _config.energyCost>>
<div class="combat-error">Not enough energy! (Need <<print _config.energyCost>> energy)</div>
<<goto "Combat_Actions">>
<</if>>
<<clampStat "player.energy" (-(_config.energyCost || 0)) 0 50>>
<div class="combat-action-visual supernatural">
<<if _config.hasVideo>>
<<intimateVideo _config.videoPath "You kiss with supernatural power..." false>>
<<else>>
<img src="assets/images/combat/succubus-kiss.png" alt="Succubus Kiss" class="combat-action-img">
<</if>>
</div>
<<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>
<</widget>>
<<widget "executeTerrorVisage">>
<<set _config to setup.supernaturalConfigs.terror_visage>>
<<if $player.energy lt _config.energyCost>>
<div class="combat-error">Not enough energy! (Need <<print _config.energyCost>> energy)</div>
<<goto "Combat_Actions">>
<</if>>
<<clampStat "player.energy" (-(_config.energyCost || 0)) 0 50>>
<div class="combat-action-visual supernatural">
<img src="assets/images/combat/terror-visage.png" alt="Terror Visage" class="combat-action-img">
</div>
<<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>
<</widget>>
<<widget "executeShadowStep">>
<<set _config to setup.supernaturalConfigs.shadow_step>>
<<if $player.energy lt _config.energyCost>>
<div class="combat-error">Not enough energy! (Need <<print _config.energyCost>> energy)</div>
<<goto "Combat_Actions">>
<</if>>
<<clampStat "player.energy" (-(_config.energyCost || 0)) 0 50>>
<div class="combat-action-visual supernatural">
<img src="assets/images/combat/shadow-step.png" alt="Shadow Step" class="combat-action-img">
</div>
<<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>
<</widget>>
<<widget "executeAbyssalForm">>
<<set _config to setup.supernaturalConfigs.abyssal_form>>
<<if $player.energy lt _config.energyCost>>
<div class="combat-error">Not enough energy! (Need <<print _config.energyCost>> energy)</div>
<<goto "Combat_Actions">>
<</if>>
<<clampStat "player.energy" (-(_config.energyCost || 0)) 0 50>>
<div class="combat-action-visual supernatural">
<<combatVideo "assets/videos/combat/abyssal-transform.mp4" false>>
</div>
<<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>
<</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 $combat.playerStunned && $combat.playerStunned > 0>>
<<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>>
<<clampStat "player.health" (-random(2, 4)) 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 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>>
<<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>>
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 += '<p>The raider\'s hands are rough but deliberate. He tugs her top up, exposing her stomach, then higher.</p>';
html += '<p class="enemy-speech">"Fuck. Look at these..."</p>';
html += '<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 += '<p>He squeezes one breast roughly, watching her face for any reaction. Kira remains unconscious, unaware of the violation.</p>';
html += '<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 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", "exposed")>>
<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 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"
}>>
<</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="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="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", "naked")>>
<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 3>>
<<set $combat.enemies[0].health -= 20>>
<<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 "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">THE DARKEST PATH</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 "executeKiraCNCJoinCard">>
<<silently>>
<<set $flags.joinedKiraCNC to true>>
<<addCorruption 15>>
<<set $player.lust to 0>>
<<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"
}>>
<</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>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="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>>
<<executeKiraCNCJoinCard>>
<<run VaultUI.showCharacter("kira", "center", "naked")>>
<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 "kiraCNCJoinMaleCard">>
<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">JOINING IN</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 "executeKiraCNCJoinMaleCard">>
<<silently>>
<<set $flags.joinedKiraCNC to true>>
<<addCorruption 15>>
<<set $player.lust to 0>>
<<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
}>>
<</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="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">>
<<kiraCNCJoinMaleCard>>
<<executeKiraCNCJoinMaleCard>>
<<run VaultUI.showCharacter("kira", "center", "naked")>>
<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 "kiraCNCJoinFemaleCard">>
<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">JOINING IN</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 "executeKiraCNCJoinFemaleCard">>
<<silently>>
<<set $flags.joinedKiraCNC to true>>
<<addCorruption 15>>
<<set $player.lust to 0>>
<<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
}>>
<</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="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">>
<<kiraCNCJoinFemaleCard>>
<<executeKiraCNCJoinFemaleCard>>
<<run VaultUI.showCharacter("kira", "center", "naked")>>
<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>>
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 += '<p>He approaches her, crouching down. His rough hand brushes hair from her face.</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 += '<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 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>>
<<set $player.corruption -= 2>>
<<set $combat.enemies[0].stunned to 2>>
<<set $combat.enemies[0].health -= 15>>
<<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: $flags.kiraUnconsciousFirstTime
}>>
<</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($combat.backgroundImage || "media/backgrounds/travel/terrain/reclaimed/reclaimed_1.webp")>>
<<run VaultUI.setTimeOfDay("afternoon")>>
<<if $flags.kiraUnconsciousFirstTime>>
<<goto "Kira_Unconscious_FirstTime_Start">>
<<else>>
<<goto "Kira_Unconscious_Carry_Home">>
<</if>>
<</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>>
<<set _savedReturnPassage to $combat.returnPassage || "Vault_Hub">>
<<endCombat>>
<<set window._kiraVictoryData to {
firstTime: $flags.kiraUnconsciousFirstTime
}>>
<</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($combat.backgroundImage || "media/backgrounds/travel/terrain/reclaimed/reclaimed_1.webp")>>
<<run VaultUI.setTimeOfDay("afternoon")>>
<<if $flags.kiraUnconsciousFirstTime>>
<<goto "Kira_Unconscious_FirstTime_Start">>
<<else>>
<<goto "Kira_Unconscious_Carry_Home">>
<</if>>
<</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>>
<<set _enemy to $combat.enemies[0]>>
<<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" -6>>
<<addTension "kira" 12>>
<<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" -5>>
<<addTension "kira" 10>>
<<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" -4>>
<<addTension "kira" 8>>
<<set _kiraOrgasm to false>>
<</if>>
<<addMaleEnemyLust random(15, 20) "sex_act_complete">>
<<set _videoPath to null>>
<<if _isBound>>
<<selectMediaWithRace "combat/kira-bound-fucked" {} _enemy>>
<<else>>
<<selectMediaWithRace "combat/kira-combat-fucked" {} _enemy>>
<</if>>
<<if _result && _result.file>>
<<set _videoPath to _result.file>>
<<set _videoFormat to _result.format>>
<</if>>
<<if _isBound>>
<<set _narrativeStart to setup.combatNarrative.kira_bound_fucked_start ? setup.combatNarrative.kira_bound_fucked_start.random() : "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,
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) {
var imgSrc = data.isBound
? 'assets/images/combat/kira-bound-fucked.webp'
: 'assets/images/combat/kira-fucked-combat.webp';
var imgAlt = data.isBound ? 'Kira Fucked While Bound' : 'Kira Fucked';
imageEl.innerHTML = '<div class="narrative-image intimate"><img src="' + imgSrc + '" alt="' + imgAlt + '"></div>';
}
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>';
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 {
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 (videoEl && data.showVideos && data.videoPath) {
videoEl.innerHTML = '<video autoplay loop muted playsinline><source src="' + data.videoPath + '" type="video/' + (data.videoFormat || 'mp4') + '"></video>';
videoEl.style.display = 'block';
} else if (videoEl) {
videoEl.style.display = 'none';
}
if (reactionEl) {
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>';
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) {
effectHtml += '<div class="effect-row negative"><span class="icon"><span class="gi gi-arrow-down"></span></span> Trust severely damaged (-30)</div>';
}
effectsEl.innerHTML = effectHtml;
}
}, 50);
<</script>>
<</widget>>
<<widget "kiraWatchFuckedCardFlow">>
<<kiraWatchFuckedCard>>
<<executeKiraWatchFuckedCard>>
<<silently>>
<<set _enemy to $combat.enemies[0]>>
<<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>>
setTimeout(function() {
var narrativeEl = document.querySelector('.check-narrative');
if (narrativeEl) {
var html = '<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>>
<<advanceTime 0 30>>
<</silently>>
<<script>>
setTimeout(function() {
var narrativeEl = document.querySelector('.aftermath-narrative');
if (narrativeEl) {
var html = '<h2>Victory</h2>';
html += '<p>The enemies are dead. But the damage is done.</p>';
html += '<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($combat.backgroundImage || "media/backgrounds/travel/terrain/reclaimed/reclaimed_1.webp")>>
<<run VaultUI.setTimeOfDay("afternoon")>>
<<showCharacter "kira" "center" "hurt">>
<div class="choice-container">
<<vchoice "Return to vault" "Vault_Hub" "move" "house">>
</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 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>>
<<set _kscIdx to $combat.currentTarget || 0>>
<<set _enemy to $combat.enemies[_kscIdx]>>
<<if !_enemy>><<set _kscIdx to 0>><<set _enemy to $combat.enemies[0]>><</if>>
<<setPronouns _enemy>>
<<damageClothing "kira" "bottom" 50>>
<<clampStat "player.lust" 20>>
<<addTension "kira" 4>>
<<set _enemy.lust to Math.min(100, (Number(_enemy.lust) || 0) + 25)>>
<<set $combat.enemies[_kscIdx].lust to _enemy.lust>>
<<set window._kiraStrippedData to {
enemyName: _enemy.name,
pronoun: _p
}>>
<</silently>>
<<script>>
setTimeout(function() {
var data = window._kiraStrippedData;
if (!data) return;
var sceneEl = document.querySelector('.sex-scene-display');
if (sceneEl) {
var html = '<p>You watch as ' + data.pronoun.he + ' tears at her clothes...</p>';
html += '<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>>
<<set _enemy to $combat.enemies[$combat.currentTarget]>>
<<if !_enemy>><<set _enemy to $combat.enemies[0]>><</if>>
<<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 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
}>>
<</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 "kiraRepairCard">>
<div class="combat-card companion-card kira-repair-card">
<div class="card-header repair-header">
<span class="card-icon"><<icon "repair">></span>
<span class="card-title">REPAIRING CLOTHES</span>
</div>
<div class="card-body">
<div class="repair-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 "executeKiraRepairCard">>
<<silently>>
<<set _titsExposed to $clothing.kira.titsExposed>>
<<set _pussyExposed to $clothing.kira.pussyExposed>>
<<if $clothing.kira.top lt 30>><<set $clothing.kira.top to 30>><</if>>
<<if $clothing.kira.bottom lt 30>><<set $clothing.kira.bottom to 30>><</if>>
<<set $clothing.kira.titsExposed to false>>
<<set $clothing.kira.pussyExposed to false>>
<<set window._kiraRepairData to {
titsExposed: _titsExposed,
pussyExposed: _pussyExposed
}>>
<</silently>>
<<script>>
setTimeout(function() {
var data = window._kiraRepairData;
if (!data) return;
var narrativeEl = document.querySelector('.repair-narrative');
if (narrativeEl) {
var html = '<p>You help Kira pull her torn clothing back into place.</p>';
if (data.titsExposed || data.pussyExposed) {
html += '<p>It\'s a temporary fix at best—safety pins and careful tucking—but at least she\'s covered.</p>';
html += '<p class="kira-speech">"Thanks. This will hold until we get back."</p>';
} else {
html += '<p class="kira-speech">"Appreciate the help."</p>';
}
narrativeEl.innerHTML = html;
}
}, 50);
<</script>>
<</widget>>
<<widget "kiraRepairCardFlow">>
<<kiraRepairCard>>
<<executeKiraRepairCard>>
<<relationChange "kira" "affection" 1>>
<div class="choice-container">
<<vchoice "Continue" "WorldMap_View" "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>>
<<set _enemy to $combat.enemies[0]>>
<<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" -7>>
<<addTension "kira" 12>>
<<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" -5>>
<<addTension "kira" 9>>
<</if>>
<<addMaleEnemyLust random(15, 20) "anal_complete">>
<<set _videoPath to null>>
<<if _isBound>>
<<selectMediaWithRace "combat/kira-bound-anal" {} _enemy>>
<<else>>
<<selectMediaWithRace "combat/kira-forced-anal" {} _enemy>>
<</if>>
<<if _result && _result.file>>
<<set _videoPath to _result.file>>
<<set _videoFormat to _result.format>>
<</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,
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) {
var imgSrc = data.isBound
? 'assets/images/combat/kira-bound-anal.webp'
: 'assets/images/combat/kira-anal-combat.webp';
var imgAlt = data.isBound ? 'Bound Forced Anal' : 'Forced Anal';
imageEl.innerHTML = '<div class="narrative-image intimate"><img src="' + imgSrc + '" alt="' + imgAlt + '"></div>';
}
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>';
html += '<p>Kira hangs limply in her bonds, cum leaking from her ruined ass, broken by the violation.</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 (videoEl && data.showVideos && data.videoPath) {
videoEl.innerHTML = '<video autoplay loop muted playsinline><source src="' + data.videoPath + '" type="video/' + (data.videoFormat || 'mp4') + '"></video>';
videoEl.style.display = 'block';
} else if (videoEl) {
videoEl.style.display = 'none';
}
if (reactionEl) {
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>';
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) {
effectHtml += '<div class="effect-row negative"><span class="icon"><span class="gi gi-arrow-down"></span></span> Trust severely damaged (-35)</div>';
}
effectsEl.innerHTML = effectHtml;
}
}, 50);
<</script>>
<</widget>>
<<widget "kiraWatchAnalCardFlow">>
<<kiraWatchAnalCard>>
<<executeKiraWatchAnalCard>>
<<silently>>
<<set _enemy to $combat.enemies[0]>>
<<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 "kiraJoinDPCard">>
<div class="combat-card companion-card kira-sex-card">
<div class="card-header sex-header extreme-header">
<span class="card-icon"><<icon "corruption">></span>
<span class="card-title">JOINING IN</span>
</div>
<div class="card-body">
<div id="kira-dp-image" class="card-image-container"></div>
<div id="kira-dp-narrative" class="sex-scene-display"></div>
<div id="kira-dp-video" class="card-video-container"></div>
<div id="kira-dp-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 "executeKiraJoinDPCard">>
<<silently>>
<<set _enemy to $combat.enemies[0]>>
<<set _enemy.stunned to true>>
<<set _enemy.stunnedTurns to 2>>
<<set $player.lust to 20>>
<<set $flags.joinedKiraThreesome to true>>
<<set $flags.kiraCreamedByEnemy to true>>
<<relationChange "kira" "trust" -6>>
<<addTension "kira" 10>>
<<set _videoPath to null>>
<<selectMediaWithRace "combat/kira-dp-mff" {} _enemy>>
<<if _result && _result.file>>
<<set _videoPath to _result.file>>
<<set _videoFormat to _result.format>>
<</if>>
<<set window._kiraJoinDPData to {
enemyName: _enemy.name,
videoPath: _videoPath,
videoFormat: _videoFormat,
showVideos: $preferences && $preferences.showVideos
}>>
<</silently>>
<<script>>
setTimeout(function() {
var data = window._kiraJoinDPData;
if (!data) return;
var imageEl = document.getElementById('kira-dp-image');
var narrativeEl = document.getElementById('kira-dp-narrative');
var videoEl = document.getElementById('kira-dp-video');
var effectsEl = document.getElementById('kira-dp-effects');
if (imageEl) {
imageEl.innerHTML = '<div class="narrative-image intimate"><img src="assets/images/combat/kira-dp-combat.webp" alt="Double Penetration Combat"></div>';
}
if (narrativeEl) {
var html = '<p>You move toward them. Kira\'s eyes widen.</p>';
html += '<p class="kira-speech">"What are you— you\'re going to—"</p>';
html += '<p>' + data.enemyName + ' grins.</p>';
html += '<p class="enemy-speech">"Room for two. I\'ve got her pussy. You take her mouth."</p>';
html += '<p>You position yourself at Kira\'s face. She\'s being fucked from behind already.</p>';
html += '<p class="explicit">She takes you in her mouth. No choice. ' + data.enemyName + ' pounding her pussy while you use her throat.</p>';
html += '<p class="kira-speech">"Mmmph— nngh—"</p>';
html += '<p>She can\'t speak. Can\'t protest. Just takes both cocks.</p>';
html += '<p class="explicit climax">You and ' + data.enemyName + ' finish simultaneously. In her mouth. In her pussy. She\'s filled from both ends.</p>';
html += '<p>' + data.enemyName + ' staggers, stunned.</p>';
html += '<p>Kira lies there. Violated. By BOTH of you.</p>';
narrativeEl.innerHTML = html;
}
if (videoEl && data.showVideos && data.videoPath) {
videoEl.innerHTML = '<video autoplay loop muted playsinline><source src="' + data.videoPath + '" type="video/' + (data.videoFormat || 'mp4') + '"></video>';
videoEl.style.display = 'block';
} else if (videoEl) {
videoEl.style.display = 'none';
}
if (effectsEl) {
effectsEl.innerHTML = '<div class="effect-row negative"><span class="icon"><span class="gi gi-broken-heart"></span></span> You joined her violation. Trust severely damaged (-30)</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 "kiraJoinDPCardFlow">>
<<kiraJoinDPCard>>
<<executeKiraJoinDPCard>>
<div class="choice-container">
<<vchoice "Kill the enemy" "Combat_Kill_Stunned" "action" "skull-bones">>
</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>>
<<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>>
<<selectMediaWithRace "combat/ride-eye-contact" {} _enemy>>
<<if _result && _result.file>>
<<set _videoPath to _result.file>>
<<set _videoFormat to _result.format>>
<</if>>
<<set window._kiraRideLookData to {
enemyName: _enemy.name,
videoPath: _videoPath,
videoFormat: _videoFormat,
showVideos: $preferences && $preferences.showVideos
}>>
<</silently>>
<<run VaultUI.showCharacter("kira", "left", "conflicted")>>
<<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 = '<div class="narrative-image intimate"><img src="assets/images/combat/player-ridden-kira-watches.webp" alt="Kira Watches"></div>';
}
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 (videoEl && data.showVideos && data.videoPath) {
videoEl.innerHTML = '<video autoplay loop muted playsinline><source src="' + data.videoPath + '" type="video/' + (data.videoFormat || 'mp4') + '"></video>';
videoEl.style.display = 'block';
} else if (videoEl) {
videoEl.style.display = 'none';
}
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>
<div class="kira-result-display"></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">>
<<tryEscapePosition _posI>>
<<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[0]>>
<<checkTensionDistraction>>
<<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>>
<<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 _leashedHit>>
<<set _baseDmg to (_kcs.baseDamage || 2) + Math.floor($tempCompanion.combat / (_kcs.statDivisor || 5))>>
<<set _damageDealt to Math.floor(_baseDmg * _leashedMult)>>
<<set _target.health -= _damageDealt>>
<<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>>
<<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 _kcs.hitChance>>
<<set _damage to _damage + random(_kcs.varianceMin, _kcs.varianceMax)>>
<<set _target.health -= _damage>>
<<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()>>
<<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>>
<<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 $combat.enemies.shift()>>
<<set _kiraKillLog to _target.name + " defeated!">>
<<logCombat _kiraKillLog "critical">>
<<set _kiraAction.killedTarget to true>>
<<set _resultNarrative to setup.combatNarrative.kira_kill.random()>>
<<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()>>
<</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 _actionNarrative to _actionNarrative.replace(/\[Enemy\]/g, _targetName || "the enemy")>>
<<set _actionNarrative to _actionNarrative.replace(/\[Player\]/g, $player.name)>>
<<set _statusNarrative to _statusNarrative.replace(/\[Enemy\]/g, _targetName || "the enemy")>>
<<set _statusNarrative to _statusNarrative.replace(/\[Player\]/g, $player.name)>>
<<set _resultNarrative to _resultNarrative.replace(/\[Enemy\]/g, _targetName || "the enemy")>>
<<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>>
<<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>>
<</widget>>
<<widget "kiraTurnCardFlow">>
<<if !$combat.companionInCombat>>
<<if $combat.useCardUI>>
<<goto "Combat_Enemy_Turn_Cards">>
<<else>>
<<goto "Combat_Enemy_Turn">>
<</if>>
<<else>>
<<kiraTurnCard>>
<<executeKiraTurnCard>>
<<if window._kiraTurnData && window._kiraTurnData.action && window._kiraTurnData.action.allEnemiesDefeated>>
<<goto "Combat_Victory">>
<<else>>
<<set _activeEnemies to $combat.enemies.filter(function(e) { return e.health > 0 && !e.beenUsed; })>>
<<if $combat.enemies.length gt 0 && _activeEnemies.length === 0>>
<<goto "Combat_Victory">>
<</if>>
<div class="choice-container">
<<if $combat.useCardUI>>
<<vchoice "Continue" "Combat_Enemy_Turn_Cards" "move" "map">>
<<else>>
<<vchoice "Continue" "Combat_Enemy_Turn" "move" "map">>
<</if>>
</div>
<</if>>
<</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>>
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 += '<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 += '<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).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>>
<<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>>
<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.combatNarrative && setup.combatNarrative.kira_jealous>>
<<set _kiraJealousReaction to setup.combatNarrative.kira_jealous.random()>>
<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 -->
<div class="card-stats">
<!-- HP Bar -->
<div class="stat-row">
<span class="stat-label">HP:</span>
<div class="stat-bar health-bar">
<div class="stat-fill" @style="'width: ' + Math.floor((_esxEnemy.health / _esxEnemy.maxHealth) * 100) + '%'"></div>
</div>
<span class="stat-value"><<print _esxEnemy.health>>/<<print _esxEnemy.maxHealth>></span>
</div>
<!-- Position -->
<<if _esxEnemy.position && _esxEnemy.position !== "standing">>
<div class="card-position">
<<getPositionIcon _esxEnemy>>
<<icon _positionIcon "medium">>
Position: <<print _esxEnemy.position.replace("_", " ").toUpperFirst()>>
</div>
<</if>>
<!-- Exposure -->
<<if _esxEnemy.clothing && (_esxEnemy.clothing.titsExposed || _esxEnemy.clothing.pussyExposed)>>
<div class="card-exposure">
<<icon "hazard-sign" "medium">>
<<if _esxEnemy.clothing.titsExposed>>Tits Exposed<</if>>
<<if _esxEnemy.clothing.titsExposed && _esxEnemy.clothing.pussyExposed>> · <</if>>
<<if _esxEnemy.clothing.pussyExposed>>Pussy Exposed<</if>>
</div>
<</if>>
</div>
<!-- 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>
<</widget>><<widget "enhancedEnemyStatusCard">>
<<set _escAction to _args[0]>>
<<set _escEnemy to _escAction.enemyRef>>
<<set _escIdx to _escAction.enemyIndex>>
<div class="combat-card enemy-card enemy-status-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">>
<p class="lust-break-advantage"><em>Their lust is your advantage. They can't focus on anything else.</em></p>
<</if>>
</div>
<!-- STATS -->
<div class="card-stats">
<!-- HP Bar -->
<div class="stat-row">
<span class="stat-label">HP:</span>
<div class="stat-bar health-bar">
<div class="stat-fill" @style="'width: ' + Math.floor((_escEnemy.health / _escEnemy.maxHealth) * 100) + '%'"></div>
</div>
<span class="stat-value"><<print _escEnemy.health>>/<<print _escEnemy.maxHealth>></span>
</div>
<!-- Position -->
<<if _escEnemy.position && _escEnemy.position !== "standing">>
<div class="card-position">
<<getPositionIcon _escEnemy>>
<<icon _positionIcon "medium">>
Position: <<print _escEnemy.position.replace("_", " ").toUpperFirst()>>
</div>
<</if>>
<!-- Exposure -->
<<if _escEnemy.clothing && (_escEnemy.clothing.titsExposed || _escEnemy.clothing.pussyExposed)>>
<div class="card-exposure">
<<icon "hazard-sign" "medium">>
<<if _escEnemy.clothing.titsExposed>>Tits Exposed<</if>>
<<if _escEnemy.clothing.titsExposed && _escEnemy.clothing.pussyExposed>> · <</if>>
<<if _escEnemy.clothing.pussyExposed>>Pussy Exposed<</if>>
</div>
<</if>>
</div>
</div>
<</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>
<!-- Video Container -->
<div id="use-her-video" class="card-video-container"></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 "">>
<<clampStat "player.energy" (-(_euhConfig.energyCost || 0)) 0 50>>
<<set _euhStripText to "">>
<<if _target.clothing && (!_target.clothing.titsExposed || !_target.clothing.pussyExposed)>>
<<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>>
<<for _euhI to 0; _euhI lt $combat.enemies.length; _euhI++>>
<<if _euhI !== _euhTargetIdx && $combat.enemies[_euhI].health gt 0>>
<<if !$combat.enemies[_euhI].statusEffects>>
<<set $combat.enemies[_euhI].statusEffects to []>>
<</if>>
<<set _euhHasFear to false>>
<<for _euhEffect range $combat.enemies[_euhI].statusEffects>>
<<if _euhEffect.id === "fear">>
<<set _euhHasFear to true>>
<<set _euhEffect.duration += 1>>
<</if>>
<</for>>
<<if !_euhHasFear>>
<<run $combat.enemies[_euhI].statusEffects.push({
id: "fear",
duration: _euhConfig.fearEffect.duration,
stacks: _euhConfig.fearEffect.stacks
})>>
<</if>>
<<set _euhFearApplied to true>>
<</if>>
<</for>>
<</if>>
<<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)>>
<<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>>
<</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">
<<vchoice "Continue Fight" "Combat_Actions" "action" "attack">>
</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"></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 50>>
<<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>>
<<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.">>
<<for _ecfI to 0; _ecfI lt $combat.enemies.length; _ecfI++>>
<<if _ecfI !== _ecfTargetIdx && $combat.enemies[_ecfI].health gt 0>>
<<if !$combat.enemies[_ecfI].statusEffects>>
<<set $combat.enemies[_ecfI].statusEffects to []>>
<</if>>
<<set _ecfHasFear to false>>
<<for _ecfEffect range $combat.enemies[_ecfI].statusEffects>>
<<if _ecfEffect.id === "fear">>
<<set _ecfHasFear to true>>
<<set _ecfEffect.duration += 2>>
<<set _ecfEffect.stacks to (_ecfEffect.stacks || 1) + 1>>
<</if>>
<</for>>
<<if !_ecfHasFear>>
<<run $combat.enemies[_ecfI].statusEffects.push({id: "fear", duration: 3, stacks: 2})>>
<</if>>
<<set _ecfFearApplied to true>>
<</if>>
<</for>>
<</if>>
<<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)>>
<<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 _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">
<<vchoice "Continue Fight" "Combat_Actions" "action" "attack">>
</div>
<</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 -->
<div id="used-action-narrative-<<print _uacConfig.id>>" class="attack-narrative-container"></div>
<!-- Video Container -->
<div id="used-action-video-<<print _uacConfig.id>>" class="card-video-container"></div>
<!-- Effects -->
<div id="used-action-effects-<<print _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-<<print _uacConfig.id>>"><<print $player.lust>>%</span>
</span>
</div>
</div>
</div>
<</widget>>
<<widget "executeUsedActionCard">>
<<silently>>
<<set _euaConfig to _args[0]>>
<<initCombatTarget>>
<<set _euaTargetIdx to _targetIndex>>
<<clampStat "player.energy" (-(_euaConfig.energyCost || 0)) 0 50>>
<<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 _euaLustDrop to _euaConfig.lustDrop.base + random(0, _euaConfig.lustDrop.variance)>>
<<set $player.lust to Math.max(0, $player.lust - _euaLustDrop)>>
<<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,
mainText: _euaMainText,
moansText: _euaMoansText,
climaxText: _euaClimaxText,
lustDrop: _euaLustDrop,
newLust: $player.lust,
dickExposed: _euaConfig.exposeDick || false
}>>
<</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.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>';
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>';
}
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">
<<vchoice "Continue Fight" "Combat_Actions" "action" "attack">>
</div>
<</widget>>
<<widget "initUsedActionConfigs">>
<<run setup.usedActionConfigs = {}>>
<<run setup.usedActionConfigs.throat = {
id: "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",
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",
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",
name: "WHIP IT OUT & FUCK",
icon: "corruption",
energyCost: 5,
narrativePool: "used_fuck",
introText: "You free your cock and position yourself at her entrance.",
fallbackText: "You thrust into her, claiming her body.",
lustDrop: { base: 25, variance: 15 },
stunTurns: 2,
exposeDick: true
}>>
<<run setup.usedActionConfigs.anal = {
id: "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",
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",
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",
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>>
<<clampStat "player.energy" (-(_epaConfig.energyCost || 0)) 0 50>>
<<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) - (_target.dodge || 0) + _epaConfig.accuracyModifier>>
<<if $clothing && $clothing.player && $clothing.player.dickExposed>>
<<set _epaBaseAccuracy -= 5>>
<</if>>
<<if $player.lustPenalty>>
<<set _epaBaseAccuracy -= $player.lustPenalty>>
<</if>>
<<if $player.tensionPenalty>>
<<set _epaBaseAccuracy -= $player.tensionPenalty>>
<</if>>
<<set _epaHitChance to _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 _target.health -= _epaDamage>>
<<if _posModifiedDamage gt _epaBaseDamage>>
<<set _epaPositionBonus to true>>
<<else>>
<<set _epaPositionBonus to false>>
<</if>>
<<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 _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>>
<<else>>
<<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 _epaClothingDamage to 0>>
<<set _epaClothingSlot to "">>
<<if _epaHit && _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>>
<<damageClothingWithArmor $combat.currentTarget "random" _epaClothingDamage>>
<</if>>
<</if>>
<<set _epaCapturedTargetHealth to (_target && _target.health !== undefined) ? _target.health : 0>>
<<set _epaKnockdown to false>>
<<if _epaHit && _epaConfig.knockdownChance gt 0 && $flags.seductionUnlocked>>
<<if random(1, 100) lte _epaConfig.knockdownChance>>
<<knockdown $combat.currentTarget "random">>
<<set _epaKnockdown to true>>
<</if>>
<</if>>
<<if _epaConfig.consumeCombo && _epaComboUsed gt 0>>
<<set $combat.combo to {count: 0, bonus: 0, chain: []}>>
<</if>>
<<if _epaConfig.playerVulnerable>>
<<set $combat.playerVulnerable to true>>
<</if>>
<<set _epaVideoPath to null>>
<<set _epaVideoFormat to null>>
<<if _epaHit && _epaConfig.videoFolder>>
<<selectMediaFromPool _epaConfig.videoFolder>>
<<if _result && _result.file>>
<<set _epaVideoPath to _result.file>>
<<set _epaVideoFormat to _result.format>>
<</if>>
<<elseif !_epaHit && _epaConfig.videoFolderMiss>>
<<selectMediaFromPool _epaConfig.videoFolderMiss>>
<<if _result && _result.file>>
<<set _epaVideoPath to _result.file>>
<<set _epaVideoFormat to _result.format>>
<</if>>
<</if>>
<</silently>>
<<run window._epaCardData = {
error: _epaError || '',
hit: _epaHit,
hitRoll: _epaHitRoll,
hitChance: _epaHitChance,
damage: _epaDamage || 0,
crit: _epaCrit,
comboUsed: _epaComboUsed || 0,
positionBonus: _epaPositionBonus,
clothingDamage: _epaClothingDamage || 0,
clothingSlot: _epaClothingSlot || 'random',
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,
videoPath: _epaVideoPath || null,
videoFormat: _epaVideoFormat || null
}>>
<<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">' + (setup.combatNarrative[d.narrativeKey]?.random() || d.narrativeFallback) + '</p>' + resultBadge + '</div>';
} else {
narrativeHtml = '<div class="attack-narrative-row"><p class="attack-miss-narrative">' + (setup.combatNarrative[d.missNarrativeKey]?.random() || d.missFallback || 'Your attack misses!') + '</p>' + resultBadge + '</div>';
}
$('#player-attack-narrative').html(narrativeHtml);
}, 10)>>
<<run setTimeout(function() {
var d = window._epaCardData;
var videoContainer = document.getElementById('player-attack-video');
if (videoContainer && d.videoPath) {
if (d.videoFormat === 'webm' || d.videoFormat === 'mp4') {
videoContainer.innerHTML = '<video src="' + d.videoPath + '" autoplay loop muted playsinline class="constrained-combat-video"></video>';
} else {
videoContainer.innerHTML = '<img src="' + d.videoPath + '" class="constrained-combat-video" alt="Attack">';
}
videoContainer.style.display = 'block';
} else if (videoContainer) {
videoContainer.style.display = 'none';
}
}, 15)>>
<<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! +50% damage';
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 (State.variables.combat.clothingTier === 'full_exposure') {
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>';
if (State.variables.combat.combo.count >= 3) {
effectsHtml += ' <span class="finisher-ready">FINISHER READY!</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>>
<<widget "playerAttackPreviewCard">>
<<set _papConfig to _args[0]>>
<<set _papTarget to $combat.enemies[$combat.currentTarget]>>
<div class="combat-card player-card player-preview-card">
<div class="card-header player-preview-header">
<<if _papConfig.icon>>
<<icon _papConfig.icon "medium">>
<<else>>
<<icon "sword" "medium">>
<</if>>
<span class="preview-label">ATTACK PREVIEW</span>
</div>
<div class="card-body">
<div class="preview-attack-name"><<print _papConfig.name>></div>
<div class="preview-stats">
<div class="stat-row">
<span class="stat-label">Target:</span>
<span class="stat-value"><<print _papTarget.name>></span>
</div>
<div class="stat-row">
<span class="stat-label">Energy Cost:</span>
<span class="stat-value"><<print _papConfig.energyCost>></span>
</div>
<div class="stat-row">
<span class="stat-label">Base Damage:</span>
<span class="stat-value"><<print Math.floor((5 + ($player.strength || 10) / 2) * _papConfig.damageMultiplier)>></span>
</div>
<div class="stat-row">
<span class="stat-label">Accuracy:</span>
<span class="stat-value"><<print 70 + ($player.agility || 10) - (_papTarget.dodge || 0) + _papConfig.accuracyModifier>>%</span>
</div>
<<if _papConfig.clothingDamage && _papConfig.clothingDamage.chance gt 0>>
<div class="stat-row">
<span class="stat-label">Clothing Dmg:</span>
<span class="stat-value"><<print _papConfig.clothingDamage.chance>>% chance</span>
</div>
<</if>>
</div>
<<if _papConfig.description>>
<div class="preview-description">
<<print _papConfig.description>>
</div>
<</if>>
</div>
<div class="card-footer preview-actions">
<<link "EXECUTE" _papConfig.executePassage>>
<<set $combat.playerActionPreview to {config: _papConfig}>>
<</link>>
<<link "CANCEL">><<goto "Combat_Actions">><</link>>
</div>
</div>
<</widget>><<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 random(_epcaConfig.hpDamageRange[0], _epcaConfig.hpDamageRange[1])>>
<<set _target.health -= _epcaHpDamage>>
<</if>>
<<if _target.clothing>>
<<set _oldDurability to (_target.clothing[_epcaConfig.clothingSlot] || 100)>>
<<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 (_target.lust || 0) + _epcaLustGain>>
<<set _target.humiliation to (_target.humiliation || 0) + _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>>
<<set _target.humiliation to (_target.humiliation || 0) + _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>>
<<set _target.humiliation to (_target.humiliation || 0) + _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>>
<<set _epcaVideoPath to null>>
<<set _epcaVideoFormat to null>>
<<if _epcaConfig.videoFolder>>
<<selectMediaFromPool _epcaConfig.videoFolder>>
<<if _result && _result.file>>
<<set _epcaVideoPath to _result.file>>
<<set _epcaVideoFormat to _result.format>>
<</if>>
<</if>>
<</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
}>>
<<run setTimeout(function() {
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);
}, 10)>>
<<run setTimeout(function() {
var videoContainer = document.getElementById('player-clothing-video');
var videoPath = _epcaVideoPath;
var videoFormat = _epcaVideoFormat;
if (videoContainer && videoPath) {
if (videoFormat === 'webm' || videoFormat === 'mp4') {
videoContainer.innerHTML = '<video src="' + videoPath + '" autoplay loop muted playsinline class="constrained-combat-video"></video>';
} else {
videoContainer.innerHTML = '<img src="' + videoPath + '" class="constrained-combat-video" alt="Clothing Attack">';
}
videoContainer.style.display = 'block';
} else if (videoContainer) {
videoContainer.style.display = 'none';
}
}, 15)>>
<<run setTimeout(function() {
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);
}, 30)>>
<<run setTimeout(function() {
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 + '%');
}, 40)>>
<</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>>
<<set _epdVideoPath to null>>
<<set _epdVideoFormat to null>>
<<if _epdConfig.videoFolder>>
<<selectMediaFromPool _epdConfig.videoFolder>>
<<if _result && _result.file>>
<<set _epdVideoPath to _result.file>>
<<set _epdVideoFormat to _result.format>>
<</if>>
<</if>>
<</silently>>
<<run setTimeout(function() {
var narrativeHtml = '<p class="defense-stance-narrative">';
var pool = setup.combatNarrative[_epdConfig.actionType + '_stance'];
if (pool) {
narrativeHtml += pool.random();
} else {
narrativeHtml += _epdConfig.logText || ('You prepare to ' + _epdConfig.actionType + '.');
}
narrativeHtml += '</p>';
$('#player-defense-narrative').html(narrativeHtml);
}, 10)>>
<<run setTimeout(function() {
var videoContainer = document.getElementById('player-defense-video');
var videoPath = _epdVideoPath;
var videoFormat = _epdVideoFormat;
if (videoContainer && videoPath) {
if (videoFormat === 'webm' || videoFormat === 'mp4') {
videoContainer.innerHTML = '<video src="' + videoPath + '" autoplay loop muted playsinline class="constrained-combat-video"></video>';
} else {
videoContainer.innerHTML = '<img src="' + videoPath + '" class="constrained-combat-video" alt="Defense">';
}
videoContainer.style.display = 'block';
} else if (videoContainer) {
videoContainer.style.display = 'none';
}
}, 15)>>
<<run 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)>>
<<run setTimeout(function() {
var infoHtml = '<div class="defense-info ' + _epdConfig.actionType + '">';
var actionType = _epdConfig.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)>>
<<run setTimeout(function() {
var statusHtml = '<span class="stance-label">' + _epdConfig.name.toUpperCase() + ' ACTIVE</span>';
$('#player-defense-status').html(statusHtml);
}, 40)>>
<</widget>>
<<widget "playerDefenseCardFlow">>
<<set _pdfConfig to _args[0]>>
<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>
<</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 (_target.lust || 0) + _epdoLustGain>>
<<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.defeatType to "seduced">>
<</if>>
<<set _epdoVideoPath to null>>
<<set _epdoVideoFormat to null>>
<<if _epdoConfig.videoFolder>>
<<selectMediaFromPool _epdoConfig.videoFolder>>
<<if _result && _result.file>>
<<set _epdoVideoPath to _result.file>>
<<set _epdoVideoFormat to _result.format>>
<</if>>
<</if>>
<</silently>>
<<run window._epdoCardData = {
targetLust: _target ? _target.lust : 0,
targetHealth: _target ? _target.health : 0,
targetMaxHealth: _target ? _target.maxHealth : 0
}>>
<<run setTimeout(function() {
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);
}, 10)>>
<<run setTimeout(function() {
var videoContainer = document.getElementById('player-do-video');
if (videoContainer && _epdoVideoPath) {
if (_epdoVideoFormat === 'webm' || _epdoVideoFormat === 'mp4') {
videoContainer.innerHTML = '<video src="' + _epdoVideoPath + '" autoplay loop muted playsinline class="constrained-combat-video"></video>';
} else {
videoContainer.innerHTML = '<img src="' + _epdoVideoPath + '" class="constrained-combat-video" alt="Domination">';
}
videoContainer.style.display = 'block';
} else if (videoContainer) {
videoContainer.style.display = 'none';
}
}, 15)>>
<<run setTimeout(function() {
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);
}, 20)>>
<<run setTimeout(function() {
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);
}, 30)>>
<<run setTimeout(function() {
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);
}, 40)>>
<</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 random(_eppiConfig.painDamage.min, _eppiConfig.painDamage.max)>>
<<else>>
<<set _eppiPainDmg to 0>>
<</if>>
<<set _target.lust to (_target.lust || 0) + _eppiLustDmg>>
<<set $combat.enemies[_targetIndex].lust to _target.lust>>
<<if _eppiPainDmg gt 0>>
<<set _target.health -= _eppiPainDmg>>
<<set $combat.enemies[_targetIndex].health to _target.health>>
<</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 += _eppiConfig.secondaryEffect.lustBonus>>
<<set $combat.enemies[_targetIndex].lust to _target.lust>>
<</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>>
<<set _eppiVideoPath to null>>
<<set _eppiVideoFormat to null>>
<<if _eppiConfig.videoFolder>>
<<selectMediaFromPool _eppiConfig.videoFolder>>
<<if _result && _result.file>>
<<set _eppiVideoPath to _result.file>>
<<set _eppiVideoFormat to _result.format>>
<</if>>
<</if>>
<<set _eppiVictory to false>>
<<if _target.lust gte _target.seduceThreshold>>
<<set _eppiVictory to true>>
<<set _target.defeated to true>>
<<set _target.defeatType to "seduced">>
<<set $combat.enemies[_targetIndex].defeated to true>>
<<set $combat.enemies[_targetIndex].defeatType to "seduced">>
<</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,
videoPath: _eppiVideoPath || null,
videoFormat: _eppiVideoFormat || null
}>>
<<run setTimeout(function() {
var d = window._eppiCardData;
$('#player-pinned-narrative').html(d.narrative);
var videoContainer = document.getElementById('player-pinned-video');
if (videoContainer && d.videoPath) {
if (d.videoFormat === 'webm' || d.videoFormat === 'mp4') {
videoContainer.innerHTML = '<video src="' + d.videoPath + '" autoplay loop muted playsinline class="constrained-combat-video"></video>';
} else {
videoContainer.innerHTML = '<img src="' + d.videoPath + '" class="constrained-combat-video" alt="Action">';
}
videoContainer.style.display = 'block';
} else if (videoContainer) {
videoContainer.style.display = 'none';
}
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);
}, 40)>>
<</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 "executeBasicAttack">>
<<set _config to _args[0]>>
<<if $player.energy lt _config.energyCost>>
<div class="combat-error">
You're too exhausted! (Need <<print _config.energyCost>> energy)
</div>
<<goto "Combat_Actions">>
<</if>>
<<clampStat "player.energy" (-(_config.energyCost || 0)) 0 50>>
<<initCombatTarget>>
<<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)>>
<<if !_config.autoHit>>
<<set _hitRoll to random(1, 100)>>
<<set _baseAccuracy to 70 + ($player.agility || 10) - (_target.dodge || 0) + _config.accuracyModifier>>
<<if $clothing && $clothing.player && $clothing.player.dickExposed>>
<<set _baseAccuracy -= 5>>
<</if>>
<<set _hitChance to _baseAccuracy>>
<<else>>
<<set _hitRoll to 1>>
<<set _hitChance to 100>>
<</if>>
<div class="combat-action-visual">
<<if _config.imagePath>>
<img @src="'assets/images/' + _config.imagePath" @alt="_config.name" class="combat-action-img">
<</if>>
</div>
<<set _genderSuffix to setup.genderSuffix(_target.gender)>>
<<if _hitRoll lte _hitChance>>
<<set _damage to _baseDamage + random(_config.damageVariance[0], _config.damageVariance[1])>>
<<set _damage to Math.max(1, _damage - (_target.armor || 0))>>
<<if !_config.consumeCombo>>
<<buildCombo _config.attackType _targetIndex>>
<<getComboBonus>>
<<set _damage to Math.floor(_damage * _returnComboMult)>>
<<else>>
<<if $combat.combo && $combat.combo.count >= 2>>
<<set _comboMult to 1 + ($combat.combo.bonus / 100)>>
<<set _damage to Math.floor(_damage * _comboMult)>>
<<set _comboUsed to $combat.combo.count>>
<<else>>
<<set _comboUsed to 0>>
<</if>>
<</if>>
<<applyPositionDamage _damage _targetIndex>>
<<if _posModifiedDamage gt _damage>>
<<displayPositionBonus _targetIndex "physical">>
<</if>>
<<set _damage to _posModifiedDamage>>
<<set _target.health -= _damage>>
<<set _attackType to _config.attackType>>
<<if _config.critThreshold > 0>>
<<set _critHit to (_damage gte (_baseDamage + _config.critThreshold))>>
<<else>>
<<set _critHit to false>>
<</if>>
<<set _hitLogPool to setup.combatNarrative[_config.hitLogKey + _genderSuffix]>>
<<set _hitLogText to (_hitLogPool ? _hitLogPool.random() : _config.hitLogFallback).replace("{damage}", _damage)>>
<<if _critHit>>
<<logCombat _hitLogText.replace("!", " - CRITICAL!") "critical">>
<<elseif _config.consumeCombo && _comboUsed > 0>>
<<logCombat "FINISHER! " + _damage + " damage! (" + _comboUsed + "x combo consumed)" "critical">>
<<else>>
<<logCombat _hitLogText "damage">>
<</if>>
<<set _hitNarrativeKey to _config.narrativeKey + _genderSuffix>>
<<if _config.consumeCombo && _comboUsed > 0>>
<div class="combat-finisher-effect">
<div class="finisher-header">
<<icon "damage-boost" "medium">> <strong><<print _comboUsed>>x COMBO FINISHER!</strong>
</div>
<div class="finisher-narrative">
<<combatNarrative _hitNarrativeKey _config.narrativeFallback>>
</div>
<div class="finisher-damage">
<span class="damage-number massive">-<<print _damage>></span>
</div>
</div>
<<else>>
<div @class="'combat-hit-effect ' + _config.attackType">
<<combatNarrative _hitNarrativeKey _config.narrativeFallback>>
<span class="damage-number">-<<print _damage>></span>
</div>
<</if>>
<<silently>>
<<if _config.clothingDamage && _config.clothingDamage.chance > 0>>
<<set _clothingRoll to random(1, 100)>>
<<set _clothingChance to _config.clothingDamage.chance>>
<<if _config.clothingDamage.critBonus && _critHit>>
<<set _clothingChance to 100>>
<</if>>
<<if $flags.seductionUnlocked && _clothingRoll lte _clothingChance>>
<<set _clothingDmg to random(_config.clothingDamage.amount[0], _config.clothingDamage.amount[1])>>
<<set $combat.clothingDamageDealt to _clothingDmg>>
<<damageClothingWithArmor _targetIndex "random" _clothingDmg>>
<<set _cdnSlot to _config.clothingDamage.targetSlot>>
<<set _cdnTier to $combat.clothingTier || "regular">>
<<set _cdnConfig to setup.clothingDamageNarratives[_cdnSlot][_cdnTier]>>
<<if _cdnConfig>>
<<set _clothingPoolKey to _cdnConfig.poolKey + _genderSuffix>>
<<set _clothingFallback to _cdnConfig.fallback>>
<<else>>
<<set _clothingPoolKey to "clothing_damage_" + _cdnSlot + "_regular" + _genderSuffix>>
<<set _clothingFallback to "Clothing damaged!">>
<</if>>
<<if _cdnTier === "full_exposure">>
<p class="explicit clothing-rip">
<<combatNarrative _clothingPoolKey _clothingFallback>>
</p>
<<elseif _cdnTier === "nearly_destroyed" || _cdnTier === "underwear_only">>
<p class="explicit clothing-rip">
<<combatNarrative _clothingPoolKey _clothingFallback>>
</p>
<<else>>
<p class="clothing-damage">
<<combatNarrative _clothingPoolKey _clothingFallback>>
</p>
<</if>>
<div class="damage-dealt">
<<icon "scissors" "medium">> -<<print $combat.clothingDamageDealt>>% <<print _config.clothingDamage.targetSlot>> clothing
</div>
<</if>>
<</if>>
<<if _config.knockdownChance > 0 && $flags.seductionUnlocked>>
<<if random(1, 100) lte _config.knockdownChance>>
<<knockdown _targetIndex "random">>
<</if>>
<</if>>
<</silently>>
<<if _config.playerVulnerable>>
<<set $combat.playerVulnerable to true>>
<</if>>
<<if _config.consumeCombo>>
<<set $combat.combo to {count: 0, lastAction: "", target: -1, bonus: 0}>>
<</if>>
<<else>>
<<set _missLogPool to setup.combatNarrative[_config.missLogKey + _genderSuffix]>>
<<set _missLogText to (_missLogPool ? _missLogPool.random() : _config.missLogFallback)>>
<<logCombat _missLogText "miss">>
<div @class="'combat-miss-effect ' + _config.attackType + '-miss'">
<<if _config.missNarrativeKey>>
<<set _missNarrativeKey to _config.missNarrativeKey + _genderSuffix>>
<<combatNarrative _missNarrativeKey _config.missFallback>>
<<else>>
<<getPlayerMissNarrative>>
<</if>>
</div>
<<if _config.playerVulnerable>>
<<set $combat.playerVulnerable to true>>
<</if>>
<</if>>
<<if _target.health lte 0>>
<<set _killLogPool to setup.combatNarrative[_config.killLogKey]>>
<<set _defeatLog to (_killLogPool ? _killLogPool.random() : _config.killLogFallback).replace("{enemy}", _target.name)>>
<<logCombat _defeatLog "critical">>
<<if !$combat.defeatedEnemies>><<set $combat.defeatedEnemies to []>><</if>>
<<run $combat.defeatedEnemies.push(clone(_target))>>
<<run $combat.enemies.splice(_targetIndex, 1)>>
<<set _killNarrativeKey to _config.killNarrativeKey + _genderSuffix>>
<<set _killNarrativePool to setup.combatNarrative[_killNarrativeKey]>>
<<set _killText to (_killNarrativePool ? _killNarrativePool.random() : _config.killNarrativeFallback).replace("{enemy}", _target.name)>>
<<print _killText>>
<<if _target.id && setup.raiderTypeMap && setup.raiderTypeMap[_target.id]>>
<<getRaiderDefeat _target>>
<<set _defeatLine to _return>>
<p class="enemy-defeat-dialogue">"<<print _defeatLine>>"</p>
<</if>>
<<if $combat.combo>>
<<set $combat.combo.target to -1>>
<</if>>
<<if $combat.currentTarget >= $combat.enemies.length>>
<<set $combat.currentTarget to Math.max(0, $combat.enemies.length - 1)>>
<</if>>
<<if $combat.enemies.length === 0>>
<<goto "Combat_Victory">>
<</if>>
<</if>>
<div class="choice-container">
<<vchoice "Continue" "Combat_Companion_Turn" "move" "map">>
</div>
<</widget>>
<<widget "calculatePlayerAttackPreview">>
<<set _config to _args[0]>>
<<set _preview to {}>>
<<set _preview.config to _config>>
<<initCombatTarget>>
<<set _preview.targetName to _target.name>>
<<set _preview.targetIndex to _targetIndex>>
<<set _preview.energyCost to _config.energyCost>>
<<set _preview.currentEnergy to $player.energy>>
<<set _preview.canAfford to ($player.energy >= _config.energyCost)>>
<<set _preview.energyAfter to Math.max(0, $player.energy - _config.energyCost)>>
<<set _baseDmg to 5 + Math.floor(($player.strength || 10) / 2)>>
<<if _config.useWeaponBonus && $equipped && $equipped.weapon>>
<<set _baseDmg += $equipped.weapon.damage>>
<<set _preview.weaponBonus to $equipped.weapon.damage>>
<</if>>
<<set _baseDmg to Math.floor(_baseDmg * _config.damageMultiplier)>>
<<set _preview.damageMin to _baseDmg + _config.damageVariance[0]>>
<<set _preview.damageMax to _baseDmg + _config.damageVariance[1]>>
<<set _armorReduction to (_target.armor || 0)>>
<<set _preview.damageMin to Math.max(1, _preview.damageMin - _armorReduction)>>
<<set _preview.damageMax to Math.max(1, _preview.damageMax - _armorReduction)>>
<<set _preview.armorReduction to _armorReduction>>
<<if $combat.combo && $combat.combo.count >= 2 && !_config.consumeCombo>>
<<getComboBonus>>
<<set _comboMult to _returnComboMult>>
<<set _preview.comboCount to $combat.combo.count>>
<<set _preview.comboBonus to $combat.combo.bonus>>
<<set _preview.damageMin to Math.floor(_preview.damageMin * _comboMult)>>
<<set _preview.damageMax to Math.floor(_preview.damageMax * _comboMult)>>
<<elseif _config.consumeCombo && $combat.combo && $combat.combo.count >= 2>>
<<set _comboMult to 1 + ($combat.combo.bonus / 100)>>
<<set _preview.comboCount to $combat.combo.count>>
<<set _preview.comboBonus to $combat.combo.bonus>>
<<set _preview.damageMin to Math.floor(_preview.damageMin * _comboMult)>>
<<set _preview.damageMax to Math.floor(_preview.damageMax * _comboMult)>>
<<set _preview.consumesCombo to true>>
<</if>>
<<if _target.position && _target.position !== "standing">>
<<set _posBonus to 0>>
<<switch _target.position>>
<<case "kneeling">><<set _posBonus to 25>>
<<case "prone_back" "prone_front" "bent_over">><<set _posBonus to 50>>
<<case "pinned">><<set _posBonus to 100>>
<</switch>>
<<if _posBonus > 0>>
<<set _posMult to (1 + _posBonus / 100)>>
<<set _preview.damageMin to Math.floor(_preview.damageMin * _posMult)>>
<<set _preview.damageMax to Math.floor(_preview.damageMax * _posMult)>>
<<set _preview.positionBonus to _posBonus>>
<<set _preview.positionName to _target.position.replace(/_/g, ' ')>>
<</if>>
<</if>>
<<if _config.autoHit>>
<<set _preview.hitChance to 100>>
<<set _preview.hitLabel to "Auto-Hit">>
<<set _preview.accuracyBreakdown to "Finisher always hits">>
<<else>>
<<set _baseAcc to 70 + ($player.agility || 10) - (_target.dodge || 0) + _config.accuracyModifier>>
<<if $clothing && $clothing.player && $clothing.player.dickExposed>>
<<set _baseAcc -= 5>>
<<set _preview.dickPenalty to true>>
<</if>>
<<set _preview.hitChance to Math.min(100, Math.max(5, _baseAcc))>>
<<set _preview.hitLabel to _preview.hitChance + "%">>
<<set _preview.accuracyBreakdown to "Base 70 + Agility " + ($player.agility || 10) + " + Modifier " + _config.accuracyModifier>>
<<if _target.dodge && _target.dodge > 0>>
<<set _preview.accuracyBreakdown += " - Enemy Dodge " + _target.dodge>>
<</if>>
<<if _preview.dickPenalty>>
<<set _preview.accuracyBreakdown += " - Dick Exposed 5">>
<</if>>
<</if>>
<<set _preview.secondaryEffects to []>>
<<if _config.clothingDamage && _config.clothingDamage.chance > 0>>
<<set _clothingText to _config.clothingDamage.chance + "% chance: Clothing damage (" +
_config.clothingDamage.amount[0] + "-" + _config.clothingDamage.amount[1] + ")">>
<<if _config.clothingDamage.critBonus>>
<<set _clothingText += " (100% on crit)">>
<</if>>
<<run _preview.secondaryEffects.push(_clothingText)>>
<</if>>
<<if _config.knockdownChance > 0>>
<<run _preview.secondaryEffects.push(_config.knockdownChance + "% chance: Knockdown")>>
<<else>>
<<run _preview.secondaryEffects.push("No knockdown")>>
<</if>>
<<if _config.playerVulnerable>>
<<run _preview.secondaryEffects.push("WARNING: Leaves you vulnerable (+10% enemy hit chance)")>>
<</if>>
<<if _preview.consumesCombo>>
<<run _preview.secondaryEffects.push("WARNING: Consumes " + _preview.comboCount + "x combo")>>
<</if>>
<<set $combat.playerActionPreview to _preview>>
<</widget>>
<<widget "displayPlayerActionCard">>
<<if ndef $settings>><<set $settings to {}>><</if>>
<<set _preview to $combat.playerActionPreview>>
<<set _config to _preview.config>>
<<if $settings.playerCardAsPopup>>
<<run Dialog.setup(_config.name.toUpperCase() + " - Attack Preview", "player-action-dialog")>>
<<run Dialog.wiki(`
<<set _preview to $combat.playerActionPreview>>
<<set _config to _preview.config>>
<<displayPlayerActionCardContent>>
`)>>
<<run Dialog.open()>>
<<else>>
<<displayPlayerActionCardContent>>
<</if>>
<</widget>>
<<widget "displayPlayerActionCardContent">>
<<set _preview to $combat.playerActionPreview>>
<<set _config to _preview.config>>
<div class="player-action-card">
<!-- HEADER -->
<div class="player-action-header">
<span class="action-icon"><<icon "attack" "medium">></span>
<span class="action-name"><<print _config.name.toUpperCase()>></span>
</div>
<!-- TARGET -->
<div class="action-target-display">
<span class="target-label">Target:</span>
<span class="target-name"><<print _preview.targetName.toUpperCase()>></span>
<span class="target-number">#<<print (_preview.targetIndex + 1)>></span>
</div>
<div class="card-divider"></div>
<!-- COST SECTION -->
<div class="action-cost-section">
<div class="section-header"><<icon "gold" "medium">> Cost</div>
<div class="cost-line">
<span class="cost-label">Energy:</span>
<span @class="'cost-value ' + (_preview.canAfford ? 'affordable' : 'too-expensive')">
<<print _preview.energyCost>>/<<print _preview.currentEnergy>> <<icon "electricity" "medium">>
</span>
</div>
<<if _preview.canAfford>>
<div class="cost-after">
(<<print _preview.energyAfter>> remaining after attack)
</div>
<<else>>
<div class="cost-warning">
<<icon "hazard-sign" "medium">> Not enough energy!
</div>
<</if>>
</div>
<!-- ACCURACY SECTION -->
<div class="action-accuracy-section">
<div class="section-header"><<icon "crosshair" "medium">> Accuracy</div>
<div class="accuracy-line">
<span class="accuracy-label">Hit Chance:</span>
<span class="accuracy-value"><<print _preview.hitLabel>></span>
</div>
<div class="accuracy-breakdown">
<<print _preview.accuracyBreakdown>>
</div>
</div>
<!-- DAMAGE SECTION -->
<div class="action-damage-section">
<div class="section-header"><<icon "destruction" "medium">> Damage</div>
<div class="damage-line">
<span class="damage-label">Predicted:</span>
<span class="damage-value"><<print _preview.damageMin>>-<<print _preview.damageMax>> HP</span>
</div>
<div class="damage-formula">
(<<print Math.floor(_config.damageMultiplier * 100)>>% of base damage)
</div>
<<if _preview.armorReduction > 0>>
<div class="damage-note">
Enemy armor: -<<print _preview.armorReduction>> damage
</div>
<</if>>
<<if _preview.weaponBonus>>
<div class="damage-note">
Weapon bonus: <<print "+" + _preview.weaponBonus>> damage
</div>
<</if>>
</div>
<!-- MODIFIERS SECTION (conditional) -->
<<if _preview.comboBonus || _preview.positionBonus>>
<div class="action-modifiers-section">
<div class="section-header"><<icon "magic" "medium">> Active Modifiers</div>
<<if _preview.comboBonus>>
<div class="modifier-line combo">
<span class="mod-icon"><<icon "fire" "medium">></span>
<span class="mod-text">Combo: <<print _preview.comboCount>>x (<<print "+" + _preview.comboBonus>>% damage)</span>
</div>
<</if>>
<<if _preview.positionBonus>>
<div class="modifier-line position">
<span class="mod-icon"><<icon "move" "medium">></span>
<span class="mod-text">Position: <<print _preview.positionName>> (<<print "+" + _preview.positionBonus>>% damage)</span>
</div>
<</if>>
</div>
<</if>>
<!-- SECONDARY EFFECTS -->
<<if _preview.secondaryEffects && _preview.secondaryEffects.length > 0>>
<div class="action-secondary-section">
<div class="section-header"><<icon "dice" "medium">> Secondary Effects</div>
<<for _effect range _preview.secondaryEffects>>
<div class="secondary-line">
<<print _effect>>
</div>
<</for>>
</div>
<</if>>
<div class="card-divider"></div>
<!-- CONFIRM BUTTONS -->
<div class="action-confirm-buttons">
<<if _preview.canAfford>>
<<if $settings.playerCardAsPopup>>
<<link "CONFIRM ATTACK">>
<<run Dialog.close()>>
<<goto "Combat_Execute_Basic_Attack">>
<</link>>
<<else>>
<<link "CONFIRM ATTACK" "Combat_Execute_Basic_Attack">><</link>>
<</if>>
<<else>>
<span class="button-disabled">CONFIRM ATTACK (Not enough energy)</span>
<</if>>
<<if $settings.playerCardAsPopup>>
<<link "CANCEL">>
<<run Dialog.close()>>
<</link>>
<<else>>
<<link "CANCEL" "Combat_Actions">><</link>>
<</if>>
</div>
</div>
<</widget>>
<<widget "basicAttackAction">>
<<set _baaText to _args[0]>>
<<set _baaPassage to _args[1]>>
<<set _baaType to _args[2]>>
<<set _baaIcon to _args[3] || "">>
<span class="combat-btn-wrapper action">
<a @data-passage="_baaPassage" class="link-internal macro-link">
<<if _baaIcon>><<icon _baaIcon "medium">> <</if>><<print _baaText>>
</a>
</span>
<</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 Math.min(100, _e.lust + _reaction.lustGain)>>
<<set $combat.enemies[_i].lust to _e.lust>>
<<set _reaction.newLust to _e.lust>>
<<if _reaction.humiliationGain gt 0>>
<<set _e.humiliation to (_e.humiliation || 0) + _reaction.humiliationGain>>
<<set $combat.enemies[_i].humiliation to _e.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>>
<<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>>
<<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 Math.min(100, (_e.lust || 0) + _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>>
<<run window._pfcCardData = {
narrative: _flauntNarrative,
reactions: _enemyReactions,
totalLustGained: _totalLustGained,
enemiesDistracted: _enemiesDistracted
}>>
<<else>>
<<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>>
<<widget "playerStrategicStripTopCard">>
<<set _psstTarget to $combat.enemies[$combat.currentTarget]>>
<div class="combat-card player-card player-strip-card player-strip-top-card">
<!-- HEADER -->
<div class="card-header player-card-header player-strip-header">
<<icon "shirt" "medium">>
<span class="player-card-name">STRIP ATTACK</span>
<span class="attack-name">RIP TOP</span>
</div>
<!-- CARD BODY -->
<div class="card-body">
<!-- Attack Info Row -->
<div class="attack-info-row">
<span class="attack-target">
<<icon "target" "medium">> <<print _psstTarget.name>><<if _psstTarget.position and _psstTarget.position neq "standing">> <span class="target-position-indicator">(<<print _psstTarget.position>>)</span><</if>>
</span>
<span class="body-part">
<<icon "female" "medium">> tits
</span>
</div>
<!-- Narrative -->
<div id="player-strip-top-narrative" class="strip-narrative-container"></div>
<!-- Video Container -->
<div id="player-strip-top-video" class="card-video-container"></div>
<!-- Position Bonus -->
<div id="player-strip-top-position" class="strip-position-container"></div>
<!-- Effects -->
<div id="player-strip-top-effects" class="strip-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 _psstTarget.health>>/<<print _psstTarget.maxHealth>>
</span>
<span class="target-humiliation">
<<icon "flushed" "medium">>
<span id="player-strip-top-humil"><<print _psstTarget.humiliation || 0>></span> humil
</span>
</div>
</div>
</div>
<</widget>>
<<widget "executePlayerStrategicStripTopCard">>
<<silently>>
<<set _sstIdx to $combat.currentTarget || 0>>
<<set _enemy to $combat.enemies[_sstIdx]>>
<<if _enemy && _enemy.gender === "female">>
<<forcedStopCovering _sstIdx>>
<<getPositionStripBonus _sstIdx "top">>
<<set _posBonus to _posStripBonus || 0>>
<<set _posNarrative to _posStripNarrative || "">>
<<set _stripNarrative to "You grab her top and TEAR — her tits spill out, bouncing free!">>
<<if setup.combatNarrative && setup.combatNarrative.strategic_rip_top>>
<<set _pool to setup.combatNarrative.strategic_rip_top>>
<<if Array.isArray(_pool) && _pool.length gt 0>>
<<set _stripNarrative to _pool[random(0, _pool.length - 1)]>>
<<elseif typeof _pool === "string">>
<<set _stripNarrative to _pool>>
<</if>>
<</if>>
<<set _wasExposed to (_enemy.clothing && _enemy.clothing.titsExposed)>>
<<if _enemy.clothing>>
<<set _enemy.clothing.titsExposed to true>>
<<set _enemy.clothing.top to 0>>
<<set $combat.enemies[_sstIdx].clothing.titsExposed to true>>
<<set $combat.enemies[_sstIdx].clothing.top to 0>>
<</if>>
<<set _humBonus to 15 + _posBonus>>
<<addHumiliation _sstIdx _humBonus "strip_top">>
<<set _newHumil to $combat.enemies[_sstIdx].humiliation || 0>>
<<buildCombo "strip_top" _sstIdx>>
<<set _posIcon to "prone">>
<<if _enemy.position>>
<<switch _enemy.position>>
<<case "kneeling">><<set _posIcon to "kneeling">>
<<case "prone_front" "prone_back">><<set _posIcon to "prone">>
<<case "bent_over">><<set _posIcon to "bent-over">>
<<case "pinned">><<set _posIcon to "pinned">>
<</switch>>
<</if>>
<<set _bonusNarrative to "">>
<<set _humState to $combat.enemies[_sstIdx].humiliationState || "normal">>
<<if _humState !== "normal">>
<<set _bonusPoolKey to "strip_top_bonus_" + _humState>>
<<if setup.combatNarrative && setup.combatNarrative[_bonusPoolKey]>>
<<set _bonusPool to setup.combatNarrative[_bonusPoolKey]>>
<<if Array.isArray(_bonusPool) && _bonusPool.length gt 0>>
<<set _bonusNarrative to _bonusPool[random(0, _bonusPool.length - 1)]>>
<<elseif typeof _bonusPool === "string">>
<<set _bonusNarrative to _bonusPool>>
<</if>>
<</if>>
<</if>>
<<if $combat.log>>
<<run $combat.log.push({
text: _enemy.name + "'s tits exposed! +" + _humBonus + " Humiliation",
type: "strip"
})>>
<</if>>
<<run window._psstCardData = {
narrative: _stripNarrative,
bonusNarrative: _bonusNarrative,
posBonus: _posBonus,
posNarrative: _posNarrative,
posIcon: _posIcon,
humBonus: _humBonus,
newHumil: _newHumil,
wasExposed: _wasExposed,
enemyName: _enemy.name
}>>
<<else>>
<<run window._psstCardData = {
narrative: "Target is not valid for this attack.",
bonusNarrative: "",
posBonus: 0,
posNarrative: "",
posIcon: "",
humBonus: 0,
newHumil: 0,
wasExposed: true,
enemyName: "Unknown"
}>>
<</if>>
<</silently>>
<<run setTimeout(function() {
var d = window._psstCardData;
$('#player-strip-top-narrative').html('<div class="strip-narrative-row"><p class="strip-hit-narrative">' + d.narrative + '</p></div>');
if (d.posBonus > 0 && d.posNarrative) {
var posHtml = '<div class="position-bonus-row">';
posHtml += '<span class="gi gi-' + d.posIcon + ' gi-medium"></span> ';
posHtml += '<span class="position-narrative">' + d.posNarrative + '</span>';
posHtml += '</div>';
$('#player-strip-top-position').html(posHtml);
}
var effectsHtml = '<div class="strip-effects-row">';
if (!d.wasExposed) {
effectsHtml += '<div class="exposure-alert"><span class="gi gi-hazard-sign gi-medium"></span> TITS EXPOSED!</div>';
}
if (d.bonusNarrative) {
effectsHtml += '<div class="bonus-narrative"><em>' + d.bonusNarrative + '</em></div>';
}
effectsHtml += '<div class="humiliation-gain">';
effectsHtml += '<span class="gi gi-flushed gi-medium"></span> +' + d.humBonus + ' humiliation';
if (d.posBonus > 0) {
effectsHtml += ' <span class="bonus-breakdown">(15 base + ' + d.posBonus + ' position)</span>';
}
effectsHtml += '</div>';
effectsHtml += '</div>';
$('#player-strip-top-effects').html(effectsHtml);
$('#player-strip-top-humil').text(d.newHumil);
}, 50)>>
<</widget>>
<<widget "playerStrategicStripTopCardFlow">>
<<initCombatTarget>>
<div class="player-turn-container">
<!-- Render the card -->
<<playerStrategicStripTopCard>>
<!-- Execute and populate -->
<<executePlayerStrategicStripTopCard>>
</div>
<!-- Continue button -->
<div class="choice-container">
<<vchoice "Continue" "Combat_Companion_Turn" "move" "map">>
</div>
<</widget>>
<<widget "playerStrategicStripBottomCard">>
<<set _pssbTarget to $combat.enemies[$combat.currentTarget]>>
<div class="combat-card player-card player-strip-card player-strip-bottom-card">
<!-- HEADER -->
<div class="card-header player-card-header player-strip-header">
<<icon "pants" "medium">>
<span class="player-card-name">STRIP ATTACK</span>
<span class="attack-name">TEAR BOTTOM</span>
</div>
<!-- CARD BODY -->
<div class="card-body">
<!-- Attack Info Row -->
<div class="attack-info-row">
<span class="attack-target">
<<icon "target" "medium">> <<print _pssbTarget.name>><<if _pssbTarget.position and _pssbTarget.position neq "standing">> <span class="target-position-indicator">(<<print _pssbTarget.position>>)</span><</if>>
</span>
<span class="body-part">
<<icon "body" "medium">> pussy
</span>
</div>
<!-- Narrative -->
<div id="player-strip-bottom-narrative" class="strip-narrative-container"></div>
<!-- Video Container -->
<div id="player-strip-bottom-video" class="card-video-container"></div>
<!-- Position Bonus -->
<div id="player-strip-bottom-position" class="strip-position-container"></div>
<!-- Effects -->
<div id="player-strip-bottom-effects" class="strip-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 _pssbTarget.health>>/<<print _pssbTarget.maxHealth>>
</span>
<span class="target-lust">
<<icon "lust" "medium">>
<span id="player-strip-bottom-lust"><<print _pssbTarget.lust || 0>>%</span>
</span>
</div>
</div>
</div>
<</widget>>
<<widget "executePlayerStrategicStripBottomCard">>
<<silently>>
<<set _ssbIdx to $combat.currentTarget || 0>>
<<set _enemy to $combat.enemies[_ssbIdx]>>
<<if _enemy && _enemy.gender === "female">>
<<forcedStopCovering _ssbIdx>>
<<getPositionStripBonus _ssbIdx "bottom">>
<<set _posBonus to _posStripBonus || 0>>
<<set _posNarrative to _posStripNarrative || "">>
<<set _stripNarrative to "You tear away her bottom — her wet pussy is completely exposed!">>
<<if setup.combatNarrative && setup.combatNarrative.strategic_rip_bottom>>
<<set _pool to setup.combatNarrative.strategic_rip_bottom>>
<<if Array.isArray(_pool) && _pool.length gt 0>>
<<set _stripNarrative to _pool[random(0, _pool.length - 1)]>>
<<elseif typeof _pool === "string">>
<<set _stripNarrative to _pool>>
<</if>>
<</if>>
<<set _wasExposed to (_enemy.clothing && _enemy.clothing.pussyExposed)>>
<<if _enemy.clothing>>
<<set _enemy.clothing.pussyExposed to true>>
<<set _enemy.clothing.assExposed to true>>
<<set _enemy.clothing.bottom to 0>>
<<set $combat.enemies[_ssbIdx].clothing.pussyExposed to true>>
<<set $combat.enemies[_ssbIdx].clothing.assExposed to true>>
<<set $combat.enemies[_ssbIdx].clothing.bottom to 0>>
<</if>>
<<set _lustBonus to 12 + _posBonus>>
<<set _enemy.lust to Math.min(100, (Number(_enemy.lust) || 0) + _lustBonus)>>
<<set $combat.enemies[_ssbIdx].lust to _enemy.lust>>
<<updateArousalState _ssbIdx>>
<<set _newLust to $combat.enemies[_ssbIdx].lust || 0>>
<<buildCombo "strip_bottom" _ssbIdx>>
<<set _posIcon to "prone">>
<<if _enemy.position>>
<<switch _enemy.position>>
<<case "kneeling">><<set _posIcon to "kneeling">>
<<case "prone_front" "prone_back">><<set _posIcon to "prone">>
<<case "bent_over">><<set _posIcon to "bent-over">>
<<case "pinned">><<set _posIcon to "pinned">>
<</switch>>
<</if>>
<<set _bonusNarrative to "">>
<<set _arousalState to $combat.enemies[_ssbIdx].arousalState || "normal">>
<<if _arousalState !== "normal">>
<<set _poolKey to _arousalState>>
<<if _poolKey === "climax">><<set _poolKey to "desperate">><</if>>
<<set _bonusPoolKey to "strip_bottom_bonus_" + _poolKey>>
<<if setup.combatNarrative && setup.combatNarrative[_bonusPoolKey]>>
<<set _bonusPool to setup.combatNarrative[_bonusPoolKey]>>
<<if Array.isArray(_bonusPool) && _bonusPool.length gt 0>>
<<set _bonusNarrative to _bonusPool[random(0, _bonusPool.length - 1)]>>
<<elseif typeof _bonusPool === "string">>
<<set _bonusNarrative to _bonusPool>>
<</if>>
<</if>>
<</if>>
<<if $combat.log>>
<<run $combat.log.push({
text: _enemy.name + "'s pussy exposed! +" + _lustBonus + " Lust",
type: "strip"
})>>
<</if>>
<<run window._pssbCardData = {
narrative: _stripNarrative,
bonusNarrative: _bonusNarrative,
posBonus: _posBonus,
posNarrative: _posNarrative,
posIcon: _posIcon,
lustBonus: _lustBonus,
newLust: _newLust,
wasExposed: _wasExposed,
enemyName: _enemy.name
}>>
<<else>>
<<run window._pssbCardData = {
narrative: "Target is not valid for this attack.",
bonusNarrative: "",
posBonus: 0,
posNarrative: "",
posIcon: "",
lustBonus: 0,
newLust: 0,
wasExposed: true,
enemyName: "Unknown"
}>>
<</if>>
<</silently>>
<<run setTimeout(function() {
var d = window._pssbCardData;
$('#player-strip-bottom-narrative').html('<div class="strip-narrative-row"><p class="strip-hit-narrative">' + d.narrative + '</p></div>');
if (d.posBonus > 0 && d.posNarrative) {
var posHtml = '<div class="position-bonus-row">';
posHtml += '<span class="gi gi-' + d.posIcon + ' gi-medium"></span> ';
posHtml += '<span class="position-narrative">' + d.posNarrative + '</span>';
posHtml += '</div>';
$('#player-strip-bottom-position').html(posHtml);
}
var effectsHtml = '<div class="strip-effects-row">';
if (!d.wasExposed) {
effectsHtml += '<div class="exposure-alert"><span class="gi gi-hazard-sign gi-medium"></span> PUSSY EXPOSED!</div>';
}
if (d.bonusNarrative) {
effectsHtml += '<div class="bonus-narrative"><em>' + d.bonusNarrative + '</em></div>';
}
effectsHtml += '<div class="lust-gain">';
effectsHtml += '<span class="gi gi-lust gi-medium"></span> +' + d.lustBonus + ' lust';
if (d.posBonus > 0) {
effectsHtml += ' <span class="bonus-breakdown">(12 base + ' + d.posBonus + ' position)</span>';
}
effectsHtml += '</div>';
effectsHtml += '</div>';
$('#player-strip-bottom-effects').html(effectsHtml);
$('#player-strip-bottom-lust').text(d.newLust + '%');
}, 50)>>
<</widget>>
<<widget "playerStrategicStripBottomCardFlow">>
<<initCombatTarget>>
<div class="player-turn-container">
<!-- Render the card -->
<<playerStrategicStripBottomCard>>
<!-- Execute and populate -->
<<executePlayerStrategicStripBottomCard>>
</div>
<!-- Continue button -->
<div class="choice-container">
<<vchoice "Continue" "Combat_Companion_Turn" "move" "map">>
</div>
<</widget>><<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>
<!-- 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>>
<<set _hpMinPercent to 0.25>>
<<if $player.health lt ($player.maxHealth * _hpMinPercent)>>
<<set _canRest to false>>
<<set _errorMsg to "Too injured to rest safely!">>
<</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>>
<</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 +20% hit chance this turn!';
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>>
<<set _videoPath to null>>
<<set _videoFormat to null>>
<<if _config.videoFolders && _config.videoFolders[_genderSuffix]>>
<<selectMediaFromPool _config.videoFolders[_genderSuffix]>>
<<if _result && _result.file>>
<<set _videoPath to _result.file>>
<<set _videoFormat to _result.format>>
<</if>>
<</if>>
<<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,
videoPath: _videoPath,
videoFormat: _videoFormat
}>>
<<else>>
<<run window._pForceBegCardData = {
narrative: "No valid target.",
humGain: 0,
resistChange: 0,
newHumil: 0,
newResist: 0,
enemyName: "Unknown",
videoPath: null,
videoFormat: null
}>>
<</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>');
if (d.videoPath) {
var videoHtml = '<video class="combat-video" autoplay loop muted playsinline>';
videoHtml += '<source src="' + d.videoPath + '" type="video/' + d.videoFormat + '">';
videoHtml += '</video>';
$('#player-force-beg-video').html(videoHtml);
}
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>>
<<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>>
<<set _epppVideoPath to null>>
<<set _epppVideoFormat to null>>
<<if _epppConfig.videoFolder>>
<<selectMediaFromPool _epppConfig.videoFolder>>
<<if _result && _result.file>>
<<set _epppVideoPath to _result.file>>
<<set _epppVideoFormat to _result.format>>
<</if>>
<</if>>
<</if>>
<</silently>>
<<run window._epppCardData = {
targetLust: _target ? _target.lust : 0,
targetHealth: _target ? _target.health : 0,
targetMaxHealth: _target ? _target.maxHealth : 0,
canAttack: _epppCanAttack
}>>
<<run setTimeout(function() {
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);
}, 10)>>
<<run setTimeout(function() {
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);
}, 20)>>
<<run setTimeout(function() {
var videoContainer = document.getElementById('player-pp-video');
if (videoContainer && _epppVideoPath) {
if (_epppVideoFormat === 'webm' || _epppVideoFormat === 'mp4') {
videoContainer.innerHTML = '<video src="' + _epppVideoPath + '" autoplay loop muted playsinline class="constrained-combat-video"></video>';
} else {
videoContainer.innerHTML = '<img src="' + _epppVideoPath + '" class="constrained-combat-video" alt="Attack">';
}
videoContainer.style.display = 'block';
} else if (videoContainer) {
videoContainer.style.display = 'none';
}
}, 25)>>
<<run setTimeout(function() {
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);
}, 30)>>
<<run setTimeout(function() {
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);
}, 40)>>
<<run setTimeout(function() {
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);
}
}, 50)>>
<</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"></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 Math.min(100, (Number(_enemy.lust) || 0) + _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>>
<<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>>
<<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 "playerSeduceCard">>
<<set _target to $combat.enemies[$combat.currentTargetIndex] || $combat.enemies[0]>>
<<set _seduceThreshold to _target.seduceThreshold || 100>>
<div class="combat-card player-card player-seduce-card">
<div class="card-header player-card-header player-seduce-header">
<<icon "lust" "medium">>
<span class="player-card-name">SEDUCTION</span>
<span class="attack-name">SEDUCE</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-seduce-narrative" class="seduce-narrative-container">
<em>Seducing...</em>
</div>
<!-- Lust result placeholder -->
<div id="player-seduce-result" class="seduce-result-container"></div>
<!-- Status effects placeholder -->
<div id="player-seduce-status" class="seduce-status-container"></div>
</div>
<div class="card-footer player-card-footer">
<span class="target-hp"><<icon "health" "medium">> <span id="player-seduce-hp"><<print _target.health>></span></span>
<span class="target-lust"><<icon "lust" "medium">> <span id="player-seduce-lust"><<print _target.lust || 0>>%</span></span>
<span class="attack-cost"><<icon "energy" "medium">> -5</span>
</div>
</div>
<</widget>>
<<widget "executePlayerSeduceCard">>
<<silently>>
<<set _target to $combat.enemies[$combat.currentTargetIndex] || $combat.enemies[0]>>
<<set _seduceThreshold to _target.seduceThreshold || 100>>
<<clampStat "player.energy" (-5) 0 50>>
<<set _lustDamage to 10 + ($player.allure || 0)>>
<<set _oldLust to _target.lust || 0>>
<<set _target.lust to (_target.lust || 0) + _lustDamage>>
<<set _newLust to _target.lust>>
<<set _seductionSuccess to (_target.lust >= _seduceThreshold)>>
<<set _lustDazeTrigger to (!_seductionSuccess && _target.lust >= (_seduceThreshold * 0.7) && _oldLust < (_seduceThreshold * 0.7))>>
<<if _lustDazeTrigger>>
<<applyStatus _target "lust_daze">>
<</if>>
<<set _narrativePool to setup.combatNarrative.seduce_sultry_gaze || []>>
<<if _narrativePool.length gt 0>>
<<set _narrative to _narrativePool[random(0, _narrativePool.length - 1)]>>
<<else>>
<<set _narrative to "You lock eyes with her, letting desire show plainly in your gaze.">>
<</if>>
<<set _lustPercent to Math.floor((_newLust / _seduceThreshold) * 100)>>
<<if _lustPercent gte 67>>
<<set _reactionPool to setup.combatNarrative.seduce_enemy_reaction_high || []>>
<<elseif _lustPercent gte 34>>
<<set _reactionPool to setup.combatNarrative.seduce_enemy_reaction_mid || []>>
<<else>>
<<set _reactionPool to setup.combatNarrative.seduce_enemy_reaction_low || []>>
<</if>>
<<if _reactionPool.length gt 0>>
<<set _reaction to _reactionPool[random(0, _reactionPool.length - 1)]>>
<<else>>
<<set _reaction to "">>
<</if>>
<<run window._seduceCardData = {
narrative: _narrative,
reaction: _reaction,
targetName: _target.name,
lustDamage: _lustDamage,
oldLust: _oldLust,
newLust: _newLust,
allureBonus: $player.allure || 0,
seductionSuccess: _seductionSuccess,
lustDazeTrigger: _lustDazeTrigger,
seduceThreshold: _seduceThreshold
}>>
<</silently>>
<<run setTimeout(function() {
var d = window._seduceCardData;
var narrativeHtml = '<p>' + d.narrative + '</p>';
if (d.reaction) {
narrativeHtml += '<p class="enemy-reaction">' + d.reaction + '</p>';
}
$('#player-seduce-narrative').html(narrativeHtml);
var resultHtml = '<div class="lust-damage-row">';
resultHtml += '<span class="gi gi-lust gi-medium"></span>';
resultHtml += '<span class="lust-amount">+' + d.lustDamage + ' Lust</span>';
resultHtml += '</div>';
if (d.allureBonus > 0) {
resultHtml += '<div class="lust-breakdown">';
resultHtml += '<span class="breakdown-item">Base: 10</span>';
resultHtml += '<span class="breakdown-item">+' + d.allureBonus + ' (Allure)</span>';
resultHtml += '</div>';
}
$('#player-seduce-result').html(resultHtml);
var statusHtml = '';
if (d.seductionSuccess) {
statusHtml = '<div class="seduction-success-alert">';
statusHtml += '<span class="gi gi-lust gi-medium"></span>';
statusHtml += '<span>SEDUCTION SUCCESSFUL!</span>';
statusHtml += '</div>';
} else if (d.lustDazeTrigger) {
statusHtml = '<div class="lust-daze-alert">';
statusHtml += '<span class="gi gi-dazed gi-medium"></span>';
statusHtml += '<span>' + d.targetName + ' is lust-dazed!</span>';
statusHtml += '</div>';
}
$('#player-seduce-status').html(statusHtml);
$('#player-seduce-lust').text(d.newLust + '%');
}, 50)>>
<</widget>>
<<widget "playerSeduceCardFlow">>
<<initCombatTarget>>
<<set _target to $combat.enemies[$combat.currentTargetIndex] || $combat.enemies[0]>>
<<set _seduceThreshold to _target.seduceThreshold || 100>>
<<set _willSucceed to ((_target.lust || 0) + 10 + ($player.allure || 0)) gte _seduceThreshold>>
<div class="player-turn-container">
<!-- Render the card -->
<<playerSeduceCard>>
<!-- Execute and populate -->
<<executePlayerSeduceCard>>
</div>
<!-- Handle seduction success or continue -->
<<if _willSucceed>>
<<set $combat.seduced to _target.id>>
<div class="choice-container">
<<vchoice "Claim Victory" "Combat_Seduction_Success" "intimate" "lips">>
</div>
<<else>>
<div class="choice-container">
<<vchoice "Continue" "Combat_Companion_Turn" "move" "map">>
</div>
<</if>>
<</widget>>
<<widget "playerIntimidateCard">>
<<set _target to $combat.enemies[$combat.currentTargetIndex] || $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>
<!-- 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.currentTargetIndex] || $combat.enemies[0]>>
<<set _config to setup.dominationConfigs.intimidate>>
<<set _negEnergyCost to -_config.energyCost>>
<<clampStat "player.energy" _negEnergyCost 0 50>>
<<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>>
<<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
}>>
<</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>
<!-- 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 50>>
<<set _baseDamage to _config.baseDamage>>
<<set _corruptionBonus to Math.floor($player.corruption / _config.corruptionScaling)>>
<<set _damage to _baseDamage + _corruptionBonus>>
<<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 _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>>
<<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>>
<<set $combat.enemies to $combat.enemies.filter(function(e) { return e.health > 0; })>>
<<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 (_target.lust || 0) + _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 _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>>
<<set _epsVideoPath to null>>
<<set _epsVideoFormat to null>>
<<if _epsConfig.videoFolder>>
<<selectMediaFromPool _epsConfig.videoFolder>>
<<if _result && _result.file>>
<<set _epsVideoPath to _result.file>>
<<set _epsVideoFormat to _result.format>>
<</if>>
<</if>>
<</silently>>
<<run window._epsCardData = {
targetLust: _targetLust,
targetHealth: _target.health,
targetMaxHealth: _target.maxHealth
}>>
<<run setTimeout(function() {
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 += resistPool?.random() || 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 += hitPool?.random() || 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 += secondaryPool?.random() || secondaryNarrative;
narrativeHtml += '</p>';
}
var tierKey = config.narrativeKey + '_lust_' + _epsLustTier;
var tierPool = setup.combatNarrative[tierKey];
if (tierPool) {
var tierClass = _epsLustTier === '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);
}, 10)>>
<<run setTimeout(function() {
var videoContainer = document.getElementById('player-seduce-video');
if (videoContainer && _epsVideoPath) {
if (_epsVideoFormat === 'webm' || _epsVideoFormat === 'mp4') {
videoContainer.innerHTML = '<video src="' + _epsVideoPath + '" autoplay loop muted playsinline class="constrained-combat-video"></video>';
} else {
videoContainer.innerHTML = '<img src="' + _epsVideoPath + '" class="constrained-combat-video" alt="Seduction">';
}
videoContainer.style.display = 'block';
} else if (videoContainer) {
videoContainer.style.display = 'none';
}
}, 15)>>
<<run setTimeout(function() {
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);
}, 30)>>
<<run setTimeout(function() {
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! +50% 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 (_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 + '%');
}, 40)>>
<</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 (_target.lust || 0) + 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 (_target.lust || 0) + 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 (_target.lust || 0) + 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>>
<<set _eptcVideoPath to null>>
<<set _eptcVideoFormat to null>>
<<if _eptcConfig.videoFolder>>
<<selectMediaFromPool _eptcConfig.videoFolder>>
<<if _result && _result.file>>
<<set _eptcVideoPath to _result.file>>
<<set _eptcVideoFormat to _result.format>>
<</if>>
<</if>>
<</silently>>
<<run window._eptcCardData = {
success: _eptcSuccess,
newPosition: _eptcNewPosition,
currentPosition: _target ? _target.position : 'standing',
targetHealth: _target ? _target.health : 0,
targetMaxHealth: _target ? _target.maxHealth : 0
}>>
<<run setTimeout(function() {
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);
}, 10)>>
<<run setTimeout(function() {
var videoContainer = document.getElementById('player-takedown-video');
if (videoContainer && _eptcVideoPath) {
if (_eptcVideoFormat === 'webm' || _eptcVideoFormat === 'mp4') {
videoContainer.innerHTML = '<video src="' + _eptcVideoPath + '" autoplay loop muted playsinline class="constrained-combat-video"></video>';
} else {
videoContainer.innerHTML = '<img src="' + _eptcVideoPath + '" class="constrained-combat-video" alt="Takedown">';
}
videoContainer.style.display = 'block';
} else if (videoContainer) {
videoContainer.style.display = 'none';
}
}, 25)>>
<<run setTimeout(function() {
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 ' + (_target.position || 'standing') + '</span>';
resultHtml += '</div>';
}
$('#player-takedown-result').html(resultHtml);
}, 30)>>
<<run setTimeout(function() {
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);
}, 40)>>
<<run setTimeout(function() {
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);
}, 50)>>
<</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>>
<<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,
class: _template.class,
tier: _tierName,
tierData: _tier,
gender: _template.gender,
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.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: "Full defensive capability",
blockMod: 0,
parryMod: 0,
canParry: true,
canRiposte: true
}>>
<<set setup.enemyPositionConfigs.kneeling to {
id: "kneeling",
name: "On Knees",
icon: "kneeling",
defenseClass: "position-vulnerable",
tooltip: "Block -20%, Parry -25%, No Riposte",
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: "Block -50%, No Parry, No Riposte",
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: "Block -50%, No Parry, No Riposte",
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: "Block -40%, No Parry, No Riposte",
blockMod: -40,
parryMod: 0,
canParry: false,
canRiposte: false
}>>
<<set setup.enemyPositionConfigs.pinned to {
id: "pinned",
name: "PINNED",
icon: "pinned",
defenseClass: "position-critical",
tooltip: "Cannot defend! Must break 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>>
<<widget "initEnemyPositionConfig">>
<<silently>>
<<if !setup.enemyPositionConfigs>>
<<include "EnemyPositionConfig">>
<</if>>
<</silently>>
<</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"
}
},
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: 30 },
urgent: { min: 70, max: 89, stripChance: 50 },
desperate: { min: 90, stripChance: 70, 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 }
},
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 - bulge visible" },
intent: { min: 60, max: 89, icon: "eye-target", tooltip: "Sexual Intent - targeting Kira" },
desperate: { min: 90, max: 100, icon: "desperate", tooltip: "Desperate - will force immediately", cssClass: "male-desperate" },
exposed: { icon: "hazard-sign", tooltip: "Dick Out - ready to assault", cssClass: "male-exposed" }
}
}>>
<</widget>>
<<widget "getPositionMod">>
<<set _pos to _args[0] || $combat.positions.kira || "standing">>
<<set _cfg to setup.maleAssaultConfig.positionMods>>
<<set _posMod to _cfg[_pos] || _cfg.standing>>
<</widget>>
<<widget "getBoundMod">>
<<set _boundMod to { stripChance: 0, stripDamage: 0 }>>
<<set _cfg to setup.maleAssaultConfig.boundMods>>
<<if $combat.kiraWristsBound && $combat.kiraAnklesBound>>
<<set _boundMod.stripChance to _cfg.bothBound.stripChance>>
<<set _boundMod.stripDamage to _cfg.bothBound.stripDamage>>
<<else>>
<<if $combat.kiraWristsBound>>
<<set _boundMod.stripChance += _cfg.wristsBound.stripChance>>
<<set _boundMod.stripDamage += _cfg.wristsBound.stripDamage>>
<</if>>
<<if $combat.kiraAnklesBound>>
<<set _boundMod.stripChance += _cfg.anklesBound.stripChance>>
<<set _boundMod.stripDamage += _cfg.anklesBound.stripDamage>>
<</if>>
<</if>>
<<if $combat.kiraLeashed>>
<<set _boundMod.stripChance += _cfg.leashed.stripChance>>
<<set _boundMod.stripDamage += _cfg.leashed.stripDamage>>
<</if>>
<</widget>>
<<widget "getKiraLustMod">>
<<set _kiraLust to $companions[0].lust || 0>>
<<set _cfg to setup.maleAssaultConfig.kiraLustMods>>
<<set _kiraStripMod to 0>>
<<if _kiraLust < 40>>
<<set _kiraStripMod to _cfg.calm.stripResist>>
<<elseif _kiraLust < 60>>
<<set _kiraStripMod to _cfg.aroused.stripResist>>
<<elseif _kiraLust < 80>>
<<set _kiraStripMod to _cfg.distracted.stripResist>>
<<else>>
<<set _kiraStripMod to _cfg.overwhelmed.stripResist>>
<</if>>
<</widget>>
<<widget "getWeaponStripMod">>
<<set _weapon to _args[0] || "fists">>
<<set _cfg to setup.maleAssaultConfig.weaponMods>>
<<switch _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 "rope">>
<<set _weaponKey to "rope">>
<<case "pipe">>
<<set _weaponKey to "pipe">>
<<default>>
<<set _weaponKey to "fists">>
<</switch>>
<<set _weaponMod to _cfg[_weaponKey] || _cfg.fists>>
<</widget>>
<<widget "getEnemyLustBehavior">>
<<set _lust to _args[0] || 0>>
<<set _cfg to setup.maleAssaultConfig.lustThresholds>>
<<if _lust >= 90>>
<<set _lustBehavior to "desperate">>
<<set _stripChance to _cfg.desperate.stripChance>>
<<elseif _lust >= 70>>
<<set _lustBehavior to "urgent">>
<<set _stripChance to _cfg.urgent.stripChance>>
<<elseif _lust >= 50>>
<<set _lustBehavior to "eager">>
<<set _stripChance to _cfg.eager.stripChance>>
<<else>>
<<set _lustBehavior to "patient">>
<<set _stripChance to _cfg.patient.stripChance>>
<</if>>
<</widget>>
<<widget "getMaleArousalIcon">>
<<set _enemy to _args[0]>>
<<set _cfg to setup.maleAssaultConfig.maleArousalIcons>>
<<set _arousalIcon to { icon: null, tooltip: null, cssClass: "" }>>
<<if _enemy && _enemy.gender === "male">>
<<if _enemy.clothing && _enemy.clothing.dickExposed>>
<<set _arousalIcon.icon to _cfg.exposed.icon>>
<<set _arousalIcon.tooltip to _cfg.exposed.tooltip>>
<<set _arousalIcon.cssClass to _cfg.exposed.cssClass>>
<<else>>
<<set _lust to _enemy.lust || 0>>
<<if _lust >= 90>>
<<set _arousalIcon.icon to _cfg.desperate.icon>>
<<set _arousalIcon.tooltip to _cfg.desperate.tooltip>>
<<set _arousalIcon.cssClass to _cfg.desperate.cssClass>>
<<elseif _lust >= 60>>
<<set _arousalIcon.icon to _cfg.intent.icon>>
<<set _arousalIcon.tooltip to _cfg.intent.tooltip>>
<<elseif _lust >= 30>>
<<set _arousalIcon.icon to _cfg.aroused.icon>>
<<set _arousalIcon.tooltip to _cfg.aroused.tooltip>>
<</if>>
<</if>>
<</if>>
<</widget>>
<<widget "getClothingStateDesc">>
<<set _piece to _args[0]>>
<<set _value to _args[1]>>
<<set _cfg to setup.maleAssaultConfig.clothingStates>>
<<if _value > 75>>
<<set _clothingState to "intact">>
<<elseif _value > 50>>
<<set _clothingState to "damaged">>
<<elseif _value > 25>>
<<set _clothingState to "revealing">>
<<else>>
<<set _clothingState to "destroyed">>
<</if>>
<<switch _piece>>
<<case "top">>
<<switch _clothingState>>
<<case "intact">><<set _clothingDesc to "Shirt intact">>
<<case "damaged">>
<<getMaleAssaultNarrative "top_damaged" "Shirt torn, stomach showing">>
<<set _clothingDesc to _maNarrative>>
<<case "revealing">>
<<getMaleAssaultNarrative "top_revealing" "Shirt barely hanging on, underboob visible">>
<<set _clothingDesc to _maNarrative>>
<<case "destroyed">><<set _clothingDesc to "Tits exposed">>
<</switch>>
<<case "bottom">>
<<switch _clothingState>>
<<case "intact">><<set _clothingDesc to "Pants intact">>
<<case "damaged">>
<<getMaleAssaultNarrative "bottom_damaged" "Pants torn at thigh">>
<<set _clothingDesc to _maNarrative>>
<<case "revealing">>
<<getMaleAssaultNarrative "bottom_revealing" "Pants low, panty waistband visible">>
<<set _clothingDesc to _maNarrative>>
<<case "destroyed">><<set _clothingDesc to "Pants destroyed">>
<</switch>>
<<case "underwear">>
<<switch _clothingState>>
<<case "intact">><<set _clothingDesc to "Panties intact">>
<<case "damaged">>
<<getMaleAssaultNarrative "underwear_damaged" "Panties torn at hip">>
<<set _clothingDesc to _maNarrative>>
<<case "revealing">>
<<getMaleAssaultNarrative "underwear_revealing" "Panties barely covering">>
<<set _clothingDesc to _maNarrative>>
<<case "destroyed">><<set _clothingDesc to "Pussy exposed">>
<</switch>>
<</switch>>
<</widget>>
<<widget "canAccessForPenetration">>
<<set _enemy to _args[0]>>
<<set _targetArea to _args[1] || "pussy">>
<<set _canAccess to false>>
<<set _blockReason to "">>
<<set _needsExpose to false>>
<<set _needsShoveAside to false>>
<<set _c to $clothing.kira>>
<<if _enemy.gender === "male" && _targetArea !== "mouth">>
<<if !_enemy.clothing || !_enemy.clothing.dickExposed>>
<<set _blockReason to "dick_not_exposed">>
<<set _needsExpose to true>>
<</if>>
<</if>>
<<if !_needsExpose>>
<<switch _targetArea>>
<<case "pussy">>
<<if _c.pussyExposed>>
<<set _canAccess to true>>
<<elseif _c.underwear <= 50 && _enemy.lust >= 90>>
<<set _canAccess to true>>
<<set _needsShoveAside to true>>
<<set _blockReason to "shove_aside">>
<<else>>
<<set _blockReason to "underwear_blocking">>
<</if>>
<<case "ass">>
<<if _c.assExposed>>
<<set _canAccess to true>>
<<elseif _c.bottom <= 25>>
<<set _canAccess to true>>
<<else>>
<<set _blockReason to "pants_blocking">>
<</if>>
<<case "mouth">>
<<set _pos to $combat.positions.kira || "standing">>
<<if _pos === "kneeling" || _pos === "prone_back" || _pos === "pinned">>
<<set _canAccess to true>>
<<else>>
<<set _blockReason to "wrong_position">>
<</if>>
<</switch>>
<</if>>
<</widget>>
<<widget "applyExposedDebuffs">>
<<set _idx to _args[0]>>
<<set _enemy to $combat.enemies[_idx]>>
<<if _enemy && _enemy.clothing && _enemy.clothing.dickExposed>>
<<set _debuffs to setup.maleAssaultConfig.exposedDebuffs>>
<<if !_enemy.exposedDebuffsApplied>>
<<set _enemy.accuracyMod to (_enemy.accuracyMod || 0) + _debuffs.accuracy>>
<<set _enemy.defenseMod to (_enemy.defenseMod || 0) + _debuffs.defense>>
<<set _enemy.exposedDebuffsApplied to true>>
<<set $combat.enemies[_idx] to _enemy>>
<</if>>
<</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 "checkPenetrationPrerequisites">>
<<set _enemy to _args[0]>>
<<set _idx to _args[1]>>
<<set _intendedAction to _args[2] || "fuck_pussy">>
<<set _prereqResult to {
canProceed: false,
redirectAction: null,
blockReason: null,
needsShoveAside: false
}>>
<<switch _intendedAction>>
<<case "fuck_pussy">>
<<set _targetArea to "pussy">>
<<case "fuck_ass">>
<<set _targetArea to "ass">>
<<case "forced_oral">>
<<set _targetArea to "mouth">>
<<default>>
<<set _targetArea to "pussy">>
<</switch>>
<<canAccessForPenetration _enemy _targetArea>>
<<if _needsExpose>>
<<set _prereqResult.redirectAction to "expose_self">>
<<set _prereqResult.blockReason to "dick_not_exposed">>
<<elseif _canAccess>>
<<set _prereqResult.canProceed to true>>
<<if _needsShoveAside>>
<<set _prereqResult.needsShoveAside to true>>
<</if>>
<<else>>
<<set _prereqResult.blockReason to _blockReason>>
<<if _blockReason === "underwear_blocking">>
<<set _prereqResult.redirectAction to "strip_underwear">>
<<elseif _blockReason === "pants_blocking">>
<<set _prereqResult.redirectAction to "strip_pants">>
<<elseif _blockReason === "wrong_position">>
<<set _prereqResult.redirectAction to "force_position">>
<</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>>
<<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 "getPartialExposureDesc">>
<<set _c to $clothing.kira>>
<<set _exposureDesc to "">>
<<set _exposureParts to []>>
<<if _c.top > 0 && _c.top <= 75>>
<<getClothingStateDesc "top" _c.top>>
<<run _exposureParts.push(_clothingDesc)>>
<</if>>
<<if _c.bottom > 0 && _c.bottom <= 75>>
<<getClothingStateDesc "bottom" _c.bottom>>
<<run _exposureParts.push(_clothingDesc)>>
<</if>>
<<if _c.bottom <= 0 && _c.underwear > 0 && _c.underwear <= 75>>
<<getClothingStateDesc "underwear" _c.underwear>>
<<run _exposureParts.push(_clothingDesc)>>
<</if>>
<<if _exposureParts.length > 0>>
<<set _exposureDesc to _exposureParts.join(". ") + ".">>
<<else>>
<<set _exposureDesc to "">>
<</if>>
<</widget>>
<<widget "getTelegraph">>
<<set _intent to _args[0]>>
<<set _telegraphKey to null>>
<<switch _intent>>
<<case "fuck_pussy" "fuck_ass" "mount">>
<<set _telegraphKey to "telegraph_fuck">>
<<case "forced_oral">>
<<set _telegraphKey to "telegraph_forced_oral">>
<<case "expose_self">>
<<set _telegraphKey to "telegraph_expose">>
<<case "pants_yank" "slice_pants" "belt_yank_pants">>
<<set _telegraphKey to "telegraph_strip_bottom">>
<<case "rip_top_off" "slice_top">>
<<set _telegraphKey to "telegraph_strip_top">>
<<case "rip_underwear" "slice_underwear" "belt_yank_underwear" "shove_underwear_aside">>
<<set _telegraphKey to "telegraph_strip_underwear">>
<</switch>>
<</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 _e && _e.health > 0>>
<<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 _data.enemy.isHolding || _data.enemy.lastAction === "grab" || _data.enemy.lastAction === "grapple">>
<<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>>
<<set _pos to $combat.positions.kira || "standing">>
<<if _pos === "prone_back" || _pos === "prone_front" || _pos === "kneeling">>
<<set _coopResult.canCoop to true>>
<<set _coopResult.coopType to "spit_roast">>
<<set _coopResult.narrativeKey to "coop_spit_roast_start">>
<</if>>
<<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 "handleFailedStrip">>
<<set _idx to _args[0]>>
<<set _stripTarget to _args[1] || "unknown">>
<<set _enemy to $combat.enemies[_idx]>>
<<set _cfg to setup.maleAssaultConfig.failedStripTaunt>>
<<set _failResult to {
tauntTriggered: false,
tauntText: null,
enemyEnraged: false
}>>
<<if _enemy && _cfg>>
<<if random(1, 100) <= _cfg.chance>>
<<set _failResult.tauntTriggered to true>>
<<if setup.maleAssaultNarrative && setup.maleAssaultNarrative.strip_fail_taunt>>
<<set _taunts to setup.maleAssaultNarrative.strip_fail_taunt>>
<<set _failResult.tauntText to _taunts[random(0, _taunts.length - 1)]>>
<</if>>
<<if random(1, 100) <= _cfg.enrageChance>>
<<set _failResult.enemyEnraged to true>>
<<set _enemy.lust to Math.min(100, (_enemy.lust || 0) + _cfg.lustBonus)>>
<<set _enemy.enraged to true>>
<<set _enemy.enragedDuration to 2>>
<<set $combat.enemies[_idx] to _enemy>>
<</if>>
<</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 "displayMaleAssaultNarrative">>
<<set _dmaPoolKey to _args[0]>>
<<set _dmaFallback to _args[1] || "">>
<<set _dmaCssClass to _args[2] || "assault-narrative">>
<<getMaleAssaultNarrative _dmaPoolKey _dmaFallback>>
<<if _maNarrative !== "">>
<div @class="_dmaCssClass"><<print _maNarrative>></div>
<</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 "displayTelegraph">>
<<set _dtIntent to _args[0]>>
<<set _telegraphPool to null>>
<<switch _dtIntent>>
<<case "fuck_pussy" "fuck_ass" "mount">>
<<set _telegraphPool to "telegraph_fuck">>
<<case "forced_oral">>
<<set _telegraphPool to "telegraph_forced_oral">>
<<case "expose_self">>
<<set _telegraphPool to "telegraph_expose">>
<<case "pants_yank" "slice_pants" "belt_yank_pants" "strip_bottom">>
<<set _telegraphPool to "telegraph_strip_bottom">>
<<case "rip_top_off" "slice_top" "strip_top">>
<<set _telegraphPool to "telegraph_strip_top">>
<<case "rip_underwear" "slice_underwear" "belt_yank_underwear" "shove_underwear_aside" "strip_underwear">>
<<set _telegraphPool to "telegraph_strip_underwear">>
<</switch>>
<<if _telegraphPool>>
<<getMaleAssaultNarrative _telegraphPool "">>
<<if _maNarrative !== "">>
<div class="telegraph-narrative"><<print _maNarrative>></div>
<</if>>
<</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 "displayShoveAsideNarrative">>
<<getMaleAssaultNarrative "shove_underwear_aside" "He roughly shoves her panties aside.">>
<div class="shove-aside-narrative"><<print _maNarrative>></div>
<<getMaleAssaultNarrative "kira_shove_aside_reaction" "">>
<<if _maNarrative !== "">>
<div class="kira-reaction"><<print _maNarrative>></div>
<</if>>
<</widget>>
<<widget "displayPenetrationNarrative">>
<<set _dpnType to _args[0]>>
<<set _pos to $combat.positions.kira || "standing">>
<<set _poolKey to null>>
<<switch _dpnType>>
<<case "fuck_pussy" "fuck">>
<<if _pos === "prone_back">>
<<set _poolKey to "fuck_prone_back">>
<<elseif _pos === "prone_front" || _pos === "prone">>
<<set _poolKey to "fuck_prone_front">>
<<elseif _pos === "bent_over">>
<<set _poolKey to "fuck_bent_over">>
<<else>>
<<set _poolKey to "fuck_prone_back">>
<</if>>
<<case "forced_oral" "oral">>
<<set _poolKey to "oral_kneeling">>
<</switch>>
<<if _poolKey>>
<<getMaleAssaultNarrative _poolKey "">>
<<if _maNarrative !== "">>
<div class="penetration-narrative"><<print _maNarrative>></div>
<</if>>
<</if>>
<</widget>>
<<widget "checkFailedStripTaunt">>
<<set _cftEnemy to _args[0]>>
<<set _pos to $combat.positions.kira || "standing">>
<<set _canTaunt to (_pos === "standing" || _pos === "kneeling") && !$combat.kiraMouthOccupied>>
<<if _canTaunt && random(1, 100) <= 40>>
<<getMaleAssaultNarrative "strip_fail_taunt" "'That all you got?'">>
<div class="kira-taunt"><<print _maNarrative>></div>
<<if random(1, 100) <= 30>>
<<getMaleAssaultNarrative "enemy_enraged_by_taunt" "His face reddens with anger.">>
<div class="enemy-enraged"><<print _maNarrative>></div>
<<if _cftEnemy>>
<<set _cftEnemy.enraged to true>>
<<set _cftEnemy.enragedDuration to 2>>
<<set _cftEnemy.lust to Math.min(100, (_cftEnemy.lust || 0) + 10)>>
<</if>>
<</if>>
<</if>>
<</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"],
lootChance: 0.5,
baseXp: 15
},
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", "throwing_knife"],
lootChance: 0.4,
baseXp: 10
},
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", "crude_weapon", "stimpack"],
lootChance: 0.6,
baseXp: 25
},
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", "leather_scraps", "dirty_water"],
lootChance: 0.5,
baseXp: 18
},
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"],
lootChance: 0.5,
baseXp: 16
},
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: ["chain", "scrap_metal", "stimpack"],
lootChance: 0.5,
baseXp: 20
},
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: ["machete", "bandage", "dirty_water"],
lootChance: 0.6,
baseXp: 22
},
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", "throwing_knife", "bandage"],
lootChance: 0.55,
baseXp: 20
},
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: ["quality_weapon", "armor_piece", "rare_parts"],
lootChance: 0.8,
baseXp: 50
},
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: ["throwing_knife", "leather_scraps", "dirty_water"],
lootChance: 0.5,
baseXp: 18
},
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"],
lootChance: 0.4,
baseXp: 15
},
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: ["leather_scraps", "dirty_water", "bandage"],
lootChance: 0.5,
baseXp: 17
},
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: ["machete", "stimpack", "leather_scraps"],
lootChance: 0.6,
baseXp: 24
},
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"],
lootChance: 0.5,
baseXp: 16
},
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: ["chain", "scrap_metal", "dirty_water"],
lootChance: 0.5,
baseXp: 19
},
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", "leather_scraps"],
lootChance: 0.5,
baseXp: 22
},
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", "leather_scraps", "stimpack"],
lootChance: 0.6,
baseXp: 23
},
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: ["quality_weapon", "raider_crown", "rare_parts"],
lootChance: 0.8,
baseXp: 55
}
}>>
<<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"],
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",
"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_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 "isRaiderType">>
<<set _checkType to _args[0]>>
<<set _isRaider to false>>
<<if setup.raiderTypeMap && setup.raiderTypeMap[_checkType]>>
<<set _isRaider to true>>
<<elseif setup.raiderTemplates && setup.raiderTemplates[_checkType]>>
<<set _isRaider to true>>
<</if>>
<<set _return to _isRaider>>
<</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.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>>
<<set _return to _enemy>>
<</silently>>
<</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.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.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.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 _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 _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 _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 "getSmartRaiderHitNarrative">>
<<set _damage to _args[0]>>
<<set _enemy to _args[1]>>
<<set _target to _args[2] || "kira">>
<<set _typeNarrative to "">>
<<if _target === "kira" && _enemy.gender === "male">>
<<getRaiderHitKiraNarrative _enemy>>
<<set _typeNarrative to _return>>
<<elseif _target === "player" && _enemy.gender === "female">>
<<getRaiderHitPlayerNarrative _enemy>>
<<set _typeNarrative to _return>>
<</if>>
<<if _typeNarrative && _typeNarrative.trim().length gt 0>>
<<set _return to _typeNarrative>>
<<else>>
<<if _target === "kira">>
<<set _return to "">>
<<else>>
<<set _return to "">>
<</if>>
<</if>>
<</widget>><<set _session to $combat.sex.participants[0]>>
<<set _enemy to $combat.enemies[0]>>
<<say $player.name "I'm joining in.">>
<<showCharacter "kira" "center" "shocked">>
<<say "Kira" "What?! NO— don't you DARE—">>
But you're already moving. <<print _enemy.name>> grins.
<div class="choice-container">
<<vchoice "..." "Combat_Join_Kira_DP" "intimate" "lust">>
</div><<widget "initializeCombatClothing">>
<<for _i, _e range $combat.enemies>>
<<if !_e.clothing>>
<<set _e.clothing to {
top: 100,
bottom: 100,
underwear: 100,
titsExposed: false,
pussyExposed: false,
assExposed: false
}>>
<</if>>
<</for>>
<<set $clothing.player to {
top: 100,
bottom: 100,
underwear: 100,
chestExposed: false,
dickExposed: false,
assExposed: false
}>>
<<set $clothing.kira to {
top: 100,
bottom: 100,
underwear: 100,
leftTitExposed: false,
rightTitExposed: false,
titsExposed: false,
pussyExposed: false,
assExposed: false
}>>
<<set $combat.positions.player to "standing">>
<<set $combat.positions.kira to "standing">>
<<set $combat.positions.enemies to []>>
<<set $combat.kiraOrgasmTriggered to false>>
<<set $combat.kiraStunned to 0>>
<<set $combat.kiraDefenseDebuff to 0>>
<<set $combat.kiraDefenseModifier to 0>>
<<set $combat.kiraBeingGroped to false>>
<<set $combat.kiraBeingFingered to false>>
<<set $combat.kiraRefractoryTurns to 0>>
<<set $combat.kiraPostOrgasmAttacks to 0>>
<<set $combat.kiraMultipleOrgasm to false>>
<<set $combat.kiraInRefractory to false>>
<</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 ($combat.playerStunned && $combat.playerStunned > 0)>>
<<set _isProne to (_playerPos === "prone_back" || _playerPos === "prone_stomach")>>
<<set _isKneeling to (_playerPos === "kneeling")>>
<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">>
<<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">>
<<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">>
<</if>>
<<setPronouns _enemy>>
<<if _intent>>
<<set _c to $clothing.kira>>
<<set _pos to $combat.positions.kira>>
<<switch _intent>>
<<case "fuck_pussy">>
<<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 "grope_tits">>
<<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">>
<<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">>
<<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">>
<<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>>
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>>
<<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">>
<<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>>
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>>
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">>
<<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>>
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>>
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">>
<<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>>
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>>
<<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">>
<<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>>
<<set _targetArea to either("back", "thighs", "ass", "tits")>>
<<switch _targetArea>>
<<case "back">>
CRACK! The belt lashes across Kira's back, leaving a red welt!
<<clampStat "companions[0].health" (-random(3, 6)) 0 100>>
<<case "thighs">>
SNAP! The belt bites into her thighs, stinging exposed skin!
<<clampStat "companions[0].health" (-random(2, 5)) 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 handprint!
<</if>>
<<clampStat "companions[0].health" (-random(2, 4)) 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>>
<<clampStat "companions[0].health" (-random(4, 7)) 0 100>>
<<addKiraLust setup.kiraSexConfig.crop.general.kiraLust>>
<</switch>>
<<if $companions[0].health lt 1>><<set $companions[0].health to 1>><</if>>
<<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>>
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 _cfg.resistDC>>
Kira twists away, clutching her pants!
<<say "Kira" "Get your hands OFF!">>
<<set _enemy.sexIntent to null>>
<div class="choice-container">
<<vchoice "Continue fighting" "Combat_Actions" "move" "map">>
</div>
<<else>>
<<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>>
<<clampStat "player.lust" (setup.playerWatchConfig.stripped.playerLust || 0)>>
<<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 _cfg.resistDC>>
Kira clamps her thighs together and twists away!
<<say "Kira" "Get your filthy hands off me!">>
<<set _enemy.sexIntent to null>>
<div class="choice-container">
<<vchoice "Continue fighting" "Combat_Actions" "move" "map">>
</div>
<<else>>
<<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" "You— I'll KILL you!">>
<<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 _cfg.resistDC>>
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>>
<div class="choice-container">
<<vchoice "Continue fighting" "Combat_Actions" "move" "map">>
</div>
<<else>>
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 _cfg.resistDC>>
Kira grabs the belt and wrenches it away!
<<say "Kira" "Nice try, asshole!">>
<<set _enemy.sexIntent to null>>
<div class="choice-container">
<<vchoice "Continue fighting" "Combat_Actions" "move" "map">>
</div>
<<else>>
<<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 _cfg.resistDC>>
Kira clutches her top, holding it together!
<<say "Kira" "Keep your hands OFF!">>
<<set _enemy.sexIntent to null>>
<div class="choice-container">
<<vchoice "Continue fighting" "Combat_Actions" "move" "map">>
</div>
<<else>>
<<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 (_cfg.resistDC + 3)>>
Kira throws herself backward! The knife misses!
<<say "Kira" "Missed, asshole!">>
<<set _enemy.sexIntent to null>>
<div class="choice-container">
<<vchoice "Continue fighting" "Combat_Actions" "move" "map">>
</div>
<<else>>
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>>
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>>
<<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>>
<<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">>
<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>>
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>>
<<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>>
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>>
<<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">>
<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">>
<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">>
<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>>
Kira kicks <<print _p.him>> hard and pulls her arms free!
<<say "Kira" "Not happening!">>
<<set _enemy.health -= _cfg.resistDamage>>
<<set _enemy.sexIntent to null>>
<div class="choice-container">
<<vchoice "Continue fighting" "Combat_Actions" "move" "map">>
</div>
<<else>>
<<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>>
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>>
<<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>>
<<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>>
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>>
<<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">>
<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">>
<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>>
<<set _enemy to $combat.enemies[_currentEnemyIndex]>>
<<if _exposeResult.success>>
<<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>>
<<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">>
<<if _enemy.coopData>>
<<displayCooperationNarrative _enemy.coopData>>
<</if>>
<<checkAndDisplayFirstTime "penetration">>
<<checkAndDisplayFirstTime "oral">>
<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>
<<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">>
<<if _enemy.coopData>>
<<displayCooperationNarrative _enemy.coopData>>
<</if>>
<p class="explicit">While one raider pins Kira's arms, <<print _enemy.name>> tears at her remaining clothing.</p>
<<enemyStripAttempt _enemy>>
<<if _stripResult && _stripResult.shouldStrip>>
<<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">>
<<if _enemy.coopData>>
<<displayCooperationNarrative _enemy.coopData>>
<</if>>
<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>>
<<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>><<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">>
<<if $combat.playerStunned && $combat.playerStunned > 0>>
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" "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>>.
<<clampStat "player.health" (-random(3, 6)) 0 100>>
<<say _enemy.name "Stay DOWN!">>
<div class="choice-container">
<<vchoice "Continue" "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 !($combat.playerStunned && $combat.playerStunned > 0) && (!(_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 _baseAccuracy + _adrenalineBonus - _positionPenalty>>
<<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 _baseDamage + _damageRoll>>
<<set _enemy.health -= _damage>>
<div class="combat-hit-effect">
Your blade connects! <span class="damage-number">-<<print _damage>></span>
</div>
<<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)>>
The <<print _enemy.name.toLowerCase()>> falls dead.
<<if $combat.enemies.length === 0>>
<<goto "Combat_Victory">>
<</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" "Combat_Actions" "move" "map">>
</div>
<</if>><<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">>
<<if $combat.playerStunned && $combat.playerStunned > 0>>
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.
<<clampStat "player.health" (-random(2, 5)) 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>><<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">>
<<if $combat.playerStunned && $combat.playerStunned > 0>>
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 _enemy to $combat.enemies[$combat.currentTarget]>>
<<if !_enemy>><<set _enemy to $combat.enemies[0]>><</if>>
<<setPronouns _enemy>>
<<set _watchCfg to setup.playerWatchConfig.forcedOral>>
You watch, frozen... or is it something else?
<<clampStat "player.lust" (_watchCfg.playerLust || 0)>>
The raider grips Kira's hair tighter, fucking her mouth with brutal thrusts.
<<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" -1>>
<<relationChange "kira" "affection" -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 _enemy to $combat.enemies[$combat.currentTarget]>>
<<if !_enemy>><<set _enemy to $combat.enemies[0]>><</if>>
<<setPronouns _enemy>>
<<set _watchCfg to setup.playerWatchConfig.mountAttempt>>
You hesitate, watching...
The raider moves between Kira's spread legs, already fumbling with <<print _p.his>> pants.
<<say "Kira" `$player.name + "?! HELP ME!"`>>
<<clampStat "player.lust" (_watchCfg.playerLust || 0)>>
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>>
<<print _p.He>> grabs her pants, trying to yank them down.
<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" -1>><<kiraStrippedCardFlow>><<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">>
<<if $combat.playerStunned && $combat.playerStunned > 0>>
You try to move but your body won't cooperate. Still dazed from before.
<<say $player.name "Come on... move...">>
You can only watch helplessly as <<print _p.he>> continues with Kira.
<<say "Kira" `$player.name + "! Are you okay?!"`>>
<div class="choice-container">
<<vchoice "Continue" "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!">>
<<print _p.He>> goes back to groping Kira.
<div class="choice-container">
<<vchoice "Continue" "Combat_Actions" "move" "map">>
</div>
<</if>>
<<elseif _playerPos === "kneeling">>
You lunge from your knees, putting yourself at a disadvantage.
<<set _positionPenalty to 10>>
<<else>>
While <<print _p.he>>'s distracted with Kira, you strike!
<<set _positionPenalty to 0>>
<</if>>
<<if !(_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 _baseAccuracy + _distractedBonus - _positionPenalty>>
<<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 _baseDamage + _damageRoll + _distractedDamageBonus>>
<<set _enemy.health -= _damage>>
<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>
<<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>>
<<goto "Combat_Victory">>
<</if>>
<<else>>
<<print _enemy.name>> staggers, releasing Kira to face you.
<<set _enemy.sexIntent to null>>
<</if>>
<<relationChange "kira" "trust" 1>>
<<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!">>
<<print _p.He>> shoves Kira aside to face you properly.
<<set _enemy.sexIntent to null>>
<<relationChange "kira" "trust" 2>>
<</if>>
<div class="choice-container">
<<vchoice "Continue" "Combat_Actions" "move" "map">>
</div>
<</if>><<set _enemy to $combat.enemies[$combat.currentTarget]>>
<<if !_enemy>><<set _enemy to $combat.enemies[0]>><</if>>
<<setPronouns _enemy>>
<<if $combat.playerStunned && $combat.playerStunned > 0>>
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" "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>>
<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>>
<<goto "Combat_Victory">>
<</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" "Combat_Actions" "move" "map">>
</div>
<</if>><<set _enemy to $combat.enemies[0]>>
<<set _watchCfg to setup.playerWatchConfig.grope>>
You watch for a moment. He's squeezing her tits, rough and possessive.
<div class="narrative-image intimate">
<img src="assets/images/combat/kira-groped.webp" alt="Groped During Combat">
</div>
<<say "Kira" "Are you— are you WATCHING?!">>
Her face is red. Anger. Shame. And something else.
<<addKiraLust _watchCfg.kiraLust>>
<<clampStat "player.lust" (_watchCfg.playerLust || 0)>>
After a few seconds, you attack <<print _enemy.name>>, ending it.
<<set $flags.watchedKiraGetGroped to true>>
<div class="choice-container">
<<vchoice "Continue fighting" "Combat_Actions" "move" "map">>
</div><<set _enemy to $combat.enemies[0]>>
<<setPronouns _enemy>>
<<set _watchCfg to setup.playerWatchConfig.fingered>>
You watch, frozen in place. She's running her fingers over Kira's exposed pussy.
<div class="narrative-image intimate">
<img src="assets/images/combat/kira-touched.webp" alt="Kira Touched During Combat">
</div>
<<say "Kira" "Are you— you're just going to WATCH?!">>
<<print _p.She>> slides a finger inside, and Kira gasps despite herself.
<<say _enemy.name "She's getting wet. Can you see that from there?">>
Her face burns with shame. You're watching her get fingered by another woman.
<<addKiraLust _watchCfg.kiraLust>>
<<clampStat "player.lust" (_watchCfg.playerLust || 0)>>
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 _enemy to $combat.enemies[0]>>
<<setPronouns _enemy>>
<<set _watchCfg to setup.playerWatchConfig.analFinger>>
You watch helplessly as <<print _p.she>> probes Kira's exposed ass.
<div class="narrative-image intimate">
<img src="assets/images/combat/kira-touched.webp" alt="Kira Touched During Combat">
</div>
<<say "Kira" `$player.name + "! Don't just— STAND there!"`>>
<<print _p.She>> 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.she>>'s got her pinned.
<<addKiraLust _watchCfg.kiraLust>>
<<clampStat "player.lust" (_watchCfg.playerLust || 0)>>
The sight breaks the spell. You charge in to stop it.
<<set $flags.watchedKiraGetAnalFingered to true>>
<div class="choice-container">
<<vchoice "Continue fighting" "Combat_Actions" "move" "map">>
</div><<set _enemy to $combat.enemies[$combat.currentTarget]>>
<<if !_enemy>><<set _enemy to $combat.enemies[0]>><</if>>
<<setPronouns _enemy>>
You rush in, grabbing for the chain!
<<set _strCheck to random(1, 20) + Math.floor(($player.strength || 10) / 3)>>
<<if _strCheck >= 12>>
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>><<set _enemy to $combat.enemies[$combat.currentTarget]>>
<<if !_enemy>><<set _enemy to $combat.enemies[0]>><</if>>
<<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>>
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><<set _enemy to $combat.enemies[$combat.currentTarget]>>
<<if !_enemy>><<set _enemy to $combat.enemies[0]>><</if>>
<<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>>
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><<set _enemy to $combat.enemies[$combat.currentTarget]>>
<<if !_enemy>><<set _enemy to $combat.enemies[0]>><</if>>
<<if $equipped && $equipped.weapon && ($equipped.weapon.type === "blade" || $equipped.weapon.name === "Combat Knife")>>
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>><<set _enemy to $combat.enemies[$combat.currentTarget]>>
<<if !_enemy>><<set _enemy to $combat.enemies[0]>><</if>>
<<setPronouns _enemy>>
<<if $equipped && $equipped.weapon && ($equipped.weapon.type === "blade" || $equipped.weapon.name === "Combat Knife")>>
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>>
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><<kiraWatchFuckedCardFlow>><<kiraWatchAnalCardFlow>><<set _enemy to $combat.enemies[0]>>
<<setPronouns _enemy>>
You drive your blade through the stunned enemy's throat. <<print _p.He>> dies gurgling.
<<run $combat.enemies.shift()>>
Justice. But too late.
<<if $combat.enemies.length === 0>>
<<goto "Combat_Victory_AfterKiraFucked">>
<<else>>
<div class="choice-container">
<<vchoice "Continue fighting" "Combat_Actions" "move" "map">>
</div>
<</if>><<kiraCheckCardFlow>><<kiraVictoryAfterFuckedCardFlow>><<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.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: 2,
statDivisor: 5,
varianceMin: -1,
varianceMax: 2,
hitChance: 65,
leashed: {
damageMultiplier: 0.5,
hitChance: 40
},
breakFree: {
knockedDown: 60,
wristsBound: 30,
anklesBound: 25
},
painPleasureChance: 25,
clothingDamageChance: 30
}>>
<<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, missing by inches.",
"She swings but [Enemy] dodges at the last moment.",
"[Enemy] twists aside and Kira's blade cuts only air.",
"Kira overextends, her attack missing its mark.",
"She lunges but [Enemy] is faster, evading the blow.",
"The strike glances off armor, dealing no damage."
]>>
<<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 "medical">>
<<if $expeditionCompanion === "kira">>
<<set $expeditionCompanion to "">>
<</if>>
<</if>>
<</if>>
<</widget>>
<<widget "checkKiraUnconscious">>
<<if $companions && $companions[0] && $companions[0].health lte 1>>
<<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">>
<<set $flags.kiraIsUnconscious to true>>
<<set $companions[0].health to 1>>
<<set $companions[0].status to "unconscious">>
<<set $companions[0].currentLocation to "medical">>
<<set $combat.kiraIncapacitated to true>>
<<if $expeditionCompanion === "kira">>
<<set $expeditionCompanion to "">>
<</if>>
<</widget>><<kiraUnconsciousCardFlow>><<kiraCNCWatchCardFlow>><<kiraCNCStripCardFlow>><<kiraCNCFullCardFlow>><<kiraCNCInterveneCardFlow>><<kiraCNCInterveneLateCardFlow>><<kiraCNCJoinCardFlow>><<kiraCNCJoinMaleCardFlow>><<kiraCNCJoinFemaleCardFlow>><<endCombat>>
<<run VaultUI.setBackgroundDirect($combat.backgroundImage || "media/backgrounds/travel/terrain/reclaimed/reclaimed_1.webp")>>
<<run VaultUI.setTimeOfDay("evening")>>
You find water and rags. Carefully, you clean Kira's body, trying to remove all evidence of what happened.
<<set $clothing.kira.top to 50>>
<<set $clothing.kira.bottom to 50>>
<<set $clothing.kira.titsExposed to false>>
<<set $clothing.kira.pussyExposed to false>>
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.
<<set $flags.hidCNCFromKira to true>>
<<if $flags.kiraUnconsciousFirstTime>>
<<goto "Kira_Unconscious_FirstTime_Start">>
<<else>>
<<goto "Kira_Unconscious_Carry_Home">>
<</if>><<endCombat>>
<<run VaultUI.setBackgroundDirect($combat.backgroundImage || "media/backgrounds/travel/terrain/reclaimed/reclaimed_1.webp")>>
<<run VaultUI.setTimeOfDay("evening")>>
You don't bother cleaning her. She'll figure it out when she wakes up.
<p class="dark-consequence">Her clothes are torn, her body exposed. Evidence of violation obvious between her thighs.</p>
<p class="internal-thought dark">Let her deal with it. You've got enough problems.</p>
<<set $flags.leftCNCEvidence to true>>
<<if $flags.kiraUnconsciousFirstTime>>
<<goto "Kira_Unconscious_FirstTime_Start">>
<<else>>
<<goto "Kira_Unconscious_Carry_Home">>
<</if>><<endCombat>>
<<run VaultUI.setBackgroundDirect($combat.backgroundImage || "media/backgrounds/travel/terrain/reclaimed/reclaimed_1.webp")>>
<<run VaultUI.setTimeOfDay("evening")>>
Your hands shake as you clean her. You use water from your canteen, wiping away the evidence of what you did.
<<set $clothing.kira.top to 30>>
<<set $clothing.kira.bottom to 30>>
<<set $clothing.kira.titsExposed to false>>
<<set $clothing.kira.pussyExposed to false>>
You re-dress her, fingers clumsy with guilt.
<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 $flags.kiraUnconsciousFirstTime>>
<<goto "Kira_Unconscious_FirstTime_Start">>
<<else>>
<<goto "Kira_Unconscious_Carry_Home">>
<</if>><<endCombat>>
<<run VaultUI.setBackgroundDirect($combat.backgroundImage || "media/backgrounds/travel/terrain/reclaimed/reclaimed_1.webp")>>
<<run VaultUI.setTimeOfDay("evening")>>
You don't clean her. Let her see. Let her know.
<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>
<<set $flags.leftCNCEvidence to true>>
<<set $flags.wantsKiraToKnow to true>>
<<if $flags.kiraUnconsciousFirstTime>>
<<goto "Kira_Unconscious_FirstTime_Start">>
<<else>>
<<goto "Kira_Unconscious_Carry_Home">>
<</if>><<kiraFleeCardFlow>><<kiraVictoryUnconsciousCardFlow>><<run VaultUI.setBackgroundDirect($combat.backgroundImage || "media/backgrounds/travel/terrain/reclaimed/reclaimed_1.webp")>>
<<run VaultUI.setTimeOfDay("afternoon")>>
You lift Kira carefully, cradling her against your chest. Her head lolls against your shoulder.
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 "">>
<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($combat.backgroundImage || "media/backgrounds/travel/terrain/reclaimed/reclaimed_1.webp")>>
<<run VaultUI.setTimeOfDay("afternoon")>>
<<advanceTime 0 20>>
<h3>Phase 1 of 3 - Ruined District</h3>
You move through the crumbling buildings, Kira's unconscious form a constant weight in your arms.
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($combat.backgroundImage || "media/backgrounds/travel/terrain/reclaimed/reclaimed_1.webp")>>
<<run VaultUI.setTimeOfDay("afternoon")>>
<<advanceTime 0 20>>
<h3>Phase 2 of 3 - Industrial Ruins</h3>
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($combat.backgroundImage || "media/backgrounds/travel/terrain/reclaimed/reclaimed_1.webp")>>
<<run VaultUI.setTimeOfDay("evening")>>
<<advanceTime 0 20>>
<<setTime 18 0>>
<h3>Phase 3 of 3 - Vault Approach</h3>
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.carryKiraChoice to "groped">>
<<addCorruption 3>>
<<set $temp.carryKiraLust += 20>>
You tell yourself it's just adjusting your grip.
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>>
Through her torn pants, you can feel the heat of her body.
<</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><<addCorruption 5>>
<<set $temp.carryKiraLust += 15>>
<<set $player.lust to Math.min(100, $player.lust + 20)>>
You walk and grope. Every step bounces her body in your arms, and you use that as an excuse to let your hands roam.
Her tits. Her ass. Her thighs.
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($combat.backgroundImage || "media/backgrounds/travel/terrain/reclaimed/reclaimed_1.webp")>>
<<run VaultUI.setTimeOfDay("afternoon")>>
<<set $temp.carryKiraChoice to "rested">>
You set Kira down in a sheltered alcove. You need a moment.
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>>
Her bare tits rise and fall with each breath.
<</if>>
<<if $clothing.kira.pussyExposed>>
Her pussy is right there. Exposed. Defenseless.
<</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>>
<<set $temp.carryKiraLust to 0>>
You pull your cock out, keeping your eyes on Kira's unconscious form.
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><<addCorruption 10>>
<<set $player.lust to 20>>
<<set $flags.cumOnUnconsciousKira to true>>
You stand over her, cock in hand.
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>>
—her exposed pussy, dripping down her thighs.
<<else>>
—her torn clothes, soaking into the fabric.
<</if>>
She doesn't stir. Doesn't react. Just lies there, covered in your cum.
<<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($combat.backgroundImage || "media/backgrounds/travel/terrain/reclaimed/reclaimed_1.webp")>>
<<run VaultUI.setTimeOfDay("evening")>>
You can't take it anymore.
You set Kira down carefully, propping her against a crumbling wall. Her head lolls to one side.
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 60>>
<<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)>>
Your hands move over her body. No pretense now. Pure groping.
You squeeze her tits, pinch her nipples. Spread her thighs and run your fingers along her slit.
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>>
<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>>
You cross the line.
You pull her pants down—or what's left of them—and position yourself between her limp thighs.
<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>>
<<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($combat.backgroundImage || "media/backgrounds/travel/terrain/reclaimed/reclaimed_1.webp")>>
<<run VaultUI.setTimeOfDay("evening")>>
<<addCorruption 5>>
So close to safety. But you're not ready to give up this... opportunity.
You set her down just outside the vault entrance, in a shadowed alcove where no one can see.
<<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>
<<goto "Carry_Kira_Vault_Arrival">><<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")>>
<<setTime 3 0>>
<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.">>
She materializes from the darkness, all curves and hunger.
<<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.">>
She circles you, trailing a claw along your shoulder.
<<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?">>
Velith smiles, her fangs gleaming.
<<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")>>
<<advanceTime 8 0>>
<<setTime 7 0>>
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">>
<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">>
<div class="combat-error">
She's not broken enough to capture without defeating her!
</div>
<<goto "Combat_Actions">>
<</if>>
<div class="combat-victory capture-victory">
<h2><<icon "lock" "medium">> CAPTURED</h2>
<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>>
<<set $combat.enemies.splice(_targetIndex, 1)>>
<<set $player.dominance to ($player.dominance || 0) + 5>>
<<if !$combat.capturedEnemies>>
<<set $combat.capturedEnemies to []>>
<</if>>
<<run $combat.capturedEnemies.push(clone(_target))>>
<<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>
<<goto "Combat_Victory">>
<<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><<useHerSceneCardFlow>><<chokeFuckCardFlow>><<usedThroatCardFlow>><<usedOralCardFlow>><<usedFuckCardFlow>><<usedFuckStartCardFlow>><<usedAnalCardFlow>><<usedMissionaryCardFlow>><<usedDoggyCardFlow>><<usedFacefuckCardFlow>><<executeAllowOrgasm setup.orgasmControlConfigs.allow_orgasm>><<initCombatTarget>>
<<clampStat "player.energy" (-3) 0 50>>
<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><<initCombatTarget>>
<<if _target.lust < 95>>
<div class="combat-error">
She's not aroused enough to force an orgasm yet. Build her lust higher first.
</div>
<<goto "Combat_Actions">>
<<else>>
<<clampStat "player.energy" (-6) 0 50>>
<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! You can capture her now.
</div>
<</if>>
<div class="choice-container">
<<vchoice "Continue" "Combat_Companion_Turn" "move" "map">>
</div>
<</if>><<initCombatTarget>>
<<canWorsenPosition _targetIndex>>
<<if !_canWorsen>>
<div class="combat-error">
<<if _target.position === "pinned">>
They're already fully pinned. You can't worsen their position further.
<<else>>
You can't worsen their position right now.
<</if>>
</div>
<<goto "Combat_Actions">>
<<else>>
<<clampStat "player.energy" (-4) 0 50>>
<div class="combat-action position-action">
<<applyWorsenPosition _targetIndex>>
</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>>
<div class="combat-error">
They're standing—there's no position to hold them in.
</div>
<<goto "Combat_Actions">>
<<else>>
<<clampStat "player.energy" (-2) 0 50>>
<div class="combat-action position-action">
<<applyHoldPosition _targetIndex>>
</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>><<goto "Combat_Player_Block">><<silently>>
<<include "DefensiveActionNarratives">>
<<initDefensiveActionConfigs>>
<</silently>>
<<playerDefenseCardFlow setup.defensiveActionConfigs.dodge>><<playerRestCardFlow>><<silently>><<include "BasicAttackNarratives">><</silently>>
<<canFinisher>>
<<if !_canFinisher>>
<div class="combat-error">
Can't use Finisher! (Need 3+ combo and 8 energy)
</div>
<<goto "Combat_Actions">>
<</if>>
<<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",
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>><<silently>><<include "BasicAttackNarratives">><</silently>>
<<set _config to $combat.playerActionPreview.config>>
<<executeBasicAttack _config>><<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>><<playerStrategicStripTopCardFlow>><<playerStrategicStripBottomCardFlow>><<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",
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",
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",
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",
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",
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",
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",
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",
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",
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",
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",
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",
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",
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",
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",
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>>
<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 (_target.lust || 0) + _lustDamage>>
<<set $player.lust to Math.min(100, $player.lust + 20)>>
<<combatNarrative "player_hit_ultra_extreme" "" "ultra-narrative">>
<<if _target.lust gte _target.seduceThreshold>>
<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.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">>
<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 (_target.lust || 0) + _lustDamage>>
<<set $player.lust to Math.min(100, $player.lust + 18)>>
<<if _target.lust gte _target.seduceThreshold>>
<p class="explicit victory">She moans around your shaft, sucking eagerly— COMPLETE SUBMISSION!</p>
<<set _target.defeated to true>>
<<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>>
<<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 (_target.lust || 0) + _lustDamage>>
<<set $player.lust to Math.min(100, $player.lust + 22)>>
<<if _target.lust gte _target.seduceThreshold>>
<p class="explicit victory">She moans around your cock as she cums from sucking you— CONQUERED!</p>
<<set _target.defeated to true>>
<<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><<set $combat.active to false>>
<<set $combat.result to "test_exit">>
<<run document.body.classList.remove("scene-mode-combat")>>
<<run $("#combat-sidebar-container").remove()>>
<<set $clothing to {
player: {top: 100, bottom: 100, underwear: 100, chestExposed: false, dickExposed: false, assExposed: false},
kira: {top: 100, bottom: 100, underwear: 100, leftTitExposed: false, rightTitExposed: false, titsExposed: false, pussyExposed: false, assExposed: false}
}>>
<<set $combat.positions to {player: "standing", kira: "standing"}>>
<<set $player.health to $player.maxHealth>>
<<set $player.energy to $player.maxEnergy>>
<<set $companions[0].health to $companions[0].maxHealth>>
<p class="info-text">🧪 Test mode: Combat exited. All stats and clothing reset.</p>
<<goto "Vault_Hub">><<silently>><<include "SeductionNarratives">><</silently>>
<<playerSeduceCardFlow>><<silently>><<include "BasicAttackNarratives">><</silently>>
<<playerAttackCardFlow setup.basicAttackConfigs.power_strike>><<playerIntimidateCardFlow>><<playerDarkPulseCardFlow>><<set _seduced to $combat.enemies[0]>>
<<endCombat>>
<<run VaultUI.setBackgroundDirect($combat.backgroundImage || "media/backgrounds/travel/terrain/reclaimed/reclaimed_1.webp")>>
<<run VaultUI.setTimeOfDay("afternoon")>>
<h2>Seduction Success</h2>
The <<print _seduced.name.toLowerCase()>> drops their 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", "suspicious")>>
<<say "Kira" "Seriously? You seduced them in the middle of a fight?">>
<<relationChange "kira" "trust" -1>>
<<relationChange "kira" "affection" 2>>
<</if>>
<<set $stats.combat_victories += 1>>
<<set $vault.scrap += 1>>
<div class="choice-container">
<<vchoice "Take what you can and leave" "Day3_Combat_Aftermath" "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[0]>>
<<clampStat "player.energy" (-8) 0 50>>
<div class="combat-action-visual seduction">
<img src="assets/images/combat/sultry-gaze.png" alt="Sultry Gaze" class="combat-action-img">
</div>
You lock eyes with the <<print _target.name.toLowerCase()>>, 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 += _lustDamage>>
<<logCombat "Enemy arousal +" + _lustDamage + "!" "sexual">>
<div class="status-applied">The <<print _target.name.toLowerCase()>> is entranced! (<<print "+" + _lustDamage>> Lust)</div>
<<else>>
<<logCombat "Seduction failed!" "sexual">>
The <<print _target.name.toLowerCase()>> looks away, resisting your gaze.
<</if>>
<div class="choice-container">
<<vchoice "Continue" "Combat_Companion_Turn" "move" "map">>
</div><<clampStat "player.energy" (-12) 0 50>>
<div class="combat-action-visual seduction">
<<intimateVideo "assets/videos/combat/strip-tease.mp4" "You move provocatively..." false>>
</div>
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 Math.min(100, (Number(_enemy.lust) || 0) + _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 _target to $combat.enemies[0]>>
<<clampStat "player.energy" (-20) 0 50>>
<div class="combat-action-visual seduction">
<<intimateVideo "assets/videos/combat/kiss-submission.mp4" "You move in for a supernatural kiss..." false>>
</div>
Dark energy swirls around you as you approach the <<print _target.name.toLowerCase()>>...
<<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>>
<<addCorruption 2>>
<<goto "Combat_Seduction_Success">>
<<else>>
<<set _lustDamage to 25 + $player.allure>>
<<set _target.lust += _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>>
<<goto "Combat_Seduction_Success">>
<</if>>
<</if>>
<div class="choice-container">
<<vchoice "Continue" "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]>>
<div class="combat-action-visual">
<img src="assets/images/combat/negotiate.png" alt="Negotiate" class="combat-action-img">
</div>
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>>
The <<print _target.name.toLowerCase()>> hesitates, then lowers their weapon.
<<if _target.negotiate>>
<<say _target.name _target.negotiate>>
<<else>>
"...Fine. But you owe me."
<</if>>
<<endCombat>>
<<run VaultUI.setBackgroundDirect($combat.backgroundImage || "media/backgrounds/travel/terrain/reclaimed/reclaimed_1.webp")>>
<<run VaultUI.setTimeOfDay("afternoon")>>
<<set $stats.negotiations_successful += 1>>
<<set $vault.scrap += 1>>
<div class="choice-container">
<<vchoice "Part ways peacefully" "Day3_Combat_Aftermath" "move" "hand">>
</div>
<<else>>
The <<print _target.name.toLowerCase()>> snarls.
"Too late for talk!"
They attack with renewed fury!
<div class="choice-container">
<<vchoice "Continue" "Combat_Companion_Turn" "move" "map">>
</div>
<</if>><div class="seduction-menu">
<h3>Seduction Actions</h3>
<<set _enemy to $combat.enemies[0]>>
<div class="enemy-lust-bar">
<span class="label"><<print _enemy.name>> Lust:</span>
<div class="bar-container">
<div class="bar lust" @style="'width: ' + ((_enemy.lust || 0) / _enemy.maxLust) * 100 + '%'"></div>
</div>
<span class="value"><<print (_enemy.lust || 0)>> / <<print _enemy.seduceThreshold>> to seduce</span>
</div>
<div class="action-grid seduction">
<<seductionActionButton "sultry_gaze" "eye">>
<<seductionActionButton "flirt" "list">>
<<seductionActionButton "pose" "seduce">>
<<if $player.corruption >= 5>>
<<seductionActionButton "blow_kiss" "lips">>
<</if>>
<<if $player.allure >= 20>>
<<seductionActionButton "strip_tease" "armor">>
<<seductionActionButton "approach" "walk">>
<</if>>
<<if $player.charm >= 15>>
<<seductionActionButton "whisper" "lips">>
<</if>>
<<if $player.corruption >= 30>>
<<seductionActionButton "dark_allure" "marked">>
<</if>>
</div>
<div class="seduction-back">
<div class="choice-container">
<<vchoice "Back to Combat" "Combat_Actions" "action" "arrow-left">>
</div>
</div>
</div><<set _enemy to $combat.enemies[0]>>
<<endCombat>>
<<run VaultUI.setBackgroundDirect($combat.backgroundImage || "media/backgrounds/travel/terrain/reclaimed/reclaimed_1.webp")>>
<<run VaultUI.setTimeOfDay("afternoon")>>
<<showCharacter _enemy.id "center" "seduced">>
<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>>
<</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 $combat.enemies[0]>>
<<sexScene _enemy.id "seduction" "dominant" "wasteland-combat">>
<<showCharacter _enemy.id "center" "submissive">>
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">>
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>>
<<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><<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><<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>>
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><<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 || $combat.enemies[0]>>
<<showCharacter _enemy.id "center" "satisfied">>
She dresses slowly, still dazed.
<<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.enemiesSeduced += 1>>
<<if _enemy.loot && _enemy.loot.length gt 0>>
<<for _item range _enemy.loot>>
<<if random(1, 100) <= ((_enemy.lootChance || 0.5) * 100)>>
<<addItem _item 1>>
<p class="loot-found">Found: <<print _item.replace(/_/g, " ")>></p>
<</if>>
<</for>>
<</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>>
<<addAffection "kira" 1>>
<</if>>
<<run $combat.enemies.shift()>>
<<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 $combat.enemies[0]>>
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.shift()>>
<<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 $combat.enemies[0]>>
<<showCharacter _enemy.id "center" "submissive">>
<<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.shift()>>
<<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 $combat.enemies[0]>>
<<endCombat>>
<<run document.body.classList.add("scene-mode-intimate")>>
<<run VaultUI.setBackgroundDirect($combat.backgroundImage || "media/backgrounds/travel/terrain/reclaimed/reclaimed_1.webp")>>
<<run VaultUI.setTimeOfDay("afternoon")>>
<h3>Overwhelmed by Desire</h3>
Your resistance crumbles. The need is too strong. Your weapon falls from numb fingers.
<<showCharacter _enemy.id "center" "victorious">>
<<say _enemy.name "That's it. Give in.">>
You can't fight it anymore. The lust is overwhelming.
<<if _enemy.type === "supernatural">>
<<goto "Combat_Seduction_Defeat_Supernatural">>
<<else>>
<<goto "Combat_Seduction_Defeat_Human">>
<</if>><<set _enemy to $combat.lastEnemy || $combat.enemies[0]>>
She's on you before you can think. Not attacking — claiming.
<<showCharacter _enemy.id "center" "feeding">>
<<say _enemy.name "supernatural" "Delicious. You have so much to give.">>
Pleasure crashes through you, uncontrollable. She feeds on your essence.
<<performSexAct "climax_player">>
<<addCorruption 10>>
<<set $player.lust to 0>>
<<clampStat "player.health" (-15) 0 100>>
You come back to yourself on the ground, alone.
Weaker. But strangely satisfied.
<<run document.body.classList.remove("scene-mode-intimate")>>
<div class="choice-container">
<<vchoice "Stagger back to the vault" "Journey_ReturnToVault" "move" "house">>
</div><<set _enemy to $combat.lastEnemy || $combat.enemies[0]>>
She approaches, confident now.
<<say _enemy.name "Well well. Let's see what you've got.">>
<<sexScene _enemy.id "surrendered" "submissive" "wasteland">>
What follows is... thorough.
She takes what she wants. And you give it willingly.
<<performSexAct "oral_give">>
<<performSexAct "penetrate">>
<<sexPhase "climax">>
<<performSexAct "climax_player">>
<<endSexScene>>
<<set $player.lust to 0>>
<<set $player.submission += 5>>
<<set _playerItems to UInv.GetItemsArray("player")>>
<<if _playerItems.length > 0>>
<<set _stolenName to _playerItems[random(0, _playerItems.length - 1)]>>
<<run UInv.DeleteItem("player", _stolenName)>>
<p class="item-lost">She takes your <<print _stolenName>> when she leaves.</p>
<</if>>
<<if $combat.companionInCombat === "kira">>
<<showCharacter "kira" "left" "worried">>
Kira approaches, helps you up.
<<say "Kira" "You alright?">>
<<say $player.name "I... yeah. Let's go.">>
She doesn't mention what happened. But you both know.
<<addTension "kira" 15>>
<</if>>
<<run document.body.classList.remove("scene-mode-intimate")>>
<div class="choice-container">
<<if $combat.returnPassage>>
<<vchoice "Collect yourself and continue" $combat.returnPassage "move" "map">>
<<else>>
<<vchoice "Collect yourself and continue" "WorldMap_View" "move" "map">>
<</if>>
</div><<kiraTurnCardFlow>><<set $combat.phase to "enemy">>
<<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>>
<<for _cetEnemy range $combat.enemies>>
<<processStatusEffects _cetEnemy>>
<<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.length - 1>>
<<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>>
<<link "Continue">><<goto $combat.pendingSexAction.passage>><</link>>
<<else>>
<<vchoice "Continue" "Combat_Actions" "move" "map">>
<</if>>
</div>
</div>
</div><<goto "Combat_Actions">><<set $flags.timeSlowExperienced to true>>
<<run document.body.classList.remove("scene-mode-combat")>>
<<run document.body.classList.add("scene-mode-supernatural")>>
<div class="time-slow-effect">
Something *shifts*.
The world... slows. The raider's blade descends toward you in impossibly slow motion. You can see individual dust motes frozen in the air. Your heartbeat thunders in your ears — once, twice — spanning what feels like minutes.
Your body moves before your mind catches up. Faster than you've ever moved. Faster than should be *possible*.
<<set _damage to random(12, 18)>>
<<set $combat.enemies[0].health -= _damage>>
You strike. The raider's eyes widen in slow-motion surprise.
Then time *snaps* back to normal.
</div>
<<run document.body.classList.remove("scene-mode-supernatural")>>
<<run document.body.classList.add("scene-mode-combat")>>
The raider staggers back, clutching a wound he didn't see coming. <span class="damage-number">-<<print _damage>></span>
<<run VaultUI.showCharacter("kira", "left", "surprised")>>
<<say "Kira" "What the— how did you—">>
She stares at you, eyes wide.
<<say "Kira" "Did you feel that? Like... static electricity?">>
You don't have an answer. Your hands are shaking.
<<addCorruption 2>>
<<notify "warning">>Something strange happened. Corruption +2<</notify>>
<<if $combat.enemies[0].health lte 0>>
<<run $combat.enemies.shift()>>
The raider collapses.
<<if $combat.enemies.length === 0>>
<<goto "Combat_Victory">>
<</if>>
<</if>>
<div class="choice-container">
<<vchoice "Continue" "Combat_Companion_Turn" "move" "map">>
</div><<logCombat "VICTORY!" "critical">>
<<if $combat.kiraIncapacitated>>
<<goto "Combat_Victory_Kira_Unconscious">>
<</if>>
<<if $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>>
<<run VaultUI.setBackgroundDirect($combat.backgroundImage || "media/backgrounds/travel/terrain/reclaimed/reclaimed_1.webp")>>
<<run VaultUI.setTimeOfDay("afternoon")>>
<h2>Victory</h2>
The last raider falls. Silence settles over the ruins, broken only by your ragged breathing.
<<run VaultUI.showCharacter("kira", "center", "slight-smile")>>
<<say "Kira" "Not bad. You can actually handle yourself.">>
<<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>>
<<if _loot.length gt 0>>
You search the bodies and find:
<ul>
<<for _lootId range _loot>>
<<set _lootName to _lootId.replace(/_/g, " ").replace(/\b\w/g, function(l){ return l.toUpperCase() })>>
<<set _lootItem to {id: _lootId, name: _lootName, type: "misc", description: "Found after combat."}>>
<li><<print _lootName>></li>
<<addItem _lootItem 1>>
<</for>>
</ul>
<</if>>
<<relationChange "kira" "trust" 2>>
<<relationChange "kira" "affection" 1>>
<<set $vault.scrap += 2>>
<div class="choice-container">
<<if $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 _wasKiraIncapacitated to $combat.kiraIncapacitated>>
<<set _hadCompanion to $combat.companionInCombat === "kira">>
<<set $player.health to 1>>
<<if $companions && $companions[0]>>
<<getCompanion "kira">>
<<set $tempCompanion.health to Math.max(1, $tempCompanion.health - 20)>>
<</if>>
<<endCombat>>
<<if !$temp>><<set $temp to {}>><</if>>
<<set $temp.defeatReturnPassage to _savedReturnPassage>>
<<set _kiraDown to _wasKiraIncapacitated || ($companions[0] && $companions[0].health <= 1)>>
<<set _inVault to $currentLocation === "vault">>
<<if !_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("afternoon")>>
<<else>>
<<run VaultUI.setBackgroundDirect($combat.backgroundImage || "media/backgrounds/travel/terrain/reclaimed/reclaimed_1.webp")>>
<<run VaultUI.setTimeOfDay("afternoon")>>
<</if>>
<h2>Defeat</h2>
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("evening")>>
<h2>Darkness</h2>
<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?">>
<<say "Groundskeeper" "Alive. Recovering in her room. She woke an hour ago.">>
<p>Relief floods through you.</p>
<<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 $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 ($temp && $temp.defeatReturnPassage) ? $temp.defeatReturnPassage : "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 ($temp && $temp.defeatReturnPassage) ? $temp.defeatReturnPassage : "Vault_Hub">>
<div class="choice-container">
<<vchoice "Rest and think" _returnTo "action" "sleep">>
</div><<run VaultUI.setBackgroundDirect($combat.backgroundImage || "media/backgrounds/travel/terrain/reclaimed/reclaimed_1.webp")>>
<<run VaultUI.setTimeOfDay("evening")>>
<h2>Alone</h2>
<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>>
<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>
<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>
<p class="narrator">When you finally come to, you're bound. Bruised. But alive.</p>
<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($combat.backgroundImage || "media/backgrounds/travel/terrain/reclaimed/reclaimed_1.webp")>>
<<run VaultUI.setTimeOfDay("night")>>
<h2>Darkness Falls</h2>
<p>You fall. Somewhere nearby, Kira has already fallen—unconscious, maybe worse.</p>
<p>The raiders stand over you both. Victorious. Hungry.</p>
<<set _roll to random(1, 100)>>
<<if _roll <= 50>>
<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" "Vault_Hub" "action" "health">>
</div>
<<else>>
<p>They don't leave. They have plans for you both.</p>
<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>>
<</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" "Vault_Hub" "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>>
<div class="choice-container">
<<vchoice "\"Thanks for saving me.\"" _returnTo "talk" "talk">>
<<vchoice "Nod and stand" _returnTo "action" "strength">>
</div><<set _seduced to $combat.enemies[0]>>
<<set _savedReturnPassage to $combat.returnPassage || "Vault_Hub">>
<<run VaultUI.setBackgroundDirect($combat.backgroundImage || "media/backgrounds/travel/terrain/reclaimed/reclaimed_1.webp")>>
<<run VaultUI.setTimeOfDay("afternoon")>>
<h2>Intimate Victory</h2>
The <<print _seduced.name.toLowerCase()>> is completely under your control, eyes glazed with desire and submission.
<div class="narrative-image intimate">
<img src="assets/images/narrative/seduction-victory.webp" alt="Seduced Enemy">
</div>
<<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)>>
<<addTension "kira" 15 "He's... doing it right here. I should look away.">>
<<if $combat.companionInCombat === "kira">>
<<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.enemiesSeduced += 1>>
<<notify "intimate">>+20 Lust. Kira is watching...<</notify>>
<</if>>
<<endCombat>>
<div class="choice-container">
<<vchoice "Finish and leave" _savedReturnPassage "move" "crystal">>
</div><<silently>>
<<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">
<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><<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>
<<goto "Combat_Player_Ridden_NoEscape">>
<<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>
<<goto "Combat_Player_Blowjob_NoEscape">>
<<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>>
<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>>
<<clampStat "player.health" (-random(3, 6)) 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>
<<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>>
<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>>
<<clampStat "player.health" (-random(2, 4)) 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.'"]>>
<<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>>
<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>>
<<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.'"]>>
<<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>>
<div class="choice-container">
<<vchoice "Counter-attack!" "Combat_Actions" "action" "attack">>
</div>
<<else>>
WHACK! Her knee connects solidly!
<<clampStat "player.health" (-random(5, 10)) 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>>
<<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>>
<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>>
<<clampStat "player.health" (-random(4, 8)) 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.'"]>>
<<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>>
<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>>
<<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>>
<<combatNarrative "female_attack_whip_cock" "CRACK! The whip catches your exposed cock!" "explicit">>
<<clampStat "player.health" (-random(3, 6)) 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!
<</if>>
<div class="choice-container">
<<vchoice "Continue fighting" "Combat_Actions" "move" "map">>
</div>
<<case "cock_grab">>
<<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">>
<<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">>
<<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">>
<<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 _enemy to $combat.enemies[0]>>
<<attemptEscape "player" "sexual_assault">>
<<if $tempEscaped>>
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 _enemy.sexIntent === "ride">>
<<goto "Combat_Player_Ridden_NoEscape">>
<<elseif _enemy.sexIntent === "blowjob">>
<<goto "Combat_Player_Blowjob_NoEscape">>
<<elseif _enemy.sexIntent === "handjob">>
<<goto "Combat_Let_Handjob">>
<<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>>
<<set $player.lust to 0>>
<<set $combat.playerStunned to 2>>
<<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>>
<</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>
<<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>
<<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>
<<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>><<kiraJoinDPCardFlow>><<kiraRideLookCardFlow>><<playerBlowjobForcedCardFlow>><<playerHandjobCardFlow>><<playerHandjobFinishCardFlow>><<playerEscapeMountCardFlow>><<playerMountedCardFlow>><<playerStrippedMountCardFlow>><<playerGrabHipsCardFlow>><<playerSupernaturalMountCardFlow>><<playerEscapeBoundCardFlow>><<playerTeasingCardFlow>><<playerClawCardFlow>><<playerShowOffCardFlow>><<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
}>>
<</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 = '<img src="assets/images/combat/enemy-rides-player.webp" alt="Ridden" class="scene-image">';
}
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 (videoEl && data.showVideo) {
videoEl.innerHTML = '<video autoplay loop muted playsinline><source src="assets/videos/combat/enemy-rides-cock.mp4" type="video/mp4"></video>';
}
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
}>>
<</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 (videoEl && data.showVideo) {
videoEl.innerHTML = '<video autoplay loop muted playsinline><source src="assets/videos/combat/forced-ride.mp4" type="video/mp4"></video>';
}
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>>
<</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
}>>
<</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 (videoEl && data.showVideo) {
videoEl.innerHTML = '<video autoplay loop muted playsinline><source src="assets/videos/combat/combat-blowjob.mp4" type="video/mp4"></video>';
}
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 $combat.companionInCombat === "kira" && $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,
showVideo: $preferences && $preferences.showVideos
}>>
<</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>';
}
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 (videoEl && data.showVideo) {
videoEl.innerHTML = '<video autoplay loop muted playsinline><source src="assets/videos/combat/forced-blowjob-combat.mp4" type="video/mp4"></video>';
}
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>';
effects += '<div class="effect-row"><span class="effect negative">Kira Affection -10</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>>
<<set window._playerFacefuckData to {
enemyName: _enemy.name,
pronoun: _p,
playerName: $player.name,
showVideo: $preferences && $preferences.showVideos
}>>
<</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 (videoEl && data.showVideo) {
videoEl.innerHTML = '<video autoplay loop muted playsinline><source src="assets/videos/combat/facefuck-combat.mp4" type="video/mp4"></video>';
}
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
}>>
<</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 = '<img src="assets/images/combat/combat-handjob.webp" alt="Combat Handjob" class="scene-image">';
}
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-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 window._playerHandjobFinishData to {
enemyName: _enemy.name,
pronoun: _p
}>>
<</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>>
<<clampStat "player.health" (-(setup.playerSexConfig.cardEffects.supernaturalDrain.playerDamage || 0)) 0 100>>
<</if>>
<<set window._playerSupernaturalMountData to {
enemyName: _enemy.name,
pronoun: _p,
dickExposed: _dickExposed,
showVideo: $preferences && $preferences.showVideos
}>>
<</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 (videoEl && data.showVideo && data.dickExposed) {
videoEl.innerHTML = '<video autoplay loop muted playsinline><source src="assets/videos/combat/supernatural-ride.mp4" type="video/mp4"></video>';
}
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-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
}>>
<</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-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
}>>
<</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 bulge, 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-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
}>>
<</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-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
}>>
<</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 bulge 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-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.lust >= _enemy.seduceThreshold)>>
<<if !_seduced>>
<<set $combat.lastAttackWasGrab to true>>
<</if>>
<<set window._playerShowOffData to {
enemyName: _enemy.name,
playerName: $player.name,
seduced: _seduced
}>>
<</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-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>>
<<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
}>>
<</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-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>>
<<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
}>>
<</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-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>>
<<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
}>>
<</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 "getCombatNarrative">>
<<set _type to _args[0]>>
<<set _context to _args[1]>>
<<set _pool to setup.combatNarrative[_type]>>
<<if !_pool>>
<<set _pool to ["You strike out, the combat continuing."]>>
<</if>>
<<set _selected to _pool.random()>>
<<print _selected>>
<</widget>>
<<widget "getEnemyMissNarrative">>
<<set _enemy to _args[0]>>
<<set _pool to []>>
<<if _enemy.gender === "male" && $clothing.kira>>
<<if $clothing.kira.titsExposed || $clothing.kira.pussyExposed>>
<<set _pool to setup.combatNarrative.enemy_miss_distracted_male>>
<</if>>
<<elseif _enemy.gender === "female" && $clothing.player>>
<<if $clothing.player.dickExposed>>
<<set _pool to setup.combatNarrative.enemy_miss_distracted_female>>
<</if>>
<</if>>
<<if (_enemy.lust || 0) >= 50>>
<<set _pool to setup.combatNarrative.enemy_miss_high_lust>>
<</if>>
<<if _pool.length === 0>>
<<set _pool to setup.combatNarrative.enemy_miss>>
<</if>>
<<print _pool.random()>>
<</widget>>
<<widget "getPlayerHitNarrative">>
<<set _damage to _args[0]>>
<<set _targetIndex to _args[1]>>
<<set _target to $combat.enemies[_targetIndex]>>
<<set _wasTopExposed to (_target.clothing && _target.clothing.titsExposed)>>
<<set _wasBottomExposed to (_target.clothing && (_target.clothing.pussyExposed || _target.clothing.dickExposed))>>
<<set _isTopExposed to (_target.clothing && _target.clothing.titsExposed)>>
<<set _isBottomExposed to (_target.clothing && (_target.clothing.pussyExposed || _target.clothing.dickExposed))>>
<<set _pool to []>>
<<set _playerLust to ($player.lust || 0)>>
<<set _kiraTension to ($companions[0] && $companions[0].tension) || 0>>
<<if _playerLust >= 100 && _kiraTension >= 100 && _target.gender === "female">>
<<set _pool to setup.combatNarrative.player_hit_critical_100>>
<<elseif _playerLust >= 90 && _kiraTension >= 90 && _target.gender === "female">>
<<set _pool to setup.combatNarrative.player_hit_ultra_extreme>>
<<elseif _target.gender === "female">>
<<if !_wasTopExposed && _isTopExposed>>
<<set _pool to setup.combatNarrative.player_hit_exposes_tits>>
<<elseif !_wasBottomExposed && _isBottomExposed>>
<<set _pool to setup.combatNarrative.player_hit_exposes_pussy>>
<<elseif _isTopExposed || _isBottomExposed>>
<<set _pool to setup.combatNarrative.player_hit_already_exposed>>
<<elseif _target.clothing && ((_target.clothing.top >= 26 && _target.clothing.top <= 50) || (_target.clothing.bottom >= 26 && _target.clothing.bottom <= 50))>>
<<set _pool to setup.combatNarrative.player_hit_tears_clothing>>
<<else>>
<<set _pool to setup.combatNarrative.player_hit_light>>
<</if>>
<<else>>
<<set _pool to setup.combatNarrative.player_hit_light>>
<</if>>
<<if _pool && _pool.length gt 0>>
<<print _pool.random()>>
<<else>>
You strike them hard.
<</if>>
<</widget>>
<<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 _narrativeText && _enemy && _enemy.name>>
<<set _narrativeText to _narrativeText.replace(/\{enemy\}/g, _enemy.name)>>
<</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>>
<<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 && _isDickExposed && setup.combatNarrative.enemy_medium_lust_hit>>
<<set _lustFlavor to setup.combatNarrative.enemy_medium_lust_hit.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.combatNarrative.enemy_taunt_female_exposed.random()>>
<<elseif setup.combatNarrative.enemy_taunt_female_clothed>>
<<set _enemyTaunt to setup.combatNarrative.enemy_taunt_female_clothed.random()>>
<</if>>
<<else>>
<<if _isDickExposed && setup.combatNarrative.enemy_taunt_male_exposed>>
<<set _enemyTaunt to setup.combatNarrative.enemy_taunt_male_exposed.random()>>
<<elseif setup.combatNarrative.enemy_taunt_male_clothed>>
<<set _enemyTaunt to setup.combatNarrative.enemy_taunt_male_clothed.random()>>
<</if>>
<</if>>
<</if>>
<<if _enemyTaunt && _enemy && _enemy.name>>
<<set _enemyTaunt to _enemyTaunt.replace(/\{enemy\}/g, _enemy.name)>>
<</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 || !setup.combatNarrative.enemy_hit_kira_basic>>
<<set _narrativeText to "Kira takes a hit!">>
<<set _lustFlavor to "">>
<<set _enemyTaunt to "">>
<<set _kiraReaction to "">>
<<set _kiraHitReaction to "">>
<<silently>><<return>><</silently>>
<</if>>
<<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>>
<<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>>
<<silently>>
<<combatNarrative _category "Kira takes a hit!">>
<</silently>>
<<set _narrativeText to _narrativeResult.text>>
<</if>>
<<if _narrativeText && _enemy && _enemy.name>>
<<set _narrativeText to _narrativeText.replace(/\{enemy\}/g, _enemy.name)>>
<</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>>
<<set _lustFlavor to setup.combatNarrative.female_max_lust_hit.random()>>
<<elseif _enemy.lust >= 60 && setup.combatNarrative.female_high_lust_hit>>
<<set _lustFlavor to setup.combatNarrative.female_high_lust_hit.random()>>
<<elseif _enemy.lust >= 31 && _isExposed && setup.combatNarrative.female_medium_lust_hit>>
<<set _lustFlavor to setup.combatNarrative.female_medium_lust_hit.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 _enemyTaunt.replace(/\{enemy\}/g, _enemy.name)>>
<</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>>
<</widget>>
<<widget "getPlayerMissNarrative">>
<<set _isDickExposed to ($clothing.player && $clothing.player.dickExposed)>>
<<set _isLustHigh to ($player.lust >= 50)>>
<<set _category to "player_miss">>
<<if _isDickExposed && _isLustHigh>>
<<set _category to "player_miss_exposed_hard">>
<<elseif _isDickExposed>>
<<set _category to "player_miss_exposed">>
<</if>>
<<combatNarrative _category "You miss!">>
<</widget>>
<<widget "getKiraMissNarrative">>
<<set _isKiraExposed to ($clothing.kira && ($clothing.kira.titsExposed || $clothing.kira.pussyExposed))>>
<<set _category to "kira_miss">>
<<if _isKiraExposed>>
<<set _category to "kira_miss_exposed">>
<</if>>
<<combatNarrative _category "Kira misses!">>
<</widget>>
<<widget "kiraComment">>
<<if random(1, 100) > 30>>
<<silently>><<return>><</silently>>
<</if>>
<<set _target to $combat.enemies[0]>>
<<set _kiraTension to ($companions[0] && $companions[0].tension) || 0>>
<<set _playerLust to ($player.lust || 0)>>
<<set _category to null>>
<<if _playerLust >= 100 && _kiraTension >= 100 && _target.gender === "female">>
<<set _category to "kira_comment_critical_100">>
<<elseif _playerLust >= 90 && _kiraTension >= 90 && _target.gender === "female">>
<<set _category to "kira_comment_ultra_extreme">>
<<elseif _kiraTension >= 60 && _target.gender === "female" && _target.clothing && (_target.clothing.titsExposed || _target.clothing.pussyExposed)>>
<<if random(1, 100) <= 50>>
<<set _category to "kira_comment_enemy_exposed_high_tension_female">>
<<else>>
<<set _category to "kira_comment_enemy_exposed_suggest_player">>
<</if>>
<<elseif _kiraTension >= 70>>
<<set _category to "kira_distracted_high_tension">>
<<elseif _target.gender === "female" && _target.lust && _target.lust >= 50>>
<<set _category to "kira_comment_enemy_high_lust">>
<<elseif _kiraTension < 60 && _target.gender === "female" && _target.clothing && (_target.clothing.titsExposed || _target.clothing.pussyExposed)>>
<<set _category to "kira_comment_enemy_exposed_low_tension">>
<</if>>
<<if _category>>
<div class="kira-comment">
<<combatNarrative _category>>
</div>
<</if>>
<</widget>>
<<widget "getCriticalArousalNarrative">>
<<set _type to _args[0]>>
<<if !setup.combatNarrative>>
<<silently>><<return>><</silently>>
<</if>>
<<set _pool to []>>
<<switch _type>>
<<case "player_hit">>
<<set _pool to setup.combatNarrative.player_hit_critical_100>>
<<case "kira_comment">>
<<set _pool to setup.combatNarrative.kira_comment_critical_100>>
<<case "combined_action">>
<<set _pool to setup.combatNarrative.critical_100_combined>>
<</switch>>
<<if _pool && _pool.length gt 0>>
<<print _pool.random()>>
<</if>>
<</widget>><<run VaultUI.setBackgroundDirect($combat.backgroundImage || "media/backgrounds/travel/terrain/reclaimed/reclaimed_1.webp")>>
<<showCharacter "kira" "center" "aroused">>
<<showEventMedia "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">>
<p class="explicit"><<randomLine "arousal_mutual_explosion" "fucking">></p>
<<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>>
<p class="narrator"><<randomLine "arousal_mutual_explosion" "aftermath">></p>
<p class="narrator"><<randomLine "arousal_mutual_explosion" "aftermath">></p>
<<say "Kira" `setup.randomLine("arousal_mutual_explosion", "aftermath")`>>
<<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($combat.backgroundImage || "media/backgrounds/travel/terrain/reclaimed/reclaimed_1.webp")>>
<<showCharacter "kira" "center" "desperate">>
<<showEventMedia "arousal_kira_jumps_player">>
<<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>
<<performSexAct "oral_deepthroat">>
<p class="explicit"><<randomLine "arousal_kira_jumps_player" "blowjob">></p>
<<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">>
<p class="explicit"><<randomLine "arousal_kira_jumps_player" "finish">></p>
<<performSexAct "climax_inside">>
<p class="explicit"><<randomLine "arousal_kira_jumps_player" "finish">></p>
<<endSexScene>>
<p class="narrator"><<randomLine "arousal_kira_jumps_player" "after">></p>
<<kinkAfterNarrative>>
<<say "Kira" `setup.randomLine("arousal_kira_jumps_player", "after")`>>
<<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($combat.backgroundImage || "media/backgrounds/travel/terrain/reclaimed/reclaimed_1.webp")>>
<<showCharacter "kira" "center" "vulnerable">>
<<showEventMedia "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">>
<p class="explicit"><<randomLine "arousal_player_takes_kira" "take_her">></p>
<p class="explicit"><<randomLine "arousal_player_takes_kira" "take_her">></p>
<<performSexAct "tease">>
<<sexPhase "action">>
<<performSexAct "penetrate_rough">>
<p class="explicit"><<randomLine "arousal_player_takes_kira" "reaction">></p>
<<performSexAct "thrust_hard">>
<<performSexAct "thrust_fast">>
<p class="explicit"><<randomLine "arousal_player_takes_kira" "reaction">></p>
<<performSexAct "hairpull">>
<<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>>
<p class="narrator"><<randomLine "arousal_player_takes_kira" "aftermath">></p>
<<say "Kira" `setup.randomLine("arousal_player_takes_kira", "aftermath")`>>
<<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 ($clothing.player.top lt 50 || $clothing.player.bottom lt 50)>>
<<set _kiraDamaged to ($clothing.kira.top lt 50 || $clothing.kira.bottom lt 50)>>
<<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>
<div class="narrative-image">
<img src="assets/images/combat/post-combat-exposed.webp" alt="Both Exposed">
</div>
<<addTension "kira" 4>>
<</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>
<<clampStat "player.lust" (setup.postCombatConfig.clothingCheck.exposedLust || 0)>>
<</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>>
<</if>>
<</if>>
<div class="choice-container">
<<vchoice "\"Let's just get back. I like the view.\"" "PostCombat_Flirt_Clothes" "intimate" "lips">>
<<vchoice "Help each other patch up" "PostCombat_Repair_Mutual" "action" "armor">>
<<vchoice "Head back exposed" "PostCombat_Return_Exposed" "action" "run">>
</div>
<</if>><<kiraRepairCardFlow>>You help each other patch the worst tears. Makeshift but functional.
Close proximity. Hands on each other. Intimate despite the circumstances.
<<if $clothing.kira.titsExposed>>
You help her tie fabric across her chest. Your fingers brush her nipple. She gasps.
<<addTension "kira" 3>>
<</if>>
<<relationChange "kira" "affection" 2>>
<div class="choice-container">
<<vchoice "Head back" "Vault_Hub" "move" "house">>
</div><<say $player.name "Let's just get back. I like the view.">>
<<showCharacter "kira" "center" "flustered">>
<<say "Kira" "You're such an ass.">>
But she's smiling. And not covering up any more than necessary.
The walk back is VERY distracting.
<<addTension "kira" 4>>
<<clampStat "player.lust" (setup.postCombatConfig.flirt.playerLust || 0)>>
<div class="choice-container">
<<vchoice "Return to vault" "Vault_Hub" "move" "house">>
</div>You just head back. Torn clothes and all.
<<if $clothing.kira.titsExposed || $clothing.player.dickExposed>>
The Groundskeeper raises an eyebrow when you return but says nothing.
<<addTension "kira" 3>>
<</if>>
<div class="choice-container">
<<vchoice "Clean up" "Vault_Hub" "move" "house">>
</div><<silently>>
<<if !$postBattle || !$postBattle.defeatedEnemies || $postBattle.defeatedEnemies.length === 0>>
<<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", "dirty_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: []
}>>
<<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>>
<</if>>
<</silently>>
<<run VaultUI.setBackgroundDirect($combat.backgroundImage || "media/backgrounds/travel/terrain/reclaimed/reclaimed_1.webp")>>
<h2>Victory</h2>
The fight is over. Bodies litter the ground — some dead, some just unconscious.
<<if $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">>
Kira wipes blood from her blade.
<<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>>
<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(_itemName)>>
<<addItem _lootItem 1>>
<<if !$postBattle.collectedLoot>><<set $postBattle.collectedLoot to []>><</if>>
<<run $postBattle.collectedLoot.push({id: _lootItem, name: _itemName, from: _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>>
<<run _found.push(_itemName + (_qty > 1 ? " x" + _qty : ""))>>
<<addItem _itemId _qty>>
<<if !$postBattle.collectedLoot>><<set $postBattle.collectedLoot to []>><</if>>
<<run $postBattle.collectedLoot.push({id: _itemId, name: _itemName, qty: _qty, from: _e.name})>>
<</if>>
<</for>>
<</if>>
<</if>>
<<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>><</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>><</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 _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 _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>>
<</if>>
<<if _e.gender === "male" && _e.health gt 0>>
<<if _e.clothing && _e.clothing.dickExposed>>
<<link "Jerk him off">>
<<set $postBattle.currentEnemy to _i>>
<<goto "PostBattle_Jerk_Male_Enemy">>
<</link>>
<<link "Make him cum on himself">>
<<set $postBattle.currentEnemy to _i>>
<<goto "PostBattle_Humiliate_Male_Enemy">>
<</link>>
<<if $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">>
<<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">
<<vchoice "Done here — head back to vault" "PostBattle_Leave" "action" "house">>
</div><<if $postBattle && $postBattle.collectedLoot && $postBattle.collectedLoot.length gt 0>>
<ul class="loot-list">
<<for _loot range $postBattle.collectedLoot>>
<li class="loot-item">
<span class="loot-name"><<print _loot.name>></span>
<span class="loot-source">(from <<print _loot.from>>)</span>
</li>
<</for>>
</ul>
<p class="loot-total">Total items: <<print $postBattle.collectedLoot.length>></p>
<<else>>
<p class="loot-hint">Search bodies to collect loot.</p>
<</if>><<if $postBattle && $postBattle.enemiesSearched && _e>>
<<capture _i, _e>>
<div class="enemy-actions" data-enemy="<<print _i>>">
<<if !$postBattle.enemiesSearched.includes(_i)>>
<<set _searchAltId to "search-alt-" + _i>>
<span id="<<print _searchAltId>>" class="search-result-alt">
<<link "Search">>
<<advanceTime 0 5>>
<<run $postBattle.enemiesSearched.push(_i)>>
<<set _loot to []>>
<<if _e.loot && _e.lootChance>>
<<for _lootItem range _e.loot>>
<<if Math.random() <= _e.lootChance>>
<<run _loot.push(_lootItem)>>
<<addItem _lootItem 1>>
<</if>>
<</for>>
<</if>>
<<set _targetAltSelector to "#search-alt-" + _i>>
<<if _loot.length > 0>>
<<replace _targetAltSelector>>Found: <<print _loot.join(", ")>><</replace>>
<<else>>
<<replace _targetAltSelector>>Nothing useful.<</replace>>
<</if>>
<</link>>
</span>
<</if>>
<<if _e.clothing && (_e.clothing.top > 0 || _e.clothing.bottom > 0)>>
<<link "Strip clothing">>
<<set _e.clothing.top to 0>>
<<set _e.clothing.bottom to 0>>
<<set _e.clothing.underwear to 0>>
<<set _e.clothing.titsExposed to true>>
<<set _e.clothing.pussyExposed to true>>
<<set _e.clothing.assExposed to true>>
<<addItem "scrap_cloth" 1>>
<<goto "PostBattle_Strip_Enemy">>
<</link>>
<</if>>
<<if _e.gender === "female" && _e.health > 0 && !$postBattle.playerCame>>
<<if _e.clothing.titsExposed>>
<<link "Grope her tits">>
<<clampStat "player.lust" 10>>
<<goto "PostBattle_Grope_Tits">>
<</link>>
<</if>>
<<if _e.clothing.pussyExposed>>
<<link "Finger her">>
<<clampStat "player.lust" 15>>
<<goto "PostBattle_Finger_Enemy">>
<</link>>
<</if>>
<<if _e.clothing.pussyExposed>>
<<link "Eat her out">>
<<clampStat "player.lust" 20>>
<<goto "PostBattle_EatOut_Enemy">>
<</link>>
<</if>>
<<if _e.clothing.pussyExposed && $clothing.player.dickExposed && !$postBattle.enemiesUsed.includes(_enemyIdx)>>
<<link "Fuck her">>
<<run $postBattle.enemiesUsed.push(_enemyIdx)>>
<<goto "PostBattle_Fuck_Enemy">>
<</link>>
<</if>>
<<if _e.clothing.assExposed && $clothing.player.dickExposed && !$postBattle.enemiesUsed.includes(_enemyIdx)>>
<<link "Fuck her ass">>
<<run $postBattle.enemiesUsed.push(_enemyIdx)>>
<<goto "PostBattle_Anal_Enemy">>
<</link>>
<</if>>
<<if $clothing.player.dickExposed && !$postBattle.enemiesUsed.includes(_enemyIdx)>>
<<link "Use her mouth">>
<<run $postBattle.enemiesUsed.push(_enemyIdx)>>
<<goto "PostBattle_Facefuck_Enemy">>
<</link>>
<</if>>
<<if _e.clothing.pussyExposed && $companions[0].lust >= 40 && !$postBattle.enemiesUsed.includes(_enemyIdx)>>
<div class="choice-container">
<<vchoice "Have Kira use her" "PostBattle_Kira_Uses_Enemy" "action" "lips">>
</div>
<</if>>
<<if $postBattle.enemiesUsed.includes(_enemyIdx)>>
<span class="used-indicator">✓ Already used</span>
<</if>>
<</if>>
<<if _e.health > 0 && _e.boundState !== "tied">>
<span id="enemy-status-<<print _enemyIdx>>">
<<link "Tie her up">>
<<set _e.boundState to "tied">>
<<replace "#enemy-status-" + _enemyIdx>>Tied up<</replace>>
<</link>>
</span>
<</if>>
<<if _e.health > 0>>
<<link "Let her go">>
<<run $postBattle.enemiesReleased.push(_enemyIdx)>>
<<goto "PostBattle_Release_Enemy">>
<</link>>
<</if>>
<<if _e.health > 0>>
<<link "Execute">>
<<run $postBattle.enemiesExecuted.push(_enemyIdx)>>
<<goto "PostBattle_Execute_Enemy">>
<</link>>
<</if>>
</div>
<</capture>>
<<else>>
<!-- Silently skip if state not initialized -->
<</if>><<set _i to $postBattle.currentEnemy>>
<<set _e to $postBattle.defeatedEnemies[_i]>>
<<set _stripType to $postBattle.stripType || "all">>
<<set _isMale to (_e.gender === "male")>>
<<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>>
<<showEventMedia "defeated_enemy_strip">>
<<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 "postbattle_strip" "rip_top">></p>
<<say _e.name `setup.randomLine("postbattle_strip", "her_reaction")`>>
<p class="explicit"><<randomLine "postbattle_strip" "rip_top">></p>
<<say _e.name `setup.randomLine("postbattle_strip", "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 "postbattle_strip" "rip_bottom">></p>
<<say _e.name `setup.randomLine("postbattle_strip", "her_reaction")`>>
<p class="explicit"><<randomLine "postbattle_strip" "rip_bottom">></p>
<<say _e.name `setup.randomLine("postbattle_strip", "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 "postbattle_strip" "strip_all">></p>
<<say _e.name `setup.randomLine("postbattle_strip", "her_reaction")`>>
<p class="explicit"><<randomLine "postbattle_strip" "strip_all">></p>
<<say _e.name `setup.randomLine("postbattle_strip", "her_reaction")`>>
<<if $companions[0].tension >= 40>>
<<say "Kira" `setup.randomLine("postbattle_grope", "kira_watches")`>>
<<addTension "kira" 5>>
<</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 >= 50>>
<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(_topLoot)>>
<<addItem _topLoot 1>>
<</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(_bottomLoot)>>
<<addItem _bottomLoot 1>>
<</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>>
<<showEventMedia "defeated_enemy_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 >= 60>>
<p class="explicit"><<randomLine "postbattle_narrative" "grope_aftermath">></p>
<</if>>
<<set _e.lust to (_e.lust || 0) + 20>>
<<clampStat "player.lust" 10>>
<<if $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>>
<<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>>
<<showEventMedia "defeated_enemy_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 (_e.lust || 0) + 35>>
<<clampStat "player.lust" 15>>
<<if $clothing.player.dickExposed && $player.lust >= 70>>
<p class="explicit"><<randomLine "postbattle_narrative" "finger_temptation">></p>
<</if>>
<<if $companions[0].lust >= 40>>
<<say "Kira" `setup.randomLine("postbattle_grope", "kira_watches")`>>
<<clampStat "companions[0].lust" 10>>
<<addTension "kira" 10>>
<</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 20>>
<<showEventMedia "defeated_enemy_eatout">>
<h3>Eat Her Out</h3>
<p class="explicit"><<randomLine "postbattle_eatout" "action">></p>
<<say _e.name `setup.randomLine("postbattle_eatout", "her_reaction")`>>
<p class="explicit"><<randomLine "postbattle_eatout" "action">></p>
<<say _e.name `setup.randomLine("postbattle_eatout", "her_reaction")`>>
<p class="explicit"><<randomLine "postbattle_eatout" "action">></p>
<<say _e.name `setup.randomLine("postbattle_eatout", "her_reaction")`>>
<<set _e.lust to (_e.lust || 0) + 50>>
<p class="explicit"><<randomLine "postbattle_eatout" "orgasm">></p>
<<say _e.name `setup.randomLine("defeated_enemy_cum", "orgasm_reaction")`>>
<p class="explicit"><<randomLine "postbattle_eatout" "orgasm">></p>
<<clampStat "player.lust" 20>>
<p class="explicit"><<randomLine "postbattle_narrative" "eatout_aftermath">></p>
<<if $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>>
<</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_fuck_tied" : (_isBroken ? "postbattle_fuck_broken" : "postbattle_fuck")>>
<<showEventMedia "defeated_enemy_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 $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>>
<</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 $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]>>
<<showEventMedia "defeated_enemy_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>>
<<set $postBattle.playerCame to true>>
<<set _e.lust to 20>>
<<set $stats.sex.penetrativeTop += 1>>
<<if $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>>
<</if>>
<div class="choice-container">
<<vchoice "Continue" "PostBattle_Normal" "action" "map">>
</div><<set _i to $postBattle.currentEnemy>>
<<set _e to $postBattle.defeatedEnemies[_i]>>
<<showEventMedia "defeated_enemy_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>>
<<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]>>
<<showEventMedia "defeated_enemy_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>>
<<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]>>
<<showEventMedia "defeated_enemy_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>>
<<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]>>
<<showEventMedia "defeated_enemy_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 "kira_cum" "buildup">></p>
<p class="explicit"><<randomLine "postbattle_fuck" "fucking">></p>
<<say "Kira" `setup.randomLine("kira_cum", "buildup")`>>
<p class="explicit"><<randomLine "postbattle_narrative" "fuck_perform_kira">></p>
<p class="explicit"><<randomLine "kira_cum" "buildup">></p>
<<say "Kira" `setup.randomLine("kira_cum", "buildup")`>>
<p class="explicit"><<randomLine "kira_cum" "orgasm">></p>
<<say "Kira" "FUCK! I'M— I'M CUMMING! AHHH!">>
<p class="explicit"><<randomLine "kira_cum" "kira_cum_from_fingers">></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 "kira_cum" "after">></p>
<p class="explicit"><<randomLine "player_cum" "after">></p>
<<set $player.lust to 20>>
<<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>>
<<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")>>
<<showEventMedia "defeated_enemy_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>
<<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]>>
<<showEventMedia "defeated_enemy_anal_cum_inside">>
<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>>
<<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]>>
<<showEventMedia "defeated_enemy_anal_cum_on">>
<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>>
<<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]>>
<<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")>>
<<showEventMedia "defeated_enemy_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]>>
<<showEventMedia "defeated_enemy_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>>
<<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]>>
<<showEventMedia "defeated_enemy_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>>
<<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>>
<<showEventMedia "defeated_enemy_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")`>>
<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>
<<say _e.name `setup.randomLine("postbattle_threesome", "enemy_first_woman")`>>
<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")`>>
<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 >= 70>>
<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>><<advanceTime 0 15>>
<p class="explicit"><<randomLine "postbattle_narrative" "watching_kira_masturbate">></p>
<<say _e.name `setup.randomLine("postbattle_threesome", "enemy_cumming")`>>
<p class="explicit"><<randomLine "postbattle_narrative" "lesbian_cum_description">></p>
<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><<advanceTime 0 30>>
<<showEventMedia "defeated_enemy_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>
<<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>>
<<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]>>
<<advanceTime 0 2>>
<h3>Release Her</h3>
<p class="narrator"><<randomLine "postbattle_release" "release_action">></p>
<<say $player.name `setup.randomLine("postbattle_release", "player_release")`>>
<<if $postBattle.enemiesUsed.includes(_i)>>
<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 $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")`>>
<<say "Kira" `setup.randomLine("postbattle_release", "kira_dismisses_release")`>>
<</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>>
<h3>Execute</h3>
<<if _e.health > 0>>
<p class="narrator"><<randomLine "postbattle_release" "execute_approach">></p>
<<say _e.name `setup.randomLine("postbattle_release", "enemy_begging_life")`>>
<<if $postBattle.enemiesUsed.includes(_i)>>
<p class="explicit"><<randomLine "postbattle_narrative" "execute_aftermath_used">></p>
<</if>>
<p class="narrator"><<randomLine "postbattle_release" "execute_strike">></p>
<<say "Kira" `setup.randomLine("postbattle_release", "kira_approves_execute")`>>
<<else>>
<p class="narrator"><<randomLine "postbattle_release" "execute_confirm_dead">></p>
<<say "Kira" `setup.randomLine("postbattle_release", "kira_approves_execute")`>>
<</if>>
<<set $stats.combat.enemiesDefeated += 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 15>>
<<showEventMedia "defeated_enemy_facesit">>
<h3>Sit On Your Face</h3>
<p class="explicit"><<randomLine "postbattle_facesit" "action">></p>
<<say _e.name `setup.randomLine("postbattle_facesit", "her_reaction")`>>
<p class="explicit"><<randomLine "postbattle_facesit" "action">></p>
<<say _e.name `setup.randomLine("postbattle_facesit", "her_reaction")`>>
<p class="explicit"><<randomLine "postbattle_facesit" "action">></p>
<<say _e.name `setup.randomLine("postbattle_facesit", "her_reaction")`>>
<p class="explicit"><<randomLine "postbattle_facesit" "action">></p>
<<say _e.name `setup.randomLine("defeated_enemy_cum", "orgasm_reaction")`>>
<<set _e.lust to (_e.lust || 0) + 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]>>
<<showEventMedia "defeated_enemy_titfuck">>
<<advanceTime 0 20>>
<h3>Titfuck Her</h3>
<p class="explicit"><<randomLine "postbattle_titfuck" "action">></p>
<<say _e.name `setup.randomLine("postbattle_titfuck", "her_reaction")`>>
<p class="explicit"><<randomLine "postbattle_titfuck" "action">></p>
<<say _e.name `setup.randomLine("postbattle_titfuck", "her_reaction")`>>
<p class="explicit"><<randomLine "postbattle_titfuck" "action">></p>
<<say _e.name `setup.randomLine("postbattle_titfuck", "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]>>
<<showEventMedia "defeated_enemy_titfuck_cum_face">>
<p class="explicit"><<randomLine "postbattle_titfuck" "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>>
<<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]>>
<<showEventMedia "defeated_enemy_titfuck_cum_tits">>
<p class="explicit"><<randomLine "postbattle_titfuck" "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>>
<<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]>>
<<showEventMedia "defeated_enemy_titfuck_cum_mouth">>
<p class="explicit"><<randomLine "postbattle_titfuck" "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>>
<<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]>>
<<advanceTime 0 15>>
<<showEventMedia "defeated_enemy_beg">>
<h3>Make Her Beg</h3>
<p class="explicit"><<randomLine "postbattle_beg" "tease">></p>
<<say _e.name `setup.randomLine("postbattle_beg", "her_begging")`>>
<p class="explicit"><<randomLine "postbattle_beg" "tease">></p>
<<say _e.name `setup.randomLine("postbattle_beg", "her_begging")`>>
<p class="explicit"><<randomLine "postbattle_beg" "tease">></p>
<<say _e.name `setup.randomLine("postbattle_beg", "her_begging")`>>
<p class="explicit"><<randomLine "postbattle_beg" "tease">></p>
<<say _e.name `setup.randomLine("postbattle_beg", "her_begging")`>>
<p class="explicit"><<randomLine "postbattle_narrative" "male_beg_desperation">></p>
<<clampStat "player.dominance" 5>>
<<set _e.lust to (_e.lust || 0) + 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]>>
<<showEventMedia "defeated_enemy_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>
<<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]>>
<<showEventMedia "defeated_enemy_threesome_cum_enemy">>
<p class="explicit"><<randomLine "postbattle_threesome" "climax">></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_threesome" "climax">></p>
<<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>>
<<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]>>
<<showEventMedia "defeated_enemy_threesome_cum_both">>
<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>>
<<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]>>
<<showEventMedia "defeated_enemy_threesome_cum_kira">>
<p class="explicit"><<randomLine "postbattle_narrative" "finish_inside_kira">></p>
<<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>>
<<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]>>
<<advanceTime 0 15>>
<<showEventMedia "defeated_male_jerk">>
<h3>Jerk Him Off</h3>
<p class="explicit"><<randomLine "postbattle_narrative" "male_jerk_start">></p>
<<say _e.name `setup.randomLine("postbattle_male_enemy", "resistance")`>>
<<say $player.name `setup.randomLine("postbattle_male_enemy", "player_commands_male")`>>
<p class="explicit"><<randomLine "postbattle_narrative" "male_jerk_stroking">></p>
<<say _e.name `setup.randomLine("postbattle_male_enemy", "denial_aroused")`>>
<p class="explicit"><<randomLine "postbattle_narrative" "male_jerk_technique">></p>
<<say _e.name `setup.randomLine("postbattle_male_enemy", "forced_orgasm_building")`>>
<p class="explicit"><<randomLine "postbattle_narrative" "male_jerk_cum">></p>
<<say _e.name `setup.randomLine("postbattle_male_enemy", "aftermath")`>>
<<clampStat "player.dominance" 3>>
<div class="choice-container">
<<vchoice "Continue" "PostBattle_Normal" "action" "map">>
</div><<set _i to $postBattle.currentEnemy>>
<<set _e to $postBattle.defeatedEnemies[_i]>>
<<advanceTime 0 20>>
<<showEventMedia "defeated_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>
<<say "Kira" `setup.randomLine("postbattle_male_enemy", "kira_watches_male")`>>
<<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]>>
<<showEventMedia "defeated_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>
<<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("kira_cum", "buildup")`>>
<p class="explicit"><<randomLine "postbattle_kira_male" "riding">></p>
<<say "Kira" `setup.randomLine("kira_cum", "buildup")`>>
<p class="explicit"><<randomLine "kira_cum" "kira_cum_from_sex">></p>
<<say "Kira" `setup.randomLine("postbattle_threesome", "kira_cumming")`>>
<p class="explicit"><<randomLine "postbattle_kira_male" "climax">></p>
<p class="explicit"><<randomLine "kira_cum" "after">></p>
<<say "Kira" `setup.randomLine("postbattle_kira", "after_threesome")`>>
<<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))>>
<<showEventMedia "defeated_enemy_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 (_e.lust || 0) + 15>>
<<clampStat "player.lust" 10>>
<<clampStat "player.dominance" 3>>
<<if $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
}>>
<<if !$combat.cardUIActive>>
<div class="combat-event kira-orgasm">
<p class="explicit"><<print _narrative>></p>
<<if _boundNarrative>>
<p class="explicit bound-detail"><<print _boundNarrative>></p>
<</if>>
<p class="state-change"><<print _aftermath>></p>
</div>
<</if>>
<<if _type === "multiple" || _type === "fucked">>
<<set $companions[0].lust to random(30, 45)>>
<<else>>
<<set $companions[0].lust to random(40, 60)>>
<</if>>
<<if _type === "intense" || _type === "forced">>
<<set $combat.kiraStunned to 2>>
<<else>>
<<set $combat.kiraStunned to 1>>
<</if>>
<<set $combat.kiraDefenseDebuff to 2>>
<<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",
message: "Kira orgasms! Stunned for " + $combat.kiraStunned + " turn(s), defense reduced."
})>>
<<addTension "kira" 5>>
<</widget>>
<<widget "triggerKiraMultipleOrgasm">>
<<set _pos to $combat.positions.kira || "standing">>
<div class="combat-event kira-multiple-orgasm">
<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>>
<<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>>
<<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",
message: "Kira suffers multiple orgasms! Completely broken - stunned 3 turns, -25% defense."
})>>
<<addTension "kira" 10>>
<</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 "resetKiraOrgasmFlag">>
<<set $combat.kiraOrgasmTriggered to false>>
<</widget>>
<<widget "addKiraLust">>
<<set _amount to _args[0] || 0>>
<<if $companions && $companions[0]>>
<<clampStat "companions[0].lust" (_amount || 0)>>
<<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 "combatVictoryTransition">>
<<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>>
<<run _defeatedEnemies.push(clone(_e))>>
<</for>>
<</if>>
<<if _defeatedEnemies.length === 0 && $combat && $combat.allEnemies && $combat.allEnemies.length > 0>>
<<set _defeatedEnemies to clone($combat.allEnemies)>>
<</if>>
<<if _defeatedEnemies.length === 0>>
<<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", "dirty_bandage", "ammo"],
lootChance: 0.6,
boundState: "none"
}]>>
<</if>>
<<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: []
}>>
<<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)>>
<<if _playerAroused && _kiraAroused && _highTension>>
<<goto "PostBattle_Mutual_Explosion">>
<<elseif _kiraAroused && _highTension && $clothing.player.dickExposed>>
<<goto "PostBattle_Kira_Jumps_Player">>
<<elseif _playerAroused && _kiraExposed>>
<<goto "PostBattle_Player_Takes_Kira">>
<<else>>
<<goto "PostBattle_Normal">>
<</if>>
<</widget>>
<<widget "checkPlayerAroused">>
<<set _playerAroused to ($player.lust >= 70)>>
<</widget>>
<<widget "checkKiraAroused">>
<<set _kiraAroused to ($companions[0].lust >= 60)>>
<</widget>>
<<widget "checkKiraTension">>
<<set _highTension to ($companions[0].tension >= 60)>>
<</widget>>
<<widget "checkAllArousal">>
<<set _playerAroused to ($player.lust >= 70)>>
<<set _kiraAroused to ($companions[0].lust >= 60)>>
<<set _highTension to ($companions[0].tension >= 60)>>
<</widget>>
<<widget "showArousalStates">>
<div class="arousal-states">
<<if $player.lust >= 70>>
<span class="state-warning">Player: Highly Aroused (Lust: <<print $player.lust>>)</span><br>
<<elseif $player.lust >= 50>>
<span class="state-caution">Player: Aroused (Lust: <<print $player.lust>>)</span><br>
<</if>>
<<if $companions[0].lust >= 60>>
<span class="state-warning">Kira: Highly Aroused (Lust: <<print $companions[0].lust>>)</span><br>
<<elseif $companions[0].lust >= 40>>
<span class="state-caution">Kira: Aroused (Lust: <<print $companions[0].lust>>)</span><br>
<</if>>
<<if $companions[0].tension >= 60>>
<span class="state-danger">Kira: High Tension (<<print $companions[0].tension>>)</span><br>
<<elseif $companions[0].tension >= 40>>
<span class="state-warning">Kira: Building Tension (<<print $companions[0].tension>>)</span><br>
<</if>>
</div>
<</widget>>
<<widget "checkPlayerExposed">>
<<set _playerExposed to ($clothing.player.dickExposed || $clothing.player.chestExposed || $clothing.player.assExposed)>>
<</widget>>
<<widget "checkKiraExposed">>
<<set _kiraExposed to ($clothing.kira.titsExposed || $clothing.kira.pussyExposed || $clothing.kira.assExposed)>>
<</widget>>
<<widget "checkPlayerNaked">>
<<set _playerNaked to ($clothing.player.top <= 0 && $clothing.player.bottom <= 0)>>
<</widget>>
<<widget "checkKiraNaked">>
<<set _kiraNaked to ($clothing.kira.top <= 0 && $clothing.kira.bottom <= 0)>>
<</widget>>
<<widget "checkAllExposure">>
<<set _playerExposed to ($clothing.player.dickExposed || $clothing.player.chestExposed || $clothing.player.assExposed)>>
<<set _kiraExposed to ($clothing.kira.titsExposed || $clothing.kira.pussyExposed || $clothing.kira.assExposed)>>
<<set _playerNaked to ($clothing.player.top <= 0 && $clothing.player.bottom <= 0)>>
<<set _kiraNaked to ($clothing.kira.top <= 0 && $clothing.kira.bottom <= 0)>>
<</widget>>
<<widget "showExposureStates">>
<div class="exposure-states">
<<if $clothing.player.dickExposed>>
<span class="status-exposed">Player: Dick Exposed</span><br>
<</if>>
<<if $clothing.player.assExposed>>
<span class="status-exposed">Player: Ass Exposed</span><br>
<</if>>
<<if $clothing.player.chestExposed>>
<span class="status-exposed">Player: Chest Exposed</span><br>
<</if>>
<<if $clothing.player.top <= 0 && $clothing.player.bottom <= 0>>
<span class="status-naked">Player: FULLY NAKED</span><br>
<</if>>
<<if $clothing.kira.titsExposed>>
<span class="status-exposed">Kira: Tits Exposed</span><br>
<</if>>
<<if $clothing.kira.pussyExposed>>
<span class="status-exposed">Kira: Pussy Exposed</span><br>
<</if>>
<<if $clothing.kira.assExposed>>
<span class="status-exposed">Kira: Ass Exposed</span><br>
<</if>>
<<if $clothing.kira.top <= 0 && $clothing.kira.bottom <= 0>>
<span class="status-naked">Kira: FULLY NAKED</span><br>
<</if>>
</div>
<</widget>>
<<widget "getExposureLevel">>
<<set _target to _args[0]>>
<<set _exposureLevel to "covered">>
<<if _target === "player">>
<<if $clothing.player.top <= 0 && $clothing.player.bottom <= 0>>
<<set _exposureLevel to "naked">>
<<elseif $clothing.player.dickExposed || $clothing.player.assExposed>>
<<set _exposureLevel to "exposed">>
<<elseif $clothing.player.top < 30 || $clothing.player.bottom < 30>>
<<set _exposureLevel to "torn">>
<</if>>
<<elseif _target === "kira">>
<<if $clothing.kira.top <= 0 && $clothing.kira.bottom <= 0>>
<<set _exposureLevel to "naked">>
<<elseif $clothing.kira.titsExposed || $clothing.kira.pussyExposed || $clothing.kira.assExposed>>
<<set _exposureLevel to "exposed">>
<<elseif $clothing.kira.top < 30 || $clothing.kira.bottom < 30>>
<<set _exposureLevel to "torn">>
<</if>>
<</if>>
<</widget>>
<<widget "calculateEncounterRisk">>
<<set _baseRisk to 20>>
<<checkAllExposure>>
<<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>>
<<if $player.lust >= 70>><<set _baseRisk += 10>><</if>>
<<set $journey.encounter.risk to _baseRisk>>
<<set $journey.exposure.player.exposed to _playerExposed>>
<<set $journey.exposure.companion.exposed to _kiraExposed>>
<<set $journey.exposure.player.naked to _playerNaked>>
<<set $journey.exposure.companion.naked to _kiraNaked>>
<</widget>>
<<widget "showEncounterRisk">>
<<calculateEncounterRisk>>
<div class="encounter-risk-display">
<h4>Travel Risk Assessment</h4>
<div class="risk-meter">
<div class="risk-bar" style="width: <<print Math.min($journey.encounter.risk, 100)>>%; background-color: <<if $journey.encounter.risk >= 60>>red<<elseif $journey.encounter.risk >= 40>>orange<<else>>yellow<</if>>;">
<<print $journey.encounter.risk>>%
</div>
</div>
<<if $journey.encounter.risk >= 60>>
<p class="warning">DANGER: High chance of hostile encounter!</p>
<<elseif $journey.encounter.risk >= 40>>
<p class="caution">WARNING: Moderate encounter risk</p>
<<else>>
<p class="safe">Relatively safe travel expected</p>
<</if>>
<<if $journey.exposure.player.exposed || $journey.exposure.companion.exposed>>
<p class="risk-factor">Risk Factor: Exposure increases attention</p>
<</if>>
<<if $journey.exposure.player.naked || $journey.exposure.companion.naked>>
<p class="risk-factor">Risk Factor: Nakedness highly visible</p>
<</if>>
<<if $companions[0].lust >= 60 || $player.lust >= 70>>
<p class="risk-factor">Risk Factor: High arousal attracts predators</p>
<</if>>
</div>
<</widget>><<widget "combatNarrative">>
<<set _cnPool to _args[0]>>
<<set _cnFallback to _args[1] || "">>
<<set _cnVideoFolder to _args[2] || null>>
<<set _cnVideoFilters to _args[3] || {}>>
<<if setup.combatNarrative && setup.combatNarrative[_cnPool]>>
<<set _cnText to setup.combatNarrative[_cnPool].random()>>
<<else>>
<<set _cnText to _cnFallback>>
<</if>>
<<set _cnVideo to null>>
<<if _cnVideoFolder>>
<<selectMediaFromPool _cnVideoFolder _cnVideoFilters>>
<<set _cnVideo to (_result && _result.file) ? _result.file : null>>
<</if>>
<<set _narrativeResult to {
text: _cnText,
video: _cnVideo,
hasVideo: (_cnVideo !== null && _cnVideo !== undefined),
pool: _cnPool
}>>
<<if _cnText>><<print _cnText>><</if>>
<</widget>>SECTION 23: SEDUCTION COMBAT WIDGETS
============================================================= */
<<widget "seduceAction">>
<<set _actionId to _args[0]>>
<<set _target to _args[1] || 0>>
<<set _enemy to $combat.enemies[_target]>>
<<set _action to $seductionActions[_actionId]>>
<<if $player.energy lt _action.energyCost>>
<p class="combat-fail">Not enough energy!</p>
<<return>>
<</if>>
<<clampStat "player.energy" (-(_action.energyCost || 0)) 0 50>>
<<set _baseChance to _action.baseChance>>
<<set _allureBonus to Math.floor($player.allure / 2)>>
<<set _charmBonus to Math.floor($player.charm / 3)>>
<<set _resistPenalty to Math.floor(_enemy.lustResistance / 2)>>
<<set _successChance to _baseChance + _allureBonus + _charmBonus - _resistPenalty>>
<<set _roll to random(1, 100)>>
<div class="seduction-action">
<<combatNarrative _action.narrativePool>>
</div>
<<if _roll lte _successChance>>
<<set _lustDamage to random(_action.lustMin, _action.lustMax)>>
<<set _lustDamage += Math.floor($player.allure / 5)>>
<<set _lustDamage -= Math.floor(_enemy.lustResistance / 4)>>
<<set _lustDamage to Math.max(5, _lustDamage)>>
<<set _enemy.lust to Math.min(100, (Number(_enemy.lust) || 0) + _lustDamage)>>
<div class="seduction-success">
<span class="result"><<combatNarrative _action.successPool>></span>
<span class="lust-damage"><<print "+" + _lustDamage>> Lust</span>
</div>
<<seductionEnemyReaction _target>>
<<if _enemy.lust gte _enemy.seduceThreshold>>
<<goto "Combat_Seduction_Victory">>
<</if>>
<<else>>
<div class="seduction-fail">
<span class="result"><<combatNarrative "seduce_failure">></span>
</div>
<<if random(1, 100) lte 30>>
<<set _enemy.aggression += 10>>
<p class="enemy-angry"><<combatNarrative "seduce_failure_anger">></p>
<</if>>
<</if>>
<<set _seduceLog to "You attempted to seduce " + _enemy.name + " #" + (_target + 1)>>
<<logCombat _seduceLog "sexual">>
<</widget>>
<<widget "seductionEnemyReaction">>
<<set _target to _args[0]>>
<<set _enemy to $combat.enemies[_target]>>
<<set _lustPercent to (_enemy.lust / _enemy.maxLust) * 100>>
<<if _lustPercent gte 67>>
<div class="enemy-reaction desperate">
<<combatNarrative "seduce_enemy_reaction_high">>
</div>
<<set _enemy.aggression -= 30>>
<<set _enemy.dodge -= 10>>
<<elseif _lustPercent gte 34>>
<div class="enemy-reaction aroused">
<<combatNarrative "seduce_enemy_reaction_mid">>
</div>
<<set _enemy.aggression -= 15>>
<<elseif _lustPercent gte 1>>
<div class="enemy-reaction affected">
<<combatNarrative "seduce_enemy_reaction_low">>
</div>
<</if>>
<</widget>>
<<widget "seductionActionButton">>
<<set _actionId to _args[0]>>
<<set _iconName to _args[1]>>
<<set _action to $seductionActions[_actionId]>>
<<set _canUse to $player.energy gte _action.energyCost>>
<div class="seduction-action-btn <<if !_canUse>>disabled<</if>>">
<<if _canUse>>
<<link _action.name>>
<<seduceAction _actionId 0>>
<<goto "Combat_Enemy_Turn">>
<</link>>
<<else>>
<span class="disabled"><<print _action.name>></span>
<</if>>
<span class="energy-cost"><<print _action.energyCost>> Energy</span>
</div>
<</widget>>
<<widget "sexActChoice">>
<<if !$currentSexScene>>
<p class="error">No active sex scene</p>
<<return>>
<</if>>
<<set _phase to $currentSexScene.phase>>
<<set _intensity to $currentSexScene.intensity>>
<<set _partner to $currentSexScene.partner>>
<div class="sex-act-choices">
<h4>What do you do?</h4>
<div class="sex-act-grid">
<<for _actId, _act range $sexualActs>>
<<set _unlocked to true>>
<<if _act.intensityRequirement && _intensity lt _act.intensityRequirement>>
<<set _unlocked to false>>
<</if>>
<<if $currentSexScene.actsPerformed.includes(_actId)>>
<<set _unlocked to false>>
<</if>>
<<if _act.requiresConsent && $currentSexScene.type === "non-consensual">>
<<set _unlocked to false>>
<</if>>
<<if _unlocked>>
<div class="sex-act-option">
<<link _act.name>>
<<performSexAct _actId>>
<<goto passage()>>
<</link>>
<div class="act-intensity">Intensity: <<print _act.intensity>></div>
</div>
<</if>>
<</for>>
</div>
</div>
<</widget>>
<<widget "enemySeductionAttempt">>
<<set _enemy to _args[0]>>
<<if !_enemy.canSeduce>>
<<return>>
<</if>>
<<set _seduceChance to 30>>
<<if _enemy.type === "supernatural">>
<<set _seduceChance to 50>>
<</if>>
<<if $player.lust gte 50>>
<<set _seduceChance += 20>>
<</if>>
<<if random(1, 100) lte _seduceChance>>
<<set _lustDamage to random(_enemy.lustDamage - 5, _enemy.lustDamage + 5)>>
<<set _resistance to $player.willpower + Math.floor((100 - $player.lust) / 10)>>
<<set _lustDamage -= Math.floor(_resistance / 5)>>
<<set _lustDamage to Math.max(5, _lustDamage)>>
<div class="enemy-seduction">
<<if _enemy.type === "supernatural">>
<<print _enemy.name>> flows toward you, trailing fingers of shadow.
<<say _enemy.name "supernatural" "Why fight? I can give you what you really want...">>
<<else>>
<<print _enemy.name>> smirks, shifting her stance provocatively.
<<say _enemy.name "Maybe we can work something out, handsome.">>
<</if>>
<span class="lust-damage player"><<print "+" + _lustDamage>> Lust</span>
</div>
<<set $player.lust to Math.min(100, Number($player.lust || 0) + Number(_lustDamage || 0))>>
<<if $player.lust gte 100>>
<<goto "Combat_Player_Seduction_Defeat">>
<</if>>
<</if>>
<</widget>>
<<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)>>
<<clampStat "player.lust" (_act.playerLust || 0)>>
<<getCompanion $currentSexScene.partner>>
<<if $tempCompanion>>
<<set $tempCompanion.lust += (_act.partnerLust || 0)>>
<</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)>>
<</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>>
<</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 += _trustGain>>
<<set $tempCompanion.affection += _affectionGain>>
<<set $tempCompanion.tension += _tensionLoss>>
<<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 "checkEnemyCovering">>
<<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>>
<<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>>
<div class="covering-stopped broken">
<<combatNarrative "cover_broken" "She doesn't even try to cover herself anymore. What's the point?">>
</div>
<<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>>
<div class="enemy-covering">
<<if _humLevel >= 60>>
<<combatNarrative "cover_high_humiliation" "She starts to cover herself, then stops, unsure if it even matters anymore.">>
<<elseif _humLevel >= 30>>
<<combatNarrative "cover_medium_humiliation" "She hesitates, torn between covering herself and defending.">>
<<else>>
<<combatNarrative "cover_low_humiliation" "She covers herself quickly, maintaining her combat stance as best she can.">>
<<if _coveringPart === "both">>
<<combatNarrative "enemy_cover_both">>
<<elseif _coveringPart === "pussy">>
<<combatNarrative "enemy_cover_pussy">>
<<else>>
<<combatNarrative "enemy_cover_tits">>
<</if>>
<</if>>
<div class="covering-penalty">
<<icon "accuracy" "small">> Covering penalty: -<<print _coverAccPenalty>>% accuracy, no heavy attacks
</div>
</div>
<<set _enemy.coveringTurns += 1>>
<<set $combat.enemies[_cecIdx].coveringTurns to _enemy.coveringTurns>>
<<else>>
<<if _enemy.isCovering>>
<div class="covering-stopped">
<<combatNarrative "stop_cover_attack" "She drops her covering arm to fight, exposing herself again.">>
</div>
<</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 "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 -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">>
<<if _playerDickOut>>
<<set _positionHint to "Her mouth is at dick height. Or shove her down for more.">>
<<else>>
<<set _positionHint to "Pull your dick out for throat access. Or push her face down.">>
<</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 "getPositionStripBonus">>
<<set _psbIdx to _args[0] || $combat.currentTarget || 0>>
<<set _psbType to _args[1] || "bottom">>
<<set _enemy to $combat.enemies[_psbIdx]>>
<<set _posStripMult to 1.0>>
<<set _posStripBonus to 0>>
<<set _posStripNarrative to "">>
<<if _enemy>>
<<set _pos to _enemy.position || "standing">>
<<switch _pos>>
<<case "standing">>
<<set _posStripMult to 1.0>>
<<set _posStripBonus to 0>>
<<case "kneeling">>
<<set _posStripMult to 1.15>>
<<set _posStripBonus to 5>>
<<if _psbType === "top">>
<<set _posStripNarrative to "On her knees, she can't shield her chest.">>
<<else>>
<<set _posStripNarrative to "Kneeling, she can't clamp her thighs shut.">>
<</if>>
<<case "prone_front">>
<<if _psbType === "bottom">>
<<set _posStripMult to 1.5>>
<<set _posStripBonus to 15>>
<<set _posStripNarrative to "Face down, her ass is perfectly presented for stripping.">>
<<else>>
<<set _posStripMult to 1.1>>
<<set _posStripBonus to 3>>
<<set _posStripNarrative to "You have to flip her slightly to reach her top.">>
<</if>>
<<case "prone_back">>
<<if _psbType === "top">>
<<set _posStripMult to 1.5>>
<<set _posStripBonus to 15>>
<<set _posStripNarrative to "On her back, her chest is completely vulnerable.">>
<<else>>
<<set _posStripMult to 1.25>>
<<set _posStripBonus to 8>>
<<set _posStripNarrative to "You spread her legs and tear at her pants.">>
<</if>>
<<case "bent_over">>
<<if _psbType === "bottom">>
<<set _posStripMult to 1.75>>
<<set _posStripBonus to 20>>
<<set _posStripNarrative to "Bent over, her ass and pussy are perfectly positioned.">>
<<else>>
<<set _posStripMult to 1.2>>
<<set _posStripBonus to 6>>
<<set _posStripNarrative to "You reach around and tear her top off from behind.">>
<</if>>
<<case "pinned">>
<<set _posStripMult to 2.0>>
<<set _posStripBonus to 25>>
<<if _psbType === "top">>
<<set _posStripNarrative to "Pinned beneath you, she can only watch as you rip her top away.">>
<<else>>
<<set _posStripNarrative to "Pinned and helpless, her clothes come off easily.">>
<</if>>
<</switch>>
<<if $combat.combo && $combat.combo.count >= 2>>
<<set _comboStripBonus to Math.floor($combat.combo.bonus / 2)>>
<<set _posStripBonus += _comboStripBonus>>
<<set _posStripMult += ($combat.combo.bonus / 200)>>
<</if>>
<</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">>
<<if (_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 "playerExposeDick">>
<<if $clothing && $clothing.player && !$clothing.player.dickOut>>
<<set $clothing.player.dickOut to true>>
<<set $clothing.player.dickExposed to true>>
<div class="player-expose">
<<combatNarrative "player_pull_out" "You reach down and free your cock, letting it hang heavy and hard.">>
</div>
<<for _i, _e range $combat.enemies>>
<<if _e.gender === "female">>
<<initClothingTactics _i>>
<<set _e.seenPlayerDick to true>>
<<set $combat.enemies[_i].seenPlayerDick to true>>
<<set _eLust to _e.lust || 0>>
<<if _eLust >= 50>>
<div class="enemy-reaction aroused">
<<combatNarrative "enemy_sees_dick_aroused" "Her eyes fix on your cock and her thighs press together involuntarily.">>
</div>
<<set _e.lust to Math.min(100, _e.lust + 10)>>
<<set $combat.enemies[_i].lust to _e.lust>>
<<else>>
<div class="enemy-reaction intimidated">
<<combatNarrative "enemy_sees_dick_intimidated" "Her eyes drop to your cock and widen. She swallows nervously.">>
</div>
<<set _e.lust to Math.min(100, (_e.lust || 0) + 5)>>
<<set $combat.enemies[_i].lust to _e.lust>>
<<addHumiliation _i 5 "saw_dick">>
<</if>>
<</if>>
<</for>>
<<if $companions && $companions[0] && $combat.allies && $combat.allies.includes("kira")>>
<<addTension "kira" 8>>
<div class="kira-reaction subtle">
Kira notices your exposure, her cheeks flushing slightly.
</div>
<</if>>
<<if $combat.log>>
<<run $combat.log.push({
text: "You expose yourself! Enemies react.",
type: "intimidate"
})>>
<</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 "playerFlaunt">>
<<if $clothing && $clothing.player && ($clothing.player.dickOut || $clothing.player.dickExposed)>>
<div class="player-flaunt">
<<combatNarrative "player_flaunt" "You stroke your cock slowly, making her watch every inch.">>
</div>
<<for _i, _e range $combat.enemies>>
<<if _e.gender === "female">>
<<set _e.flauntedThisTurn to true>>
<<set _e.flauntDistracted to true>>
<<set $combat.enemies[_i].flauntedThisTurn to true>>
<<set $combat.enemies[_i].flauntDistracted to true>>
<div class="enemy-distracted">
<<combatNarrative "enemy_flaunt_distracted" "She's completely distracted by your display, her guard dropping.">>
<div class="distract-effect">
<<icon "accuracy" "small">> Enemy accuracy -10% this turn
<br>
<<icon "high-arousal" "small">> +15 Lust
</div>
</div>
<<set _e.lust to Math.min(100, (_e.lust || 0) + 15)>>
<<set $combat.enemies[_i].lust to _e.lust>>
<<updateArousalState _i>>
<</if>>
<</for>>
<<if $combat.log>>
<<run $combat.log.push({
text: "You flaunt yourself! Enemies distracted.",
type: "intimidate"
})>>
<</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 "updateExposure">>
<<set _target to _args[0]>>
<<if _target === "player">>
<<set _c to $clothing.player>>
<<set _c.chestExposed to (_c.chestExposed || _c.top lte 25)>>
<<set _c.dickExposed to (_c.dickExposed || _c.bottom lte 25 || _c.underwear lte 25)>>
<<set _c.assExposed to (_c.assExposed || _c.bottom lte 25)>>
<<elseif _target === "kira">>
<<set _c to $clothing.kira>>
<<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 || _c.bottom lte 25 || _c.underwear lte 25)>>
<<set _c.assExposed to (_c.assExposed || _c.bottom lte 25)>>
<<else>>
<<set _e to $combat.enemies[_target]>>
<<if _e && _e.clothing>>
<<set _e.clothing.titsExposed to (_e.clothing.titsExposed || _e.clothing.top lte 25)>>
<<set _e.clothing.pussyExposed to (_e.clothing.pussyExposed || _e.clothing.bottom lte 25 || _e.clothing.underwear lte 25)>>
<<set _e.clothing.assExposed to (_e.clothing.assExposed || _e.clothing.bottom lte 25)>>
<</if>>
<</if>>
<</widget>>
<<widget "damageClothing">>
<<if !$flags.seductionUnlocked>>
<<return>>
<</if>>
<<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 Number($clothing.player[_part]) || 100>>
<<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.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 Number($clothing.kira[_part]) || 100>>
<<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 Number($combat.enemies[_target].clothing[_part]) || 100>>
<<set $combat.enemies[_target].clothing[_part] to Math.max(0, _currentVal - Number(_amount))>>
<<updateExposure _target>>
<<displayClothingDamage _target _part _amount>>
<</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 $combat.companionInCombat === "kira">>
<<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>>
<</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>>
<<set $flags.kiraSeenPlayerDick to true>>
<<addTension "kira" 15>>
<<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>>
<<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>>
<<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>>
<<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>>
<<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>>
<<return>>
<</if>>
<<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>>
<</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}>>
<<if !$flags.seductionUnlocked>>
<<set _sexDecisionDebug.earlyReturn to "seductionUnlocked is false">>
<<return>>
<</if>>
<<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">>
<<return>>
<</if>>
<<if _enemy.type === "beast" || _enemy.type === "construct">>
<<set _sexDecisionDebug.earlyReturn to "beast or construct">>
<<return>>
<</if>>
<<if _enemy.gender === "male">>
<<if !$clothing.kira || !$combat.positions.kira>>
<<set _sexDecisionDebug.earlyReturn to "missing kira clothing or position">>
<<return>>
<</if>>
<<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 _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}>>
<<enemyStripAttempt _enemy>>
<<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>>
<<if _wantsToExpose && random(1, 100) lte (60 + _urgencyMod)>>
<<set _enemy.sexIntent to "expose_self">>
<<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>>
<<set _enemy.sexIntent to _stripResult.action>>
<<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 _isDickOut && _isKneeling && _enemy.lust >= _sexOral.lustMin && random(1, 100) lte _sexOral.chance>>
<<set _enemy.sexIntent to "forced_oral">>
<<elseif _isDickOut && _c.pussyExposed && _canFuck && _enemy.isHuman && random(1, 100) lte (_sexFuckPussy.chance + _urgencyMod)>>
<<set _enemy.sexIntent to "fuck_pussy">>
<<elseif _isDickOut && _c.assExposed && (_pos === "prone_front" || _pos === "bent_over") && random(1, 100) lte (_sexFuckAss.chance + _urgencyMod)>>
<<set _enemy.sexIntent to "fuck_ass">>
<<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 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>>
<<elseif _enemy.gender === "female">>
<<if !$clothing.player || !$combat.positions.player>>
<<return>>
<</if>>
<<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>>
<<set _enemy.sexTarget to _target>>
<<set _sexDecisionDebug.finalIntent to _enemy.sexIntent>>
<<set _sexDecisionDebug.finalTarget to _enemy.sexTarget>>
<</widget>>SECTION 20: COMBAT WIDGETS
============================================================= */
<<widget "startCombat">>
<<set $combat.active to true>>
<<set $combat.cardUIActive to true>>
<<set $combat.turn to 1>>
<<set $combat.phase to "player">>
<<set $combat.enemies to _args[0]>>
<<set $combat.companionInCombat to _args[1] || null>>
<<set $combat.canFlee to _args[2] !== false>>
<<set $combat.canSeduce to $flags.seductionUnlocked || false>>
<<set $combat.log to []>>
<<set $combat.allEnemies to clone(_args[0])>>
<<set $combat.defeatedEnemies 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.playerStunned to 0>>
<<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>>
<<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 "endCombat">>
<<set _combatMinutes to Math.max(15, ($combat.turn || 1) * 10)>>
<<advanceTime 0 _combatMinutes>>
<<set $combat.active to false>>
<<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>>
<<capture _caPassage, _caText, _caType, _caIcon>>
<<if _caEnabled>>
<span class="combat-btn-wrapper <<print _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 "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>>
<<else>>
<<switch _template>>
<<case "boss_raider_warlord">>
<<set _returnEnemy to {
id: "boss_raider_warlord",
name: "Warlord Kresh",
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: ["quality_armor", "rare_parts", "rare_stimpack"],
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",
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: "Boss_Succubus_LustDefeat",
guaranteedLoot: ["succubus_essence", "void_heart"],
loot: ["corruption_crystal", "desire_manifest"],
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>>
<<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">>
<</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 _count to _minCount + Math.floor(Math.random() * (_maxCount - _minCount + 1))>>
<<set _maleRaiders to ["grunt", "scout", "brute", "blade", "slaver", "binder", "chain", "machete"]>>
<<set _femaleRaiders to ["huntress", "vixen", "whip", "amazon", "binder_f", "chain_f", "temptress", "slaver_f"]>>
<<set _raiderGroup to []>>
<<for _ri to 0; _ri lt _count; _ri++>>
<<if Math.random() < 0.5>>
<<set _template to _maleRaiders[Math.floor(Math.random() * _maleRaiders.length)]>>
<<else>>
<<set _template to _femaleRaiders[Math.floor(Math.random() * _femaleRaiders.length)]>>
<</if>>
<<if _tierOverride>>
<<set _tier to _tierOverride>>
<<else>>
<<getTierForDay $time.day _eliteBonus>>
<<set _tier to _return>>
<</if>>
<<createEnemy _template _tier>>
<<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>>
<<run _raiderGroup.push(clone(_returnEnemy))>>
<</for>>
<<set _returnRaiderGroup to _raiderGroup>>
<</widget>>
<<widget "applyStatus">>
<<set _statusTarget to _args[0]>>
<<set _effectId to _args[1]>>
<<set _effect to $statusEffects[_effectId]>>
<<if _effect>>
<<if !_statusTarget.statusEffects>>
<<set _statusTarget.statusEffects to []>>
<</if>>
<<set _immune to false>>
<<if _statusTarget.statusImmunities>>
<<for _immunity range _statusTarget.statusImmunities>>
<<if _immunity === _effectId || _immunity === _effect.type>>
<<set _immune to true>>
<</if>>
<</for>>
<</if>>
<<if !_immune>>
<<set _existing to _statusTarget.statusEffects.find(e => e.id === _effectId)>>
<<if _existing && _effect.stackable>>
<<if _existing.stacks lt _effect.maxStacks>>
<<set _existing.stacks += 1>>
<</if>>
<<elseif !_existing>>
<<run _statusTarget.statusEffects.push({
id: _effectId,
name: _effect.name,
icon: _effect.icon,
duration: _effect.duration,
stacks: 1
})>>
<</if>>
<</if>>
<</if>>
<</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 -= _tickDmg>>
<<if _effect.tickMessage>>
<div class="status-tick"><<print _effect.icon>> <<print _effect.tickMessage>> (-<<print _tickDmg>> HP)</div>
<</if>>
<</if>>
<<if _effect.tickLust>>
<<clampStat "player.lust" (_effect.tickLust || 0)>>
<</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 "removeStatus">>
<<set _statusTarget to _args[0]>>
<<set _effectId to _args[1]>>
<<if _statusTarget.statusEffects>>
<<set _statusTarget.statusEffects to _statusTarget.statusEffects.filter(s => s.id !== _effectId)>>
<</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>><<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="Stunned - skips next turn">
<<icon "stunned" "small">>
</span>
<<elseif _status.id === "bleed">>
<span class="status-badge status-bleed" @title="'Bleeding - takes ' + _statusDmg + ' dmg/turn (' + _statusDuration + ' rounds)' + (_statusStacks > 1 ? ' x' + _statusStacks : '')">
<<icon "bleeding" "small">>
</span>
<<elseif _status.id === "poison">>
<span class="status-badge status-poison" @title="'Poisoned - takes damage each turn (' + _statusDuration + ' rounds)'">
<<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">
<<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">
<<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.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>>
<<goto $combat.enemies[0].lustVictoryScene>>
<</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">>
<</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>>
<</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-<<print _posName>>">
<<if _posConfig.icon>>
<<icon _posConfig.icon "tiny">>
<</if>>
<<print _posConfig.displayName>>
</span>
<</if>>
<</if>>
<</widget>>
<<widget "displayPositionBonus">>
<<set _dpbIdx to _args[0] || 0>>
<<set _dpbType to _args[1] || "physical">>
<<getPositionDamageMultipliers _dpbIdx>>
<<if _posName !== "standing">>
<<getPositionName _posName>>
<<if _dpbType === "lust" && _posLustMult gt 1.0>>
<<set _bonusPct to Math.round((_posLustMult - 1) * 100)>>
<div class="position-bonus lust-bonus">
<<icon "high-arousal" "tiny">> Position Bonus: <<print "+" + _bonusPct>>% lust damage (<<print _posDisplayName>>)
</div>
<<elseif _dpbType === "physical" && _posDmgMult gt 1.0>>
<<set _bonusPct to Math.round((_posDmgMult - 1) * 100)>>
<div class="position-bonus damage-bonus">
<<icon "attack" "tiny">> Position Bonus: <<print "+" + _bonusPct>>% damage (<<print _posDisplayName>>)
</div>
<</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 _awpEnemy.positionHeldTurns to 0>>
<<set $combat.enemies[_awpIdx].positionHeldTurns to 0>>
<<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 += _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 === "surrendered">>
<<set _baseEscapeChance to 0>>
<</if>>
<<set _escapeChance to Math.max((_tepEnemy.resistanceState === "broken") ? 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 _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>
<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>
<<set $player.lust to 0>>
<<set $combat.playerStunned to 3>>
<<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>
<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>
<<set $player.lust to 0>>
<<set $combat.playerStunned to 4>>
<<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>
<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>
<<set $player.lust to 0>>
<<set $combat.playerStunned to 2>>
<<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>
<p class="explicit ultra">She mounts you from behind, her strap/fingers plunging back inside as she pins you down.</p>
<p class="explicit ultra"><<combatNarrative "player_forced_cum_behind">></p>
<<set $player.lust to 0>>
<<set $combat.playerStunned to 3>>
<<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>>
<<set $combat.playerStunned to 2>>
<<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>>
<<return>>
<<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">>
<<return>>
<</if>>
<</if>>
<<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>>
<</widget>><<widget "getCombatPortrait">>
<<set _who to _args[0]>>
<<if _who === "player">>
<<set _position to $combat.positions.player>>
<<set _c to $clothing.player>>
<<if _c.top <= 0 && _c.bottom <= 0>>
<<set _clothState to "naked">>
<<elseif _c.dickExposed>>
<<set _clothState to "exposed_dick">>
<<elseif _c.bottom <= 25>>
<<set _clothState to "torn_bottom">>
<<elseif _c.top <= 25>>
<<set _clothState to "torn_top">>
<<else>>
<<set _clothState to "dressed">>
<</if>>
<<set _portraitPath to "media/combat/player/" + _position + "/" + _clothState + ".webp">>
<<elseif _who === "kira">>
<<set _position to $combat.positions.kira>>
<<set _c to $clothing.kira>>
<<if _c.top <= 0 && _c.bottom <= 0>>
<<set _clothState to "naked">>
<<elseif _c.pussyExposed>>
<<set _clothState to "exposed_pussy">>
<<elseif _c.titsExposed>>
<<set _clothState to "exposed_tits">>
<<elseif _c.bottom <= 25>>
<<set _clothState to "torn_bottom">>
<<elseif _c.top <= 25>>
<<set _clothState to "torn_top">>
<<else>>
<<set _clothState to "dressed">>
<</if>>
<<set _portraitPath to "media/combat/kira/" + _position + "/" + _clothState + ".webp">>
<</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 && _armor.maxDurability>>
<<set _armorPct to Math.floor((Number(_armor.currentDurability) || 0) / (Number(_armor.maxDurability) || 1) * 100)>>
<<if isNaN(_armorPct)>><<set _armorPct to 0>><</if>>
<span class="armor-status <<getClothingClass _armorPct>>">
<span data-tooltip="Armor Durability"><<icon "armor" "small">></span> <span class="cloth-label"><<print _armorPct>>%</span>
</span>
<</if>>
<span class="cloth-top <<getClothingClass _c.top>>">
<span data-tooltip="Top Clothing"><<icon "shirt" "small">></span> <span class="cloth-label"><<getClothingLabel _c.top>></span>
</span>
<span class="cloth-bottom <<getClothingClass _c.bottom>>">
<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: "+15% damage"})>>
<<run _effects.push({icon: "seduction-boost", type: "buff", name: "Desperate Charm", desc: "+20% seduction"})>>
<</if>>
<<if $arousal.player.blueBallsActive>>
<<if $arousal.player.daysAtHigh >= 3>>
<<run _effects.push({icon: "accuracy-down", type: "debuff", name: "Distracted", desc: "-2 accuracy"})>>
<<elseif $arousal.player.daysAtHigh >= 2>>
<<run _effects.push({icon: "accuracy-down", type: "debuff", name: "Unfocused", desc: "-1 accuracy"})>>
<</if>>
<<if $arousal.player.daysAtHigh >= 5>>
<<run _effects.push({icon: "energy-down", type: "debuff", name: "Aching", desc: "-5 max energy"})>>
<</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 $combat.combo.count >= 3>>
<<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: "+15% enemy accuracy"})>>
<</if>>
<<if $combat.resting>>
<<run _effects.push({icon: "rest", type: "debuff", name: "Resting", desc: "Vulnerable to attack"})>>
<</if>>
<<if $equipped.armor && $equipped.armor.currentDurability > 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: "-10% accuracy, " + $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: "Cannot act, " + $combat.playerEffects.stunned + " turns"})>>
<</if>>
<</if>>
<<if $combat.playerWristsBound || ($combat.playerEffects && $combat.playerEffects.wristsBound)>>
<<run _effects.push({icon: "bound", type: "debuff", name: "Wrists Bound", desc: "Limited actions"})>>
<</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: $combat.kiraEffects.intimidated + " turns"})>>
<</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: $combat.kiraDefenseModifier + "% defense"})>>
<</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="Block -20%, Parry -25%, No Riposte"><<icon "hazard-sign" "small">> On Knees</span>
<<case "prone_front">>
<span class="position-danger" data-tooltip="Block -50%, No Parry, No Riposte"><<icon "hazard-sign" "small">><<icon "hazard-sign" "small">> Face Down</span>
<<case "prone_back">>
<span class="position-danger" data-tooltip="Block -50%, No Parry, No Riposte"><<icon "hazard-sign" "small">><<icon "hazard-sign" "small">> On Back</span>
<<case "bent_over">>
<span class="position-danger" data-tooltip="Block -40%, No Parry, No Riposte"><<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 _enemy to $combat.enemies[_aroIdx]>>
<<if _enemy>>
<<initArousalState _aroIdx>>
<<set _lust to _enemy.lust || 0>>
<<set _oldState to _enemy.arousalState>>
<<set _enemy.arousalState to setup.getThresholdState(_lust, setup.thresholds.arousal)>>
<<if _oldState !== _enemy.arousalState && _enemy.arousalState !== "normal">>
<<displayArousalThreshold _aroIdx _enemy.arousalState>>
<</if>>
<</if>>
<</widget>>
<<widget "displayArousalThreshold">>
<<set _threshIdx to _args[0]>>
<<set _threshState to _args[1]>>
<<set _enemy to $combat.enemies[_threshIdx]>>
<<if _enemy && $combat.phase !== "enemy">>
<<set _gs to setup.genderSuffix(_enemy.gender)>>
<<set _p to setup.pronouns(_enemy.gender)>>
<<set _arousalFallbacks to {
aroused: _p.His + " breathing has grown heavier. There's a " + (_p.isFemale ? "flush spreading across " + _p.his + " skin." : "bulge forming in " + _p.his + " pants."),
highly_aroused: _p.He + "'s " + (_p.isFemale ? "visibly wet, thighs pressing together." : "rock hard now, straining against " + _p.his + " pants.") + " Arousal clouds " + _p.his + " movements.",
desperate: _p.He + "'s desperate, " + (_p.isFemale ? "practically trembling with need. Every touch makes " + _p.him + " gasp." : _p.his + " cock throbbing painfully. Every touch makes " + _p.him + " groan."),
climax: _p.He + "'s on the edge—one more " + (_p.isFemale ? "push" : "touch") + " will send " + _p.him + " over."
}>>
<<set _poolKeyMap to {aroused: "enemy_aroused_50", highly_aroused: "enemy_aroused_70", desperate: "enemy_aroused_90", climax: "enemy_at_climax"}>>
<div class="arousal-threshold threshold-<<print _threshState>>">
<<set _poolKey to _poolKeyMap[_threshState] + _gs>>
<<combatNarrative _poolKey _arousalFallbacks[_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]>>
<<if _aroStatusEnemy && _aroStatusEnemy.lust !== undefined && _aroStatusEnemy.lust >= 50>>
<<set _aroState to _aroStatusEnemy.arousalState || "normal">>
<<switch _aroState>>
<<case "aroused">>
<span class="status-badge status-arousal aro-aroused"
@title="'Aroused (' + _aroStatusEnemy.lust + '/100) - Accuracy -10%'">
<<icon "high-arousal" "small">>
</span>
<<case "highly_aroused">>
<span class="status-badge status-arousal aro-highly-aroused"
@title="'Highly Aroused (' + _aroStatusEnemy.lust + '/100) - Accuracy -15%, Damage -20%'">
<<icon "high-arousal" "small">>
</span>
<<case "desperate">>
<span class="status-badge status-arousal aro-desperate"
@title="'Desperate (' + _aroStatusEnemy.lust + '/100) - 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 + '/100) - 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>>
<<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>>
<<initArousalState _denyIdx>>
<<set _genderSuffix to setup.genderSuffix(_enemy.gender, "Female")>>
<<if _config.effects.incrementDenialTurns>>
<<set _enemy.denialTurns += 1>>
<</if>>
<<set _frustrationDmg to _config.effects.frustrationDamage>>
<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>
<<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>>
<<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>>
<<initArousalState _orgIdx>>
<<set _genderSuffix to setup.genderSuffix(_enemy.gender, "bare")>>
<<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>>
<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">>
<div class="orgasm-break">
<<if _enemy.gender === "female">>
<<print _config.fallbackText.brokenFemale>>
<<else>>
<<print _config.fallbackText.brokenMale>>
<</if>>
</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 Math.min(100, _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 Math.max(0, Math.min(100, _mcelCurrentLust + _mcelAmount))>>
<<set $combat.enemies[_currentEnemyIndex].lust to _mcelNewLust>>
<<if _enemy !== undefined>>
<<set _enemy.lust to _mcelNewLust>>
<</if>>
<<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 Math.min(100, _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]>><<return>><</if>>
<<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="<<print _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(setup.textPools.enemy_lust_break.victory_opening)>></p>
<<set $combat.enemies[_enemyIndex].lustBroken to true>>
<<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>
<</widget>>
<<widget "checkEnemyLustBreaks">>
<<if $combat && $combat.enemies && $combat.enemies.length > 0>>
<<for _celbIdx, _celbEnemy range $combat.enemies>>
<<if _celbEnemy && !_celbEnemy.lustBroken && _celbEnemy.lust >= (_celbEnemy.lustBreak || 100)>>
<<handleEnemyLustBreak _celbIdx>>
<</if>>
<</for>>
<</if>>
<</widget>>
<<widget "checkEnemyLustBreakImmediate">>
<<set _targetIdx to _args[0]>>
<<if _targetIdx === undefined || !$combat.enemies[_targetIdx]>><<return>><</if>>
<<set _target to $combat.enemies[_targetIdx]>>
<<if !_target.lustBroken && _target.lust >= (_target.lustBreak || 100)>>
<<handleEnemyLustBreak _targetIdx>>
<</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-<<print _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 10>>
<<set _humCanOffensive to false>>
<<set _humAutoSucceed to false>>
<<set _humClothResist to 30>>
<<case "broken">>
<<set _humGrabResist to 100>>
<<set _humAccPenalty to 20>>
<<set _humCanOffensive to false>>
<<set _humAutoSucceed to true>>
<<set _humClothResist to 100>>
<</switch>>
<</if>>
<</widget>>
<<widget "displayHumiliationBar">>
<<set _barIdx to _args[0] || 0>>
<<set _enemy to $combat.enemies[_barIdx]>>
<<if _enemy && _enemy.humiliation !== undefined && _enemy.humiliation gt 0>>
<<set _humPct to _enemy.humiliation>>
<<set _humState to _enemy.humiliationState || "normal">>
<div class="humiliation-bar-container">
<div class="humiliation-label">
<<icon "broken-heart" "small">>
<<if _humState === "broken">>
<span class="hum-broken">BROKEN</span>
<<elseif _humState === "degraded">>
<span class="hum-degraded">DEGRADED</span>
<<elseif _humState === "embarrassed">>
<span class="hum-embarrassed">EMBARRASSED</span>
<<else>>
<span class="hum-normal"><<print _humPct>>%</span>
<</if>>
</div>
<div class="humiliation-bar">
<div class="humiliation-fill <<print _humState>>" @style="'width: ' + _humPct + '%'"></div>
<div class="hum-threshold t30" data-tooltip="Embarrassed (30)"></div>
<div class="hum-threshold t60" data-tooltip="Degraded (60)"></div>
<div class="hum-threshold t90" data-tooltip="Broken (90)"></div>
</div>
</div>
<</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="'Embarrassed (' + _statusEnemy.humiliation + '/100) - Grab resist -15%, Accuracy -5%'">
<<icon "broken-heart" "small">>
</span>
<<case "degraded">>
<span class="status-badge status-humiliation hum-degraded"
@title="'Degraded (' + _statusEnemy.humiliation + '/100) - No offensive abilities, Grab resist -30%'">
<<icon "broken-heart" "small">>
</span>
<<case "broken">>
<span class="status-badge status-humiliation hum-broken"
@title="'BROKEN (' + _statusEnemy.humiliation + '/100) - All sexual actions auto-succeed'">
<<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.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 "checkHumiliationCover">>
<<set _coverIdx to _args[0] || 0>>
<<set _enemy to $combat.enemies[_coverIdx]>>
<<set _isCovering to false>>
<<if _enemy && _enemy.humiliationState === "embarrassed" || _enemy.humiliationState === "degraded">>
<<if _enemy.clothing && (_enemy.clothing.titsExposed || _enemy.clothing.pussyExposed)>>
<<if random(1, 100) <= 40>>
<<set _isCovering to true>>
<</if>>
<</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 Math.min(100, (Number(_enemy.lust) || 0) + _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 "getOverwhelmModifiers">>
<<set _gomIdx to _args[0] || 0>>
<<set _owAccPenalty to 0>>
<<set _owCanAbility to true>>
<<set _owLustBonus to 0>>
<<if $combat.enemies[_gomIdx]>>
<<initPainPleasure _gomIdx>>
<<set _enemy to $combat.enemies[_gomIdx]>>
<<if _enemy.overwhelmed>>
<<set _owAccPenalty to 30>>
<<set _owCanAbility to false>>
<<set _owLustBonus to 25>>
<</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 "displayOverwhelmStatus">>
<<set _dosEnemy to _args[0]>>
<<if _dosEnemy && _dosEnemy.overwhelmed>>
<span class="status-badge status-overwhelm"
@title="'OVERWHELMED (' + _dosEnemy.overwhelmedTurns + ' turns) - Accuracy -30%, No abilities, +25% lust damage'">
<<icon "stunned" "small">> OVR
</span>
<</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 _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 _availableAbilities.includes("heavy_strike")>>
<<set _targetWounded to false>>
<<if _selTarget === "player" && $player.health < ($player.maxHealth * 0.4)>>
<<set _targetWounded to true>>
<</if>>
<<if _targetWounded>>
<div class="covering-blocked">
<<combatNarrative "covering_cant_heavy" "She can't use her heavy attack while covering herself!">>
</div>
<</if>>
<</if>>
<</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" || _selEnemy.tier === "miniboss">>
<<set _useChance to 55>>
<<elseif _selEnemy.tier === "boss">>
<<set _useChance to 70>>
<<elseif _selEnemy.tier === "fodder">>
<<set _useChance to 15>>
<</if>>
<<if random(1, 100) <= _useChance>>
<<set _selectedAbility to either(_availableAbilities)>>
<</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.effects.push("intimidate")>>
<<set _abilityResult.narrative to _execEnemy.name + " lets out a terrifying roar, trying to break your will!">>
<<set _execEnemy.abilityState.cooldowns["intimidate"] to 3>>
<<case "seductive_taunt">>
<<set _abilityResult.damage 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.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.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 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 your weak points!">>
<<set _execEnemy.abilityState.cooldowns["dirty_fighting_master"] to 2>>
<<case "seduction_irresistible">>
<<set _abilityResult.damage to 0>>
<<set _abilityResult.effects.push("lust_damage_heavy")>>
<<set _abilityResult.effects.push("charm_attempt")>>
<<set _abilityResult.narrative to _execEnemy.name + " locks eyes with you, her gaze IRRESISTIBLE...">>
<<set _execEnemy.abilityState.cooldowns["seduction_irresistible"] to 3>>
<<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>>
<<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.id !== _effectsEnemy.id>>
<<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] || 40>>
<<if random(1, 100) <= _bindChance>>
<<if _effectsTarget === "player">>
<<if !$combat.playerEffects>><<set $combat.playerEffects to {}>><</if>>
<<set $combat.playerEffects.bound to 2>>
<div class="ability-effect bound">You're BOUND! (Reduced dodge, can't flee for 2 turns)</div>
<<elseif _effectsTarget === "kira">>
<<if !$combat.kiraEffects>><<set $combat.kiraEffects to {}>><</if>>
<<set $combat.kiraEffects.bound to 2>>
<div class="ability-effect bound">Kira is BOUND!</div>
<</if>>
<<else>>
<div class="ability-resisted">You slip free of the rope!</div>
<</if>>
<<case "stun_chance">>
<<set _stunChance to _args[3] || 25>>
<<if random(1, 100) <= _stunChance>>
<<if _effectsTarget === "player">>
<<if !$combat.playerEffects>><<set $combat.playerEffects to {}>><</if>>
<<set $combat.playerEffects.stunned to 1>>
<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>>
<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">>
<<if random(1, 100) <= 35>>
<<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! (May hesitate next turn)</div>
<</if>>
<<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 _modEnemy to _args[0]>>
<<set _damageModifier to 1.0>>
<<if _modEnemy.buffs && _modEnemy.buffs.rallied && _modEnemy.buffs.rallied > 0>>
<<set _damageModifier *= 1.25>>
<</if>>
<<if _modEnemy.fearPenalty>>
<<set _damageModifier *= 0.5>>
<</if>>
<<set _returnDamageMod to _damageModifier>>
<</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>>
<<if $combat.combo.count >= 3>>
<span class="combo-finisher-ready">FINISHER READY!</span>
<</if>>
</div>
<</if>>
<<else>>
<<set $combat.combo.count to 1>>
<<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 $combat.combo.count >= 3>>
<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 "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 _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-<<print _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-<<print _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 "applyResistanceToGrab">>
<<set _argIdx to _args[0] || 0>>
<<set _argBaseChance to _args[1] || 70>>
<<getResistanceModifiers _argIdx>>
<<set _resModifiedGrab to _argBaseChance - _resGrabPenalty>>
<<set _resModifiedGrab to Math.max(20, Math.min(95, _resModifiedGrab))>>
<</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>>
<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! (Reduced attack effectiveness, 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 random(2, 4)>>
<<set $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)
<<elseif _weltCount >= 3>>
<span class="effect-icon">📛</span> Your skin burns with overlapping welts! (<<print _weltCount>> welts - accuracy -<<print _weltCount * 5>>%)
<</if>>
</div>
<<if _weltCount === 1>>
<<logCombat "Welt inflicted!" "status">>
<<elseif _weltCount >= 2>>
<<set _weltLog to "Welt #" + _weltCount + "! Accuracy -" + (_weltCount * 5) + "%">>
<<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)
<<elseif _weltCount >= 3>>
<span class="effect-icon">📛</span> Kira's skin is striped with welts! (<<print _weltCount>> welts - her attacks weaker)
<</if>>
</div>
<<if _weltCount === 1>>
<<logCombat "Kira welt inflicted!" "status">>
<<elseif _weltCount >= 2>>
<<set _weltKiraLog to "Kira welt #" + _weltCount + "! Attacks weaker">>
<<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 Math.min(_lustEnemy.maxLust || 100, (_lustEnemy.lust || 0) + _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.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>>
<<if random(1, 100) <= 30>>
<<set $combat.playerEffects.wristsBound to false>>
<div class="effect-expired">You manage to slip free of your bonds!</div>
<</if>>
<</if>>
<<if $combat.playerEffects.anklesBound>>
<<if random(1, 100) <= 20>>
<<set $combat.playerEffects.anklesBound to false>>
<div class="effect-expired">You kick free of the restraints!</div>
<</if>>
<</if>>
<</if>>
<<if $combat.kiraEffects>>
<<if $combat.kiraEffects.bleeding && $combat.kiraEffects.bleeding > 0>>
<<getCompanion "kira">>
<<set _bleedDmg to $combat.kiraEffects.bleedDamage || 3>>
<<set $tempCompanion.health to 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 _enemy to $combat.enemies[_wetIdx]>>
<<set _weaponTier to 1>>
<<set _weaponTierName to "combat">>
<<if _enemy>>
<<set _lust to _enemy.lust || 0>>
<<if _lust >= 60>>
<<set _weaponTier to 3>>
<<set _weaponTierName to "sexual_tool">>
<<elseif _lust >= 30>>
<<set _weaponTier to 2>>
<<set _weaponTierName to "sexual_awareness">>
<<else>>
<<set _weaponTier to 1>>
<<set _weaponTierName to "combat">>
<</if>>
<<set _enemy.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 _enemy to $combat.enemies[_wanIdx]>>
<<set _weaponNarrative to "">>
<<if _enemy && _enemy.weapon>>
<<getWeaponEscalationTier _wanIdx>>
<<set _weaponPrefix to "">>
<<switch _enemy.weapon>>
<<case "rusty_pipe">>
<<set _weaponPrefix to "pipe">>
<<case "chain">>
<<set _weaponPrefix to "chain">>
<<case "leather_belt">>
<<set _weaponPrefix to "belt">>
<<case "combat_knife" "rusty_shiv">>
<<set _weaponPrefix to "knife">>
<<case "riding_crop">>
<<set _weaponPrefix to "crop">>
<<case "rope">>
<<set _weaponPrefix to "rope">>
<<case "broken_bottle">>
<<set _weaponPrefix to "bottle">>
<<case "baseball_bat">>
<<set _weaponPrefix to "bat">>
<<default>>
<<set _weaponPrefix to "">>
<</switch>>
<<if _weaponPrefix !== "">>
<<set _poolBase to _weaponPrefix + "_tier" + _weaponTier + "_" + _wanAttack>>
<<set _genderSuffix to setup.genderSuffix(_enemy.gender, "_f")>>
<<set _targetSuffix to (_wanTarget !== "player") ? "_companion" : "">>
<<set _poolFull to _poolBase + _genderSuffix + _targetSuffix>>
<<set _poolGenderOnly to _poolBase + _genderSuffix>>
<<set _poolTargetOnly to _poolBase + _targetSuffix>>
<<getCombatNarrative _poolFull>>
<<if _return !== "">>
<<set _weaponNarrative to _return>>
<<else>>
<<getCombatNarrative _poolGenderOnly>>
<<if _return !== "">>
<<set _weaponNarrative to _return>>
<<else>>
<<getCombatNarrative _poolTargetOnly>>
<<if _return !== "">>
<<set _weaponNarrative to _return>>
<<else>>
<<getCombatNarrative _poolBase>>
<<set _weaponNarrative to _return>>
<</if>>
<</if>>
<</if>>
<</if>>
<</if>>
<</widget>>
<<widget "selectWeaponEscalationAttack">>
<<set _sweaIdx to _args[0] || 0>>
<<set _sweaTarget to _args[1] || "kira">>
<<set _enemy to $combat.enemies[_sweaIdx]>>
<<set _escalationAttack to "basic">>
<<set _escalationNarrative to "">>
<<if _enemy && _enemy.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 _enemy.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">>
<<if _aeTarget === "kira">>
<<addKiraLust random(5, 10)>>
<<elseif _aeTarget === "player">>
<<clampStat "player.lust" random(5, 10)>>
<</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)>>
<<clampStat "companions[0].health" (-random(2, 4)) 0 100>>
<</if>>
<<case "whip" "lash" "swing" "slash" "strike" "basic" "wrap" "mark" "collar">>
<<if _aeTarget === "kira" && $clothing && $clothing.kira && ($clothing.kira.titsExposed || $clothing.kira.pussyExposed)>>
<<addKiraLust random(2, 5)>>
<<elseif _aeTarget === "player" && $clothing && $clothing.player && ($clothing.player.assExposed || $clothing.player.dickExposed)>>
<<clampStat "player.lust" random(2, 5)>>
<</if>>
<<default>>
<</switch>>
<</widget>>
<<widget "displayWeaponEscalation">>
<<set _dweIdx to _args[0] || 0>>
<<set _dwePrevTier to _args[1] || 1>>
<<set _enemy to $combat.enemies[_dweIdx]>>
<<if _enemy>>
<<getWeaponEscalationTier _dweIdx>>
<<if _weaponTier > _dwePrevTier>>
<div @class="'weapon-escalation tier-' + _weaponTier">
<<if _weaponTier === 2>>
<<combatNarrative "weapon_escalation_tier2" "His attacks are becoming more deliberate..." "escalation-notice">>
<<elseif _weaponTier === 3>>
<<combatNarrative "weapon_escalation_tier3" "The weapon has become a tool of domination." "escalation-notice">>
<</if>>
</div>
<</if>>
<</if>>
<</widget>><<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>>
<<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 _args[1]>>
<<set _thought to _args[2] || "">>
<<for _i, _comp range $companions>>
<<if _comp.id === _compId>>
<<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>><<widget "dailyUpdate">>
<<if !$vault.crisis>>
<<set $vault.crisis to {
active: false,
type: "",
daysWithoutFood: 0,
daysWithoutWater: 0,
warningGiven: false,
criticalWarningGiven: false,
expeditionForced: false
}>>
<</if>>
<<set $vault.power -= 5>>
<<set $player.hunger -= 20>>
<<set _waterNeeded to 1 + ($companions ? $companions.length : 0)>>
<<if $vault.water gte _waterNeeded>>
<<set $vault.water -= _waterNeeded>>
<<set $vault.crisis.daysWithoutWater to 0>>
<<else>>
<<set $vault.water to Math.max(0, $vault.water)>>
<<set $vault.crisis.daysWithoutWater += 1>>
<<clampStat "player.energy" (-15) 0 50>>
<<if $vault.crisis.daysWithoutWater gte 2>>
<<clampStat "player.health" (-10) 0 100>>
<</if>>
<</if>>
<<if $companions && $companions.length gt 0>>
<<set _companionFoodNeeded to $companions.length>>
<<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]>>
<<notify "error">><<print _leavingComp.name>> has left the vault due to starvation!<</notify>>
<<run $companions.splice(_i, 1)>>
<</if>>
<</for>>
<<if $vault.food === 0>>
<<notify "warning">>Not enough food for companions! They're starving.<</notify>>
<</if>>
<</if>>
<</if>>
<<if $vault.food <= 0>>
<<set $vault.crisis.daysWithoutFood += 1>>
<<if $vault.crisis.daysWithoutFood gte 2>>
<<clampStat "player.health" (-15) 0 100>>
<</if>>
<<else>>
<<set $vault.crisis.daysWithoutFood to 0>>
<</if>>
<<set _foodDays to Math.floor($vault.food / (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>>
<</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 "alert" "medium">> Non-consensual and dubious consent scenarios</li>
<li><<icon "dark" "medium">> Dark themes including survival horror</li>
<li><<icon "talk" "medium">> Strong language</li>
</ul>
<p class="legal-text">By continuing, you confirm that you are <strong>18 years of age or older</strong> and that viewing adult content is legal 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 for="player-name">What is your name?</label>
<<textbox "$player.name" "Survivor" autofocus>>
</div>
<div class="form-group">
<label for="player-age">How old are you?</label>
<div class="age-select">
<<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>>
</div>
</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 _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.",
"The bulge in your pants 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.",
"The bulge in your pants 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">
<<vchoice "Begin your story" "Prelude_Start" "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
}>>
<<set $journal = []>>
<<set $zx = {
u: false,
d: false,
f: 0,
t: null,
h: 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: 100,
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,
leader: "Selene",
quests: [],
flags: {},
hasBreedingProgram: true,
hasPublicPunishment: true
},
cobalt: {
name: "The Cobalt Archive",
color: "#3498db",
reputation: 0,
discovered: false,
leader: "Valeria",
quests: [],
flags: {}
},
crimson: {
name: "The Crimson Warband",
color: "#e74c3c",
reputation: 0,
discovered: false,
leader: "Nyx",
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: []
},
valeria: {
name: "Valeria",
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: []
},
nyx: {
name: "Nyx",
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"], previewImage: "media/backgrounds/vault/commons/day.webp" },
pleasure_den: { id: "pleasure_den", name: "The Pleasure Den", x: 28.5, y: 86.8, region: "central", type: "location", terrain: "forest", description: "A hidden bunker where survivors trade in flesh and desire.", danger: "medium", lootTier: "uncommon", unlockDay: 1, storyLocked: true, arrivalPassage: "Location_PleasureDen", connections: ["vault"] },
crossroads_central: { id: "crossroads_central", name: "Old Town", x: 46.4, y: 16, 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" },
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/day.webp" },
convoy: { id: "convoy", name: "The Wreckage", x: 65, y: 55, region: "central", type: "location", terrain: "highway", description: "A graveyard of vehicles, picked over but not empty.", danger: "medium", lootTier: "common", unlockDay: 3, arrivalPassage: "Location_Convoy", connections: ["crossroads_central"], icon: "convoy", previewImage: "media/backgrounds/wasteland/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_Ruins_Arrive", arrivalPassageAfterStory: "Location_OvergrownRuins_Return", connections: ["crossroads_central", "vault"] },
market: { id: "market", name: "Trader's Rest", x: 18.5, y: 45.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"] },
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"] },
raider_camp: { id: "raider_camp", name: "The Nest", x: 46.5, y: 66, region: "central", type: "location", terrain: "reclaimed", description: "A den of hostile scavengers. Tread carefully.", danger: "high", lootTier: "uncommon", unlockDay: 3, discoverable: true, arrivalPassage: "Location_RaiderCamp", connections: ["the_crossway", "vault"] },
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_LakeHouse", connections: ["vault"] },
crossroads_west: { id: "crossroads_west", name: "The Farmstead", x: 21, y: 15.5, region: "western", type: "junction", terrain: "reclaimed", description: "Overgrown fields and collapsed barns. Someone still tends to parts of it.", danger: "medium", unlockDay: 5, connections: ["crossroads_central", "chemical_plant", "nomad_route"] },
chemical_plant: { id: "chemical_plant", name: "The Poisoned Well", x: 23, y: 43.6, 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_ChemicalPlant", connections: ["crossroads_west"] },
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: false, arrivalPassage: "Location_NomadRoute", connections: ["crossroads_west", "crossroads_central"] },
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, connections: ["crossroads_central", "stalker_nest", "verdant_outpost"] },
stalker_nest: { id: "stalker_nest", name: "Stalker Den", x: 60.4, y: 45.6, 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_StalkerNest", connections: ["crossroads_east"] },
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_VerdantOutpost", connections: ["crossroads_east"] },
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"] },
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_HospitalRuins", connections: ["crossroads_north"] },
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"] },
mutant_colony: { id: "mutant_colony", name: "The Warren", x: 32.9, y: 46.1, 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_MutantColony", connections: ["crossroads_south"] }
},
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: []
}>>
<<set $publicUse = {
playerStatus: "free",
daysRemaining: 0,
useCount: 0,
location: "",
canRefuse: false,
companions: {}
}>>
<<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: false,
agreedWith: [],
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
},
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 = {
preludeComplete: false,
arrivedUnwillingly: false,
firstCompanionMet: false,
supernaturalDiscovered: false,
magicIsReal: false,
darkPowersUnlocked: 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,
kiraGiftGiven: false,
kiraDenied: false,
kiraCorrupted: false,
velithWatchedSex: false,
threesomeWithVelith: 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,
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"
}
}
}>>
<<if !$wardrobe.player.tops>>
<<set $wardrobe.player.tops to ["survivor_shirt"]>>
<<set $wardrobe.player.bottoms to ["cargo_pants"]>>
<<set $wardrobe.player.equippedTop to "survivor_shirt">>
<<set $wardrobe.player.equippedBottom to "cargo_pants">>
<</if>>
<<if !$wardrobe.kira.tops || $wardrobe.kira.tops === undefined>>
<<set $wardrobe.kira.tops to ["tank_top", "tactical_shirt"]>>
<<set $wardrobe.kira.bottoms to ["cargo_pants", "tactical_pants", "shorts"]>>
<<set $wardrobe.kira.equippedTop to "tank_top">>
<<set $wardrobe.kira.equippedBottom to "cargo_pants">>
<</if>>
<<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,
hiddenCache: false,
chemicalPlant: false,
buriedBunker: false,
nomadRoute: 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", "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"]
},
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", "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/",
manifests: {},
current: {
background: null,
characters: [],
event: null,
reaction: null,
effects: [],
audio: {
ambient: null,
music: null,
sfx: null
}
},
settings: {
autoplay: true,
loop: true,
muted: false,
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>>
<<initEnemySexDecisionConfig>>
<<initMaleAssaultConfig>>
<<initRaiderConfig>>
<<include "RaiderNarratives">>
<<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")>>
<</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>>
<<set $uinvEnabled to true>>
<<else>>
<<set $uinvEnabled to false>>
<</if>><<validateKiraState>><<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-<<print _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-<<print _type>>">
_contents
</div>
<</widget>>
<<widget "toast">>
<<set _message to _args[0]>>
<<set _type to _args[1] || "info">>
<<run VaultUI.toast(_message, _type)>>
<</widget>>
<<widget "toggleImmersive">>
<<run VaultUI.toggleImmersive()>>
<</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)>>
<<run console.log('[CLAMPSTAT] path=' + _csFullPath + ' current=' + _csCurrent + ' amount=' + _csAmount + ' (raw _args[1]=' + _args[1] + ') newValue=' + _csNewValue)>>
<<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]>>
<<clampStat ("combat.enemies[" + _aelIdx + "].lust") _aelAmount>>
<</if>>
<</widget>>
<<widget "clampEnemyStats">>
<<set _cesIdx to _args[0]>>
<<if $combat && $combat.enemies && $combat.enemies[_cesIdx]>>
<<set _cesEnemy to $combat.enemies[_cesIdx]>>
<<clampStat ("combat.enemies[" + _cesIdx + "].lust") 0>>
<<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)>>
<<clampStat ("combat.enemies[" + _cesIdx + "].humiliation") 0>>
<</if>>
<</widget>>
<<widget "addCorruption">>
<<set _alcAmount to _args[0] || 0>>
<<set _alcTarget to _args[1] || "player">>
<<set _alcScaled to Math.max(1, Math.round(_alcAmount * 0.25))>>
<<if _alcTarget === "player">>
<<clampStat "player.corruption" _alcScaled>>
<<checkTransformation>>
<<elseif _alcTarget === "kira" && $companions && $companions[0]>>
<<clampStat "companions[0].corruption" _alcScaled>>
<</if>>
<</widget>>
<<widget "damageKira">>
<<set _damage to _args[0] || 0>>
<<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>>
<<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 "rollCheck">>
<<set _stat to _args[0]>>
<<set _target to _args[1]>>
<<set _dice to random(1, 20)>>
<<set _total to _dice + Math.floor((_stat - 10) / 2)>>
<<set $lastRoll = {
dice: _dice,
modifier: Math.floor((_stat - 10) / 2),
total: _total,
target: _target,
success: _total >= _target,
margin: _total - _target
}>>
<</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>><<script>>
setup.characters = {
kira: {
id: "kira",
name: "Kira",
mediaPath: "media/characters/kira/base",
defaultExpression: "neutral",
expressionPrefix: "kira_",
expressions: ["neutral", "angry", "casual_neutral", "casual_smile", "flirty", "flushed", "happy", "sad", "sitting", "smile", "surprised"],
isCompanion: true,
companionIndex: 0,
showStats: {
trust: { icon: "handshake", label: "Trust" },
tension: { icon: "lightning", label: "Tension" },
lust: { icon: "lust", label: "Lust" }
},
showClothing: true,
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"],
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",
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", "interested", "haggling", "pleased"],
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"],
isCompanion: false,
showStats: {},
showClothing: false,
showBuffs: false,
dialogueColor: "#f97316",
dialogueBg: "rgba(249, 115, 22, 0.12)"
}
};
setup.speakerMap = {
"Kira": "kira",
"Groundskeeper": "groundskeeper",
"The Groundskeeper": "groundskeeper",
"Lysara": "lysara",
"Sera": "sera",
"Merchant": "merchant",
"The Merchant": "merchant",
"Succubus": "succubus",
"The Succubus": "succubus",
"Velith": "succubus",
"Raider": "raider",
"Raiders": "raider",
"The Raider": "raider"
};
setup.speakerColors = {
"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)" },
"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 = {
"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"
};
setup.getCharacter = function(id) {
return setup.characters[id] || null;
};
setup.getCharacterFromSpeaker = function(speaker) {
return setup.speakerMap[speaker] || null;
};
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("vault-entrance-interior")>>
<<run VaultUI.setTimeOfDay("morning")>>
<<run VaultUI.showCharacter("groundskeeper", "right", "welcoming")>>
The door opens at your touch. Of course it does.
Stairs descending into darkness. You follow them down.
One step. Two. Ten. Twenty.
The darkness should be absolute. Instead, lights flicker on as you pass. Ancient. Automatic. Waiting.
At the bottom - a room. Clean. Preserved.
And a figure.
<<say "???" "You made it.">>
It's not the voice from your dreams. This one is different. Older. Less seductive, more... patient.
The figure steps forward. The Groundskeeper.
You can't quite focus on him. His form seems to shift at the edges - human-shaped but somehow *more*. Or less. It's hard to tell.
<<say "Groundskeeper" "You made it. The others before you didn't.">>
<<say $player.name "Others?">>
<<say "Groundskeeper" "Later.">>
He gestures. A bed. Food. Water. The movements are precise. Mechanical. Or perhaps simply patient beyond any human measure.
<<say "Groundskeeper" "Welcome to the Vault of Duvarnach.">>
A pause. His eyes - if they are eyes - 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><<set $player.health to $player.maxHealth>>
<<set $player.energy to $player.maxEnergy>>
<<set $player.hunger to $player.maxHunger>>
<<set $groundskeeper.awakened to true>>
<<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."}>>
<<addItem _knife 1>>
<<addItem _canteen 1>>
<<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."}>>
<<addItem _lingerie 1>>
<<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.
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")>>
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")>>
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")>>
<<addItem "combat_knife" 1>>
<<set $equipped.weapon to {
id: "combat_knife",
name: "Combat Knife",
type: "weapon",
damage: 8
}>>
<<addItem "sewing_kit" 1>>
<<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.
<<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")>>
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")>>
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")>>
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.
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><<advanceTime 2 0>>
<<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 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">
<<vchoice "Ask another question" "Day1_Evening_Meal" "dialogue" "talk">>
<<vchoice "End the conversation" "Day1_Night_Quarters" "move" "door">>
</div><<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">
<<vchoice "Ask another question" "Day1_Evening_Meal" "dialogue" "talk">>
<<vchoice "End the conversation" "Day1_Night_Quarters" "move" "door">>
</div><<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">
<<vchoice "Ask another question" "Day1_Evening_Meal" "dialogue" "talk">>
<<vchoice "End the conversation" "Day1_Night_Quarters" "move" "door">>
</div><<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">
<<vchoice "Ask another question" "Day1_Evening_Meal" "dialogue" "talk">>
<<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.
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>>
The woman from before. Horns curling from her temples. Wings folded behind her. Beautiful. Terrifying.
<<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", "thinking")>>
<<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", "suspicious")>>
<<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.
<<relationChange "kira" "trust" 2>>
<<relationChange "kira" "affection" 1>>
<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><<set $time.day to 2>>
<<setTime 7 0>>
<<set $player.health to Math.min($player.maxHealth, $player.health + 30)>>
<<set $player.energy to $player.maxEnergy>>
<<run VaultUI.setSceneMode(null)>>
<<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. They don'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.">>
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.">>
They input 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.">>
They input 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.
<<set $vault.power -= 15>>
<<notify "warning">>Vault power decreased by 15%<</notify>>
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")>>
You reach the entrance chamber as the survivor collapses.
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", "wounded")>>
<<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.
She's lighter than you expected. Too light. When did she last eat?
<<say "Woman" "...bastard...">>
But she doesn't fight. Can't fight. Her head lolls against your shoulder.
You carry her through the corridors to the medical bay, the Groundskeeper following in perfect silence.
<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", "wounded")>>
The medical bay activates as you enter. Automatic. Anticipatory.
You lay her on a bed. The Groundskeeper connects equipment - tubes, monitors, devices you don't recognize. Their movements are identical each time. Exact.
<<say "Groundskeeper" "Wound requires cleaning. Closure. Vault systems will assist. However.">>
They pause. 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", "wounded")>>
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>>
For a moment - just a moment - her wound itself seems to glow. A faint violet luminescence around the torn edges of flesh.
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.">>
You wait in the commons. Hours pass. The lights flicker occasionally - the healing process draining power.
<<set $vault.power -= 5>>
Finally, the Groundskeeper appears in the doorway. You didn't hear them 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("morning")>>
<<run VaultUI.hideAllCharacters()>>
<h2>Storage Room</h2>
You return to the storage area, this time looking for clothes that might fit her.
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("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>
<<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("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")>>
<<run VaultUI.setTimeOfDay("morning")>>
<<run VaultUI.showCharacter("kira", "center", "wounded")>>
She's still asleep. You set the clothes on a nearby chair where she'll see them when she wakes.
<<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><<advanceTime 3 0>>
<<run VaultUI.setBackground("medical")>>
<<run VaultUI.setTimeOfDay("afternoon")>>
<<run VaultUI.showCharacter("kira", "center", "hostile")>>
Her eyes snap open.
In one motion, she's off the bed, crouched, looking for a weapon, looking for threats.
<<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. "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", "suspicious")>>
<<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.
Then her eyes dart down. At her ruined clothes. At how much skin is showing through the tears.
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 _kiraTrustBonus 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>>
<p class="thought">You imagine what's happening behind you. Her pulling off the ruined shirt. Bare skin. The new clothes sliding on. 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]>>
<<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.
<<if !$flags.kiraIntroduced>>
<<set $flags.kiraIntroduced to true>>
<<set _kira = {
id: "kira",
name: "Kira",
age: 24,
description: "A lean, sharp-eyed survivor with close-cropped dark hair and a scar across her left cheek. 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"],
personality: ["pragmatic", "guarded", "dry humor", "loyal once earned"],
thoughts: ["Who are these people? What do they really want?"],
currentLocation: "medical",
mood: "hostile",
outfit: "torn scavenger gear",
claimed: false,
pregnant: false
}>>
<<run $companions.push(_kira)>>
<<randomizeKinks "kira" 2>>
<<if def _kiraTrustBonus>>
<<addTrust "kira" _kiraTrustBonus>>
<</if>>
<<if def _kiraClothingTrustBonus>>
<<addTrust "kira" _kiraClothingTrustBonus>>
<<addAffection "kira" _kiraClothingAffectionBonus>>
<</if>>
<<notify "info">>Kira has joined the vault. Relationship: Hostile (-10 trust)<</notify>>
<</if>>
<div class="choice-container">
<<vchoice "Ask what was chasing her" "Day2_Kira_Pursuers" "talk" "talk">>
<<vchoice "Offer to show her around" "Day2_Kira_Tour_Offer" "talk" "talk">>
</div><<run VaultUI.showCharacter("kira", "center", "suspicious")>>
<<say $player.name "What was chasing you out there?">>
Her expression darkens.
<<say "Kira" "Scavvers. Raiders. Whatever you want to call them." She touches her side. "Caught me off guard. Stupid. Won't happen again.">>
<<say $player.name "They looked... wrong. On the monitor.">>
<<say "Kira" "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.">>
Kira's eyes snap to the Groundskeeper.
<<say "Kira" "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">
<<vchoice "Ask about the Convergence" "Day2_Kira_Convergence" "talk" "talk">>
<<vchoice "Offer to show her around" "Day2_Kira_Tour_Offer" "talk" "talk">>
</div><<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 "Kira" "Wait.">>
You turn back.
<<say "Kira" "...Thank you. For opening the door." She looks away. "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 "Kira" "Maybe.">>
<<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", "suspicious")>>
<<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.
Finally, footsteps. Kira appears in the doorway, looking more composed. She's found clothes somewhere - practical, functional. Her hair is tied back.
<<run VaultUI.showCharacter("kira", "right", "neutral")>>
<<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. "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", "suspicious")>>
<<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. "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. "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", "suspicious")>>
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", "suspicious")>>
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.
<<say "Kira" "You want labor? I can work. You want a fighter? I can fight. You want..." She hesitates. "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. "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", "suspicious")>>
<<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.">>
<<say "Kira" "How do you know my name?">>
<<say "Groundskeeper" "Data acquisition: standard monitoring protocols.">>
The Groundskeeper turns to you. Their 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.">>
They don't elaborate further. But you notice them watching Kira throughout the meal - quick glances when they think 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.">>
They depart. 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 creatures 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. "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.
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")>>
The succubus emerges from the shifting forms. Solid. Present.
<<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.">>
She reaches for you. Her touch burns with pleasure.
<<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><<set $time.day to 3>>
<<setTime 7 0>>
<<set $player.health to Math.min($player.maxHealth, $player.health + 30)>>
<<set $player.energy to $player.maxEnergy>>
<<run VaultUI.setSceneMode(null)>>
<<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", "thinking")>>
<<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.">>
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", "thinking")>>
<<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. "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. Their 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", "suspicious")>>
<<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", "slight-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 maybe ten when everything fell apart.">>
<<say $player.name "That's... a whole life lived in chaos.">>
<<say "Kira" "It's the only life I know.">>
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.">>
They indicate a corner of the storage area. Old crates, covered in dust. The gesture is identical to every other gesture they've 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.">>
They depart. 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.
<<set _food to {id: "preserved_food", name: "Preserved Food", type: "consumable", description: "Pre-Cataclysm rations, still edible.", effect: "hunger", value: 30}>>
<<set _tools to {id: "basic_tools", name: "Basic Tools", type: "misc", description: "Screwdrivers, wrenches, and other useful tools."}>>
<<set _meds to {id: "medical_supplies", name: "Medical Supplies", type: "consumable", description: "Bandages and antiseptic.", effect: "health", value: 20}>>
<<addItem _food 3>>
<<addItem _tools 1>>
<<addItem _meds 2>>
<<notify "info">>Found: Preserved Food x3, Basic Tools, Medical Supplies x2<</notify>>
And then...
<<run VaultUI.showCharacter("kira", "center", "thinking")>>
<<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>
<<set _lingerie to {id: "pre_cataclysm_lingerie", name: "Pre-Cataclysm Lingerie", type: "intimate", description: "Delicate, preserved lingerie from before the world ended. Surprisingly well-maintained."}>>
<<set _toy to {id: "intimate_toy", name: "Intimate Toy", type: "intimate", description: "A personal pleasure device. Still functional after all these years."}>>
<<addItem _lingerie 2>>
<<addItem _toy 1>>
<<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.
<div class="narrative-image small">
<img src="assets/images/narrative/kira-blushing.webp" alt="Kira looks away, embarrassed">
</div>
<<relationChange "kira" "affection" 1>>
<div class="choice-container">
<<vchoice "Continue searching" "Day3_Midday_Discovery" "examine" "search">>
</div><<run VaultUI.showCharacter("kira", "center", "suspicious")>>
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 a small crystal, glowing faintly purple.
<div class="narrative-image-row">
<div class="narrative-image">
<img src="assets/images/narrative/discovery-journal.webp?v=2" alt="Old Journal">
</div>
<div class="narrative-image mysterious">
<img src="assets/images/narrative/discovery-crystal.webp?v=2" alt="Glowing Purple Crystal">
</div>
</div>
<<set $flags.foundOldJournal to true>>
<<set $flags.foundPurpleCrystal to true>>
<<set _journal to {id: "mysterious_journal", name: "Mysterious Journal", type: "quest", description: "An old journal with handwritten notes. The symbols match those on the sealed doors."}>>
<<set _crystal to {id: "purple_crystal", name: "Purple Crystal", type: "quest", description: "A small crystal that glows with faint purple light. Warm to the touch."}>>
<<addItem _journal 1>>
<<addItem _crystal 1>>
<<notify "info">>Found: Mysterious Journal, Purple Crystal<</notify>>
<div class="choice-container">
<<vchoice "Read the journal" "Day3_Discovery_Journal" "examine" "book">>
<<vchoice "Examine the crystal" "Day3_Discovery_Crystal" "examine" "crystal">>
<<vchoice "Show the Groundskeeper" "Day3_Discovery_Groundskeeper" "move" "run">>
</div>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 "Examine the crystal" "Day3_Discovery_Crystal" "examine" "crystal">>
<<vchoice "Show the Groundskeeper" "Day3_Discovery_Groundskeeper" "move" "run">>
</div><<run VaultUI.showCharacter("kira", "center", "worried")>>
The crystal pulses with inner light. Purple, like everything else in this place.
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")>>
The Groundskeeper examines the journal. The crystal. Their 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.">>
They regard 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")>>
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.">>
Three 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.">>
He steps closer. His movements are wrong. Jerky. Like something else is wearing his body.
<<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")>>
<<say "Kira" "Corrupted. Their eyes - see how they glow? They're not fully human anymore.">>
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")>>
You scan the ruins. A collapsed section behind you. A narrow gap between walls.
<<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,
romanceStage: 0
}>>
<<if !$companions>><<set $companions to []>><</if>>
<<run $companions.push(_kira)>>
<<randomizeKinks "kira" 2>>
<</if>>
<<createEnemy "raider">>
<<set _raider1 to clone(_returnEnemy)>>
<<createEnemy "raider_scout">>
<<set _raider2 to clone(_returnEnemy)>>
<<set $combat.active to true>>
<<set $combat.turn to 1>>
<<set $combat.phase to "player">>
<<set $combat.enemies to [_raider1, _raider2]>>
<<set $combat.companionInCombat to "kira">>
<<set $combat.canFlee to true>>
<<set $combat.canSeduce to false>>
<<set $combat.log to []>>
<<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.defending to false>>
<<set $combat.dodging to false>>
<<set $combat.combo to {count: 0, lastAction: "", target: -1, bonus: 0}>>
<<set $combat.positions to {player: "standing", kira: "standing"}>>
<<set $combat.playerDazed to false>>
<<set $combat.playerDazedTurns to 0>>
<<set $combat.playerStunned to 0>>
<<set $combat.kiraInRefractory to false>>
<<set $combat.kiraRefractoryTurns to 0>>
<<if $companions && $companions[0] && $companions[0].health <= 1>>
<<set $combat.kiraIncapacitated to true>>
<<else>>
<<set $combat.kiraIncapacitated to false>>
<</if>>
<<run document.body.classList.add("scene-mode-combat")>>
<<run VaultUI.showCharacter("kira", "left", "combat-ready")>>
<<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">
<<set _enemyImgAlt to _enemy.name>>
<<set _enemySprite to (_enemy.id === 'raider_scout' ? 'threatening' : 'attacking')>>
<img @src="'assets/images/char/raider/' + _enemySprite + '.webp'" @alt="_enemyImgAlt">
<div class="enemy-info">
<div class="enemy-name"><<print _enemy.name>></div>
<<statbar _enemy.health _enemy.maxHealth "#e74c3c">>
</div>
</div>
<</for>>
</div>
<<goto "Combat_Actions">><<run VaultUI.setBackground("prelude/reclaimed-day")>>
<<run VaultUI.setTimeOfDay("afternoon")>>
<<run VaultUI.showCharacter("kira", "left", "thinking")>>
You gather what you came for quickly. Neither of you wants to stay.
The walk back is quiet. Kira keeps glancing at you.
<<say "Kira" "Whatever that was... it saved us. But-">>
<<say $player.name "But it's connected to whatever's happening to me.">>
<<say "Kira" "The succubus. The marks. The vault choosing you.">>
<<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", "thinking")>>
<<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. "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.
You're left with Kira in the commons. Evening light through the artificial windows.
<<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.">>
She laughs. Quiet, but real. The first genuine laugh you've heard from her.
<<run VaultUI.showCharacter("kira", "center", "slight-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.">>
She looks at you. Something shifts in her expression.
<<run VaultUI.showCharacter("kira", "center", "slight-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.
She freezes. Doesn't pull away. Doesn't move closer.
<<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.
You sit like that for a moment. Not speaking. Just... connected.
<div class="choice-container">
<<vchoice "Continue the moment" "Day3_Evening_Moment" "intimate" "clock">>
</div><<run VaultUI.showCharacter("kira", "center", "neutral")>>
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")>>
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 purple crystal hidden 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")>>
She's there. The succubus. More solid than ever.
<<say "Succubus" "Finally. We can truly speak.">>
She circles you. Her form is beautiful, terrifying - curves and shadows, horns and wings, eyes that burn with violet hunger.
<<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("morning")>>
<<run VaultUI.hideAllCharacters()>>
You wake gasping.
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 4>>
<<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><<set $time.day to 4>>
<<setTime 7 0>>
<<set $player.health to Math.min($player.maxHealth, $player.health + 30)>>
<<set $player.energy to $player.maxEnergy>>
<<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>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 you scouted days ago.
<<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 we scouted? 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 "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 "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.
<div class="choice-container">
<<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("afternoon")>>
The Overgrown Ruins.
You've seen it from a distance before. Crumbling walls choked with mutated vines. Stone that predates the Cataclysm.
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><<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.
Not metaphorically. She MATERIALIZES from nothing. Shadow and desire given form.
<div class="scene-media">
<video autoplay loop muted playsinline>
<source src="media/characters/succubus/story/appearance.webm" type="video/webm">
</video>
</div>
<<showCharacter "succubus" "center" "seductive">>
Horns curving elegantly from dark hair. Wings folded behind her, leather-soft and vast. Skin that seems to drink in the purple light. Eyes that glow violet and HUNGRY.
She's naked save for fragments of shadow that cling like clothing. Every curve is weaponized. Every line designed to make you want.
She shouldn't be real.
<<say "???" "Finally." "supernatural">>
Her voice is silk and smoke.
<<say "???" "Someone who can SEE me." "supernatural">>
Your body responds before your mind catches up. Heat flooding through you. Need like you've never felt.
<<clampStat "player.lust" 30>>
She steps closer. Each movement is liquid grace.
<<say "???" "Oh, you're DELICIOUS. All that untapped potential." "supernatural">>
A smile that promises things.
<<say "???" "You don't even know what you are, do you?" "supernatural">>
<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><<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—">>
And then SHE appears.
<<showCharacter "succubus" "center" "amused">>
The demon. Horns. Wings. Perfect and terrible.
<<say "???" "Oh. You brought a friend." "supernatural">>
Kira raises her weapon, but her hands are shaking.
The succubus laughs. Not mocking. Delighted.
<<say "???" "Precious. But THIS one..." "supernatural">>
She looks at you. Through you.
<<say "???" "...is the one I've been waiting for." "supernatural">>
<<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.">>
Velith laughs. Delighted.
<<say "Velith" "Oh, how NOBLE. Protecting your little mortal friend." "supernatural">>
She doesn't seem threatened. If anything, she's amused.
<<say "Velith" "Fine. She's not the one I want anyway." "supernatural">>
<<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.">>
Velith's smile widens.
<<say "Velith" "Oh, you sweet thing. So quick to sacrifice yourself." "supernatural">>
She waves a hand. Kira slumps against the wall, eyes glazed but unharmed.
<<say "Velith" "Don't worry. She won't remember this. But YOU..." "supernatural">>
She focuses entirely on you.
<<say "Velith" "You, I'll make sure remember EVERYTHING." "supernatural">>
<<addTrust "kira" 1>>
<<set $flags.sacrificedForKira to true>>
<div class="choice-container">
<<vchoice "Continue" "Day4_Succubus_Choice" "move" "map">>
</div><<say $player.name "What ARE you?">>
<<say "Succubus" "What am I?" "supernatural">>
She spreads her wings. The span fills the chamber.
<<say "Succubus" "Demon. Spirit. The thing that visits men's dreams. Pick your label." "supernatural">>
<<say "Succubus" "I am hunger given form. Desire made flesh. The dark at the edge of lust." "supernatural">>
She's right in front of you now. So close you can feel her warmth.
<<say "Succubus" "And you... you are MINE." "supernatural">>
<div class="choice-container">
<<vchoice "Continue" "Day4_Succubus_Choice" "move" "map">>
</div><<say $player.name "Stay back!">>
She tilts her head. Not threatened. Curious.
<<say "Succubus" "Such fear. Mixed with such WANT." "supernatural">>
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." "supernatural">>
<div class="choice-container">
<<vchoice "Continue" "Day4_Succubus_Choice" "move" "map">>
</div>You can't speak. Can barely breathe.
She's impossible. But she's REAL.
<<say "Succubus" "Yes. Drink me in." "supernatural">>
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." "supernatural">>
<<clampStat "player.lust" 10>>
<div class="choice-container">
<<vchoice "Continue" "Day4_Succubus_Choice" "move" "map">>
</div>She steps even closer. Every nerve in your body screams — half warning, half WANT.
<<say "Succubus" "I could show you things. Teach you what you're becoming." "supernatural">>
Her hand rises, not quite touching your face. You feel heat radiating from her palm.
<<say "Succubus" "All I ask is a taste..." "supernatural">>
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><<say $player.name "What do you mean, what I'm becoming?">>
<<say "Succubus" "Oh, sweet thing. You don't know, do you?" "supernatural">>
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." "supernatural">>
<<say "Succubus" "Some were touched by that breaking. Marked. Changed at a level deeper than flesh." "supernatural">>
She stops in front of you again.
<<say "Succubus" "You're one of them. One of US." "supernatural">>
<<say $player.name "I'm not a demon.">>
<<say "Succubus" "Not yet. But the seed is there. Waiting. And I can help it BLOOM." "supernatural">>
<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.
Her smile could ignite cities.
<<say "Succubus" "Oh, you beautiful thing. I'm going to ruin you in the best possible way." "supernatural">>
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.
Then she laughs. Not mocking. Genuine delight.
<<say "Succubus" "Oh, you DELICIOUS thing. Resisting when every cell in your body is screaming YES." "supernatural">>
She doesn't pursue.
<<say "Succubus" "I like you even more now." "supernatural">>
<<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">>
<div class="scene-media">
<video autoplay loop muted playsinline>
<source src="media/characters/succubus/story/seduction.webm" type="video/webm">
</video>
</div>
Her lips meet yours.
It's not a human kiss. There's POWER in it. Energy that crackles between you.
<<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 "Velith" "Yes. Let me TASTE you." "supernatural">>
She pushes you back against stone. The symbols around you flare brighter.
<<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) 0 100>>
Your vision goes purple at the edges.
<<sexPhase "action">>
<<performSexAct "grind">>
Her body moves against yours. Impossible heat. Supernatural friction.
<<say "Velith" "More. Give me MORE." "supernatural">>
You're losing yourself in her. Boundaries dissolving.
<<performSexAct "penetrate">>
<div class="scene-media">
<video autoplay loop muted playsinline>
<source src="media/characters/succubus/story/sex_scene_doggy.webm" type="video/webm">
</video>
</div>
When you enter her, the world SHIFTS. Power floods both ways. She gasps — actually GASPS.
<<say "Velith" "Oh... you really ARE special..." "supernatural">>
<<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">>
<div class="scene-media">
<video autoplay loop muted playsinline>
<source src="media/characters/succubus/story/feeding_climax.webm" type="video/webm">
</video>
</div>
The orgasm rips through you both. Purple light EXPLODES outward. Every symbol in the chamber ignites.
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) 0 100>>
<<set $player.lust to 0>>
<div class="choice-container">
<<vchoice "Aftermath" "Day4_Succubus_Aftermath_Accept" "move" "map">>
</div><<sexPhase "aftermath">>
<div class="scene-media">
<video autoplay loop muted playsinline>
<source src="media/characters/succubus/story/aftermath.webm" type="video/webm">
</video>
</div>
<<showCharacter "velith" "center" "satisfied">>
She's draped across stone like a satisfied cat. Wings spread. Absolutely radiant.
<<say "Velith" "Mmm. DELICIOUS." "supernatural">>
You're trying to remember how to breathe.
<<say "Velith" "You fed me so well, sweet thing. And in return..." "supernatural">>
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." "supernatural">>
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." "supernatural">>
She leans close. Whispers her name like a secret.
<<say "Velith" "My name is Velith. Remember it. You'll be screaming it often enough." "supernatural">>
<div class="choice-container">
<<vchoice "She fades" "Day4_Awakening_Systems" "move" "map">>
</div><<run document.body.classList.remove("scene-mode-supernatural")>>
She regards you with something like respect.
<<say "Succubus" "Strong will. I can work with that." "supernatural">>
She raises a hand. Before you can react, she touches your forehead.
Pain. Pleasure. KNOWLEDGE flooding in.
<<say "Succubus" "A gift. For your restraint." "supernatural">>
<<addCorruption 5>>
When you can see again, she's still there.
<<say "Succubus" "My name is Velith. And this isn't over between us." "supernatural">>
<<say "Velith" "I've marked you. Gently. You'll dream of me. And eventually..." "supernatural">>
She smiles.
<<say "Velith" "You'll say yes." "supernatural">>
<div class="choice-container">
<<vchoice "She vanishes" "Day4_Awakening_Systems" "move" "map">>
</div><<run VaultUI.setBackground("reclaimed-ruins")>>
<<run VaultUI.setTimeOfDay("afternoon")>>
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 15>>
<<set $player.lust to 40>>
<<else>>
<<set $player.corruption to 5>>
<<set $player.lust to 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><<run VaultUI.setBackground("reclaimed-ruins")>>
<<run VaultUI.setTimeOfDay("afternoon")>>
<div class="system-prompt">
<h3>A Door Has Opened</h3>
<p>The world contains more than you knew. Forces beyond human understanding. Powers that twist and change.</p>
<p>Do you want to explore its darker nature?</p>
<p><em>This enables supernatural sexual content including: succubus encounters, corruption mechanics, transformation elements, and magical beings.</em></p>
<p class="note">You can change this later in settings.</p>
<div class="choice-container">
<<vchoice "Yes — embrace the darkness" "Day4_Supernatural_Yes" "intimate" "marked">>
<<vchoice "No — stay grounded in reality" "Day4_Supernatural_No" "action" "armor">>
</div>
</div><<set $extremeContent.supernatural to true>>
You feel the change settle into your bones. This is who you are now.
The darkness doesn't frighten you. It CALLS to you.
<<addCorruption 2>>
<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><<set $extremeContent.supernatural to false>>
You close that door. For now.
Whatever Velith awakened, you'll keep it contained. Controlled.
<<set $player.willpower += 5>>
<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 outside, 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 $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.">>
<<say "Kira" "Fine? FINE? Your eyes are glowing!">>
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("evening")>>
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>>
<<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.">>
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>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.">>
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("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, tail, 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 saw me with the succubus. Saw 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">>
She's waiting. Of course she is.
<<say "Velith" "Did you think one meeting would be enough?" "supernatural">>
She's draped across nothing, suspended in dream-space.
<<say "Velith" "I'm in you now. A seed planted. And seeds... grow." "supernatural">>
She traces a finger down your dream-body. You shudder.
<<say "Velith" "I'll visit often. Teach you. SHAPE you. Until you're ready." "supernatural">>
<<say $player.name "Ready for what?">>
<<say "Velith" "To become what you were always meant to be." "supernatural">>
<<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 5>>
<<goto "Day5_Morning_Wake">><<set $time.day to 5>>
<<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>>
<<if $flags.kiraSnapPending>>
<<set $flags.kiraSnapPending to false>>
<<goto "Kira_Tension_Snap">>
<</if>>
<<if $flags.mutualSnapPending>>
<<set $flags.mutualSnapPending to false>>
<<goto "Mutual_Snap_Scene">>
<</if>>
<<if $arousal.player.edging && $arousal.player.daysAtHigh >= 5>>
<<goto "Event_Forced_Release">>
<</if>>
<<if $flags.playerTierUpPending>>
<<set $flags.playerTierUpPending to false>>
<<goto "Event_Exhib_Tier_Up_Player">>
<</if>>
<<if $flags.kiraTierUpPending>>
<<set $flags.kiraTierUpPending to false>>
<<goto "Event_Exhib_Tier_Up_Kira">>
<</if>>
<<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>>The mirror shows... you.
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.">>
<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.">>
He pulls out an old book. Opens to a page with a symbol that makes your eyes water.
<<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.">>
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.">>
<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.">>
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...">>
Beyond: shelves of strange tomes. A table with crystals. Symbols that pulse with power.
<<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("mystical")>>
<<run VaultUI.hideCharacter("kira")>>
The hidden library hums with energy.
Books in languages you shouldn't understand. But somehow, you CAN.
<<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.">>
<<addItem "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 pulled me out of that raider camp.">>
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><<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.">>
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">>
<<say "Velith" "You've been learning. Good." "supernatural">>
She circles you in the dream-space.
<<say "Velith" "The Groundskeeper told you some truth. But not all of it." "supernatural">>
<<say $player.name "What didn't he tell me?">>
<<say "Velith" "That the transformation can be... pleasurable. If you embrace it." "supernatural">>
Her hand trails across your dream-body.
<<say "Velith" "Sleep well, sweet thing. Tomorrow brings new awakenings." "supernatural">>
<div class="choice-container">
<<vchoice "Wake" "Day5_Wake_Day6" "move" "sunrise">>
</div><<set $time.day to 6>>
<<goto "Day6_Morning_Wake">><<set $time.day to 6>>
<<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>>
<<if $flags.kiraSnapPending>>
<<set $flags.kiraSnapPending to false>>
<<goto "Kira_Tension_Snap">>
<</if>>
<<if $flags.mutualSnapPending>>
<<set $flags.mutualSnapPending to false>>
<<goto "Mutual_Snap_Scene">>
<</if>>
<<if $arousal.player.edging && $arousal.player.daysAtHigh >= 5>>
<<goto "Event_Forced_Release">>
<</if>>
<<if $flags.playerTierUpPending>>
<<set $flags.playerTierUpPending to false>>
<<goto "Event_Exhib_Tier_Up_Player">>
<</if>>
<<if $flags.kiraTierUpPending>>
<<set $flags.kiraTierUpPending to false>>
<<goto "Event_Exhib_Tier_Up_Kira">>
<</if>>
<<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.
Your hand grazes her hip. She freezes. You freeze.
<<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">
<<vchoice "\"No. Not really.\"" "Day6_Tension_Build" "intimate" "broken-heart">>
<<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><<say $player.name "No. Not really.">>
<<say "Kira" "No?">>
<<say $player.name "Dreams are... intense. But they're not real. Not REAL real.">>
You're looking at each other now. The space between you feels charged.
<<say "Kira" "And you want... real?">>
Her voice is barely above a whisper.
<<addTension "kira" 15>>
<<if $companions[0].tension gte 65>>
She stands. Closer now.
<<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.">>
She closes the distance. Her lips find yours.
<div class="choice-container">
<<vchoice "..." "Day6_Kiss_Continue" "intimate" "affection">>
</div>You close the distance.
Your lips meet hers.
<div class="choice-container">
<<vchoice "..." "Day6_Kiss_Continue" "intimate" "affection">>
</div>She melts into you.
Her hands find your hair. Your arms circle her waist.
It's not like kissing 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">>
<<say "Velith" "You kissed her." "supernatural">>
Not a question. She KNOWS.
<<say "Velith" "How sweet. Human affection." "supernatural">>
She's not jealous. Entertained.
<<say "Velith" "Don't worry, sweet thing. I'm not the possessive type. Fuck whoever you want." "supernatural">>
<<say "Velith" "Just remember who owns your SOUL." "supernatural">>
She laughs. Fades.
<div class="choice-container">
<<vchoice "Morning comes" "Day6_Wake_Day7" "move" "sunrise">>
</div><<set $time.day to 7>>
<<goto "Day7_Morning_Wake">><<set $time.day to 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>>
<<if $flags.kiraSnapPending>>
<<set $flags.kiraSnapPending to false>>
<<goto "Kira_Tension_Snap">>
<</if>>
<<if $flags.mutualSnapPending>>
<<set $flags.mutualSnapPending to false>>
<<goto "Mutual_Snap_Scene">>
<</if>>
<<if $arousal.player.edging && $arousal.player.daysAtHigh >= 5>>
<<goto "Event_Forced_Release">>
<</if>>
<<if $flags.playerTierUpPending>>
<<set $flags.playerTierUpPending to false>>
<<goto "Event_Exhib_Tier_Up_Player">>
<</if>>
<<if $flags.kiraTierUpPending>>
<<set $flags.kiraTierUpPending to false>>
<<goto "Event_Exhib_Tier_Up_Kira">>
<</if>>
<<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")>>
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.">>
She circles you. Predatory.
<<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.">>
She gestures to a sheltered alcove in the ruins nearby.
<<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">>
The scout is professional. Efficient. She undresses without ceremony.
<<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">
<<vchoice "\"Let me taste you\"" "Day7_Scout_Oral" "intimate" "lips">>
<<vchoice "\"Get on your knees\"" "Day7_Scout_Dominant" "intimate" "crown">>
<<vchoice "\"Quick and dirty\"" "Day7_Scout_Fast" "intimate" "rapid-strikes">>
</div><<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.">>
<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.
<<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.">>
<<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.
<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.
<<addItem "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 $factions.verdant.reputation += 10>>
<<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>><<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 "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.">>
<<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.
Her arms around your neck. Your hands in her hair.
This kiss is different from before. 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><<sexScene "kira" "romantic" "passionate" "quarters-night">>
<<say $player.name "I won't.">>
Clothes come off. Fast. Desperate.
<<performSexAct "undress_partial">>
<<showCharacter "kira" "center" "aroused">>
She's beautiful. Scars and all. 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">>
<em>First time with Kira. Make it count.</em>
<<performSexAct "oral_give">>
You taste her. She cries out, hands gripping your hair.
<<say "Kira" "Oh fuck— please—">>
<<performSexAct "penetrate">>
When you enter her, she looks into your eyes.
<<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">>
Tangled together. Sweat cooling.
<<say "Kira" "That was...">>
<<say $player.name "Yeah.">>
She laughs. Soft.
<<say "Kira" "Worth the wait.">>
She curls against you.
<<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>>
<div class="choice-container">
<<vchoice "Sleep together" "Day7_Dream_End" "intimate" "night">>
</div><<run VaultUI.setBackground("prelude/dream-void")>>
<<run VaultUI.setTimeOfDay("peaceful")>>
For once, Velith doesn't visit.
The dreams are quiet. Peaceful.
Just you and Kira, tangled in warmth.
<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><<set $time.day to 8>>
<<goto "Vault_Hub">><<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 $time.day to 8>>
<<setTime 7 0>>
<<goto "Day7_Dream">><<run VaultUI.setBackground("prelude/dream-void")>>
<<run VaultUI.setTimeOfDay("supernatural")>>
<<showCharacter "velith" "center" "pleased">>
<<say "Velith" "Sex as currency. Delicious." "supernatural">>
She's lounging in dream-space.
<<say "Velith" "You're learning. Embracing what you are." "supernatural">>
<<say "Velith" "Soon, sweet thing. Soon you'll be ready for more." "supernatural">>
<div class="choice-container">
<<vchoice "Wake to Day 8" "Day7_Wake_Day8" "move" "sunrise">>
</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.">>
She gestures to a padded bench. You obey.
She kneels between your legs, producing a small key. Her face is inches from your caged cock.
<<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—
Then Lysara's hand wraps around it.
<<say $player.name "Wait— what are you—">>
<<say "Lysara" "Checking something.">>
She strokes. Once. Twice.
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.">>
She continues stroking. Your cock throbs in her grip.
<<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.
<<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...">>
She leans forward, her lips hovering over your cock.
<<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.">>
She wraps her lips around your tip.
<<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.
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.
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.
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>>
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>>
Her tongue swirls. Her lips slide. She takes you deep, deeper, until her nose presses against your pelvis.
<<say "Lysara" "Mmmmph...">>
The vibration of her moan around your cock nearly ends you right there.
<<set $player.lust to 100>>
She bobs her head. Slow at first, then faster. Her hands grip your thighs, nails digging in.
<<if $flags.survivedAgonyPath>>
After three 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—">>
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.
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.
When it finally ends, you slump back on the bench, gasping, trembling, completely spent.
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.
<<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>>
<<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—">>
Cum splashes across her face. Her cheek. Her lips. Her chin. Another rope catches her neck, dripping down toward her cleavage.
<<say $player.name "OH FUCK— SORRY— I—">>
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.
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.">>
She runs a finger through the cum on her cheek and examines it.
<<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>>
<<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 calmly wipes your cum from her face with 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.">>
She stands, smoothing her skirt. As if she didn't just give you the blowjob of your life.
<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>>
<<run UInv.AddItem("player", "resurgence elixir")>>
<<set $flags.lysaraOwesPrice to true>>
<div class="choice-container">
<<vchoice "\"How do I find you again?\"" "Lysara_Lab_Access" "talk" "door-handle">>
</div><<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>>
<<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 $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">>
<p class="notification">New location unlocked: Alchemy Lab (via Archives)</p>
<div class="choice-container">
<<vchoice "Return to the vault" "Kira_Room_With_Potion" "move" "door-handle">>
</div><<run VaultUI.setBackground("quarters")>>
<<run VaultUI.setTimeOfDay("day")>>
<h2>Kira's Room</h2>
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 "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>>
<<vchoice "Leave" "Vault_Hub" "move" "door-handle">>
</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">
<<if $flags.hasResurgenceElixir>>
<<vchoice "Use the Resurgence Elixir" "Kira_Awakening" "action" "potion">>
<</if>>
<<vchoice "Leave" "Vault_Hub" "move" "door-handle">>
</div><<run document.body.classList.add("scene-mode-intimate")>>
<<addCorruption 3>>
You approach the bed. Your hand hovers over her body.
<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>Your fingers brush her cheek. Soft. Warm.
<<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.
<<run document.body.classList.remove("scene-mode-intimate")>>
<div class="choice-container">
<<if $flags.hasResurgenceElixir>>
<<vchoice "Use the Resurgence Elixir" "Kira_Awakening" "action" "potion">>
<</if>>
<<vchoice "Leave" "Vault_Hub" "move" "door-handle">>
</div><<addCorruption 5>>
<<set $flags.gropedComaKira to true>>
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)>>
You cup her breast through her shirt. Squeeze gently.
Nothing.
<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.
<<run document.body.classList.remove("scene-mode-intimate")>>
<div class="choice-container">
<<if $flags.hasResurgenceElixir>>
<<vchoice "Use the Resurgence Elixir" "Kira_Awakening" "action" "potion">>
<</if>>
<<vchoice "Leave" "Vault_Hub" "move" "door-handle">>
</div><<run VaultUI.setBackground("quarters")>>
<<run VaultUI.setTimeOfDay("day")>>
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("quarters")>>
<<run VaultUI.setTimeOfDay("day")>>
<<set $flags.hasResurgenceElixir to false>>
<<run UInv.DeleteItem("player", "resurgence elixir")>>
<<set $flags.kiraResurgenceUsed to true>>
<h2>Awakening</h2>
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—
Her eyes FLY open.
<<run VaultUI.showCharacter("kira", "center", "shocked")>>
<<say "Kira" "GASP—">>
She bolts upright, nearly headbutting you. Her hands grab your arms, grip tight.
<<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?">>
<div class="choice-container">
<<vchoice "\"A couple of days. 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 "A couple of days. You were in some kind of coma. The vault's protection, apparently.">>
<<say "Kira" "Days? I was out for DAYS?">>
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", "tired")>>
<<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">>
Kira tries to stand. Her legs wobble and she nearly falls.
<<say $player.name "Whoa—easy.">>
You catch her, lowering her back to the bed.
<<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>>
You pull the chair close to her bed.
<<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("quarters")>>
<<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>>
<<set $flags.kiraSecondResurgenceUsed to true>>
<<set $flags.lysaraDebtIncurred to ($flags.lysaraDebtIncurred || 0) + 1>>
<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><<run VaultUI.setBackground("archives")>>
<<run VaultUI.setTimeOfDay("dim")>>
<h2>The Alchemy Laboratory</h2>
You descend through the hidden passage into Lysara's domain.
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.
<<say "Lysara" "Back again. Did you wake your companion?">>
<<if $flags.kiraAwakened>>
<<say $player.name "She's awake. Thank you.">>
<<say "Lysara" "Good. Remember—the next potion has a price.">>
<<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>>
<div class="choice-container">
<<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">
<<vchoice "Ask about the second Resurgence Elixir" "Lysara_Second_Elixir" "talk" "potion">>
<<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.
<<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><<run VaultUI.setBackground("reclaimed-day")>>
<<run VaultUI.setTimeOfDay("afternoon")>>
<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><<run VaultUI.setBackground("commons")>>
<<run VaultUI.setTimeOfDay("evening")>>
<<set $flags.kiraInComa to true>>
You carry Kira to her room and lay her on the bed.
<<run VaultUI.showCharacter("groundskeeper", "left", "concerned")>>
The Groundskeeper appears.
<<say "Groundskeeper" "Again? The vault's protection is becoming a burden.">>
<<say $player.name "I know. I need another elixir.">>
<<if $flags.hasResurgenceElixir>>
<<say "Groundskeeper" "You have one, don't you? Use it.">>
<<goto "Kira_Room_With_Potion">>
<<else>>
<<say "Groundskeeper" "Then you know where to go.">>
<div class="choice-container">
<<vchoice "Visit Lysara" "Alchemy_Lab_Visit" "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>
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")>>
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")>>
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 with those deep brown eyes that first caught your attention seven weeks ago.
<<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.">>
Her voice is warm honey in the cold desert night. You settle beside her, close enough that your shoulders touch.
<<say "Sera" "Beautiful night. Almost makes you forget everything else.">>
She turns to look at you, firelight dancing in her eyes.
<<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")>>
You don't let her finish. Your arm wraps around her waist, pulling her against you. She gasps — surprise melting immediately into desire.
<<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")>>
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>>
<<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.">>
She stands, pulling you up with her.
<<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")>>
<<say $player.name "Come to my tent.">>
It's not a question.
Sera's eyes darken with desire. She rises in one fluid motion, taking your hand.
<<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>>
<<run VaultUI.showCharacter("sera", "center", "aroused")>>
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.
She lets the tent flap fall closed, sealing you both in your own private world.
For a moment you just look at each other. Then she reaches up and begins to unlace her worn traveling shirt, holding your gaze.
<<say "Sera" "We've done this a dozen times. But tonight feels different. Like...">>
She pauses, shirt half-open, revealing the curve of her collarbone.
<<say "Sera" "Like it matters more.">>
She crosses to you, pressing close. Her fingers find the hem of your shirt.
<<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")>>
Something shifts in your chest. A primal surge of want and possession.
You catch her wrists, pressing them against her sides. Her breath catches. Her pupils blow wide.
<<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.">>
<<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.
You guide her backward until her knees hit the sleeping pallet. She sits, then lies back, gazing up at you with trust and hunger.
<<say "Sera" "Show me I'm yours.">>
<div class="choice-container">
<<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">>
</div><<run VaultUI.setBackground("prelude/sera-tent-intimate")>>
<<run VaultUI.showCharacter("sera", "center", "passionate")>>
You cover her body with yours, catching her wrists and pinning them above her head. Her back arches, pressing her curves against you.
<<say "Sera" "Oh—">>
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.
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.">>
<<say "Sera" "You. Inside me. Now. Please—">>
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.
Only then do you give her what she needs.
<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")>>
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.
When she's bare before you, lamplight gilding her skin, she waits. Trembling slightly.
<<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")>>
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.">>
She pushes you down onto the sleeping pallet. Straddles your hips. Her hands pin your shoulders, her thighs squeezing your waist.
<<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")>>
<<say $player.name "Yes.">>
<<say "Sera" "Good.">>
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.
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.*
<<say "Sera" "Hands above your head. Keep them there.">>
You obey. Your heart pounds as she slowly removes her own clothes, making you watch, making you *wait.*
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")>>
<<say $player.name "Yes, ma'am.">>
Her eyes flash with surprised delight. Her grip on your shoulders tightens.
<<say "Sera" "Oh, I *like* that.">>
She rewards you with a deep kiss, her tongue claiming your mouth. 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.*
She pushes; you pull. You pin her down; she flips you over. Clothes tear in your mutual desperation to reach skin.
<<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.
When you finally come together, it's a battle and a surrender at once. Taking turns. Trading dominance. Rising and falling like waves.
<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")>>
You set a relentless pace. Sera writhes beneath you, her nails raking your back, your name spilling from her lips like a prayer.
<<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")>>
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.
<<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")>>
The battle reaches its peak. You've lost track of who's on top, whose turn it is to lead. It doesn't matter. 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")>>
<<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")>>
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")>>
<<say "" "SCREAMS.">>
You're ripped from sleep by the sounds of chaos. Sera is already moving, grabbing clothes, her healer's instincts kicking in.
<<run VaultUI.showCharacter("sera", "center", "scared")>>
<<say "Sera" "Raiders! Get dressed—">>
The tent flap tears open. A figure silhouettes against firelight — one of the caravan guards, blood streaming down his face.
<<say "Guard" "They're everywhere! Must be forty of them— the north watch is dead—">>
An arrow takes him through the throat. He crumples.
<<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">
<<vchoice "Flee through the camp" "Prelude_Attack_Flee" "action" "run">>
<<vchoice "Find a weapon first" "Prelude_Attack_Weapon" "action" "attack">>
</div><<run VaultUI.setBackground("prelude/camp-attack")>>
You snatch the dead guard's sword. It's slick with blood, but it's better than nothing.
Sera grabs your free hand.
<<run VaultUI.showCharacter("sera", "center", "scared")>>
<<say "Sera" "This way— there's a gap in the wagon circle on the south side—">>
<<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")>>
The camp is hell. Wagons burning. Bodies everywhere. Raiders in mismatched armor cutting down anyone who moves.
You run, Sera's hand in yours, weaving between burning tents.
<<run VaultUI.showCharacter("raider", "left", "threatening")>>
A raider blocks your path. He grins through a mask of old bones.
<<say "Raider" "Fresh meat.">>
<<run VaultUI.hideCharacter("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")>>
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")>>
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")>>
You're almost free. The desert darkness beckons just yards away.
Then Sera's hand is torn from yours.
<<run VaultUI.showCharacter("sera", "right", "reaching")>>
<<say "Sera" "NO! RUN!">>
Two raiders have her. A third faces you, blade drawn.
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")>>
You launch yourself at them. 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")>>
Through blurring vision, you see Sera struggling as they drag her toward the wagons.
<<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")>>
<<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")>>
They drag Sera past you. 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")>>
<<set $prelude.seraFate to "taken">>
<<run VaultUI.transition("fade")>>
You wake to ashes.
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")>>
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.setBackground("prelude/reclaimed-day")>>
<<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.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")>>
Sera is there.
But wrong. Her smile too wide. Her eyes too bright. Shadows moving beneath her skin.
<<say "Sera?" "I've been waiting for you.">>
She approaches, hips swaying. Every movement liquid seduction.
<<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")>>
<<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.">>
Her form flickers. For a moment you glimpse something else — vast, ancient, hungry.
<<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>>
You're too tired to fight. Too broken. And she looks *so much* like Sera...
Dream-hands undress you. Dream-lips find your throat. Pleasure washes through you, tinged with wrongness you're too exhausted to examine.
<<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("morning")>>
<<run VaultUI.setSceneMode("normal")>>
<<run VaultUI.transition("fade")>>
<div class="scene-intro">
<h2>Wake</h2>
</div>
You wake with a gasp. Dawn paints the Reclaimed in shades of blood.
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.
You force yourself upright and keep walking.
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")>>
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.
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.
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.">>
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")>>
<<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 old man 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.
<<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.
<<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>>
<<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.
<<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>>
<<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.
<<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>>
<<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.
<<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>>
<<gainExhibitionism "player" 3>>
<<if $combat.active>>
<<if $flags.seductionUnlocked>>
<<combatVictoryTransition>>
<<else>>
<<goto "Combat_Victory_Simple">>
<</if>>
<<else>>
<<link "Continue" $currentPassage>><<run State.restart()>><</link>>
<</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 class="choice-container">
<<link "\"It's okay. Let me cover you.\"">>
<<addTrust "kira" 5>>
<<addAffection "kira" 1>>
<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.\"">>
<<goto "Continue_from_Exposure_Comfort">>
<</link>>
<<link "\"We'll get you somewhere safe to fix this.\"">>
<<addTrust "kira" 3>>
<p>She nods, hand covering herself, trying to focus back on the fight. But her movements are scattered. Unfocused.</p>
<<goto "Continue_from_Exposure_Distracted">>
<</link>>
</div>
<<else>>
<p>She's too mortified to acknowledge you. Just covers herself and tries to push through.</p>
<<goto "Continue_from_Exposure_Alone">>
<</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.
<<link "\"Kira, focus. We'll fix your shirt after.\"">>
<<addTrust "kira" 2>>
<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>
<<goto "Continue_from_Exposure_Distracted">>
<</link>>
<<link "\"You look fine. Really.\"">>
<<addTrust "kira" 1>>
<<clampStat "player.lust" 3>>
<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.\"">>
<<goto "Continue_from_Exposure_Distracted">>
<</link>>
<<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.\"">>
<<link "\"Agreed. Keep your head in the fight.\"">>
<<addTrust "kira" 2>>
<p>She nods, pushing through the discomfort.</p>
<<goto "Continue_from_Exposure_Fighting">>
<</link>>
<<link "\"Doesn't really bother you that much, does it?\"">>
<<clampStat "player.lust" 2>>
<<say "Kira" "\"I didn't say that. I said it's not ideal. There's a difference.\"">>
<<goto "Continue_from_Exposure_Fighting">>
<</link>>
<<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.
<<link "\"Not letting it distract you?\"">>
<<addTension "kira" 5>>
<<clampStat "player.lust" 3>>
<<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.\"">>
<<goto "Continue_from_Exposure_Fighting">>
<</link>>
<div class="choice-container">
<<vchoice "Continue fighting" "Continue_from_Exposure_Fighting" "action" "map">>
</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.
<<link "Watch her fight">>
<<clampStat "player.lust" 5>>
<<addTension "kira" 3>>
<p>She's aware you're watching. Moves with a certain... precision. Confidence. She doesn't cover herself. Doesn't apologize.</p>
<<goto "Continue_from_Exposure_Fighting">>
<</link>>
<<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>>
<<link "\"Both look pretty good.\"">>
<<addTension "kira" 5>>
<<addAffection "kira" 1>>
<<say "Kira" "\"That's what I like to hear.\" She flashes a grin. \"Now let's finish this fight.\"">>
<<goto "Continue_from_Exposure_Fighting">>
<</link>>
<<link "Focus on the fight">>
<<set $companions[0].affection += 1>>
<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>
<<goto "Continue_from_Exposure_Fighting">>
<</link>>
<</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 class="choice-container">
<<link "\"Stay behind me. I'll protect you.\"">>
<<addTrust "kira" 8>>
<<addAffection "kira" 2>>
<<say "Kira" "\"Thank you. God, thank you. I— I'm sorry, I just—\"">>
<<goto "Continue_from_Full_Exposure_Protected">>
<</link>>
<<link "\"We need to end this fight. Now.\"">>
<<addTrust "kira" 5>>
<<set $player.will += 2>>
<p>She nods, fear turning to desperation. You both attack with renewed fury.</p>
<<goto "Continue_from_Full_Exposure_Fury">>
<</link>>
</div>
<<else>>
<p>She's too mortified to even speak. Just tries to cover herself and survive.</p>
<<goto "Continue_from_Full_Exposure_Alone">>
<</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.
<<link "\"Not bothering you?\"">>
<<addTension "kira" 3>>
<<clampStat "player.lust" 3>>
<<say "Kira" "\"I didn't say that. But we have bigger problems right now.\"">>
<<goto "Continue_from_Full_Exposure_Composed">>
<</link>>
<div class="choice-container">
<<vchoice "Keep fighting" "Continue_from_Full_Exposure_Composed" "action" "attack">>
</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.
<<link "Watch her fight">>
<<clampStat "player.lust" 8>>
<<addTension "kira" 5>>
<p>She's aware you're watching. Doesn't bother covering. Moves with absolute confidence despite— or maybe because of— the exposure.</p>
<<goto "Continue_from_Full_Exposure_Composed">>
<</link>>
<div class="choice-container">
<<vchoice "Focus on the fight" "Continue_from_Full_Exposure_Composed" "action" "attack">>
</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>>
<<link "\"Both the view and the fight look good.\"">>
<<addTension "kira" 8>>
<<addAffection "kira" 1>>
<<say "Kira" "\"That's what I like to hear.\" She grins wickedly. \"Now let's finish this.\"">>
<<goto "Continue_from_Full_Exposure_Composed">>
<</link>>
<<link "Focus on the fight">>
<<set $companions[0].affection += 2>>
<p>She notices your discipline. Approves. You're both professionals, even when things get... distracting.</p>
<<goto "Continue_from_Full_Exposure_Composed">>
<</link>>
<</if>>
<<gainExhibitionism "kira" 8>>Kira recovers. You're back in the fight together. Stronger for it.
<<gainExhibitionism "kira" 5>>
<<if $flags.seductionUnlocked>>
<<combatVictoryTransition>>
<<else>>
<<goto "Combat_Victory_Simple">>
<</if>>Kira is focused but clearly distracted. You manage the fight, but it's harder this time.
<<gainExhibitionism "kira" 5>>
<<if $flags.seductionUnlocked>>
<<combatVictoryTransition>>
<<else>>
<<goto "Combat_Victory_Simple">>
<</if>>Kira pushes through on her own. Manages the fight, but it takes everything she has.
<<gainExhibitionism "kira" 5>>
<<if $flags.seductionUnlocked>>
<<combatVictoryTransition>>
<<else>>
<<goto "Combat_Victory_Simple">>
<</if>>The fight continues. Kira adapts. You're a better team because of it.
<<gainExhibitionism "kira" 5>>
<<if $flags.seductionUnlocked>>
<<combatVictoryTransition>>
<<else>>
<<goto "Combat_Victory_Simple">>
<</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>>
<<if $time.day === 5>>
<div class="choice-container">
<<vchoice "Start your day" "Day5_Morning_Mirror" "move" "map">>
</div>
<<elseif $time.day === 6>>
<div class="choice-container">
<<vchoice "Start your day" "Day6_Morning_Commons" "move" "map">>
</div>
<<elseif $time.day === 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 === 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>>
<<if $time.day === 5>>
<div class="choice-container">
<<vchoice "Start your day" "Day5_Morning_Mirror" "move" "map">>
</div>
<<elseif $time.day === 6>>
<div class="choice-container">
<<vchoice "Start your day" "Day6_Morning_Commons" "move" "map">>
</div>
<<elseif $time.day === 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 "player">>
<h2>Exposed in Public</h2>
Your clothing fails. Or shreds. Or is deliberately removed. The point is: you're exposed in the common areas. People see.
<<if _exhibTier === 0>>
<p class="mortified">Complete mortification. You try to hide. To cover yourself. But there's nowhere to go.</p>
The Groundskeeper appears from somewhere.
<<say "Groundskeeper" "\"Your clothing has failed you. This is... not appropriate for shared vault spaces.\"">>
He says it neutrally, but there's judgment in there. Disappointment.
<<say "Groundskeeper" "\"I must insist you repair yourself immediately. There are clothes in storage.\"">>
<<link "\"Yes, I'll fix this right now.\"">>
<<set $companions.groundskeeper.trust -= 2>>
<<goto "Commons_Find_Clothes">>
<</link>>
<<link "\"I'm fine like this.\"">>
<<set $companions.groundskeeper.trust -= 1>>
<<set $exhibitionism.player += 2>>
The Groundskeeper stares at you. Long. Disappointed.
<<say "Groundskeeper" "\"Your judgment is as damaged as your wardrobe. Storage. Now. Before someone else sees.\"">>
<<goto "Commons_Find_Clothes_Refused">>
<</link>>
<<elseif _exhibTier <= 2>>
<p>You're exposed. Embarrassed. But you're managing.</p>
Some people glance. Quickly look away. You can almost feel Kira's stare, but she's respectfully giving you space.
The Groundskeeper notices. Of course he does.
<<say "Groundskeeper" "\"Another clothing failure? Perhaps you should invest in more durable garments.\"">>
There's less urgency in his tone. Less judgment. Just... suggestion.
<<link "\"I'll find something to wear.\"">>
<<goto "Commons_Find_Clothes">>
<</link>>
<<link "\"I can wait until later to fix this.\"">>
<<set $exhibitionism.player += 1>>
The Groundskeeper nods.
<<say "Groundskeeper" "\"Your confidence is noted.\"">>
<<link "Proceed" $currentPassage>><<run State.restart()>><</link>>
<</link>>
<<elseif _exhibTier === 3>>
<p>You're exposed. It's not ideal, but it's manageable. You move through the commons without panic.</p>
Some people notice. Might comment. But nothing unmanageable.
The Groundskeeper observes but doesn't intervene.
<<say "Groundskeeper" "\"You've become quite comfortable with your... state.\"">>
<<link "\"It happens sometimes.\"">>
<<set $exhibitionism.player += 1>>
<<say "Groundskeeper" "\"Indeed. As you wish.\"">>
<<link "Continue" $currentPassage>><<run State.restart()>><</link>>
<</link>>
<<link "\"I'll get dressed soon.\"">>
<<say "Groundskeeper" "\"Take your time. Your clothing practices are your own affair now.\"">>
<<link "Continue" $currentPassage>><<run State.restart()>><</link>>
<</link>>
<<elseif _exhibTier === 4>>
<p>You're exposed. You don't care. You move through the vault with casual confidence.</p>
People stare. You let them. It feels good.
Kira watches with clear appreciation. The Groundskeeper merely nods acknowledgment.
<<say "Kira" "\"Looking good out there.\"">>
<<addTension "kira" 5>>
<<clampStat "player.lust" 3>>
<<link "\"Thanks for the vote of confidence.\"">>
<<set $companions[0].affection += 2>>
<<goto "Exposure_Continue">>
<</link>>
<<link "\"Want to join me?\"">>
<<addTension "kira" 8>>
<<say "Kira" "\"Tempting. Maybe later.\"">>
<<goto "Exposure_Continue">>
<</link>>
<<elseif _exhibTier === 5>>
<p>You're exposed. You want to be exposed. You're arranging yourself where the light catches you just right.</p>
People stare. You make sure they see. This is who you are now.
Kira's watching with clear hunger. The Groundskeeper doesn't comment anymore. He's accepted what you've become.
<<say "Kira" "\"You're doing that on purpose now.\"">>
<<say $player.name "\"Obviously.\"">>
<<say "Kira" "\"I like it.\"">>
<<addTension "kira" 15>>
<<clampStat "player.lust" 5>>
<<addAffection "kira" 1>>
<<link "\"I like that you like it.\"">>
<<addTension "kira" 5>>
<<goto "Exposure_Continue">>
<</link>>
<<link "Continue" "Exposure_Continue">><<run State.restart()>><</link>>
<</if>>You head directly to storage. Keep your head down. Ignore the stares.
Fix this. Now.
<<set $clothing.player.top to 100>>
<<set $clothing.player.bottom to 100>>
<<updateExposure "player">>
<div class="choice-container">
<<vchoice "Head back to your quarters" "Player_Quarters" "action" "return">>
</div>The Groundskeeper watches you walk toward storage, clearly unimpressed.
You choose to stay exposed a little longer just to prove a point.
You're not sure if you're proving it to him or to yourself.
<<link "Eventually go find clothes" "Player_Quarters">>
<<advanceTime 1 0>>
<<set $clothing.player.top to 100>>
<<set $clothing.player.bottom to 100>>
<<updateExposure "player">>
<</link>>You continue moving through the vault. The attention feels good. Validation. Acceptance.
<<link "Back to normal" $currentPassage>><<run State.restart()>><</link>>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>>
<<else>>
<<goto "Combat_Victory_Simple">>
<</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>>
<<else>>
<<goto "Combat_Victory_Simple">>
<</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>>
<<else>>
<<goto "Combat_Victory_Simple">>
<</if>>Kira fights with your support. The exposure is humiliating, but manageable with you at her side.
<<gainExhibitionism "kira" 8>>
<<if $flags.seductionUnlocked>>
<<combatVictoryTransition>>
<<else>>
<<goto "Combat_Victory_Simple">>
<</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>>
<<else>>
<<goto "Combat_Victory_Simple">>
<</if>>Kira adapts to the exposure. The fight continues. You're a better team because of it.
<<gainExhibitionism "kira" 8>>
<<if $flags.seductionUnlocked>>
<<combatVictoryTransition>>
<<else>>
<<goto "Combat_Victory_Simple">>
<</if>><<run VaultUI.setBackground("bathroom")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
You turn the dial to COLD.
The water hits you like an ice bath. Shocking. Terrible. Perfect.
<div class="narrative-image">
<img src="assets/images/effects/shower-cold.webp" alt="Cold Shower">
</div>
<<say "Narrator" "internal" "The shock of cold water floods through you, pulling your mind away from intrusive thoughts.">>
The arousal that was building fades under the assault of freezing water. Your body responds — goosebumps, quickened breathing — but it's a DIFFERENT kind of stimulation now. Not arousal. Catharsis.
<<advanceTime 0 30>>
<<clampStat "player.lust" (-20)>>
<<clampStat "player.energy" (-5) 0 50>>
You stand under the cold spray for several minutes. Gritting your teeth. But when you step out, your mind is CLEAR.
The obsessive thoughts have faded. Your body is cooled. Relief.
<div class="choice-container">
<<vchoice "Dry off and head back" "Bathroom_Hub" "move" "shower">>
</div><<run VaultUI.setBackground("training_yard")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
You hit the training dummy like it owes you money.
STRIKE. STRIKE. STRIKE.
<div class="narrative-image">
<img src="assets/images/training/intensity.webp" alt="Intense Training">
</div>
Your muscles burn. Sweat pours. Heart pounding. You drive your frustration into every punch, every kick, every brutal strike against the worn bag.
<<say "Narrator" "internal" "The physical exertion demands every bit of your focus. Energy. Aggression. All channeled into combat.">>
The arousal that was building transforms into POWER. Into strength. Your body is still burning, but it's burning with PURPOSE now.
Strike after strike. Your knuckles ache. Your legs are shaking. But you don't stop.
<<advanceTime 1 0>>
<<clampStat "player.lust" (-15)>>
<<clampStat "player.energy" (-20) 0 50>>
<<set $player.fitness to Math.clamp($player.fitness + 1, 0, 100)>>
Finally, you step back from the dummy. Breathing hard. Soaked in sweat. Your body is exhausted, but your mind is CLEAR.
The restless energy is GONE. Transformed into strength, into fitness, into something productive.
You catch your breath, fists still clenched. Satisfied.
<div class="choice-container">
<<vchoice "Head back to cool down" "Training_Yard_Hub" "move" "return">>
</div><<run VaultUI.setBackground("kira_room")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<<showCharacter "kira" "center" "thoughtful">>
You find Kira sitting on her bed, cleaning her machete.
<<say $player.name "Can we talk? Really talk?">>
She looks up. Sets the weapon aside. Careful. Watching your face.
<<say "Kira" "Yeah. Okay.">>
You sit next to her. Not close. Not yet. Just nearby. Available.
<div class="narrative-image">
<img src="assets/images/kira/conversation-serious.webp" alt="Serious Conversation">
</div>
<<say $player.name "I'm struggling. The vault. The isolation. The endless..." >>
You trail off. Can't quite name the feeling.
<<say "Kira" "The sexual frustration? The loneliness?">>
She says it plainly. Without judgment.
<<say $player.name "Yeah. That too. But more than that. I just... I need someone to understand it.">>
She's quiet for a moment. Then reaches out. Takes your hand.
<<say "Kira" "I understand. More than you know.">>
She talks. About her own frustrations. Her own needs. The pressure of being one of the only women in the vault. The burden of leadership. The constant weight of survival.
Her honesty is DISARMING. You talk for hours. About fear. About desire. About hope. About the weight of the world.
Nothing sexual. Nothing crude. Just... connection. Real connection.
<<advanceTime 1 0>>
<<deepConversationEffect>>
By the time you finish, the sun is setting outside. You're both emotionally exhausted, but lighter somehow.
<<say "Kira" "Thank you. For letting me... just be honest.">>
<<say $player.name "Thank you for listening.">>
She squeezes your hand. Holds it.
<div class="choice-container">
<<vchoice "Rest a while longer" "Relief_RestLonger" "action" "night">>
<<vchoice "Head to the commons" "Vault_Hub" "action" "door-handle">>
</div><<advanceTime 1 0>>
<<goto "Kira_Room">><<run VaultUI.setBackground("commons")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
You find a quiet corner of the vault. Somewhere still. Somewhere YOURS.
You sit. Close your eyes.
<div class="narrative-image">
<img src="assets/images/effects/meditation.webp" alt="Meditation">
</div>
<<say "Narrator" "internal" "You breathe. Long, slow breaths. In through your nose. Out through your mouth.">>
At first, the thoughts come racing. Intrusive. Sexual. Desperate.
But you don't fight them. You observe them. Watch them pass like clouds. Let them go.
Minutes pass. Your mind gradually settles.
<<clampStat "player.lust" (-8)>>
<<set $player.energy to Math.min($player.maxEnergy, $player.energy + 3)>>
<<advanceTime 1 0>>
You open your eyes. The world hasn't changed. But YOU have. Slightly. The desperate edge is less sharp.
It's not a cure. But it's relief.
<div class="choice-container">
<<vchoice "Return refreshed" "Vault_Hub" "move" "return">>
</div><<if $player.lust >= 30>>
<<if $time.phase === "morning" || $time.phase === "evening">>
<div class="relief-option">
<<vchoice "Take a COLD shower to clear your head" "Bathroom_ColdShower" "action" "shower">>
(Lust -20, Energy -5)
</div>
<</if>>
<</if>><<if $player.lust >= 40>>
<div class="relief-option">
<<vchoice "Channel it into intense training" "Training_BurnItOff" "action" "attack">>
(Lust -15, Energy -20, Fitness +1)
</div>
<</if>><<if $player.lust >= 10 && $companions[0] && $companions[0].available>>
<<if $time.phase === "evening" || $time.phase === "night">>
<div class="relief-option">
<<vchoice "Talk with Kira about what you're feeling" "Kira_DeepConversation" "action" "talk">>
(Lust -10, Kira Tension -8, Trust +2, Affection +1)
</div>
<</if>>
<</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-dark">>
<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>>
<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 "uinvAddItem">>
<<set _itemName to _args[0]>>
<<set _quantity to _args[1] || 1>>
<<set _bagName to _args[2] || "player">>
<<set $itemAdded to false>>
<<set $inventoryFull to false>>
<<if typeof UInv !== 'undefined' && UInv.BagExists(_bagName)>>
<<set _maxSlots to UInv.GetBagPropertyValue(_bagName, "maxSlots") || 0>>
<<set _currentItems to UInv.GetItemsArray(_bagName)>>
<<set _currentCount to _currentItems.length>>
<<set _alreadyHasItem to UInv.BagHasItem(_bagName, _itemName)>>
<<if _maxSlots === 0 || _alreadyHasItem || _currentCount < _maxSlots>>
<<run UInv.AddItem(_bagName, _itemName, _quantity)>>
<<set $itemAdded to true>>
<<else>>
<<set $inventoryFull to true>>
<</if>>
<</if>>
<</widget>>
<<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 "uinvHasItem">>
<<set _itemName to _args[0]>>
<<set _quantity to _args[1] || 1>>
<<set _bagName to _args[2] || "player">>
<<if typeof UInv !== 'undefined' && UInv.BagExists(_bagName)>>
<<set $hasItem to UInv.BagHasItem(_bagName, _itemName)>>
<<if $hasItem>>
<<set $hasItem to (UInv.GetItemPropertyValue(_bagName, _itemName, "UInvQuantity") >= _quantity)>>
<</if>>
<<else>>
<<set $hasItem to false>>
<</if>>
<</widget>>
<<widget "uinvGetItemCount">>
<<set _itemName to _args[0]>>
<<set _bagName to _args[1] || "player">>
<<if typeof UInv !== 'undefined' && UInv.BagExists(_bagName) && UInv.BagHasItem(_bagName, _itemName)>>
<<set $itemCount to UInv.GetItemPropertyValue(_bagName, _itemName, "UInvQuantity")>>
<<else>>
<<set $itemCount to 0>>
<</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>>
<<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>>
<<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)>>
<<set _maxSlots to UInv.GetBagPropertyValue(_invBag, "maxSlots") || 0>>
<<set _currentItems to UInv.GetItemsArray(_invBag)>>
<<set _currentCount to _currentItems.length>>
<<set _alreadyHasItem to UInv.BagHasItem(_invBag, _itemName)>>
<<if _maxSlots === 0 || _alreadyHasItem || _currentCount < _maxSlots>>
<<run UInv.MoveItem(_equipBag, _invBag, _itemName, 1)>>
<<set $unequipSuccess to true>>
<<else>>
<<set $unequipSuccess to false>>
<<set $inventoryFull to true>>
<</if>>
<<else>>
<<set $unequipSuccess to false>>
<</if>>
<<else>>
<<set $unequipSuccess to false>>
<</if>>
<</widget>>
<<widget "uinvGetEquipped">>
<<set _slot to _args[0] || "weapon">>
<<set _owner to _args[1] || "player">>
<<set _equipBag to _owner + " equipped">>
<<set $equippedItem to null>>
<<if typeof UInv !== 'undefined' && UInv.BagExists(_equipBag)>>
<<set _items to UInv.GetItemsArray(_equipBag)>>
<<for _itemName range _items>>
<<set _types to UInv.GetItemPropertyValue(_equipBag, _itemName, "type") || []>>
<<if _slot === "weapon" && _types.includes("weapon")>>
<<set $equippedItem to _itemName>>
<<break>>
<<elseif _slot === "armor" && (_types.includes("armor") || _types.includes("wearable"))>>
<<set $equippedItem to _itemName>>
<<break>>
<<elseif _slot === "accessory" && _types.includes("accessory")>>
<<set $equippedItem to _itemName>>
<<break>>
<<elseif _slot === "intimate" && _types.includes("intimate")>>
<<set $equippedItem to _itemName>>
<<break>>
<</if>>
<</for>>
<</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>>
<<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 _hungerGain > 0 || _energyGain > 0>>
<<set $useFeedback to "Hydration +" + _hungerGain>>
<<if _energyGain > 0>>
<<set $useFeedback to $useFeedback + ", Energy +" + _energyGain>>
<</if>>
<<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 "uinvMoveItem">>
<<set _itemName to _args[0]>>
<<set _fromBag to _args[1]>>
<<set _toBag to _args[2]>>
<<set _quantity to _args[3] || 1>>
<<if typeof UInv !== 'undefined'>>
<<run UInv.MoveItem(_fromBag, _toBag, _itemName, _quantity)>>
<</if>>
<</widget>>
<<widget "uinvGetItems">>
<<set _bagName to _args[0] || "player">>
<<if typeof UInv !== 'undefined' && UInv.BagExists(_bagName)>>
<<set $bagItems to UInv.GetItemsArray(_bagName)>>
<<else>>
<<set $bagItems to []>>
<</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 _maxSlots to UInv.GetBagPropertyValue("vault", "maxSlots") || 0>>
<<set _currentItems to UInv.GetItemsArray("vault")>>
<<set _alreadyInVault to UInv.BagHasItem("vault", _itemName)>>
<<if _maxSlots === 0 || _alreadyInVault || _currentItems.length < _maxSlots>>
<<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 _maxSlots to UInv.GetBagPropertyValue("player", "maxSlots") || 0>>
<<set _currentItems to UInv.GetItemsArray("player")>>
<<set _alreadyHasItem to UInv.BagHasItem("player", _itemName)>>
<<if _maxSlots === 0 || _alreadyHasItem || _currentItems.length < _maxSlots>>
<<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 UInv.GetItemPropertyValue(_wornBag, _itemName, "durability") || 100>>
<<elseif _owner === "kira">>
<<set $clothing.kira[_slot] to UInv.GetItemPropertyValue(_wornBag, _itemName, "durability") || 100>>
<</if>>
<<updateExposure _owner>>
<</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 UInv.GetItemPropertyValue(_wornBag, _itemName, "durability") || 100>>
<<break>>
<</if>>
<</for>>
<</if>>
<</widget>>
<<widget "uinvDamageClothing">>
<<set _slot to _args[0]>>
<<set _amount to _args[1] || 10>>
<<set _owner to _args[2] || "player">>
<<set _wornBag to _owner + " worn">>
<<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 _currentDur to UInv.GetItemPropertyValue(_wornBag, _itemName, "durability") || 100>>
<<set _newDur to Math.max(0, _currentDur - _amount)>>
<<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>>
<<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 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 _currentDur to UInv.GetItemPropertyValue(_wornBag, _itemName, "durability") || 0>>
<<set _maxDur to UInv.GetItemPropertyValue(_wornBag, _itemName, "maxDurability") || 100>>
<<set _newDur to Math.min(_maxDur, _currentDur + _amount)>>
<<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>>
<<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">>
<<uinvUnequipArmor>>
<<set _equipped to false>>
<<if typeof UInv !== 'undefined' && UInv.BagHasItem("player", _armorName)>>
<<run UInv.MoveItem("player", "player armor", _armorName)>>
<<set $equipped.armor to {
id: _armorName.replace(/ /g, "_"),
name: UInv.GetItemPropertyValue("player armor", _armorName, "singular") || _armorName,
type: "armor",
defense: UInv.GetItemPropertyValue("player armor", _armorName, "defense") || 0,
maxDurability: UInv.GetItemPropertyValue("player armor", _armorName, "maxDurability") || 100,
currentDurability: UInv.GetItemPropertyValue("player armor", _armorName, "durability") || UInv.GetItemPropertyValue("player armor", _armorName, "maxDurability") || 100,
image: UInv.GetItemPropertyValue("player armor", _armorName, "image") || "",
effects: {
magicResist: UInv.GetItemPropertyValue("player armor", _armorName, "magicResist") || 0,
magicBonus: UInv.GetItemPropertyValue("player armor", _armorName, "magicBonus") || 0
}
}>>
<<set _equipped to true>>
<</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>>
<<if !$wardrobe.player.armorStorage>>
<<set $wardrobe.player.armorStorage to []>>
<</if>>
<<if typeof UInv !== 'undefined' && UInv.BagExists("player armor")>>
<<set _currentArmor to UInv.GetItemsArray("player armor")>>
<<if _currentArmor.length > 0>>
<<set _armorName to _currentArmor[0]>>
<<run UInv.MoveItem("player armor", "player", _armorName)>>
<<set _unequipped to true>>
<</if>>
<</if>>
<<if !_unequipped && $equipped && $equipped.armor>>
<<run $wardrobe.player.armorStorage.push(clone($equipped.armor))>>
<<set _unequipped to true>>
<</if>>
<<if $equipped && $equipped.armor>>
<<set $equipped.armor to null>>
<</if>>
<</widget>>
<<widget "uinvGetEquippedArmor">>
<<set $equippedArmor to null>>
<<set $equippedArmorData to null>>
<<if typeof UInv !== 'undefined' && UInv.BagExists("player armor")>>
<<set _currentArmor to UInv.GetItemsArray("player armor")>>
<<if _currentArmor.length > 0>>
<<set $equippedArmor to _currentArmor[0]>>
<<set $equippedArmorData to {
name: $equippedArmor,
displayName: UInv.GetItemPropertyValue("player armor", $equippedArmor, "singular") || $equippedArmor,
defense: UInv.GetItemPropertyValue("player armor", $equippedArmor, "defense") || 0,
durability: UInv.GetItemPropertyValue("player armor", $equippedArmor, "durability") || UInv.GetItemPropertyValue("player armor", $equippedArmor, "maxDurability") || 100,
maxDurability: UInv.GetItemPropertyValue("player armor", $equippedArmor, "maxDurability") || 100,
magicResist: UInv.GetItemPropertyValue("player armor", $equippedArmor, "magicResist") || 0,
magicBonus: UInv.GetItemPropertyValue("player armor", $equippedArmor, "magicBonus") || 0,
image: UInv.GetItemPropertyValue("player armor", $equippedArmor, "image") || ""
}>>
<</if>>
<</if>>
<<if !$equippedArmor && $equipped && $equipped.armor>>
<<set $equippedArmor to $equipped.armor.name>>
<<set _armorId to $equipped.armor.name.toLowerCase().replace(/ /g, "_")>>
<<set $equippedArmorData to {
name: $equipped.armor.name,
displayName: $equipped.armor.name,
defense: $equipped.armor.defense || 0,
durability: $equipped.armor.currentDurability || $equipped.armor.maxDurability || 100,
maxDurability: $equipped.armor.maxDurability || 100,
magicResist: $equipped.armor.magicResist || 0,
magicBonus: $equipped.armor.magicBonus || 0,
image: $equipped.armor.image || "media/clothing/armor/" + _armorId + "_v2.webp"
}>>
<</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: UInv.GetItemPropertyValue("player", _itemName, "durability") || UInv.GetItemPropertyValue("player", _itemName, "maxDurability") || 100,
maxDurability: UInv.GetItemPropertyValue("player", _itemName, "maxDurability") || 100,
image: UInv.GetItemPropertyValue("player", _itemName, "image") || "media/clothing/armor/" + _armorId + "_v2.webp",
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: _armor.currentDurability || _armor.maxDurability || 100,
maxDurability: _armor.maxDurability || 100,
image: _armor.image || "media/clothing/armor/" + _armorId + "_v2.webp",
source: "storage"
})>>
<</for>>
<</if>>
<</widget>>
<<widget "uinvDamageArmor">>
<<set _damage to _args[0] || 0>>
<<if typeof UInv !== 'undefined' && UInv.BagExists("player armor")>>
<<set _currentArmor to UInv.GetItemsArray("player armor")>>
<<if _currentArmor.length > 0>>
<<set _armorName to _currentArmor[0]>>
<<set _currentDur to UInv.GetItemPropertyValue("player armor", _armorName, "durability")>>
<<if _currentDur === undefined>>
<<set _currentDur to UInv.GetItemPropertyValue("player armor", _armorName, "maxDurability") || 100>>
<</if>>
<<set _newDur to Math.max(0, _currentDur - _damage)>>
<<run UInv.SetItemPropertyValue("player armor", _armorName, "durability", _newDur)>>
<<if $equipped.armor>>
<<set $equipped.armor.currentDurability to _newDur>>
<</if>>
<</if>>
<</if>>
<</widget>>
<<widget "uinvRepairArmor">>
<<set _repair to _args[0] || 0>>
<<if typeof UInv !== 'undefined' && UInv.BagExists("player armor")>>
<<set _currentArmor to UInv.GetItemsArray("player armor")>>
<<if _currentArmor.length > 0>>
<<set _armorName to _currentArmor[0]>>
<<set _currentDur to UInv.GetItemPropertyValue("player armor", _armorName, "durability")>>
<<set _maxDur to UInv.GetItemPropertyValue("player armor", _armorName, "maxDurability") || 100>>
<<if _currentDur === undefined>>
<<set _currentDur to _maxDur>>
<</if>>
<<set _newDur to Math.min(_maxDur, _currentDur + _repair)>>
<<run UInv.SetItemPropertyValue("player armor", _armorName, "durability", _newDur)>>
<<if $equipped.armor>>
<<set $equipped.armor.currentDurability to _newDur>>
<</if>>
<</if>>
<</if>>
<</widget>><<widget "toUInvName">>
<<set $uinvName to _args[0].replace(/_/g, " ")>>
<</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>>
<<if _itemId === "scrap_metal" || _itemId === "scrap metal">>
<<set $vault.scrap += _qty>>
<<else>>
<<set _uinvName to _itemId.replace(/_/g, " ").toLowerCase()>>
<<set _currentCount to UInv.GetItemsArray("player").length>>
<<set _maxSlots to UInv.GetBagPropertyValue("player", "maxSlots") || 20>>
<<if _currentCount + _qty > _maxSlots>>
<<set _canAdd to _maxSlots - _currentCount>>
<<if _canAdd > 0>>
<<for _i to 0; _i < _canAdd; _i++>>
<<run UInv.AddItem("player", _uinvName)>>
<</for>>
<</if>>
<<else>>
<<for _i to 0; _i < _qty; _i++>>
<<run UInv.AddItem("player", _uinvName)>>
<</for>>
<</if>>
<</if>>
<</widget>>
<<widget "removeItem">>
<<set _itemId to _args[0]>>
<<set _qty to _args[1] || 1>>
<<set _uinvName to _itemId.replace(/_/g, " ").toLowerCase()>>
<<for _i to 0; _i < _qty; _i++>>
<<if UInv.BagHasItem("player", _uinvName)>>
<<run UInv.DeleteItem("player", _uinvName)>>
<</if>>
<</for>>
<</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 "getItemCount">>
<<set _itemId to _args[0]>>
<<set _uinvName to _itemId.replace(/_/g, " ").toLowerCase()>>
<<if typeof UInv !== 'undefined' && UInv.BagExists("player") && UInv.BagHasItem("player", _uinvName)>>
<<set $itemCount to UInv.GetItemPropertyValue("player", _uinvName, "UInvQuantity")>>
<<else>>
<<set $itemCount to 0>>
<</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 "kinkSystemEnabled">>
<<set _kinkEnabled to setup.kinkConfig.enabled>>
<</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>>
<<clampStat "companions[0].lust" (_kink.effects.lustBonus || 0)>>
<</if>>
<<if _kink.effects.tensionBonus>>
<<clampStat "companions[0].tension" (_kink.effects.tensionBonus || 0)>>
<</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>>
<<set $companions[0].exhibitionism += _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 "countKinksByCategory">>
<<set _partner to _args[0]>>
<<set _category to _args[1]>>
<<set _count to 0>>
<<getDiscoveredKinks _partner>>
<<for _kinkId range _discoveredKinks>>
<<if setup.kinks[_kinkId] && setup.kinks[_kinkId].category === _category>>
<<set _count += 1>>
<</if>>
<</for>>
<</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="<<print _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 && (_comp.exhibitionism || 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 && (_comp.exhibitionism || 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>>
<<widget "checkOralKink">>
<<tryDiscoverKink "kira" "oral_fixation">>
<</widget>>
<<widget "checkHairKink">>
<<tryDiscoverKink "kira" "hair_pulling">>
<</widget>>
<<widget "checkRoughKink">>
<<tryDiscoverKink "kira" "rough_play">>
<</widget>>
<<widget "checkChokeKink">>
<<tryDiscoverKink "kira" "choking">>
<</widget>>
<<widget "checkPraiseKink">>
<<tryDiscoverKink "kira" "praise">>
<</widget>>
<<widget "checkDegradeKink">>
<<tryDiscoverKink "kira" "degradation">>
<</widget>>
<<widget "checkSubmissionKink">>
<<tryDiscoverKink "kira" "submission">>
<</widget>>
<<widget "checkExhibKink">>
<<tryDiscoverKink "kira" "exhibitionism">>
<</widget>>
<<widget "checkEdgingKink">>
<<tryDiscoverKink "kira" "edging">>
<</widget>>
<<widget "checkCncKink">>
<<tryDiscoverKink "kira" "cnc">>
<</widget>>
<<widget "checkAnalKink">>
<<tryDiscoverKink "kira" "anal">>
<</widget>>
<<widget "checkCreampieKink">>
<<tryDiscoverKink "kira" "creampie">>
<</widget>><<widget "showKinkDialogueOptions">>
<<if setup.kinkConfig && setup.kinkConfig.enabled>>
<<getCompanion "kira">>
<<if $tempCompanion && $tempCompanion.kinks && $tempCompanion.kinks.length > 0>>
<<if $tempCompanion.kinks.includes("praise") && !$flags.kira_praise_dialogue_seen>>
<div class="kink-unlock-option">
<<link "Tell her she's been good...">>
<<set $flags.kira_praise_dialogue_seen to true>>
<<goto "Kira_Praise_Dialogue">>
<</link>>
</div>
<</if>>
<<if $tempCompanion.kinks.includes("rough_play") && $tempCompanion.tension >= 40>>
<div class="kink-unlock-option">
<<link "Get rough with her...">>
<<goto "Kira_Rough_Tease">>
<</link>>
</div>
<</if>>
<<if $tempCompanion.kinks.includes("submission") && $tempCompanion.trust >= 50>>
<div class="kink-unlock-option">
<<link "Give her an order...">>
<<goto "Kira_Submit_Dialogue">>
<</link>>
</div>
<</if>>
<<if $tempCompanion.kinks.includes("degradation") && $tempCompanion.tension >= 60>>
<div class="kink-unlock-option">
<<link "Call her what she really is...">>
<<goto "Kira_Degrade_Dialogue">>
<</link>>
</div>
<</if>>
<<if $tempCompanion.kinks.includes("edging") && $tempCompanion.tension >= 70>>
<div class="kink-unlock-option">
<<link "Edge her...">>
<<goto "Kira_Edge_Dialogue">>
<</link>>
</div>
<</if>>
<<if $tempCompanion.kinks.includes("exhibitionism") && $tempCompanion.exhibitionism >= 30>>
<div class="kink-unlock-option">
<<link "Suggest something... public...">>
<<goto "Kira_Exhib_Dialogue">>
<</link>>
</div>
<</if>>
<</if>>
<</if>>
<</widget>><<setBackground "kira-room">>
<<showCharacter "kira" "center" "flustered">>
<h2>Good Girl</h2>
You step closer to Kira, letting your voice drop low.
<<say "Player" "You've been so good lately, Kira. I wanted you to know that.">>
She freezes. Her breath catches. You watch the flush creep up her neck, spreading to her cheeks.
<<say "Kira" "I... what?">>
<<say "Player" "You heard me. You've been a good girl.">>
The effect is immediate. Her thighs press together. Her lips part slightly. She won't meet your eyes.
<<say "Kira" "You can't just... say things like that." >>
<<say "Player" "Why not? It's true.">>
She makes a small, desperate sound in the back of her throat.
<<say "Kira" "Because it makes me..." >>
She trails off, but her body finishes the sentence for her. The way she's squirming. The way her nipples are suddenly visible through her shirt.
<<addTension "kira" 15>>
<<clampStat "companions[0].lust" 10>>
<<applyKinkEffects "kira" "praise">>
<div class="choice-container">
<<link "Keep praising her...">>
<<goto "Kira_Praise_Continue">>
<</link>>
<<link "Leave her wanting...">>
<<addTension "kira" 5>>
<<goto "Kira_Room">>
<</link>>
</div><<showCharacter "kira" "center" "aroused">>
You reach out and tilt her chin up, forcing her to look at you.
<<say "Player" "Such a good girl. Always trying so hard. Always wanting to please.">>
<<say "Kira" "Fuck..." >>
Her voice is barely a whisper. Broken. Needy.
<<say "Player" "You like being told that, don't you? Like being reminded that you're good for me.">>
She nods. Can't even form words anymore. Just that desperate, hungry look in her eyes.
<<say "Kira" "Please..." >>
<<say "Player" "Please what?">>
<<say "Kira" "Please... keep talking. Or touch me. Or something. I can't—" >>
<<addTension "kira" 20>>
<<clampStat "companions[0].lust" 15>>
<div class="choice-container">
<<link "Reward her..." "Kira_Intimate_Scene">><</link>>
<<link "Make her wait...">>
<<addTension "kira" 10>>
<<goto "Kira_Room">>
<</link>>
</div><<setBackground "kira-room">>
<<showCharacter "kira" "center" "surprised">>
<h2>Rough</h2>
You grab Kira by the arm and spin her around, pressing her against the wall. Your body pins hers. Your hand finds her throat—not squeezing, just... there. Possessive.
<<say "Kira" "What are you—" >>
<<say "Player" "Quiet.">>
She goes still. Her pulse hammers under your palm. But she's not fighting you. Not even a little.
<<say "Player" "I know what you want. I've seen the way you look at me after fights. When the adrenaline's still pumping.">>
Her hips push back against you involuntarily.
<<say "Kira" "You're imagining things." >>
<<say "Player" "Am I?">>
You tighten your grip on her throat slightly. Just enough to feel her swallow.
<<say "Kira" "...no." >>
<<addTension "kira" 20>>
<<clampStat "companions[0].lust" 15>>
<<applyKinkEffects "kira" "rough_play">>
<<if !$companions[0].kinks.includes("hair_pulling") && $companions[0].tension >= 50>>
<<discoverKink "kira" "hair_pulling">>
<</if>>
<div class="choice-container">
<<link "Take what you want..." "Kira_Rough_Scene">><</link>>
<<link "Let her go...">>
<<addTension "kira" 5>>
<<goto "Kira_Room">>
<</link>>
</div><<showCharacter "kira" "center" "desperate">>
Your hand slides into her hair and grips tight. She gasps—not in pain. In something else entirely.
<<say "Player" "Bend over.">>
<<say "Kira" "Here? Now? Someone might—" >>
You tug her hair, cutting off the protest.
<<say "Player" "I said. Bend. Over.">>
She bends. Plants her hands on the wall. Arches her back like she was made for this.
<<say "Kira" "God, yes. Finally." >>
<<addTension "kira" 25>>
<<clampStat "companions[0].lust" 20>>
<<if !$companions[0].kinks.includes("hair_pulling")>>
<<discoverKink "kira" "hair_pulling">>
<</if>>
<div class="choice-container">
<<link "Continue..." "Kira_Intimate_Scene">><</link>>
</div><<setBackground "kira-room">>
<<showCharacter "kira" "center" "attentive">>
<h2>Orders</h2>
You look at Kira. Really look at her. The way she's watching you. Waiting. Attentive.
<<say "Player" "Kira. Come here.">>
It's not a request. It's a command. And she obeys immediately. Crosses the room. Stands before you.
<<say "Player" "Good. Now kneel.">>
A flicker of something in her eyes—not hesitation, but anticipation. She sinks to her knees. Looks up at you.
<<say "Kira" "Like this?" >>
<<say "Player" "Exactly like that. You're good at this, aren't you? Following orders.">>
She shivers.
<<say "Kira" "I... yes. I am." >>
<<addTension "kira" 15>>
<<set $companions[0].submission += 5>>
<<applyKinkEffects "kira" "submission">>
<div class="choice-container">
<<link "Give her more orders...">>
<<goto "Kira_Submit_Continue">>
<</link>>
<<link "Tell her she can stand...">>
<<goto "Kira_Room">>
<</link>>
</div><<showCharacter "kira" "center" "submissive">>
<<say "Player" "Take off your shirt. Slowly.">>
Her hands move to obey before her brain can catch up. The fabric lifts. Reveals her stomach. Her bra. She drops the shirt to the floor.
<<say "Player" "The bra too.">>
<<say "Kira" "Yes." >>
Not "yes, okay." Not "yes, fine." Just "yes." Pure acceptance. Pure submission.
The bra joins the shirt. She kneels there, topless, looking up at you like she's exactly where she wants to be.
<<say "Player" "You like this. Being told what to do. Not having to think.">>
<<say "Kira" "I love it." >>
Her voice is thick with want.
<<say "Kira" "Please. Keep going. Tell me what to do next." >>
<<addTension "kira" 20>>
<<clampStat "companions[0].lust" 15>>
<<set $companions[0].submission += 10>>
<div class="choice-container">
<<link "Use her submission..." "Kira_Intimate_Scene">><</link>>
<<link "Make her stay there and wait...">>
<<addTension "kira" 15>>
<<if !$companions[0].kinks.includes("edging")>>
<<discoverKink "kira" "edging">>
<</if>>
<<goto "Kira_Room">>
<</link>>
</div><<setBackground "kira-room">>
<<showCharacter "kira" "center" "flustered">>
<h2>Names</h2>
Kira's tension is obvious. The way she keeps shifting. The way she can't quite meet your eyes. The way her thighs keep pressing together.
<<say "Player" "You're desperate, aren't you?">>
<<say "Kira" "N-no, I'm fine, I just—" >>
<<say "Player" "Don't lie to me. I can see it. You're fucking soaked right now, aren't you?">>
Her face goes crimson. But she doesn't deny it.
<<say "Player" "Say it.">>
<<say "Kira" "...yes." >>
<<say "Player" "Yes what?">>
<<say "Kira" "Yes, I'm... I'm wet." >>
<<say "Player" "Such a needy little slut.">>
The word hits her like a physical blow. She gasps. Her whole body trembles. And then—she moans.
<<say "Kira" "Oh god..." >>
<<addTension "kira" 25>>
<<clampStat "companions[0].lust" 20>>
<<applyKinkEffects "kira" "degradation">>
<div class="choice-container">
<<link "Keep degrading her...">>
<<goto "Kira_Degrade_Continue">>
<</link>>
<<link "Stop—that was too far">>
<<set $companions[0].trust -= 5>>
<<goto "Kira_Room">>
<</link>>
</div><<showCharacter "kira" "center" "desperate">>
<<say "Player" "You like being called that. Being reminded what you are.">>
<<say "Kira" "I don't—I shouldn't—" >>
<<say "Player" "But you do. Say it. Tell me what you are.">>
She struggles. Pride warring with need. Need wins.
<<say "Kira" "I'm... I'm a slut. Your slut." >>
The words seem to break something open in her. Her hand moves between her legs before she can stop it.
<<say "Player" "Did I say you could touch yourself?">>
She freezes. Hand hovering. Eyes wild.
<<say "Kira" "Please. Please, I need—" >>
<<say "Player" "Beg properly. Like the desperate whore you are.">>
<<say "Kira" "Please let me touch myself. Please let me cum. I'll do anything. I'm such a desperate slut and I need it so bad, please—" >>
<<addTension "kira" 30>>
<<clampStat "companions[0].lust" 25>>
<<set $companions[0].submission += 10>>
<div class="choice-container">
<<link "Let her..." "Kira_Intimate_Scene">><</link>>
<<link "Make her wait...">>
<<addTension "kira" 15>>
<<if !$companions[0].kinks.includes("edging")>>
<<discoverKink "kira" "edging">>
<</if>>
<<goto "Kira_Room">>
<</link>>
</div><<setBackground "kira-room">>
<<showCharacter "kira" "center" "desperate">>
<h2>Edge</h2>
Kira is a mess. Has been for days. You've been keeping her on edge deliberately—touches that stop just before satisfaction, words that wind her up with no release.
<<say "Kira" "Please. I can't take anymore. I need to cum so badly." >>
<<say "Player" "No.">>
She whimpers. Actually whimpers.
<<say "Kira" "Why are you doing this to me?" >>
<<say "Player" "Because you love it. Because every time I deny you, you get wetter. Needier. More desperate.">>
<<say "Kira" "That's not—" >>
<<say "Player" "Lie to me again and I'll make you wait another day.">>
She bites her lip. Struggles. Loses.
<<say "Kira" "...it's true. I love it. I hate how much I love it." >>
<<addTension "kira" 20>>
<<clampStat "companions[0].lust" 15>>
<<applyKinkEffects "kira" "edging">>
<div class="choice-container">
<<link "Let her cum...">>
<<set $companions[0].tension to 20>>
<<set $companions[0].lust to 30>>
<<goto "Kira_Intimate_Scene">>
<</link>>
<<link "One more day...">>
<<addTension "kira" 15>>
<<notify>>Kira whimpers but accepts her denial.<</notify>>
<<goto "Kira_Room">>
<</link>>
</div><<setBackground "kira-room">>
<<showCharacter "kira" "center" "nervous">>
<h2>Public</h2>
You lean in close to Kira, voice low.
<<say "Player" "I've noticed something about you.">>
<<say "Kira" "Oh?" >>
<<say "Player" "When you're exposed. When people can see you. You act embarrassed, but...">>
<<say "Kira" "But what?" >>
<<say "Player" "But you're also dripping wet.">>
She goes pale, then red.
<<say "Kira" "That's—I don't—how did you—" >>
<<say "Player" "So here's what we're going to do. Tonight, you're going to walk through the vault. No underwear. And you're going to let me watch how wet you get.">>
<<say "Kira" "I... someone might notice. Someone might see." >>
<<say "Player" "I know. That's the point, isn't it?">>
She swallows hard. But she doesn't say no.
<<say "Kira" "...okay." >>
<<addTension "kira" 15>>
<<set $companions[0].exhibitionism += 5>>
<<applyKinkEffects "kira" "exhibitionism">>
<div class="choice-container">
<<link "Watch her walk the vault..." "Kira_Exhib_Walk">><</link>>
<<link "Changed your mind...">>
<<goto "Kira_Room">>
<</link>>
</div><<setBackground "vault-hub">>
<<showCharacter "kira" "center" "nervous">>
<h2>Exposed</h2>
Kira walks through the vault hub. Her steps are careful. Deliberate. She's hyperaware of the absence of underwear beneath her skirt.
Every movement. Every slight breeze. She feels it.
<<say "Kira" "(internal) God. Anyone could see. Anyone could notice. What if the skirt rides up? What if they can tell I'm not wearing—" >>
You watch her. The way her thighs rub together. The faint flush on her cheeks. The way she can't help but look around, seeing who might be watching.
<<say "Player" "How do you feel?">>
She looks at you. Eyes bright. Cheeks red. Breathing quick.
<<say "Kira" "Terrified. And... and so fucking turned on." >>
<<addTension "kira" 20>>
<<clampStat "companions[0].lust" 15>>
<<set $companions[0].exhibitionism += 10>>
<div class="choice-container">
<<link "Take her somewhere private..." "Kira_Intimate_Scene">><</link>>
<<link "Make her keep walking...">>
<<addTension "kira" 15>>
<<set $companions[0].exhibitionism += 5>>
<<goto "Vault_Hub">>
<</link>>
</div><<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>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>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.
<div class="narrative-image">
<img src="assets/images/effects/mirror-corruption-high.webp" alt="Corrupted Reflection">
</div>
<<say "Narrator" "internal" "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)>>
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.
<div class="narrative-image">
<img src="assets/images/locations/shower-steam.webp" alt="Shower">
</div>
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">>
<<vchoice "Take a COLD shower (reduce arousal)" "Bathroom_ColdShower" "action" "crystal">>
<<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)>>
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.
<div class="narrative-image intimate">
<img src="assets/images/intimate/shower-solo.webp" alt="Shower Masturbation">
</div>
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] && $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>>
<<goto "Bathroom_Caught">>
<<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>>
<video autoplay loop muted playsinline>
<source src="assets/videos/intimate/shower-masturbate-male.mp4" type="video/mp4">
</video>
<</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)>>
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.
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.
<div class="narrative-image intimate">
<img src="assets/images/intimate/caught-shower-silhouette.webp" alt="Caught in Shower">
</div>
<<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">>
She hesitates only a moment. Then steps inside. Closes the door behind her. Locks it this time.
<<say "Kira" "Don't say anything.">>
Steam swirls as she pulls off her shirt. Then her pants. Naked.
<div class="narrative-image intimate">
<img src="assets/images/intimate/kira-shower-enter.webp" alt="Kira Enters Shower">
</div>
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">>
<<advanceTime 0 30>>
Wet skin against wet skin. The shower is cramped. Intimate. Nowhere to go but against each other.
Her hand wraps around your still-hard cock. Taking over where you left off.
<div class="narrative-video intimate">
<<if $preferences.showVideos>>
<video autoplay loop muted playsinline>
<source src="assets/videos/intimate/kira-shower-handjob.mp4" type="video/mp4">
</video>
<</if>>
</div>
<<performSexAct "handjob_receive">>
<<say "Kira" "I've thought about this. Your body. What you look like when you come.">>
Her grip is firm, confident. She watches your face as she strokes.
Water cascades over her breasts. You can't help but stare.
<<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">>
<<advanceTime 0 30>>
Your hand finds her pussy. She gasps against your neck.
<<say "Kira" "Oh— fuck— yes—">>
<div class="narrative-image intimate">
<img src="assets/images/intimate/shower-mutual.webp" alt="Mutual Shower">
</div>
<<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">>
Her hand pumps you faster. Matching your rhythm. Both of you building together.
<div class="narrative-video intimate">
<<if $preferences.showVideos>>
<video autoplay loop muted playsinline>
<source src="assets/videos/intimate/shower-mutual-orgasm.mp4" type="video/mp4">
</video>
<</if>>
</div>
<<say "Kira" "I'm close— oh god—">>
<<say $player.name "Me too—">>
<<sexPhase "climax">>
<<performSexAct "climax_together">>
You come together. Her pussy clenching around your fingers while you spill over her hand. The water washing it all away.
Both of you lean against each other, panting. Steam swirling.
<<endSexScene>>
<<set $player.lust to 0>>
<<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">>
<<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.">>
She turns, bracing her hands against the tile wall. Ass toward you. Looking back over her shoulder.
<div class="narrative-image intimate">
<img src="assets/images/intimate/kira-shower-doggy.webp" alt="Shower Position">
</div>
<<say "Kira" "Then take it. Fuck me under the water.">>
<<sexPhase "action">>
<<performSexAct "position_standing_doggy">>
You grip her hips. Position yourself. The water makes everything slick.
<<performSexAct "penetrate">>
You slide into her. She's tight, wet from more than the shower. You push in deep.
<<say "Kira" "Oh FUCK— yes—">>
<div class="narrative-video intimate">
<<if $preferences.showVideos>>
<video autoplay loop muted playsinline>
<source src="assets/videos/intimate/kira-shower-fuck.mp4" type="video/mp4">
</video>
<</if>>
</div>
<<performSexAct "thrust_fast">>
The shower is cramped. The footing treacherous. You have to brace against the wall while fucking her.
Water streams over your joined bodies. Her moans echo off the tiles.
<<say "Kira" "Harder— the water— it feels so good—">>
You grip her wet hair. Pull her head back. She moans louder.
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">>
You bury yourself deep and EXPLODE. Filling her under the hot spray. She comes with you, pussy clenching, legs shaking.
<<endSexScene>>
You almost slip, catching yourselves on the wall. Both laughing breathlessly.
<<set $player.lust to 0>>
<<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...">>
She doesn't finish. Just leans back into you. Satisfied.
<div class="choice-container">
<<vchoice "Dry off together" "Bathroom_Hub" "move" "shower">>
</div><<sexScene "kira" "service" "intimate" "shower">>
<<showCharacter "kira" "center" "focused">>
<<advanceTime 0 30>>
<<say $player.name "Keep going. Finish me.">>
Her hand works you expertly. The water making it slick. Perfect.
<div class="narrative-image intimate">
<img src="assets/images/intimate/kira-shower-handjob.webp" alt="Shower Handjob">
</div>
<<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>>
<<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>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 _hlPeopleHere to []>>
<<for _comp range $companions>>
<<if _comp.currentLocation === _hlLocationId>>
<<run _hlPeopleHere.push(_comp)>>
<</if>>
<</for>>
<<capture _hlName, _hlTarget, _hlLocationId, _hlIcon>>
<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>>
</div>
<</capture>>
<</widget>>
<<widget "updateCompanionLocations">>
<<if $companions && $companions.length gt 0>>
<<for _i, _comp range $companions>>
<<if _comp.id === "kira">>
<<if $companions[_i].currentLocation !== "medical">>
<<set $companions[_i].currentLocation to "kira_quarters">>
<</if>>
<</if>>
<</for>>
<</if>>
<</widget>>
/* =============================================================<<run VaultUI.setBackground("kira_room")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<<if $companions && $companions.length > 0 && $companions[0] && $time.day >= 3 && (!$flags.lastKiraRoomEventDay || $time.day > $flags.lastKiraRoomEventDay)>>
<<set _eventRoll = random(1, 100)>>
<<if $companions[0].tension >= 80 && !$flags.sleptWithKira && _eventRoll <= 40>>
<<set $flags.lastKiraRoomEventDay = $time.day>>
<<goto "Kira_Room_Event_HighTension">>
<<elseif $player.dominance >= 25 && $companions[0].tension >= 75 && _eventRoll <= 20>>
<<set $flags.lastKiraRoomEventDay = $time.day>>
<<goto "Kira_Room_Event_Dominance">>
<<elseif $companions[0].tension >= 70 && _eventRoll <= 20>>
<<set $flags.lastKiraRoomEventDay = $time.day>>
<<goto "Kira_Room_Event_Masturbating">>
<<elseif $player.lust >= 70 && $flags.sleptWithKira && _eventRoll <= 30>>
<<set $flags.lastKiraRoomEventDay = $time.day>>
<<goto "Kira_Room_Event_HighLust">>
<<elseif $player.lust >= 65 && $companions[0].tension >= 65 && !$flags.sleptWithKira && $companions[0].trust >= 30 && _eventRoll <= 25>>
<<set $flags.lastKiraRoomEventDay = $time.day>>
<<goto "Kira_HelpEachOther_Menu">>
<<elseif $player.corruption >= 35 && $companions[0].tension >= 60 && _eventRoll <= 20>>
<<set $flags.lastKiraRoomEventDay = $time.day>>
<<goto "Kira_Room_Event_Corruption">>
<<elseif $extremeContent.supernatural && $companions[0].trust >= 90 && $companions[0].tension >= 90 && _eventRoll <= 15>>
<<set $flags.lastKiraRoomEventDay = $time.day>>
<<goto "Kira_Room_Event_Velith">>
<</if>>
<</if>>
<<if $companions && $companions.length > 0 && $companions[0]>>
<<showCharacter "kira" "center" "neutral">>
<<describeKiraRoom>>
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>>
<div class="choice-container">
<<vchoice "Talk" "Kira_Room_Talk" "talk" "talk">>
<<if ($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>>
<<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 && ($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>><<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><<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">>
<<vchoice "About Sera" "Kira_Talk_Sera" "talk" "broken-heart">>
<<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>><<showCharacter "kira" "center" "vulnerable">>
<<say "Kira" "That's...">>
She goes quiet. Then, slowly:
<<say "Kira" "Your 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>>
<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 talked about you. A lot.">>
She hands you the photograph.
Sera. Your 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><<say $player.name "She looks happy.">>
<<say "Kira" "She was. For a while.">>
Kira takes the photo back gently.
<<say "Kira" "We met on the road. Both running from different things. 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 first person I trusted in years.">>
<<relationChange "kira" "trust" 1>>
<div class="choice-container">
<<vchoice "Continue" "Kira_Room" "move" "map">>
</div>You stay silent, just looking at your 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)>>
You settle in to wait.
The room is quiet. Lived-in but sparse. A weapon rack with her machete. Training dummy showing signs of heavy use.
<<advanceTime 1 0>>
After an hour, Kira returns.
<<showCharacter "kira" "center" "surprised">>
<<say "Kira" "You waited?">>
<<relationChange "kira" "affection" 1>>
<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.succubusEncounterComplete>>
<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>>
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. Sera's sibling. 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. Sera'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.">>
She catches your meaning. A smile tugs at her lips.
<<say "Kira" "Is it now?">>
<<addTension "kira" 10>>
<<if $companions[0].tension >= 60>>
The air shifts. Charged.
<div class="choice-container">
<<vchoice "Step closer" "Kira_Room_Approach" "intimate" "broken-heart">>
<<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>>
You step closer. The room feels smaller. The bed very present.
Kira's breath catches.
<<say "Kira" "What are you—">>
She doesn't finish. Doesn't step back.
<<addTension "kira" 10>>
<<if $companions[0].tension >= 70>>
The tension snaps.
<<say "Kira" "Damn it.">>
She grabs your collar and pulls you into a kiss.
<<goto "Kira_Room_Kiss">>
<<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>>
You reach up, touch her face gently.
<<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.
All that tension, all those loaded glances — it pours into this moment.
<<set $flags.kissedKira to true>>
<<addTension "kira" 15>>
<<relationChange "kira" "affection" 2>>
Her back hits the wall. Then the desk. Papers scatter.
<<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.">>
She pulls you toward the bed.
<<if $companions[0].trust >= 50 && ($flags.sleptWithKira || $companions[0].tension >= 65)>>
<<goto "Kira_Room_Sex_Start">>
<<else>>
You fall onto the narrow bed together. Kissing. Touching.
But she stops your hand before it goes too far.
<<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.
<<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">>
<<say $player.name "Wait. We should—">>
<<say "Kira" "Yeah. Too fast.">>
But the tension is still there. Coiled. Waiting.
<<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.">>
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">>
<<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">>
<<say "Kira" "You say that now.">>
<<say $player.name "And I'll keep saying it.">>
She searches your eyes.
<<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.
Kira looks up. She knows what that means.
<<if $flags.sleptWithKira>>
<<say "Kira" "Again?">>
She's smiling.
<<say "Kira" "Come here.">>
<<goto "Kira_Room_Sex_Start">>
<<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("evening")>>
<<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.
<<goto "Kira_Sex_Familiar">>
<</if>><<sexPhase "buildup">>
<<advanceTime 0 30>>
<div class="narrative-image intimate">
<img src="assets/images/intimate/kira-first-time-kiss.webp" alt="First Kiss">
</div>
<<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.
<div class="narrative-image intimate">
<img src="assets/images/intimate/kira-undressing.webp" alt="Undressing">
</div>
<<showCharacter "kira" "center" "aroused">>
She's beautiful. Scars across her ribs, her shoulder. Battle-hardened body, lean muscle, small 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 with dark eyes.
<div class="narrative-image intimate">
<img src="assets/images/intimate/kira-oral-receive.webp" alt="Oral">
</div>
<<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.
She spreads her legs for you without being asked.
Your mouth finds her pussy. She's soaked, the taste of her flooding your tongue.
<<say "Kira" "Oh FUCK—">>
Her hands grip your hair, not forcing, just holding on.
You lick slowly at first. Teasing. Your tongue exploring her folds, 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>>
<video autoplay loop muted playsinline>
<source src="assets/videos/intimate/kira-orgasm-oral.mp4" type="video/mp4">
</video>
<</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 entrance. Looking into her eyes.
<div class="narrative-image intimate">
<img src="assets/images/intimate/kira-missionary-entry.webp" alt="Entry">
</div>
<<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.
<div class="narrative-video intimate">
<<if $preferences.showVideos>>
<video autoplay loop muted playsinline>
<source src="assets/videos/intimate/kira-missionary-fuck.mp4" type="video/mp4">
</video>
<</if>>
</div>
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.
<div class="narrative-image intimate">
<img src="assets/images/intimate/kira-orgasm-together.webp" alt="Mutual Orgasm">
</div>
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.">>
<<performSexAct "penetrate">>
You enter her in one smooth stroke. She's still trembling from her first orgasm, sensitive and swollen.
<div class="narrative-image intimate">
<img src="assets/images/intimate/kira-second-round.webp" alt="Second Round">
</div>
<<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>>
<video autoplay loop muted playsinline>
<source src="assets/videos/intimate/kira-intense-orgasm.mp4" type="video/mp4">
</video>
<</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.
<div class="narrative-image intimate">
<img src="assets/images/intimate/kira-doggy-position.webp" alt="Doggy Position">
</div>
<<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>>
<video autoplay loop muted playsinline>
<source src="assets/videos/intimate/kira-doggy-hard.mp4" type="video/mp4">
</video>
<</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("evening")>>
<<showCharacter "kira" "center" "satisfied">>
<<advanceTime 0 15>>
Tangled together. Sweat cooling.
<<if !$flags.sleptWithKira>>
<<set $flags.sleptWithKira to true>>
<<set $companions[0].romanceStage to 2>>
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">
<<vchoice "Stay the night" "Kira_Room_StayNight" "intimate" "night">>
<<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>>
Sleep comes easy.
<div class="choice-container">
<<vchoice "Dream..." "Vault_Hub" "move" "night">>
</div>You get dressed. She watches from the bed.
<<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><<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" "I was the only one who made it out.">>
<<relationChange "kira" "trust" 1>>
<div class="choice-container">
<<vchoice "Continue" "Kira_Room" "move" "map">>
</div><<showCharacter "kira" "center" "sad">>
<<advanceTime 0 40>>
<<say "Kira" "Sera... she saved my life. Literally.">>
<<say "Kira" "I was half-dead when she found me. She could have kept walking. Most people would.">>
<<say "Kira" "But she didn't.">>
<<if $flags.seraPhotoSeen>>
<<say "Kira" "That's why I kept her things. It's all I have left of her.">>
<</if>>
<<relationChange "kira" "trust" 2>>
<<relationChange "kira" "affection" 1>>
<div class="choice-container">
<<vchoice "Continue" "Kira_Room" "move" "map">>
</div><<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.succubusEncounterComplete>>
<<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.">>
Light sparring. Playful. She's holding back.
<<if $companions[0].tension >= 50>>
You end up pinned against the wall. Her body pressed against yours.
<<say "Kira" "I win.">>
Neither of you moves.
<<addTension "kira" 10>>
<div class="choice-container">
<<vchoice "Kiss her" "Kira_Room_Kiss" "intimate" "lips">>
<<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>>
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.">>
She grabs your collar, pulling you down to her level.
<<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.
<div class="narrative-image intimate">
<img src="assets/images/intimate/kira-desperate-kiss.webp" alt="Desperate Kiss">
</div>
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.
You sweep the desk clear with one arm. Papers, her map, weapons oil— everything crashes to the floor.
<<showCharacter "kira" "center" "desperate">>
You lift her onto the desk. She spreads her legs immediately, pulling you between them.
<<say "Kira" "Now. I need you NOW. Don't make me fucking wait.">>
<<sexPhase "action">>
<<performSexAct "position_desk">>
You yank her pants down to her ankles. She's not wearing underwear. Soaked already.
<div class="narrative-video intimate">
<<if $preferences.showVideos>>
<video autoplay loop muted playsinline>
<source src="assets/videos/intimate/kira-desk-sex.mp4" type="video/mp4">
</video>
<</if>>
</div>
<<performSexAct "penetrate">>
You SLAM into her. No buildup. She's wet enough. Desperate enough.
<<say "Kira" "FUCK— YES—">>
Her head falls back. You fuck her hard on her own desk. The furniture scraping across the floor with each brutal thrust.
<<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.
<div class="narrative-image intimate">
<img src="assets/images/intimate/kira-desk-rough.webp" alt="Desk Fucking">
</div>
The desk is slamming against the wall. Someone will hear. Neither of you cares.
<<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.
The desk leg cracks. You both collapse onto it, still joined, panting like animals.
No tenderness. Just raw need released.
<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">>
You catch her wrists. Stop her.
<<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>>
She drops to her knees without hesitation.
<<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>>
<<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.">>
You guide her to the bed. Lay her down. Take your time undressing her.
<<performSexAct "undress_slow">>
<<say "Kira" "You don't have to—">>
<<say $player.name "I want to.">>
When you finally slide into her, it's slow. Deliberate. Her eyes never leave yours.
<<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>>
<div class="choice-container">
<<vchoice "..." "Kira_Event_DespTenderAfter" "intimate" "broken-heart">>
</div><<endSexScene>>
<<showCharacter "kira" "center" "vulnerable">>
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">>
Papers are everywhere. Her desk is a mess.
<<say "Kira" "I needed that.">>
<<say $player.name "I noticed.">>
She laughs, breathless.
<<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.
She freezes when she hears you.
<<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>>
<<vchoice "Want help with that?" "Kira_Event_HelpMast" "intimate" "grab">>
<<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.
<div class="narrative-image intimate">
<img src="assets/images/intimate/kira-masturbating-watched.webp" alt="Watched Masturbation">
</div>
<<performSexAct "masturbate_partner">>
Her eyes lock with yours as she touches herself. Two fingers sliding through her wetness, circling her clit.
<<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.">>
She doesn't. Maintaining eye contact as she pleasures herself. It's obscene. It's beautiful.
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">>
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>>
<video autoplay loop muted playsinline>
<source src="assets/videos/intimate/kira-masturbate-orgasm.mp4" type="video/mp4">
</video>
<</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.
Finally she collapses. Chest heaving. Fingers still between her legs.
<<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.
<div class="narrative-image intimate">
<img src="assets/images/intimate/kira-fingered.webp" alt="Fingering">
</div>
<<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>>
<video autoplay loop muted playsinline>
<source src="assets/videos/intimate/kira-fingered-orgasm.mp4" type="video/mp4">
</video>
<</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.
Finally she goes limp. Panting. Your fingers still inside her.
<<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 the obvious bulge in your pants.
<<performSexAct "undress_partial">>
She pulls your pants down. Your cock springs free, hard and aching.
<<say "Kira" "Fair is fair. And I owe you.">>
<div class="narrative-image intimate">
<img src="assets/images/intimate/kira-oral-give.webp" alt="Kira Gives Oral">
</div>
<<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>>
<video autoplay loop muted playsinline>
<source src="assets/videos/intimate/kira-blowjob.mp4" type="video/mp4">
</video>
<</if>>
</div>
Her hand cups your balls. Gentle pressure. Her mouth working faster.
<<say $player.name "I'm close— Kira—">>
She doubles down. Sucking harder. Wanting it.
<<performSexAct "climax_player">>
You come with a groan. Flooding her mouth. She swallows it all, throat working, not spilling a drop.
She pulls off with a wet pop. Licks her lips.
<<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.">>
You stroke yourself while she watches. Turnabout.
<<say "Kira" "You look good like that. Desperate.">>
<<performSexAct "climax_player">>
You finish under her gaze.
<<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.">>
<<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.">>
<<performSexAct "climax_partner">>
She comes HARD on command. The power exchange making it more intense.
<<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?">>
<<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>>
<<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.">>
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">>
<<if $companions[0].trust >= 60>>
<<say "Kira" "Wait—">>
She stops herself. Shakes her head.
<<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">>
When you enter, Kira stares at you.
<<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?">>
She takes a half-step back. Uncertain.
<</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">>
<div class="narrative-image intimate">
<img src="assets/images/intimate/corruption-eyes-purple.webp" alt="Purple Eyes">
</div>
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">>
<<performSexAct "position_missionary">>
You lay her on the bed. She's trembling. Not from fear. From NEED.
<<performSexAct "penetrate">>
You enter her. Purple energy crackles where your bodies join.
<div class="narrative-video intimate">
<<if $preferences.showVideos>>
<video autoplay loop muted playsinline>
<source src="assets/videos/intimate/corruption-sex.mp4" type="video/mp4">
</video>
<</if>>
</div>
<<say "Kira" "Your eyes— they're GLOWING— oh god it feels—">>
The corruption flows from you into her with each thrust. She can FEEL it. Dark tendrils of energy seeping into her.
<<performSexAct "thrust_fast">>
You fuck her harder. The room darkens. Purple light pulsing with your heartbeat.
<<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.
<div class="narrative-image intimate">
<img src="assets/images/intimate/corruption-orgasm-purple.webp" alt="Corrupting Orgasm">
</div>
Her eyes flash purple for just a moment as she comes. Changed. Corrupted.
You collapse onto her. Both glowing faintly with residual energy.
<<addCorruption 3>>
<<addCorruption 5 "kira">>
<div class="choice-container">
<<vchoice "Aftermath" "Kira_Event_CorruptAfter" "move" "map">>
</div><<endSexScene>>
<<showCharacter "kira" "center" "changed">>
She's breathing hard. Looking at her hands.
<<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>>
Purple energy crackles around you both as you take her. Roughly. Possessively.
<<performSexAct "corruption_claim">>
The corruption doesn't just seep into her. It DEVOURS.
<<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>>
<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.">>
Your voice has AUTHORITY. Command.
<<if $companions[0].submission >= 70>>
She moves immediately. No hesitation. Sits on the bed, eyes down.
<<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.">>
<<showCharacter "kira" "center" "submissive">>
<<performSexAct "undress_partner_slow">>
She obeys. Piece by piece. Her eyes never leaving yours.
<<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">>
<<vchoice "Deny her release" "Kira_Event_DomDeny" "intimate" "check">>
<<vchoice "Finish her yourself" "Kira_Event_DomFinish" "intimate" "rapid-strikes">>
</div><<say $player.name "Finish. But keep your eyes on me.">>
<<performSexAct "masturbate_partner">>
She touches herself while staring into your eyes. Submissive. Obedient.
<<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.">>
<<performSexAct "touch_intimate">>
Your fingers replace hers. She gasps at the contact.
You're not gentle. Two fingers plunging into her wetness. She's SOAKED.
<div class="narrative-image intimate">
<img src="assets/images/intimate/kira-dominated-fingered.webp" alt="Dominated Fingering">
</div>
<<performSexAct "touch_intimate">>
You finger-fuck her ruthlessly. Curling to hit her G-spot with each thrust. Your other hand pinning her wrist above her head.
<<say "Kira" "Oh fuck oh fuck oh FUCK—">>
She's writhing, trying to close her legs. You force them open with your knee.
<<performSexAct "finger_penetrate">>
Three fingers now. Stretching her. Your thumb grinding against her clit.
<<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.
You can feel her pussy fluttering. Right on the edge. Begging for release.
<div class="narrative-video intimate">
<<if $preferences.showVideos>>
<video autoplay loop muted playsinline>
<source src="assets/videos/intimate/kira-edged-orgasm.mp4" type="video/mp4">
</video>
<</if>>
</div>
<<say $player.name "Now. Come for me NOW.">>
<<performSexAct "climax_partner">>
Permission granted. She DETONATES.
Her whole body convulses. Pussy clenching so hard around your fingers it almost hurts. Wetness flooding your hand.
<<say "Kira" "FUCK— THANK YOU— THANK YOU—">>
Thanking you for allowing her to come. Perfect submission.
You keep fingering her, drawing it out until she's sobbing from oversensitivity.
<<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">>
She slides off the bed immediately, drops to her knees. Submissive. Eager to serve.
<div class="narrative-image intimate">
<img src="assets/images/intimate/kira-knees-submissive.webp" alt="On Knees">
</div>
You stand before her. She looks up at you, waiting for permission.
<<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>>
<video autoplay loop muted playsinline>
<source src="assets/videos/intimate/kira-submissive-blowjob.mp4" type="video/mp4">
</video>
<</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.">>
<<showCharacter "kira" "center" "submissive">>
She obeys instantly. Presenting herself.
<<sexScene "kira" "dominant" "rough" "kira-room">>
<<sexPhase "action">>
<<performSexAct "position_doggy">>
<<performSexAct "penetrate">>
You grip her hips. Take her hard.
<<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>>
<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.">>
She swallows.
<<say "Kira" "Okay.">>
<div class="choice-container">
<<vchoice "Make her beg" "Kira_Event_Beg" "intimate" "hand">>
<<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">>
<<vchoice "Make her wait" "Kira_Event_DomDeny" "intimate" "check">>
</div><<showCharacter "kira" "center" "vulnerable">>
<<sexScene "kira" "dominant" "tender" "kira-room">>
<<say $player.name "I've got you. Trust me.">>
Your voice is commanding but warm. Safe.
<<if $companions[0].submission >= 60>>
She melts into the bed. Surrendering completely.
<<say "Kira" "I trust you. Do whatever you want.">>
<<else>>
She relaxes slightly. Still alert, but willing.
<<say "Kira" "...Okay. I trust you.">>
<</if>>
You undress her slowly. Worshipfully. Kissing each inch of skin as you reveal it.
<<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.">>
She rides you. Hard. Using you for her pleasure.
<<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>>
<div class="choice-container">
<<vchoice "Catch your breath" "Kira_Room" "move" "map">>
</div><<showCharacter "kira" "center" "aware">>
You enter. Your arousal is obvious.
<<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.">>
<<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.">>
She does.
<<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">>
<<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">>
Velith materializes in the room. Just visible enough.
<<say "Velith" "supernatural" "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" "supernatural" "I wanted to meet your little human. She's cute.">>
Velith circles Kira like a predator.
<<say "Velith" "supernatural" "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 $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" "supernatural" "Protective. Sweet.">>
She fades.
<<say "Velith" "supernatural" "But I'll be back. We all will.">>
<<showCharacter "kira" "center" "shaken">>
Kira is trembling.
<<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" "supernatural" "Oh, this will be FUN.">>
Velith trails a finger down Kira's arm. Kira gasps.
<<say "Kira" "She's— I can FEEL her—">>
<<say "Velith" "supernatural" "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" "supernatural" "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">>
<<performSexAct "kiss_deep">>
<<performSexAct "penetrate">>
You make love to Kira while a demon watches.
<<say "Velith" "supernatural" "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>>
<div class="choice-container">
<<vchoice "Aftermath" "Kira_Event_VelithAfter" "move" "map">>
</div><<endSexScene>>
<<showCharacter "velith" "center" "satisfied">>
<<say "Velith" "supernatural" "Delightful. We should do this again.">>
She fades.
<<showCharacter "kira" "center" "overwhelmed">>
Kira is shaking.
<<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" "supernatural" "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">>
Velith glides to Kira. Trails a clawed finger down her cheek.
<<say "Velith" "supernatural" "You're beautiful. Mortal. Fragile. I'm going to enjoy breaking you gently.">>
<div class="narrative-image intimate">
<img src="assets/images/intimate/velith-kira-kiss.webp" alt="Demon Kisses Woman">
</div>
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" "supernatural" "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>>
<video autoplay loop muted playsinline>
<source src="assets/videos/intimate/kira-velith-threesome.mp4" type="video/mp4">
</video>
<</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" "supernatural" "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.
<div class="narrative-image intimate">
<img src="assets/images/intimate/threesome-kira-velith.webp" alt="MFF Threesome">
</div>
<<say "Velith" "supernatural" "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" "supernatural" "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>>
<div class="choice-container">
<<vchoice "Aftermath" "Kira_Event_ThreesomeAfter" "move" "map">>
</div><<endSexScene>>
<<showCharacter "velith" "center" "satisfied">>
<<say "Velith" "supernatural" "Exquisite. Your human is a treasure.">>
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><<showCharacter "kira" "center" "feral">>
You return from combat. Adrenaline still pumping.
Kira follows you into her room. Slams the door.
<<say "Kira" "That fight— the way you moved—">>
She's breathing hard. Eyes wild.
<<say "Kira" "I need—">>
She doesn't finish. Just attacks you with a kiss.
<<addTension "kira" 10>>
<<clampStat "player.lust" 20>>
<div class="choice-container">
<<vchoice "Give in to the adrenaline" "Kira_Event_AdrenalineSex" "intimate" "rapid-strikes">>
<<vchoice "Calm down first" "Kira_Room" "action" "meditation">>
</div><<sexScene "kira" "adrenaline" "rough" "kira-room">>
No gentleness. Just primal, animalistic NEED.
<<sexPhase "action">>
<div class="narrative-image intimate">
<img src="assets/images/intimate/kira-wall-sex.webp" alt="Wall Sex">
</div>
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">>
You DRIVE into her. She's already wet from the adrenaline. From watching you fight.
<<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>>
<video autoplay loop muted playsinline>
<source src="assets/videos/intimate/kira-wall-fuck.mp4" type="video/mp4">
</video>
<</if>>
</div>
<<say "Kira" "Harder— fuck me like you fought— use me—">>
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.">>
<<say "Kira" "We should go fight things more often.">>
<<addAffection "kira" 1>>
<div class="choice-container">
<<vchoice "Catch your breath" "Kira_Room" "move" "map">>
</div><<showCharacter "kira" "center" "amused">>
Morning. You're in Kira's bed.
And you're VERY aware of her body pressed against yours.
<<say "Kira" "Someone's awake.">>
She presses back against you deliberately.
<<say "Kira" "And eager.">>
<<clampStat "player.lust" 20>>
<div class="choice-container">
<<vchoice "Morning sex" "Kira_Event_MorningSex" "intimate" "sunrise">>
<<vchoice "Ignore it and get up" "Kira_Room" "action" "house">>
</div><<sexScene "kira" "romantic" "lazy" "kira-room-morning">>
Morning light filters through cracks in the vault. Warm. Intimate.
<<sexPhase "action">>
<div class="narrative-image intimate">
<img src="assets/images/intimate/kira-morning-spooning.webp" alt="Morning Spooning">
</div>
<<performSexAct "position_spooning">>
She's still half-asleep. You're pressed against her from behind. Your hard cock against her ass.
She presses back deliberately. Grinding against you.
<<say "Kira" "Mmm. Someone's awake.">>
Your hand slides around. Cupping her breast. She sighs contentedly.
<<performSexAct "penetrate">>
You lift her leg slightly. Guide yourself to her entrance. Slide inside.
<<say "Kira" "Oh... yeah... just like that...">>
Still half-asleep but wet enough to take you. You enter slowly, filling her inch by inch.
<div class="narrative-video intimate">
<<if $preferences.showVideos>>
<video autoplay loop muted playsinline>
<source src="assets/videos/intimate/kira-spooning-sex.mp4" type="video/mp4">
</video>
<</if>>
</div>
<<performSexAct "thrust_slow">>
Lazy morning sex. No urgency. Just slow, deep strokes. Her ass pressed against your hips with each thrust.
Your hand finds her clit. Rubbing gently while you fuck her.
<<say "Kira" "Mmm. Good morning to you too.">>
She's smiling. You can hear it in her voice.
The intimacy of it. Waking up inside her. Gentle pleasure instead of desperate need.
<<say "Kira" "This is nice. Just... nice.">>
<<performSexAct "thrust_slow">>
You pick up the pace slightly. She moans, pushing back to meet you.
<<sexPhase "climax">>
<<say "Kira" "Keep going... I'm close...">>
Your fingers work her clit faster. Cock buried deep. Both still mostly asleep but building toward climax.
<<performSexAct "climax_together">>
You both come GENTLY. No screaming. Just shared gasps and sighs. Warm pleasure washing over you.
You stay inside her. Neither moving. Just basking in the afterglow.
<<endSexScene>>
<<say "Kira" "We should wake up like this every day.">>
<<set $player.lust to 30>>
<<relationChange "kira" "affection" 2>>
<div class="choice-container">
<<vchoice "Maybe we will" "Kira_Room" "talk" "broken-heart">>
</div><<run VaultUI.setBackground("quarters")>>
<<run VaultUI.setTimeOfDay("intimate")>>
<<showCharacter "kira" "center" "aroused">>
You pull her close. Her breath catches.
<<say "Kira" "Finally.">>
<<set $companions[0].tension to Math.max(0, $companions[0].tension - 40)>>
<<set $companions[0].lust to Math.max(0, $companions[0].lust - 30)>>
<<addAffection "kira" 2>>
<<performSexAct "kiss_deep">>
<p class="narrator"><em>Extended intimate scene content coming in future update.</em></p>
<div class="choice-container">
<<vchoice "Later..." "Kira_Room" "intimate" "heart">>
</div><<set $currentLocation to "pleasure_den">>
<h2>The Pleasure Den</h2>
The entrance is hidden behind a collapsed storefront, but the signs are there if you know what to look for. Scratched symbols on rusted metal. The faint smell of incense cutting through the Reclaimed dust.
Inside, the bunker opens into something unexpected - dim red lighting, salvaged furniture arranged into private alcoves, and the low murmur of voices. This is a place where survivors come to forget the world outside. To trade, to drink, to fuck.
A woman approaches. Late twenties, dark hair, wearing what might generously be called clothing - strips of leather that cover nothing important.
<<dialogue "Madam Silk" "npc">>Fresh meat. Welcome to the Den, traveler.<</dialogue>>
Her eyes travel over you slowly, appraisingly.
<<dialogue "Madam Silk" "npc">>We deal in pleasure here. Coin buys company. Skills buy favor. And desperation... well.<</dialogue>>
She smiles, showing teeth.
<<dialogue "Madam Silk" "npc">>Desperation buys anything.<</dialogue>>
<<if $companions && $companions[0]>>
Kira shifts uncomfortably beside you. The working girls and boys have noticed her - some with interest, others with something hungrier.
<<if $companions[0].exhibitionism >= 40>>
<<dialogue "Kira" "companion">>Interesting place. I can see why you brought us here.<</dialogue>>
She doesn't seem entirely opposed.
<<else>>
<<dialogue "Kira" "companion">>Can we not stay long? This place gives me the creeps.<</dialogue>>
Her hand finds yours, squeezing.
<</if>>
<</if>>
<div class="choice-container">
<<vchoice "Ask about services" "PleasureDen_Services" "action" "talk">>
<<vchoice "Look around" "PleasureDen_Look" "examine" "search">>
<<vchoice "Leave" "PleasureDen_Leave" "move" "return">>
</div><<dialogue "Madam Silk" "npc">>Services? We offer everything, sweetness.<</dialogue>>
She gestures to the alcoves, where shadows move in suggestive ways.
<<dialogue "Madam Silk" "npc">>Company for the night - warm bodies who know how to make you forget. Fifty caps for an hour, two hundred for the night.<</dialogue>>
<<dialogue "Madam Silk" "npc">>Or if you're short on caps...<</dialogue>>
Her eyes flick to Kira, then back to you.
<<dialogue "Madam Silk" "npc">>We're always looking for new talent. Your companion there would fetch a good price. Temporary arrangement, of course. Unless she prefers... permanent employment.<</dialogue>>
<<if $companions && $companions[0]>>
<<if $companions[0].submission >= 60>>
Kira's cheeks flush, but she doesn't immediately refuse. Her eyes find the floor.
<<else>>
<<dialogue "Kira" "companion">>Absolutely fucking not.<</dialogue>>
Her voice is sharp, but you notice her thighs press together.
<</if>>
<</if>>
<div class="choice-container">
<<vchoice "Maybe another time" "Location_PleasureDen" "action" "talk">>
<<vchoice "Leave" "PleasureDen_Leave" "move" "return">>
</div>You wander through the Den, taking in the sights.
In one alcove, a muscular man services two women at once, their moans mixing with the ambient music. In another, a woman in a collar kneels obediently while her owner discusses terms with a client.
The bar serves something that might be alcohol. The back rooms promise darker pleasures - you can hear the crack of leather, the sounds of rough use.
<<if $companions && $companions[0]>>
Kira watches it all with wide eyes. You notice her breathing has quickened.
<<if $companions[0].exhibitionism >= 30>>
<<dialogue "Kira" "companion">>They're so... open about it. No shame at all.<</dialogue>>
There's something in her voice that isn't quite disapproval.
<<else>>
She grabs your arm.
<<dialogue "Kira" "companion">>I've seen enough. Can we go?<</dialogue>>
<</if>>
<<set $companions[0].lust to Math.min(100, $companions[0].lust + 10)>>
<</if>>
<div class="choice-container">
<<vchoice "Return to the entrance" "Location_PleasureDen" "move" "return">>
</div><<dialogue "Madam Silk" "npc">>Leaving so soon? The Reclaimed is cold, traveler. We're always warm.<</dialogue>>
She presses something into your hand - a small token marked with the Den's symbol.
<<dialogue "Madam Silk" "npc">>Show this at the door next time. First drink's free.<</dialogue>>
<<if $companions && $companions[0]>>
<<dialogue "Kira" "companion">>Let's just go.<</dialogue>>
<<if $companions[0].lust >= 50>>
She's walking stiffly. The Den affected her more than she wants to admit.
<</if>>
<</if>>
<div class="choice-container">
<<vchoice "Head back to the Vault" "Travel_Setup" "move" "journey">>
</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>>
<<vchoice "Train HARD (burn off tension)" "Training_BurnItOff" "action" "strength">>
<</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.
<div class="narrative-image">
<img src="assets/images/training/solo-practice.webp" alt="Solo Training">
</div>
<<advanceTime 1 0>>
<<clampStat "player.energy" (-10) 0 50>>
<<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.
<div class="narrative-image">
<img src="assets/images/training/target-practice.webp" alt="Target Practice">
</div>
<<advanceTime 1 0>>
<<clampStat "player.energy" (-10) 0 50>>
<<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.
Kira moves first — fast, controlled. You block, counter, looking for openings.
<div class="narrative-image">
<img src="assets/images/training/sparring-kira.webp" alt="Sparring with Kira">
</div>
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 50>>
<<addTension "kira" 5>>
<<if $companions[0] && $companions[0].tension >= 50>>
<<if random(1, 100) <= 50>>
<<goto "Event_Training_SparHeat">>
<</if>>
<</if>>
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><<run VaultUI.setBackground("training_yard")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<<showCharacter "kira" "center" "combat">>
<<advanceTime 0 15>>
Sparring with Kira under the open sky. Trading blows. Bodies moving in practiced violence.
She's good. Fast. But today she's distracted.
You see an opening. Catch her wrist mid-strike. Spin her around.
Press her against the rubble wall.
<div class="narrative-image intimate">
<img src="assets/images/intimate/kira-pinned-training.webp" alt="Pinned Against Wall">
</div>
<<say "Kira" "Good move.">>
She's panting. Not just from the exercise.
You're pressed together. Her back against rough stone. Your body against hers. Sweat and heat and PROXIMITY.
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...">>
You press closer. She can feel your hardness against her. Obvious. Undeniable.
<<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.
<<goto "Training_Kiss">>
<<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>>
You kiss her. Hard. Against the rough wall.
She freezes for a moment — then MELTS into it. Her back scrapes against the rubble as she pulls you closer.
<div class="narrative-image intimate">
<img src="assets/images/intimate/training-kiss.webp" alt="Outdoor Kiss">
</div>
Open sky above. Anyone could see from the vault. Neither of you cares.
<<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>><<showCharacter "kira" "center" "passionate">>
<<advanceTime 0 30>>
You kiss against the wall. Hands exploring. The open sky above you.
Her body against yours. Sweat and heat and NEED.
<div class="narrative-video intimate">
<<if $preferences.showVideos>>
<video autoplay loop muted playsinline>
<source src="assets/videos/intimate/outdoor-makeout.mp4" type="video/mp4">
</video>
<</if>>
</div>
Anyone could see from the vault entrance. The risk makes it hotter.
<<addTension "kira" 10>>
<<clampStat "player.lust" 20>>
Your hand slides under her shirt. She gasps into your mouth.
<<if $companions[0] && $companions[0].tension >= 75 && $companions[0].trust >= 45>>
<<say "Kira" "Inside. Now. Or I'm going to fuck you right here.">>
<div class="choice-container">
<<vchoice "Her room" "Kira_Room_Urgent" "intimate" "door-handle">>
<<vchoice "Right here. I dare you." "Training_Sex_Outside" "intimate" "rapid-strikes">>
</div>
<<else>>
After a few heated minutes, she pulls back.
<<say "Kira" "We should stop. Before I do something I can't take back.">>
But the way she's looking at you says she WANTS to.
<div class="choice-container">
<<vchoice "She's probably right" "Training_Yard_Hub" "move" "return">>
</div>
<</if>><<run VaultUI.setBackground("kira_room")>>
<<run VaultUI.setTimeOfDay("evening")>>
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>>
Against the rubble wall. Under the open sky. With the Reclaimed wind on your skin and the vault entrance fifty feet away.
The RISK makes it unbearably hot.
<div class="narrative-image intimate">
<img src="assets/images/intimate/outdoor-sex-wall.webp" alt="Outdoor Sex">
</div>
<<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.
<<performSexAct "position_against_wall">>
She wraps a leg around you, bracing against the rough stone.
<<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>>
<video autoplay loop muted playsinline>
<source src="assets/videos/intimate/outdoor-public-sex.mp4" type="video/mp4">
</video>
<</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.
The rubble scrapes her back. She doesn't care. Matching your desperate pace.
<<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—">>
You press your hand over her mouth. She bites it gently. Eyes locked on yours. Both of you trying to stay silent.
<<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.
Both of you frozen. Connected. Coming silently under the open sky while people are fifty feet away.
<<endSexScene>>
You almost collapse. She holds you up. Both panting. Both grinning wildly.
<<set $player.lust to 0>>
<<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><<run VaultUI.setBackground("training_yard")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
You head outside to the training yard and stop at the entrance.
Kira is there. But she's not training.
She's sitting in a shaded corner against the rubble wall. Head back. Eyes closed. One hand between her legs.
<div class="narrative-image intimate">
<img src="assets/images/intimate/kira-masturbating-outside.webp" alt="Outdoor Masturbation">
</div>
<<showCharacter "kira" "center" "masturbating">>
She hasn't noticed you. Too focused on what she's doing.
Her breath comes in short gasps. YOUR NAME slips from her lips.
<<say "Kira" "...fuck... please... need you...">>
She's fantasizing about YOU. Touching herself while thinking of you. Outside. In the open air.
<<addTension "kira" 10>>
<<clampStat "player.lust" 20>>
<div class="choice-container">
<<vchoice "Watch silently" "Voyeur_Kira_Watch" "intimate" "search">>
<<vchoice "Make yourself known" "Voyeur_Kira_Interrupt" "action" "hand">>
<<vchoice "Leave quietly" "Voyeur_Kira_Leave" "action" "door-handle">>
<<if $companions[0] && $companions[0].tension >= 60>>
<<vchoice "Join her" "Voyeur_Kira_Join" "intimate" "rapid-strikes">>
<</if>>
</div><<advanceTime 0 10>>
You stay perfectly still. Watching from the entrance. Voyeur.
<div class="narrative-video intimate">
<<if $preferences.showVideos>>
<video autoplay loop muted playsinline>
<source src="assets/videos/intimate/kira-outdoor-masturbate.mp4" type="video/mp4">
</video>
<</if>>
</div>
Her movements grow more urgent. Two fingers working her clit. Her other hand gripping the rubble for support.
<<say "Kira" "Yes... please... need you inside me...">>
She's thinking of YOU. Imagining you fucking her. The realization sends heat through your body.
Your cock is hard watching her. You palm yourself through your pants.
She's close. You can tell from how her thighs tremble. How her breathing gets ragged.
<<say "Kira" "Oh god— yes— yes—">>
She comes. Hard. Body going rigid against the wall. Then melting. Shaking.
You can see her wetness glistening on her fingers. She's SOAKED.
<<clampStat "player.lust" 15>>
<<addTension "kira" 5>>
When she recovers, you slip away before she opens her eyes. Heart racing.
<<set $flags.watchedKiraMasturbate to true>>
<div class="choice-container">
<<vchoice "Leave her to it" "Vault_Hub" "move" "door-handle">>
</div><<showCharacter "kira" "center" "startled">>
You clear your throat. Loudly.
Her eyes SNAP open. She scrambles to adjust her clothes, face burning crimson.
<<say "Kira" "How long— I was just— FUCK.">>
She can't even form a sentence. Mortified.
<<addTension "kira" 15>>
<div class="choice-container">
<<vchoice "\"Don't stop on my account\"" "Voyeur_Kira_Flirt" "intimate" "lips">>
<<vchoice "\"Sorry, I'll go\"" "Voyeur_Kira_Leave" "action" "return">>
<<vchoice "\"Thinking of me?\"" "Voyeur_Kira_Tease" "intimate" "eye">>
</div><<showCharacter "kira" "center" "embarrassed">>
<<say $player.name "Don't stop on my account. I'm enjoying the show.">>
<<say "Kira" "You're— this isn't— shut up.">>
But she's not telling you to leave.
<<addTension "kira" 10>>
<<if $companions[0] && $companions[0].tension >= 65>>
<<say "Kira" "You know what? Fuck it.">>
She doesn't move her hand. Keeps it between her legs.
<<say "Kira" "You want a show? Come closer.">>
<<goto "Voyeur_Kira_Join">>
<<else>>
She stands, adjusting her clothes. Still blushing.
<div class="choice-container">
<<vchoice "Give her space" "Training_Yard_Hub" "move" "return">>
</div>
<</if>><<showCharacter "kira" "center" "embarrassed">>
<<say $player.name "I heard my name. Were you thinking of me?">>
She goes even redder. Can't meet your eyes.
<<say "Kira" "I... that doesn't... shut UP.">>
<<addTension "kira" 10>>
<<say $player.name "I'm flattered.">>
<<say "Kira" "I hate you.">>
But she's not telling you to leave. And her hand is still between her legs.
<<if $companions[0] && $companions[0].tension >= 65>>
<<say "Kira" "You know what? Get over here.">>
<<goto "Voyeur_Kira_Join">>
<<else>>
<div class="choice-container">
<<vchoice "Give her space" "Training_Yard_Hub" "move" "return">>
</div>
<</if>>You slip away quietly. Leaving her to her... private training.
The image stays with you though. Her hand between her legs. Your name on her lips.
<<clampStat "player.lust" 10>>
<<set $flags.sawKiraMasturbate to true>>
<div class="choice-container">
<<vchoice "Continue" "Vault_Hub" "move" "return">>
</div><<showCharacter "kira" "center" "vulnerable">>
You step fully into the training yard. Cross to her corner.
<<say $player.name "You don't have to do that alone.">>
A long moment. Her hand still between her legs. Looking up at you.
<<say "Kira" "Get over here. Now.">>
<<addTension "kira" 15>>
You join her in the shaded corner. Hidden from the vault entrance by rubble. Barely.
<<sexScene "kira" "spontaneous" "desperate" "training-yard-hidden">>
<div class="choice-container">
<<vchoice "..." "Voyeur_Kira_Join_Scene" "intimate" "lust">>
</div><<showCharacter "kira" "center" "desperate">>
She pulls you down beside her against the wall. Her hand finds yours, guides it to replace her own.
<div class="narrative-image intimate">
<img src="assets/images/intimate/outdoor-fingering.webp" alt="Outdoor Fingering">
</div>
<<performSexAct "touch_intimate">>
Your fingers slide through her wetness. She's SOAKED. Been working herself up for a while.
<<say "Kira" "I've been going crazy. Thinking about you. Can't stop. I come out here and...">>
She trails off as your fingers find her clit.
<<say "Kira" "Oh FUCK—">>
<<if $companions[0] && $companions[0].tension >= 70 && $companions[0].trust >= 50>>
<div class="choice-container">
<<vchoice "Use your mouth on her" "Voyeur_Kira_Oral" "intimate" "lips">>
<<vchoice "Take her right here" "Voyeur_Kira_Sex" "intimate" "rapid-strikes">>
<<vchoice "Just your fingers" "Voyeur_Kira_Fingers" "intimate" "hand">>
</div>
<<else>>
<<goto "Voyeur_Kira_Fingers">>
<</if>><<showCharacter "kira" "center" "ecstasy">>
<<advanceTime 0 30>>
Your fingers work her expertly. She bites her lip to stay quiet. Anyone could walk out.
<div class="narrative-image intimate">
<img src="assets/images/intimate/outdoor-fingering.webp" alt="Outdoor Fingering">
</div>
<<performSexAct "fingering">>
Two fingers inside her. Thumb on her clit. She's trying not to moan.
<div class="narrative-video intimate">
<<if $preferences.showVideos>>
<video autoplay loop muted playsinline>
<source src="assets/videos/intimate/outdoor-fingering-orgasm.mp4" type="video/mp4">
</video>
<</if>>
</div>
<<say "Kira" "Right there... yes... don't fucking stop—">>
You curl your fingers. Hit her G-spot. She GASPS, hand flying to her mouth.
<<performSexAct "fingering">>
She's close. Pussy clenching around your fingers. You can feel the orgasm building.
<<performSexAct "climax_partner">>
She comes HARD. Shaking. Grabbing your arm. Biting her own hand to muffle the sounds.
Her pussy pulses around your fingers. Wetness coating your hand.
<<endSexScene>>
<<if $companions[0]>>
<<clampStat "companions[0].tension" (-25)>>
<</if>>
<<relationChange "kira" "affection" 2>>
<<clampStat "player.lust" 20>>
When she recovers, she looks at you with hungry eyes. Still panting.
<<say "Kira" "Your turn. Fair is fair.">>
<div class="choice-container">
<<vchoice "Let her reciprocate" "Voyeur_Kira_Reciprocate" "intimate" "grab">>
</div><<showCharacter "kira" "center" "determined">>
<<advanceTime 0 15>>
She pushes you back against the wall. Her hand frees your cock from your pants.
<<say "Kira" "You watched. You helped. Now I help you.">>
<div class="narrative-image intimate">
<img src="assets/images/intimate/outdoor-handjob.webp" alt="Outdoor Handjob">
</div>
<<performSexAct "handjob_receive">>
Her grip is firm. Confident. Hand pumping you under the open sky.
It doesn't take long. Not after watching her. Touching her. The risk of being seen.
<<performSexAct "climax_player">>
You come hard. Spilling onto the packed dirt. She keeps stroking, drawing it all out.
<<set $player.lust to 0>>
<<relationChange "kira" "affection" 1>>
<<set $flags.mutualOutside to true>>
<<say "Kira" "We're even now.">>
She tucks you back in. Wipes her hand on the dirt. Grins.
<<say "Kira" "Never done that outside before. It's... different.">>
<div class="choice-container">
<<vchoice "Head inside before you're caught" "Vault_Hub" "move" "run">>
</div><<advanceTime 0 30>>
<<say $player.name "I'm going to taste you. Right here.">>
<<showCharacter "kira" "center" "shocked">>
<<say "Kira" "Out HERE? Are you insane?">>
<<say $player.name "Probably.">>
You drop to your knees in the dirt.
<div class="narrative-image intimate">
<img src="assets/images/intimate/outdoor-oral.webp" alt="Outdoor Oral">
</div>
<<performSexAct "oral_give">>
Your mouth finds her pussy. She's already soaked. You lick her under the open sky.
<<say "Kira" "Oh FUCK— someone could— oh god—">>
She has to cover her mouth with both hands. Trying desperately to stay quiet.
Your tongue works her clit. Fingers sliding inside. The risk making it impossibly hot.
<div class="narrative-video intimate">
<<if $preferences.showVideos>>
<video autoplay loop muted playsinline>
<source src="assets/videos/intimate/outdoor-cunnilingus.mp4" type="video/mp4">
</video>
<</if>>
</div>
<<performSexAct "oral_give">>
She's trembling. Close. You suck her clit while fingering her.
<<performSexAct "climax_partner">>
She comes with a muffled SCREAM. Thighs clamping around your head. Pussy flooding your mouth.
You keep licking through it. Merciless.
<<endSexScene>>
When she can stand again, she's shaking.
<<say "Kira" "You're fucking crazy.">>
<<say $player.name "You loved it.">>
<<say "Kira" "...yeah. I did.">>
<<if $companions[0]>>
<<clampStat "companions[0].tension" (-30)>>
<</if>>
<<relationChange "kira" "affection" 2>>
<<clampStat "player.lust" 25>>
<div class="choice-container">
<<vchoice "Your turn" "Voyeur_Kira_Reciprocate" "intimate" "grab">>
</div><<advanceTime 0 45>>
<<say $player.name "I'm going to fuck you. Right here. Under the sky.">>
<<showCharacter "kira" "center" "desperate">>
<<say "Kira" "Yes. Fuck. Yes.">>
She doesn't even hesitate. Wants it too badly.
<<performSexAct "position_against_wall">>
She braces against the rubble. Ass toward you. Looking back.
<div class="narrative-image intimate">
<img src="assets/images/intimate/outdoor-doggy.webp" alt="Outdoor Doggy">
</div>
<<performSexAct "penetrate">>
You drive into her from behind. She GASPS, hand clamping over her mouth.
<<sexPhase "action">>
<<performSexAct "thrust_fast">>
You fuck her brutally. Out in the open. Where anyone could see. The danger making it obscene.
<div class="narrative-video intimate">
<<if $preferences.showVideos>>
<video autoplay loop muted playsinline>
<source src="assets/videos/intimate/outdoor-fuck-doggy.mp4" type="video/mp4">
</video>
<</if>>
</div>
<<say "Kira" "Harder— fuck me harder— I don't care who sees—">>
The slap of flesh on flesh echoes across the training yard. Completely exposed.
<<sexPhase "climax">>
<<performSexAct "climax_together">>
You both finish. Her screaming into her own hand. You buried deep, pumping into her.
<<endSexScene>>
You collapse against her. Both panting. Both amazed you weren't caught.
<<set $player.lust to 0>>
<<if $companions[0]>>
<<set $companions[0].tension to Math.max(10, $companions[0].tension - 50)>>
<</if>>
<<relationChange "kira" "affection" 3>>
<<set $flags.outdoorSex to true>>
<<set $flags.publicRisk to true>>
<<say "Kira" "We're insane.">>
<<say $player.name "Worth it.">>
<<say "Kira" "...yeah.">>
<div class="choice-container">
<<vchoice "Head inside quickly" "Vault_Hub" "move" "run">>
</div><<checkVaultDebt>>
<<set $currentLocation to "commons">>
<<run VaultUI.setBackground("commons")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<<run VaultUI.hideAllCharacters()>>
<<updateCompanionLocations>>
<<if $time.day >= 2 && $companions.length > 0 && !$flags.kiraIsUnconscious>>
<<getCompanion "kira">>
<<if $tempCompanion && $tempCompanion.currentLocation === "commons">>
<<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 !== "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>
<<else>>
<<hubLocation "Kira's Room" "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>
<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>
<div class="location-category">
<h4>Surface</h4>
<<if $time.day >= 3>>
<<hubLocation "Vault Entrance" "Entrance_Hub" "entrance" "sunrise">>
<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>
<<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)>>
<</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.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 -= 5>>
<<clampStat "player.energy" (-5) 0 50>>
<<updateCompanionLocations>>
<<notify "info">>Time passes. Now <<print $time.phase>>.<</notify>>
<<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 "Check your backpack" "Quarters_Footlocker" "examine" "crystal">>
<<vchoice "Look in the mirror" "Quarters_Mirror" "examine" "search">>
<<vchoice "Return to Commons" "Vault_Hub" "move" "door-handle">>
</div><<set $time.day += 1>>
<<setTime 7 0>>
<<set $player.health to Math.min($player.maxHealth, $player.health + 30)>>
<<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 $journey.fatigue to 0>>
<<set $survival.fatigueState to "fresh">>
<<dailyUpdate>>
<<if $flags.vaultStarvationDeath>>
<<goto "Vault_Starvation_Death">>
<<elseif $flags.vaultCrisisActive && !$vault.crisis.expeditionForced>>
<<goto "Vault_Resource_Crisis">>
<<elseif $flags.vaultResourceWarning && !$vault.crisis.warningAcknowledged>>
<<goto "Vault_Resource_Warning">>
<<elseif $time.day === 2>>
<<goto "Day2_Morning_Wake">>
<<elseif $time.day === 3>>
<<goto "Day3_Morning_Wake">>
<<elseif $time.day === 4>>
<<goto "Day4_Morning_Wake">>
<<else>>
<<goto "Vault_Hub">>
<</if>><<advanceTime 1 0>>
<<set $player.energy to Math.min($player.maxEnergy, $player.energy + 20)>>
<<set $player.health to Math.min($player.maxHealth, $player.health + 10)>>
<<set $journey.fatigue to Math.max(0, $journey.fatigue - 30)>>
<<getFatigueState>>
<<notify "success">>You rest for a while. Health +10, Energy +20, Fatigue -30%<</notify>>
<<goto "Vault_Hub">>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>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()>>
<<if $flags.kiraIsUnconscious>>
<<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>>
<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>
<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>
<<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>>
<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" "Medical_Kira_Unconscious" "examine" "health">>
<<if $flags.archivesSearchUnlocked>>
<<vchoice "Search the Archives for a cure" "Archives_Search_Start" "action" "book">>
<</if>>
<<if $flags.extremeContentEnabled>>
<<vchoice "She's completely helpless..." "Medical_Kira_CNC_Start" "intimate" "corruption">>
<</if>>
<<else>>
<<for _comp range $companions>>
<<if _comp.health lt _comp.maxHealth>>
<<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)>>
<<notify "success">>You treat your wounds. Health +30<</notify>>
<<else>>
<<notify "error">>Not enough medical supplies!<</notify>>
<</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)>>
<<notify "success">>You treat <<print $tempCompanion.name>>'s wounds. Health +30<</notify>>
<<relationChange "kira" "affection" 1>>
<<if $tempCompanion.health > 50 && $tempCompanion.currentLocation === "medical" && !$flags.kiraIsUnconscious>>
<<set $tempCompanion.currentLocation to "kira_quarters">>
<<notify "info">><<print $tempCompanion.name>> is well enough to return to her room.<</notify>>
<</if>>
<<else>>
<<notify "error">>Not enough medical supplies!<</notify>>
<</if>>
<<goto "Medical_Hub">><<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">
<<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>>
<<vchoice "Return to Medical Bay" "Medical_Hub" "move" "back">>
</div><<run VaultUI.showCharacter("kira", "center", "unconscious")>>
<h3>Temptation</h3>
You look at Kira lying there. Completely helpless. Completely unaware.
The leather restraints on the bed suddenly seem... purposeful.
<<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")>>
You brush a strand of hair from her face. So soft.
Your fingers trace down her cheek, along her jaw. She doesn't react.
<<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")>>
<p class="explicit">Your hands move lower. "Checking for injuries," you tell yourself.</p>
<p class="explicit">You pull the blanket back. Her body lies there, vulnerable. Beautiful.</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")>>
<p class="explicit">You secure her wrists in the leather restraints. Then her ankles.</p>
<p class="explicit">She lies there, spread-eagle on the medical bed. Completely helpless. Completely yours.</p>
<<clampStat "player.lust" 30>>
<<set $flags.restrainedUnconsciousKira to true>>
<<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>>
<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>
<<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>>
<<addCorruption 5>>
<p class="explicit ultra">You position yourself between her legs. 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">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>>
<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>
<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("commons")>>
<<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>
</div>
<div class="supply-item">
<span class="icon"></span>
<span class="label">Purified Water</span>
<span class="value"><<print $vault.water>> units</span>
</div>
</div>
<<if $companions.length gt 0>>
<p class="info-text">Daily consumption: <<print $companions.length>> food (companions) + your meals</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>>
<<vchoice "Prepare meal for everyone" "Kitchen_Meal_Together" "action" "house">>
<</if>>
<<vchoice "Return to Commons" "Vault_Hub" "move" "door-handle">>
</div><<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)>>
<<notify "success">>You eat a meal. Hunger +40, Energy +10<</notify>>
<<else>>
<<notify "error">>No food available!<</notify>>
<</if>>
<<goto "Kitchen_Hub">><<if $vault.water gt 0>>
<<advanceTime 0 5>>
<<set $vault.water -= 1>>
<<set $player.energy to Math.min($player.maxEnergy, $player.energy + 20)>>
<<notify "success">>You drink clean water. Energy +20<</notify>>
<<else>>
<<notify "error">>No water available!<</notify>>
<</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", "slight-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>>
<<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>>
<</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>
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">
<span class="label">Power Level:</span>
<<statbar $vault.power $vault.maxPower "#f1c40f">>
<span class="value"><<print $vault.power>> / <<print $vault.maxPower>></span>
</div>
<<if $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 "Capacity" `_powerPercent + "%"` _statusClass>>
<<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>
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>
• Refined crystals from Lysara (more efficient)<br><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>
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">>
<<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)>>
<<notify "success">>You eat some food. Hunger +30<</notify>>
<<else>>
<<notify "error">>No food available or not hungry!<</notify>>
<</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() })>>
<<set _foundObj to {id: _foundItem, name: _itemName, type: "misc", description: "Found while searching storage."}>>
<<addItem _foundObj 1>>
<<notify "success">>Found: <<print _itemName>>!<</notify>>
<<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 "assets/images/items/" + _itemName.replace(/ /g, "_") + ".webp">>
<img @src="_itemImg" @alt="_itemName">
</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 "assets/images/items/" + _itemName.replace(/ /g, "_") + ".webp">>
<img @src="_itemImg" @alt="_itemName">
</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>
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" `$vault.power + " / " + $vault.maxPower`>>
<<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 Math.floor($vault.food / 2)>>
<<if _foodDays >= 14>>
<<set _rateLabel to "Sustainable">>
<<set _rateStatus to "ok">>
<<elseif _foodDays >= 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 + " days"`>>
<<terminalPrompt "DATA REFRESH: REAL-TIME">>
<</terminal>>
<div class="choice-container">
<<vchoice "Return" "Archives_Terminal" "move" "back">>
</div>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()>>
<!-- Initialize wasteland variables for old saves -->
<<if !$discoveries>>
<<set $discoveries to {
collapsedMarket: false, raiderCamp: false, hiddenCache: false,
chemicalPlant: false, buriedBunker: false, nomadRoute: false,
stalkerNest: false, strangeShrine: false,
hospitalRuins: false, libraryRuins: false,
sunkenLab: false, convergenceSite: false
}>>
<</if>>
<<if !$locations>>
<<set $locations to {
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", "cloth", "medical_supplies"] },
raider_camp: { name: "Raider Camp", region: "central", danger: "high", travelTime: 3, searched: false, lootTable: ["weapons", "ammo", "scrap_metal", "raider_gear"], enemies: ["raider_grunt", "raider_grunt", "raider_brute"] },
overgrown_ruins: { name: "Overgrown Ruins", region: "central", danger: "unknown", travelTime: 2, searched: false, story: true }
}>>
<</if>>
<<if $expeditionCompanion === undefined>>
<<set $expeditionCompanion to "">>
<<set $selectedRegion to "">>
<<set $selectedLocation to "">>
<<set $player.carriedFood to 0>>
<<set $player.carriedWater to 0>>
<</if>>
<<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">>
<<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" "Moderate" "warning">>
<<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>
<<if $companions[0] && $companions[0].health > 30 && !$flags.kiraIsUnconscious>>
<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 $companions[0] && $companions[0].health <= 30>>
<p class="warning">Kira is too injured to travel. (Health: <<print $companions[0].health>>)</p>
<<elseif $flags.kiraIsUnconscious>>
<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 $currentLocation to "commons">>
<<run VaultUI.setBackground("commons")>>
<<run VaultUI.setTimeOfDay("morning")>>
<h2>Morning in the Commons</h2>
You wake and make your way to the commons area.
<<if $time.day === 1>>
<<goto "Day1_Morning_Wake">>
<<elseif $time.day === 2>>
<<goto "Day2_Morning_Wake">>
<<elseif $time.day === 3>>
<<goto "Day3_Morning_Wake">>
<<elseif $time.day === 4>>
<<goto "Day4_Morning_Wake">>
<<elseif $time.day === 5>>
<<goto "Day5_Morning_Wake">>
<<elseif $time.day === 6>>
<<goto "Day6_Morning_Wake">>
<<elseif $time.day === 7>>
<<goto "Day7_Morning_Wake">>
<<else>>
<<goto "Vault_Hub">>
<</if>><<set $vault.crisis.warningAcknowledged to true>>
You wake with a gnawing unease.
<<if $companions && $companions[0]>>
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>>
You wake to Kira shaking you.
<<if $companions && $companions[0]>>
<<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">
<<vchoice "Head to the Outpost" "Vault_Crisis_Expedition" "action" "journey">>
<<vchoice "Search the nearby ruins first" "Vault_Crisis_Scavenge" "action" "search">>
</div><<set $currentLocation to "vault">>
<<if $companions && $companions[0]>>
<<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 $companions && $companions[0]>>
<<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. It's closer than the Outpost. Riskier, but you might not have the strength for a longer journey.
<</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 $companions && $companions[0]>>
<<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 $companions && $companions[0]>>
<<dialogue "Kira" "companion">>It's something. But we still need more. The Outpost is our only real option now.<</dialogue>>
<</if>>
<div class="choice-container">
<<vchoice "Head to the Outpost" "Vault_Crisis_Expedition" "action" "journey">>
<<vchoice "Return to the Vault" "Vault_Hub" "move" "return">>
</div>
<<else>>
The ruins are picked clean. Worse, you're not alone.
<<if $companions && $companions[0]>>
<<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,
enemies: [],
turn: 0,
phase: "player",
playerDazed: false,
playerStunned: false,
kiraIncapacitated: false,
kiraInRefractory: false
}>>
<<set $combat.enemies.push({
id: "scavenger_1",
name: "Desperate Scavenger",
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",
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>>
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.
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 10>>
<<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.
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 $companions && $companions[0]>>
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 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>>
<<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><<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>>
<<goto "Vault_Starvation_End">><<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>>
<<goto "Vault_Starvation_End">><<if $companions && $companions[0]>>
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">>
<<setBackground "reclaimed-travel">>
<<setTimeOfDay $time.phase>>
<h2>Old Town</h2>
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 $companions && $companions[0]>>
<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><<set $currentLocation to "outpost">>
<<setBackground "reclaimed-outpost">>
<<setTimeOfDay $time.phase>>
<<if $expeditionCompanion>>
<<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 $expeditionCompanion>>
<<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 $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."}>>
<<addItem _water 2>>
<<set _food to {id: "canned_food", name: "Canned Food", type: "consumable", description: "Pre-war canned food."}>>
<<addItem _food 1>>
<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>
</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."}>>
<<addItem _water 1>>
<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>
</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 $expeditionCompanion === "kira">>
<<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 $expeditionCompanion === "kira">>
<<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 $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."}>>
<<addItem _water 2>>
<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>
</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">>
<<setBackground "reclaimed-outpost">>
<<if $expeditionCompanion>>
<<showCharacter $expeditionCompanion "left" "neutral">>
<</if>>
<h2>Rusted Convoy</h2>
A line of military vehicles rusts in the sand. 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">
<<vchoice "Return to map" "WorldMap_View" "move" "map">>
</div>
<</if>><<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."}>>
<<addItem _parts 2>>
<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>
</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>>
<div class="choice-container">
<<vchoice "Continue exploring" "WorldMap_View" "move" "map">>
<<vchoice "Return to vault" "Journey_ReturnToVault" "move" "house">>
</div><<set $currentLocation to "market">>
<<setBackground "reclaimed-outpost">>
<<if $expeditionCompanion>>
<<showCharacter $expeditionCompanion "left" "neutral">>
<</if>>
<h2>Collapsed Market</h2>
The skeleton of an old marketplace. Stalls and shops have long since been picked over, but sometimes people miss things.
<<if !$locations.market.searched>>
<div class="choice-container">
<<vchoice "Search market" "Market_Search" "action" "search">>
<<vchoice "Return to map" "WorldMap_View" "move" "map">>
</div>
<<else>>
Already searched thoroughly.
<div class="choice-container">
<<vchoice "Return to map" "WorldMap_View" "move" "map">>
</div>
<</if>><<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."}>>
<<addItem _food 3>>
<<set _cloth to {id: "cloth", name: "Cloth", type: "resource", description: "Usable cloth material."}>>
<<addItem _cloth 2>>
<<set _medical to {id: "bandage", name: "Bandage", type: "consumable", description: "Basic medical supplies."}>>
<<addItem _medical 2>>
<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>
</div>
<<if $expeditionCompanion === "kira">>
<<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."}>>
<<addItem _food 1>>
<<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>
</div>
<</if>>
<div class="choice-container">
<<vchoice "Continue exploring" "WorldMap_View" "move" "map">>
<<vchoice "Return to vault" "Journey_ReturnToVault" "move" "house">>
</div><h2>Overgrown Ruins</h2>
<p class="note-important">This location will be implemented in Day 4 content update.</p>
<div class="choice-container">
<<vchoice "Return to map" "WorldMap_View" "move" "map">>
</div><h2>Overgrown Ruins</h2>
<p class="note-important">This location will be implemented after succubus encounter.</p>
<div class="choice-container">
<<vchoice "Return to map" "WorldMap_View" "move" "map">>
</div><<set $currentLocation to "raider_camp">>
<<setBackground "reclaimed-danger">>
<<setTimeOfDay $time.phase>>
<<if $expeditionCompanion>>
<<showCharacter $expeditionCompanion "left" "alert">>
<</if>>
<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. You can hear voices — raiders, at least three or four.
<<if !$locations.raider_camp.cleared>>
This is dangerous territory. The raiders won't take kindly to intruders.
<<if $expeditionCompanion === "kira">>
<<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 $expeditionCompanion === "kira">>
<<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 $combat.active to true>>
<<set $combat.returnPassage to "RaiderCamp_Victory">>
<<set $combat.canFlee to true>>
<<createEnemy "raider_grunt">>
<<run $combat.enemies.push(clone(_returnEnemy))>>
<<createEnemy "raider_scout">>
<<run $combat.enemies.push(clone(_returnEnemy))>>
<<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 $expeditionCompanion === "kira">>
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>>
<<set _ammo to {id: "ammo", name: "Ammunition", type: "resource", description: "Bullets for firearms."}>>
<<addItem _ammo 3>>
<<set _food to {id: "canned_food", name: "Canned Food", type: "consumable", description: "Pre-war canned food."}>>
<<addItem _food 2>>
<div class="loot-display">
<h4>Stolen:</h4>
<ul>
<li>Scrap Metal x5</li>
<li>Ammunition x3</li>
<li>Canned Food x2</li>
</ul>
</div>
<<if $expeditionCompanion === "kira">>
<<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 $expeditionCompanion === "kira">>
<<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>><<run VaultUI.setBackground("reclaimed-day")>>
<<run VaultUI.setTimeOfDay("afternoon")>>
<<if $combat.result === "fled">>
<h2>Escaped</h2>
You managed to escape the raider camp, but the raiders still hold their territory.
<<if $expeditionCompanion === "kira">>
<<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>
<<else>>
<<set $locations.raider_camp.cleared to true>>
<h2>Victory</h2>
The last raider falls. The camp is yours.
<<if $expeditionCompanion === "kira">>
<<run VaultUI.showCharacter("kira", "center", "satisfied")>>
<<say "Kira" "Good fight. Let's see what they were hoarding.">>
<</if>>
You search the camp thoroughly, finding significant supplies.
<<set _scrap to {id: "scrap_metal", name: "Scrap Metal", type: "resource", description: "Useful metal scraps."}>>
<<addItem _scrap 8>>
<<set _ammo to {id: "ammo", name: "Ammunition", type: "resource", description: "Bullets for firearms."}>>
<<addItem _ammo 5>>
<<set _food to {id: "canned_food", name: "Canned Food", type: "consumable", description: "Pre-war canned food."}>>
<<addItem _food 4>>
<<set _water to {id: "clean_water", name: "Clean Water", type: "consumable", description: "Purified water."}>>
<<addItem _water 3>>
<<set _stims to {id: "stimpack", name: "Stimpack", type: "consumable", description: "Military-grade healing injection."}>>
<<addItem _stims 2>>
<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>
</div>
<<set $stats.combat_victories += 1>>
<<set $vault.scrap += 3>>
<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">>
<<setBackground "reclaimed-travel">>
<<setTimeOfDay $time.phase>>
<h2>The Crossway</h2>
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 $companions && $companions[0]>>
<p>Kira scans the treeline, hand resting on her weapon. "Lot of sight lines here. Good and bad."</p>
<</if>>
<<set _eventRoll to random(1, 100)>>
<<if _eventRoll <= 20>>
<<goto "Crossway_Trader">>
<<elseif _eventRoll <= 35 && !$locations.the_crossway.foughtToday>>
<<goto "Crossway_Ambush">>
<<else>>
<p class="narrator">The junction is quiet. For now.</p>
<div class="location-options">
<h3>What do you want to do?</h3>
<div class="choice-container">
<<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>><<setBackground "reclaimed-travel">>
<h2>The Crossway - Trader</h2>
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 $companions && $companions[0]>>
<<say "Kira" "What's your angle?">>
<<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.">>
<</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.
<div class="shop-display">
<h3>Available Goods</h3>
<ul>
<li><strong>Clean Water</strong> - 5 scrap</li>
<li><strong>Ration</strong> - 8 scrap</li>
<li><strong>Bandage</strong> - 10 scrap</li>
<li><strong>Energy Drink</strong> - 12 scrap</li>
<li><strong>Coffee</strong> - 6 scrap</li>
</ul>
</div>
<div class="choice-container">
<<if $vault.scrap >= 5>>
<<vchoice "Buy Clean Water (5 scrap)" "Crossway_Buy_Water" "action" "water">>
<</if>>
<<if $vault.scrap >= 8>>
<<vchoice "Buy Ration (8 scrap)" "Crossway_Buy_Ration" "action" "food">>
<</if>>
<<if $vault.scrap >= 10>>
<<vchoice "Buy Bandage (10 scrap)" "Crossway_Buy_Bandage" "action" "health">>
<</if>>
<<if $vault.scrap >= 12>>
<<vchoice "Buy Energy Drink (12 scrap)" "Crossway_Buy_Energy" "action" "lightning">>
<</if>>
<<if $vault.scrap >= 6>>
<<vchoice "Buy Coffee (6 scrap)" "Crossway_Buy_Coffee" "action" "fire">>
<</if>>
<<vchoice "Done trading" "Crossway_Trader_Leave" "move" "back">>
</div><<set $vault.scrap -= 5>>
<<addItem "clean_water" 1>>
<<notify "success">>Bought Clean Water. Scrap -5<</notify>>
<<goto "Crossway_Trader_Shop">><<set $vault.scrap -= 8>>
<<addItem "ration" 1>>
<<notify "success">>Bought Ration. Scrap -8<</notify>>
<<goto "Crossway_Trader_Shop">><<set $vault.scrap -= 10>>
<<addItem "bandage" 1>>
<<notify "success">>Bought Bandage. Scrap -10<</notify>>
<<goto "Crossway_Trader_Shop">><<set $vault.scrap -= 12>>
<<addItem "energy_drink" 1>>
<<notify "success">>Bought Energy Drink. Scrap -12<</notify>>
<<goto "Crossway_Trader_Shop">><<set $vault.scrap -= 6>>
<<addItem "coffee" 1>>
<<notify "success">>Bought Coffee. Scrap -6<</notify>>
<<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)>>
<<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.
<<say "Raider" "Well, well. Fresh meat.">>
<</if>>
<<if $companions && $companions[0]>>
<<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 _enemyType to either("scavenger", "raider")>>
<<startCombat _enemyType 1>>
<<goto "Combat_Start">><<setBackground "reclaimed-travel">>
<<set _persuadeRoll to random(1, 100) + $player.charm * 5>>
<<if _persuadeRoll >= 60>>
You raise your hands slowly. "Nobody needs to bleed today. We're just passing through."
The attacker hesitates. Something in your voice, your posture — it makes them reconsider.
<<say "Scavenger" "...Fine. Get out of here. Don't come back this way.">>
They melt back into the treeline. You breathe.
<<if $companions && $companions[0]>>
<<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 "Scavenger" "Talking's done.">>
<<goto "Crossway_Fight">>
<</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 $companions && $companions[0]>>
<<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.
<<goto "Crossway_Fight">>
<</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>>
<<addItem "dirty_water" 1>>
<div class="loot-display">
<h4>Found:</h4>
<ul>
<li>Scrap Metal x2</li>
<li>Dirty Water x1</li>
</ul>
</div>
<<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 $companions && $companions[0]>>
<<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)>>
<p class="narrator">Energy +15</p>
<<if $companions && $companions[0]>>
Kira sits nearby, keeping watch. Neither of you fully relaxes.
<<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><<run VaultUI.setBackground("archives")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<<if !$temp>><<set $temp to {}>><</if>>
<h2>The Archives</h2>
<<if $flags.survivedAgonyPath || $flags.feralPathComplete>>
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>>
<<if !$temp>><<set $temp to {}>><</if>>
<<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)>>
<<if !$temp>><<set $temp to {}>><</if>>
<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...
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("night")>>
<<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" "Three 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.
<<set $temp.cellDays to 0>>
<<set $temp.cellPath to "agony">>
<<set $temp.lysaraInterest to 0>>
<<set $temp.lysaraEncounters to 0>>
<div class="choice-container">
<<vchoice "Begin your ordeal" "Cell_Agony_Day1" "action" "night">>
</div><<run VaultUI.setBackground("cell")>>
<<run VaultUI.setTimeOfDay("night")>>
<<set $temp.cellDays to 1>>
<<set $flags.feralLevel to 0>>
<<set $temp.cageOrgasmToday to false>>
<<setTime 8 0>>
<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.
<<clampStat "player.health" (-5) 0 100>>
<<set $player.lust to 100>>
The cell has a thin mattress. A bucket. Nothing else.
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("night")>>
<<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>>
<<if _variation is 1>>
<h3>Finding Stillness</h3>
You sit cross-legged on the thin mattress. Close your eyes. Focus on your breathing.
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>>
<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>>
<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>>
<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>>
<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)>>
<<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)>>
<<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>>
<<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)>>
<<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>>
<<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)>>
<</if>>
<p class="failure">Meditation fails. The need is too strong.</p>
<<set $flags.feralLevel to ($flags.feralLevel || 0) + 1>>
<</if>>
<<if $flags.feralLevel >= 10 && !$flags.lysaraDeviceUsed && !$flags.feralPathTriggered>>
<<goto "Cell_Feral_Surrender">>
<<elseif $flags.feralLevel >= 5 && !$flags.lysaraDeviceUsed && !$flags.feralPathTriggered && !$flags.feralWarningShown>>
<<goto "Cell_Feral_Warning">>
<</if>>
<<if $player.lust gte 100 && !$temp.cageOrgasmToday>>
<<if random(1, 100) lte 25>>
<<goto "Cell_Cage_Orgasm">>
<</if>>
<</if>>
<<if $temp.dayActions lt 4>>
<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>
<<else>>
<<goto "Cell_Day_End">>
<</if>><<run VaultUI.setBackground("cell")>>
<<run VaultUI.setTimeOfDay("night")>>
<<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.
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 70>>
<<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>>
<<goto "Cell_Day_End">>
<</if>><<run VaultUI.setBackground("cell")>>
<<run VaultUI.setTimeOfDay("night")>>
<<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.
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.
<<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>>
<<goto "Cell_Day_End">>
<</if>><<run VaultUI.setBackground("cell")>>
<<run VaultUI.setTimeOfDay("night")>>
<<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>
<<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>>
<<goto "Cell_Day_End">>
<</if>><<run VaultUI.setBackground("cell")>>
<<run VaultUI.setTimeOfDay("night")>>
<<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.
<<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>>
<<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>
<<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.
<</if>>
<<if $flags.feralLevel >= 10 && !$flags.lysaraDeviceUsed && !$flags.feralPathTriggered>>
<<goto "Cell_Feral_Surrender">>
<<elseif $flags.feralLevel >= 5 && !$flags.lysaraDeviceUsed && !$flags.feralPathTriggered && !$flags.feralWarningShown>>
<<goto "Cell_Feral_Warning">>
<<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>>
<<goto "Cell_Day_End">>
<</if>><<run VaultUI.setBackground("cell")>>
<<run VaultUI.setTimeOfDay("night")>>
<h3>Night Falls</h3>
Lysara approaches the cell.
<<say "Lysara" "Surviving?">>
<<say $player.name "Barely.">>
She studies you through the bars.
<<say "Lysara" "<<print 3 - $temp.cellDays>> more days. You're doing well.">>
<<if $flags.tastedLysara || $flags.rimmedLysara>>
<<say "Lysara" "And you've earned a small reward.">>
She passes something through the bars. Food. Water.
<<say "Lysara" "Keep up your strength. You'll need it.">>
<<else>>
She leaves food and water by the bars.
<<say "Lysara" "Eat. Sleep if you can.">>
<</if>>
She disappears into the lab.
<<set $temp.alchemyGasLevel to Math.max(20, $temp.alchemyGasLevel - 10)>>
<<if $temp.cellDays lt 3>>
<div class="choice-container">
<<vchoice "Try to sleep" "Cell_Night_Sleep" "action" "night">>
</div>
<<else>>
The third day is over. You made it.
<div class="choice-container">
<<vchoice "..." "Cell_Time_Complete" "action" "time">>
</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 3>>
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.
<div class="choice-container">
<<vchoice "Face another day" `"Cell_Agony_Day" + $temp.cellDays` "action" "time">>
</div>
<<else>>
You made it. Three days of agony—over.
<div class="choice-container">
<<vchoice "..." "Cell_Time_Complete" "action" "time">>
</div>
<</if>><<run VaultUI.setBackground("cell")>>
<<run VaultUI.setTimeOfDay("night")>>
<<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.">>
Her voice drifts from somewhere in the laboratory. Clinical. Detached.
<<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.
<<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. The halfway point. 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.
<<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 violet eyes.
<</if>>
<<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.
<</switch>>
<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("night")>>
<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 claws raking down your back. Lysara's mouth—
You wake gasping, cock straining so hard against the cage that you cry out.
<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.
<<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.
<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)>>
<</switch>>
<div class="choice-container">
<<vchoice "Continue enduring" "Cell_Agony_Day2" "action" "clock">>
</div><<run VaultUI.setBackground("cell")>>
<<run VaultUI.setTimeOfDay("night")>>
<<set $temp.dayActions to 0>>
<<set $temp.cageOrgasmToday to false>>
<<set $player.will += 3>>
<<set $player.charm += 2>>
<h2>Day 3 - The Final Trial</h2>
<<set _day3Var to random(1, 5)>>
<<switch _day3Var>>
<<case 1>>
The final 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" "Last day.">>
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>
<<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.
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>>
<<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.">>
She stands at the bars now, close enough to touch if you reached. You don't reach.
<<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>>
Final day. Final hours.
The transformation is 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.
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.
<<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">After today, 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>>
<<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. Three days of denial. Three days of watching her move through this space, wanting her, unable to have anything.
<<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>>
<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, so close 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 "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>Final Rest</h3>
<<set _sleepVar to random(1, 4)>>
<<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)>>
<<case 2>>
You drift off despite the need, your body finally surrendering to exhaustion.
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.
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>>
<<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.">>
She approaches the cell, key in hand.
<<say "Lysara" "It's time.">>
<p class="success">You made it. Three days of agony, and you survived.</p>
<<set $player.will += 10>>
<</switch>>
<div class="choice-container">
<<vchoice "The ordeal ends" "Cell_Time_Complete" "action" "door-handle">>
</div><<run VaultUI.setBackground("cell")>>
<<run VaultUI.setTimeOfDay("night")>>
<<set $temp.alchemyGasLevel to 0>>
<<set $player.lust to 50>>
<h2>The Ordeal Ends</h2>
<<if $temp.cellPath is "agony">>
Three 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>>
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.">>
Footsteps. She appears at the cell door.
<<run VaultUI.showCharacter("lysara", "center", "pleased")>>
She studies you. Tests the air. Nods.
<<say "Lysara" "Yes. The gas has run its course.">>
She produces a key and unlocks the cell.
<<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("night")>>
<<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>>
<<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("night")>>
<<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 bent over, picking up scattered vials from the floor. Her robes have ridden up, giving you a perfect view of her ass. The fabric clings to curves that seem designed to torment you.
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("night")>>
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 bent over, still taking her sweet time collecting those vials.
<<set _peekRoll to random(1, 20) + Math.floor($player.agility / 5)>>
<<if _peekRoll >= 14>>
And then she bends just a little lower.
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 folds of her pussy, glistening slightly in the dim light. The perfect curve of her ass framing it like a portrait.
<<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.
But as you lift your head, you catch a glimpse of her face in profile.
She's smiling.
Not looking at you. Not acknowledging. Just... smiling to herself as she returns to her work.
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.
Lysara straightens immediately, robes falling back into place. 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("night")>>
<<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.">>
She walks toward you, hips swaying deliberately now.
<<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("night")>>
You avert your eyes quickly. Too quickly.
<<say "Lysara" "Hmm. Modest. Or just embarrassed about the effect I'm having on you?">>
She glances at the cage. At your cock straining against it.
<<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("night")>>
<<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 toward the cell. Stops just out of reach.
<<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("night")>>
<<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.">>
She reaches through the bars. The crystal hovers over your chest—but her fingers brush your skin. Linger.
<<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("night")>>
<<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.">>
Her fingers trace lazy circles on your stomach. Just above the cage.
<<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.">>
Her hand withdraws. She tucks the crystal away.
<<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("night")>>
<<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.
<<say "Lysara" "One more hour.">>
Her hand withdraws slowly. Reluctantly.
<<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("night")>>
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.
<<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("night")>>
<<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.
Lysara is at her workbench, her back to you. One hand grips the edge of the table. The other...
The other is hidden beneath her robes. Moving.
<<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("night")>>
<<run document.body.classList.add("scene-mode-intimate")>>
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...">>
Her free hand grips the table harder. Her knees tremble.
<<say "Lysara" "Yes... yes... ah—!">>
She cums. Shuddering. Gasping. Her whole body tensing and then releasing.
For a long moment, she just stands there, catching her breath.
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.">>
She walks toward the cell, straightening her robes.
<<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("night")>>
<<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. There's color in her cheeks now. Actual embarrassment.
<<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("night")>>
You clear your throat. Loudly.
Lysara spins around, her hand jerking out from under her robes.
<<say "Lysara" "How much did you—">>
<<say $player.name "Enough.">>
She composes herself quickly. Smooths her robes. Lifts her chin.
<<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("night")>>
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>>
<<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.">>
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("night")>>
<<advanceTime 8 0>>
<h2>Awakening</h2>
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.
<<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 emerges from the shadows.
<<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. Hair like liquid midnight.
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.">>
She gestures at your caged cock.
<<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 member.
<<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 three days. The cage will keep you... contained... until then.">>
<<say $player.name "THREE DAYS?!">>
<<say "Lysara" "Your choice. Quick relief with the antidote... or three 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 three days." "Cell_Refuse_Antidote" "action" "will">>
</div><<if $flags.survivedAgonyPath || $flags.feralPathComplete>>
<<goto "Lysara_Return_Locked">>
<</if>>
<<run VaultUI.setBackground("alchemy_lab")>>
<<run VaultUI.setTimeOfDay("night")>>
<h2>The Hidden Passage</h2>
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>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.
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("night")>>
<<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.
<<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("night")>>
<<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.
<<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("night")>>
<h2>The Hidden Passage</h2>
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.
<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>
<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>>
A note is affixed to the door. 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("night")>>
<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>>
<<set $flags.lysaraDebtIncurred to ($flags.lysaraDebtIncurred || 0) + 1>>
<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("night")>>
<<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 directly in the face.
<<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...">>
Saliva. A strand of drool escapes her lips. Glistening. Thick.
<<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—">>
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.
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("night")>>
<<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.
<<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—">>
She's kissing you back now. Can't help it. Or won't help it. Her tongue meets yours. Shares the drool.
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("night")>>
<<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.
<<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—">>
She's not pulling away. She's kissing you back. Her tongue sliding against yours. Sharing the contaminated saliva.
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_Day" + $temp.cellDays` "action" "back">>
</div><<run VaultUI.setBackground("cell")>>
<<run VaultUI.setTimeOfDay("night")>>
<<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 robes are soaked through. You can see everything—the outline of her breasts, her nipples hard through wet fabric, 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—">>
She trails off. Touches between her legs. Her hand comes away glistening.
<<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.">>
She lifts her robes higher. Exposing her ass. Drool drips from her mouth onto her own chest as she bends forward slightly.
<<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 hips" "Cell_Lysara_Drool_Ass" "intimate" "grab">>
</div><<run VaultUI.setBackground("cell")>>
<<run VaultUI.setTimeOfDay("night")>>
<<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.
<<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. Her hands grip the bars.
<<say "Lysara" "I didn't position myself for this— I was just checking contamination levels—">>
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.
When you finally pull back, she stumbles forward. Catches herself on a table.
<<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.">>
She touches her ass. Where your tongue was.
<<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_Day" + $temp.cellDays` "action" "back">>
</div><<run VaultUI.setBackground("cell")>>
<<run VaultUI.setTimeOfDay("night")>>
<<set $temp.dayActions += 1>>
<<set $temp.lysaraEncounters += 1>>
<<advanceTime 1 0>>
<<set $player.lust to 100>>
<h3>Critical Contamination</h3>
Day three. Or is it? Time blurs when you're watching a blindfolded woman drool constantly.
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.
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.">>
She tries to walk. Stumbles. Falls to her knees.
<<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—">>
She starts crawling. "Searching" for landmarks. Moving backward. Toward your cell.
<<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("night")>>
<<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.
<<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 through her folds. 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—">>
She's abandoned the victim act momentarily. Lost to sensation.
You suck her clit. Hard. She screams.
<<say "Lysara" "I'M BLIND— YOU'RE USING ME WHILE I'M BLIND— I CAN'T—">>
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.">>
She produces something from a pocket. You hear crystal chiming.
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. Three days of 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("night")>>
<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.">>
She turns. Walks confidently to her workbench. Doesn't stumble once.
<<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">
<<vchoice "Accept her offer" "Cell_Lysara_Device" "intimate" "rapid-strikes">>
<<vchoice "Refuse (you don't trust her)" "Cell_Lysara_Device_Refuse" "action" "back">>
</div><<run VaultUI.setBackground("cell")>>
<<run VaultUI.setTimeOfDay("night")>>
<<set $flags.lysaraDroolResolved to true>>
<<set $flags.lysaraBlindfolded to false>>
<<set $flags.lysaraDroolActive to false>>
<h3>Perfect Vision</h3>
After everything—the extraction, the draining, the three days—Lysara reaches up.
Unties her blindfold.
It falls away.
She blinks. Once. Twice. Opens her eyes fully.
They're perfect. Clear. No damage whatsoever.
<<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.">>
She examines her eyes in a mirror. 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 last three 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.">>
She touches her lips. No drool. Perfectly dry. She licks them deliberately.
<<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.">>
She produces a vial. The Resurgence Elixir. Golden. Shimmering.
<<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.">>
She hands you the vial. Her fingers brush yours. Linger.
<<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>>
<<run UInv.AddItem("player", "resurgence elixir")>>
<<journalAdd "The blindfold came off. Perfect vision. Not a mark on her eyes. Three 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" "Kira_Room_With_Potion" "action" "door-handle">>
</div><<run VaultUI.setBackground("cell")>>
<<run VaultUI.setTimeOfDay("night")>>
<<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.
<<say "Lysara" "My vision has returned. How convenient.">>
She looks at you. No fear. No anger. Just... calculation.
<<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.">>
She touches where you grabbed her. Where you held her.
<<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">
<<vchoice "Continue" "Lysara_Feral_Aftermath_Talk" "action" "talk">>
</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>>
<div class="choice-container">
<<vchoice "Endure the night" "Cell_Day_End" "action" "night">>
</div><<run VaultUI.setBackground("cell")>>
<<run VaultUI.setTimeOfDay("night")>>
<<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("night")>>
<<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>>
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("night")>>
<<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, key glinting in the dim light.
<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.
<<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("night")>>
You press against the cold bars, your massive cock jutting through the gap. Vulnerable. Desperate.
Lysara positions the crystal cylinder at your tip. The purple glow pulses—once, twice—
Then she slides it onto you.
<<say $player.name "HOLY FUCK—">>
The sensation is INDESCRIBABLE.
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.
<<say "Lysara" "The device is calibrating. Learning your responses.">>
You're already at the edge. Three days of denial, the gas in your system, and now THIS—
<<say $player.name "I'm gonna— I'm—">>
<<say "Lysara" "Not yet.">>
She twists the base of the cylinder. The pleasure DOUBLES but the release stays just out of reach.
<<say $player.name "PLEASE—">>
<<say "Lysara" "The device controls the timing. Not you. Not me. It knows when you're ready.">>
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("night")>>
<h3>The Extraction</h3>
Time loses meaning.
The device holds you at the precipice—that excruciating moment just before orgasm—and KEEPS you there. 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("night")>>
<h3>Release</h3>
The orgasm hits like a thunderbolt.
You cum harder than you've ever cum in your life. Harder than you thought POSSIBLE. Every drop of gas-tainted seed in your body ERUPTS through your cock as the device milks you relentlessly.
Your vision whites out. Your legs give way. Distantly, you hear yourself screaming.
The device doesn't stop. 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>>
<<set $temp.alchemyGasLevel to 5>>
<div class="choice-container">
<<vchoice "..." "Cell_Lysara_Device_Aftermath" "action" "night">>
</div><<run VaultUI.setBackground("cell")>>
<<run VaultUI.setTimeOfDay("night")>>
<<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.">>
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.
Your essence. All of it.
<<say $player.name "How... how long was I out?">>
<<say "Lysara" "Three hours. The extraction was thorough.">>
She holds up the cylinder, examining it with satisfaction.
<<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("night")>>
<h3>Recovery</h3>
<<say "Lysara" "The extraction purged most of the gas from your system. The last day 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>>
<p class="system-message"><<icon "potion">> The gas has been mostly purged from your system. The final day 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("alchemy_lab")>>
<<run VaultUI.setTimeOfDay("night")>>
<<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.
<<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("night")>>
<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.">>
She wraps her hand around your cock. You flinch.
<<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("night")>>
<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.
<<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.
She's PUNISHING you.
<<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("night")>>
<h3>Payback</h3>
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.
<<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("night")>>
<h3>Edge</h3>
She does it again. And again. And AGAIN.
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("night")>>
<h3>Release</h3>
You EXPLODE.
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.
<<say $player.name "AHHHHH— FUCK— TAKE IT—">>
Rope after rope floods her mouth. She swallows greedily, her throat working, her eyes locked on yours with something between triumph and hunger.
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.
Lysara pulls off with a wet pop. A strand of cum connects her lips to your softening cock.
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>>
<<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("night")>>
<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("night")>>
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" "Essence of Awakening. Crystallized Dreamroot. Tears of the Living Stone.">>
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>>
<<run UInv.AddItem("player", "resurgence elixir")>>
<<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("night")>>
<<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.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("night")>>
<h3>Return</h3>
You dress in the clothes Lysara provides—your old ones were shredded during the transformation.
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" "Kira_Awakening" "action" "health">>
</div><<run VaultUI.setBackground("cell")>>
<<run VaultUI.setTimeOfDay("night")>>
<<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 entire length buries inside her with a wet SLAP.
<<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("night")>>
<h3>Savage</h3>
You POUND her.
Each thrust SLAMS her body against the bars. The metal groans. The whole cell shakes. And Lysara—
<<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("night")>>
<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.
<<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("night")>>
<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.
<<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("night")>>
<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.
<<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("night")>>
<h3>The Incantation</h3>
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.
Something steps out of the darkness. Semi-transparent. Feminine. Curves that shift like smoke, eyes that burn like embers.
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("night")>>
<h3>Thara</h3>
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?">>
She circles you like a predator.
<<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("night")>>
<<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.
<<say "Thara" "By the seven hells... LOOK at this thing.">>
<div class="choice-container">
<<vchoice "Get OUT of me—" "Cell_Feral_Demon_Explores" "danger" "transform">>
</div><<run VaultUI.setBackground("cell")>>
<<run VaultUI.setTimeOfDay("night")>>
<h3>Exploration</h3>
<<say $player.name "Get out— get OUT—">>
<<say "Thara" "Shh. I'm busy.">>
Your hand strokes your cock. Slowly. Deliberately. And you feel EVERYTHING—your touch, but also HER pleasure at controlling you.
<<say "Thara" "Do you have any idea how long it's been since I've had a body? A MALE body?">>
She makes you squeeze harder.
<<say "Thara" "And this cock... gods, what did that gas DO to you? It's like a weapon.">>
Across the room, Lysara is pulling on her robes. Calmly. Like nothing unusual is happening.
<<say $player.name "Lysara— help—">>
<<say "Lysara" "You'll be fine. She'll get bored eventually.">>
She doesn't even look at you.
<<say "Thara" "BORED? With this?">>
Your hand speeds up. Your hips buck involuntarily—HER doing, not yours.
<<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("night")>>
<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.
<<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 "...">>
She squeezes your balls. Gently. Then not so gently.
<<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("night")>>
<h3>Whispers</h3>
Lysara is at her work table now, bottling something. Collecting the cum that dripped onto the floor.
She's ignoring you completely.
<<say "Thara" "She's cold, isn't she? Using us both.">>
Your hand keeps stroking. The demon's rhythm. The demon's pace.
<<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...">>
She makes you thrust into your own fist.
<<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("night")>>
<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.
It rips through you like lightning. Dry. Agonizing. Your body spasms as she milks every last shudder from your spent cock.
<<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.
The last thing you see is Lysara glancing at you from across the room. That same small smile.
Then nothing.
<<set $player.lust to 10>>
<<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("night")>>
<<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. Fresh robes. Hair neat. A cup of tea in her hands.
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.">>
She sips her tea.
<<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 three 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("night")>>
<<set $flags.feralWarningShown to true>>
<h3>Something's Wrong</h3>
<<set _warningLevel to $flags.feralLevel || 0>>
<<if _warningLevel >= 5 && _warningLevel < 8>>
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>
<<elseif _warningLevel >= 8>>
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 < 10>>
<<vchoice "Fight it - try to meditate" "Cell_Meditate" "action" "meditation">>
<</if>>
<<if _warningLevel >= 5 && _warningLevel < 8>>
<<vchoice "Endure the urges" `"Cell_Agony_Day" + $temp.cellDays` "action" "will">>
<<vchoice "Rest until nightfall" "Cell_Day_End" "action" "night">>
<</if>>
<<if _warningLevel >= 8>>
<<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("night")>>
<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.">>
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 $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("night")>>
<<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("night")>>
<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("night")>>
<h3>Losing</h3>
Lysara has the antidote now. She's approaching the cell, vial in hand.
<<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("night")>>
<<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. Your cock—already massive from days of transformation—SURGES against the cage with enough force to SHATTER the enchanted metal.
Fragments ping off the walls. Your cock springs free—monstrous, inhuman, thick as your forearm and dripping with need.
<<say $player.name "RRRRAAAGGGHHH!">>
The sound that tears from your throat isn't human. It's primal. Predatory.
<<say "Lysara" "Gods—">>
The antidote slips from her fingers. Glass shatters. Blue liquid pools on the stone floor.
<<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("night")>>
<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("night")>>
<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!">>
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("night")>>
<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("night")>>
<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 reaches up and begins unfastening her robes. Slowly. One clasp at a time.
<<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.">>
Her robes fall open.
<div class="choice-container">
<<vchoice "WATCH" "Cell_Feral_Tease_1" "intimate" "eye">>
</div><<run VaultUI.setBackground("cell")>>
<<run VaultUI.setTimeOfDay("night")>>
<<run document.body.classList.add("scene-mode-intimate")>>
<h3>Torment</h3>
Underneath her robes, she wears nothing.
No undergarments. No shift. Just pale skin, full 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.">>
She steps closer to the barrier.
<<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.">>
She slides a hand between her thighs.
<<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("night")>>
<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.">>
She's fingering herself now. Two fingers pumping in and out while her other hand works her clit.
<<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—">>
She turns around. Bends over. Shows you her ass—the ass you worshipped through the bars just days ago.
<<say "Lysara" "This what you want? This hole?">>
She spreads her cheeks with one hand, still fingering herself with the other.
<<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("night")>>
<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 and spreads herself wider.
<<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("night")>>
<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.
<<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("night")>>
<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.
<div class="choice-container">
<<vchoice "TAKE HER" "Cell_Feral_Take" "danger" "lust">>
</div><<run VaultUI.setBackground("cell")>>
<<run VaultUI.setTimeOfDay("night")>>
<<run document.body.classList.add("scene-mode-intimate")>>
<<set $temp.dayActions += 1>>
<<set _oralCount to $temp.lysaraOralCount || 0>>
<h3>Through the Bars</h3>
<<if $flags.lysaraCascadeArc is "contaminated_drool">>
<<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>>
<</if>>
<<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)>>
<<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 _moodRoll to random(1, 100)>>
<<set _moodDC to 60 - ($temp.lysaraInterest || 0)>>
<<set _inMood to (_fromTierEvent || _moodRoll >= _moodDC)>>
<<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—">>
Her back arches. Her ass grinds against your face.
<<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.
<<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.
<<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—">>
You pull her closer. She stumbles against the bars. Her breast presses through the gap. Warm. Soft.
<<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.
<<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 through her folds. She's already dripping wet.
<<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_Day" + $temp.cellDays` "action" "back">>
</div>
<</if>><<set $player.lust to 100>>
<<set $temp.lysaraOralCount to ($temp.lysaraOralCount || 0) + 1>>
<<set $flags.kissedLysara to true>>
<<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.
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.
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.
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.
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>>
<<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_Day" + $temp.cellDays` "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.
<<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. She grips the bars, moaning despite herself.
<<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>>
<<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_Day" + $temp.cellDays` "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.
You pull her closer. Your mouth finds her pussy through the bars.
<<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 fold, every drop of wetness, every twitch of her hips.
Your tongue slides through her folds. She cries out.
<<say "Lysara" "STOP— I was just standing— you can't just—">>
But her hands grip the bars. Not pushing away. Holding on.
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—">>
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—">>
She pulses again. And again. Grinding against your face through the bars.
When she finally pulls away, she's gasping. Trembling. Can barely stand.
<<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.
<<goto "Cell_Lysara_Taste_Aftermath">><<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.
<<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 slides through her folds. 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.
<<goto "Cell_Lysara_Taste_Aftermath">><<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—">>
She's on the ground now. Back against the bars. You push her legs apart.
<<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 through her folds. Finds where she was touching herself. Takes over.
<<say "Lysara" "That's— you're doing what I was— but I didn't—">>
She's confused. Her body responding even as her mouth protests.
<<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.">>
<<goto "Cell_Lysara_Taste_Aftermath">><<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.
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.">>
<<goto "Cell_Lysara_Taste_Aftermath">><<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.
<<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...">>
<<goto "Cell_Lysara_Taste_Aftermath">>She adjusts her robes. Still catching her breath.
<<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.">>
<<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">
<<vchoice "Accept her offer" "Cell_Lysara_Device" "intimate" "rapid-strikes">>
<<vchoice "Refuse (you don't trust her)" "Cell_Lysara_Device_Refuse" "action" "back">>
</div>
<<else>>
<<run document.body.classList.remove("scene-mode-intimate")>>
<<goto "Cell_Day_End">>
<</if>><<run VaultUI.setBackground("alchemy_lab")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<h3>The Alchemy Laboratory</h3>
You enter Lysara's laboratory without announcement. No legitimate reason to be here—you don't need a resurgence elixir. Just... curiosity.
The lab is quiet. White walls, pristine equipment, the faint smell of alchemical compounds in the air.
You step toward her main workbench, examining the vials and crystalline devices arranged in perfect order.
Your foot presses down on something that gives slightly.
*Click.*
<p class="sound-effect">WHIRRRR—</p>
Hydraulics activate beneath the floor. Panels slide open directly in front of you.
A white examination table rises from the floor with mechanical precision. Locks into place with a heavy *CLUNK*.
"What the—"
Mechanical arms deploy from the sides of the table. Gleaming metal, multi-jointed, precise.
You try to step back.
Too late.
<div class="choice-container">
<<vchoice "..." "Lysara_RestraintTable_Captured" "danger" "alert">>
</div><<run VaultUI.setBackground("alchemy_lab")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<h3>Captured</h3>
<div class="scene-media">
<video autoplay loop muted playsinline style="max-width: 100%; height: auto; border-radius: 8px; margin: 1em 0;">
<source src="media/lysara/restraint-table/segment_01_setup.webm" type="video/webm">
</video>
</div>
The arms move faster than you can react.
Metal appendages grab your wrists. Your ankles. Pull you onto the table surface—smooth, cold, clinical.
More restraints deploy. Metal bands lock around your wrists with sharp *CLICK-CLICK-CLICK* sounds.
Your arms are pulled above your head. Locked to the table.
Ankle restraints engage. Spread slightly. Locked.
You're on your back, strapped down, completely immobilized.
<<say $player.name "FUCK—get off me—">>
You struggle against the restraints. They don't budge. Perfectly calibrated to hold without causing damage.
Harsh white lights activate above the table. Clinical. Sterile.
The sound of machinery humming. Something is activating.
A panel opens at the side of the table. A crystalline cylinder extends on a mechanical arm—glowing with soft purple light.
It positions itself directly above your groin.
<<say $player.name "Oh fuck no—">>
<div class="choice-container">
<<vchoice "Struggle harder" "Lysara_RestraintTable_Device" "action" "attack">>
</div><<run VaultUI.setBackground("alchemy_lab")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<<set $player.lust to 0>>
<h3>Arousal Protocol</h3>
Smaller mechanical appendages emerge. Before you can process what's happening, they're tearing at your pants.
Fabric rips. Your pants are mechanically removed, discarded.
You're exposed. Vulnerable. The crystalline device descends.
<<say $player.name "Wait—WAIT—">>
It doesn't wait.
The cylinder lowers onto your cock. Warm. Pulsing with energy. Not mechanical stroking—something else. Energy-based stimulation.
The effect is immediate.
<p class="arousal-effect">Your cock hardens rapidly inside the device. Tingling, pleasurable sensations spreading through you.</p>
<<set $player.lust to 40>>
You can't resist it. Your body responds automatically—hardening, sensitizing, need building.
The device brings you toward the edge with perfect precision. In less than thirty seconds, you're right at the threshold.
Right there—about to—
It stops completely.
<<say $player.name "Fuck—no—come on—">>
The arousal plateaus but doesn't fade. You're left hanging, desperate, unable to finish.
After ten agonizing seconds, the device begins again.
<p class="arousal-effect">Building you back to the edge. Perfectly calibrated. Impossibly precise.</p>
<<set $player.lust to 95>>
Right at the threshold again—
Stops.
<<say $player.name "FUCK!">>
You pull against the restraints. Completely helpless. The device starts its cycle again.
Edge. Deny. Wait. Repeat.
<div class="choice-container">
<<vchoice "Call for help" "Lysara_RestraintTable_Discovery" "action" "speech">>
</div><<run VaultUI.setBackground("alchemy_lab")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<<set $player.lust to 100>>
<<advanceTime 0 15>>
<h3>Lysara Appears</h3>
The device edges you for the fourth time. You're beyond desperate.
<<say $player.name "HELP—anyone—LYSARA—">>
The door to the back storage area opens.
<<run VaultUI.showCharacter("lysara", "center", "curious")>>
Lysara enters, carrying vials and alchemical equipment. She's moving toward her main workbench.
She sees the deployed table. Sees you strapped down. The device working on you.
Stops.
Sets down her supplies with careful precision.
<<say "Lysara" "Oh.">>
She approaches slowly. Examining the scene—the table, the restraints, the crystalline device pulsing around your cock.
<<say "Lysara" "The restraint table captured you.">>
Her voice is clinical. Professional. But there's curiosity in her violet eyes.
She walks around the table. Checking the restraints. Observing the device's operation.
<<say "Lysara" "You triggered the pressure plate. The table activated its intruder processing protocol.">>
She leans closer to read a display panel you can't see.
<<say "Lysara" "Automated extraction sequence. Duration...">>
A pause.
<<say "Lysara" "Four hours remaining.">>
<<say $player.name "Four HOURS? Get me OUT of this—">>
The device edges you again. You groan involuntarily.
<<say $player.name "Please—fuck—make it STOP—">>
<div class="choice-container">
<<vchoice "Beg her to help" "Lysara_RestraintTable_Assessment" "intimate" "lips">>
</div><<run VaultUI.setBackground("alchemy_lab")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<h3>Clinical Observation</h3>
Lysara leans closer. Observing the device's effect on you with academic interest.
<<say "Lysara" "The device brings you to ejaculatory threshold repeatedly. Without allowing completion.">>
She watches you strain against the restraints as it edges you again.
<<say "Lysara" "It's designed to extract maximum output through prolonged edging. Very effective.">>
She straightens up. Returns her attention to the control panel.
<<say "Lysara" "You'll be here for quite some time.">>
<<say $player.name "Lysara—PLEASE—can you override it—">>
She's examining the panel. Tapping through menus.
<<say "Lysara" "The automated protocol can't be interrupted once initiated. Safety feature.">>
She trails off. Thinking.
<<say "Lysara" "However...">>
Returns to your side. Looking down at you with clinical assessment.
<<say "Lysara" "Manual extraction would satisfy the protocol's completion requirements.">>
<<say "Lysara" "If I provide direct manual stimulation to completion, the device will recognize protocol fulfillment and release you.">>
She says it like she's explaining a medical procedure. Professional tone.
But there's the faintest curve to her lips.
<<say $player.name "Yes—please—anything—">>
She nods once.
<<say "Lysara" "Very well. I'll need to position myself for optimal extraction angle.">>
<div class="choice-container">
<<vchoice "Accept her help" "Lysara_RestraintTable_Positioning" "intimate" "lips">>
<<vchoice "Refuse, endure the protocol" "Lysara_RestraintTable_Refuse" "move" "back">>
</div><<run VaultUI.setBackground("alchemy_lab")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<<set $player.lust to 100>>
<<set $temp.blueBallsSeverity to 4>>
<h3>Declined</h3>
<<say $player.name "I'll... I'll endure it.">>
Lysara raises an eyebrow.
<<say "Lysara" "Four hours of edging without release. You're certain?">>
<<say $player.name "I'm sure.">>
She shrugs slightly.
<<say "Lysara" "As you wish. The protocol will complete eventually.">>
She returns to her workbench. Resumes her work.
The device continues its relentless cycle.
Edge. Deny. Wait. Repeat.
For four hours.
<p class="warning-text">You endured four hours of automated edging. The blue balls penalty is SEVERE.</p>
<<set $player.lust to 100>>
<<advanceTime 4 0>>
Eventually, the device allows release. One massive, painful orgasm.
The restraints release. You can barely stand.
[[Return to Vault Hub|Vault_Hub]]<<run VaultUI.setBackground("alchemy_lab")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<<run document.body.classList.add("scene-mode-intimate")>>
<h3>Manual Extraction Protocol</h3>
<div class="scene-media">
<video autoplay loop muted playsinline style="max-width: 100%; height: auto; border-radius: 8px; margin: 1em 0;">
<source src="media/lysara/restraint-table/segment_02_positioning.webm" type="video/webm">
</video>
</div>
Lysara inputs commands on the control panel.
The crystalline device retracts with a soft hiss. The mechanical arm folds back into the table.
Your cock springs free—rock hard, twitching, desperate after multiple edges.
<<say "Lysara" "The device has released. I'll proceed with manual protocol.">>
She steps up onto the table platform. With practiced efficiency.
One knee, then the other. She moves to straddle your hips.
Settles into position—sitting on your thighs, facing you.
<<say "Lysara" "This angle provides optimal access and control for extraction procedures.">>
You're looking up at her from your restrained position.
She's above you. In complete control.
Her black robes have fallen open slightly—glimpse of pale skin, the curve of her breasts.
Hair falling around her face. Violet eyes looking down at you with clinical assessment.
<<say "Lysara" "I'll begin the manual extraction sequence now.">>
One hand wraps around the base of your cock. The other hovers near the tip.
<div class="choice-container">
<<vchoice "..." "Lysara_RestraintTable_Extraction" "intimate" "lust">>
</div><<run VaultUI.setBackground("alchemy_lab")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<<run document.body.classList.add("scene-mode-intimate")>>
<<set $player.lust to 95>>
<h3>First Edge</h3>
<div class="scene-media">
<video autoplay loop muted playsinline style="max-width: 100%; height: auto; border-radius: 8px; margin: 1em 0;">
<source src="media/lysara/restraint-table/segment_03_edging.webm" type="video/webm">
</video>
</div>
She strokes slowly. Firm grip. Perfect pressure.
Your back arches. The relief after the device's teasing is overwhelming.
<<say "Lysara" "Sensitivity response: extreme. As expected after device conditioning.">>
Her clinical voice. But she's watching your face.
She establishes a steady rhythm. Not fast—controlled, deliberate.
<<say "Lysara" "Heart rate: elevated. Respiration: rapid. Pre-ejaculate production: high.">>
Cataloging while stroking.
You're already close. The device brought you to the edge so many times.
<<say $player.name "I'm going to—already—">>
Her hand tightens at the base. Stopping stimulation completely.
<<say "Lysara" "Not yet. The protocol requires sustained arousal state before completion.">>
You groan in frustration.
<<say $player.name "Lysara—please—">>
<<say "Lysara" "This is standard procedure. Multiple edges ensure maximum extraction volume.">>
She waits fifteen seconds. Then resumes stroking.
<div class="choice-container">
<<vchoice "..." "Lysara_RestraintTable_Edge2" "intimate" "lust">>
</div><<run VaultUI.setBackground("alchemy_lab")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<<run document.body.classList.add("scene-mode-intimate")>>
<<set $player.lust to 100>>
<h3>Second Edge</h3>
Different grip this time. Twisting motion at the tip.
You're already so sensitive. You reach the edge faster.
She stops.
<<say "Lysara" "Edge two. Excellent response time.">>
<<say $player.name "How many—">>
<<say "Lysara" "The protocol requires four edges before completion.">>
<<say $player.name "Four?!">>
She shifts position slightly. Settles more weight on your thighs. Closer now.
<<say "Lysara" "The edging protocol increases seminal volume by approximately 200-300%.">>
Resumes stroking with both hands. One at base, one working the shaft.
<<say "Lysara" "Approaching threshold... maintaining... holding...">>
Right at the edge. Your entire body tense.
She stops.
<<say "Lysara" "Edge three.">>
<div class="choice-container">
<<vchoice "Beg her to finish" "Lysara_RestraintTable_Edge4" "intimate" "speech">>
</div><<run VaultUI.setBackground("alchemy_lab")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<<run document.body.classList.add("scene-mode-intimate")>>
<h3>Fourth Edge</h3>
<div class="scene-media">
<video autoplay loop muted playsinline style="max-width: 100%; height: auto; border-radius: 8px; margin: 1em 0;">
<source src="media/lysara/restraint-table/segment_04_finish.webm" type="video/webm">
</video>
</div>
<<say $player.name "Please—I can't take more—">>
<<say "Lysara" "One more edge before completion.">>
She's more deliberate now. Taking her time.
Watching your reactions. Learning what makes you twitch, gasp, strain.
<<say "Lysara" "Notice how sensitivity increases with each edge. Documented physiological response.">>
Brings you agonizingly close. Her eyes locked on yours.
<<say "Lysara" "Right there... at threshold... perfect.">>
Stops.
You're beyond words. Just desperate sounds.
She examines your cock clinically. Leaking, twitching, purple with need.
<<say "Lysara" "Four edges completed. Arousal state: maximum. Pre-ejaculate production: excessive.">>
<<say "Lysara" "You're ready for final extraction.">>
<div class="choice-container">
<<vchoice "..." "Lysara_RestraintTable_Release" "intimate" "lust">>
</div><<run VaultUI.setBackground("alchemy_lab")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<<run document.body.classList.add("scene-mode-intimate")>>
<<set $player.lust to 0>>
<<clampStat "player.energy" (-25) 0 50>>
<h3>Extraction Complete</h3>
<<say "Lysara" "Extraction commencing.">>
She strokes with purpose now. No more stopping.
Firm grip. Fast rhythm.
<<say "Lysara" "You may ejaculate when ready.">>
Permission granted.
After all the edging, the orgasm hits like an explosion.
Massive release. Multiple spurts.
Cum everywhere—her hands, your stomach, the table.
You're crying out, straining against restraints, completely overwhelmed.
She keeps stroking through it. Milking every drop.
<<say "Lysara" "Ejaculation in progress. Volume: significant. Duration: extended.">>
She's cataloging while you cum.
<<say "Lysara" "Approximately nine spurts. Estimated total volume: 8-10 milliliters.">>
<<say "Lysara" "The edging protocol increased output by 350%. Very effective.">>
Still stroking gently as you come down.
<<say "Lysara" "Secondary contractions detected. Ensuring complete extraction.">>
You're gasping. Exhausted. Your cock still twitching in her hand.
She releases you. Examines her hands—covered in your cum.
<<say "Lysara" "Extraction complete.">>
<div class="choice-container">
<<vchoice "..." "Lysara_RestraintTable_Cleanup" "move" "forward">>
</div><<run VaultUI.setBackground("alchemy_lab")>>
<<run VaultUI.setTimeOfDay($time.phase)>>
<<advanceTime 2 0>>
<<set $flags.lysaraRestraintTableEvent to true>>
<h3>Released</h3>
She climbs off the table. Inputs code on the control panel.
*CLICK-CLICK-CLICK*
The restraints unlock. Your arms drop. Too exhausted to move yet.
Lysara is collecting some of your cum in a small vial.
<<say "Lysara" "For analysis. The effect of prolonged edging on seminal composition is worth documenting.">>
Clinical efficiency while cleaning herself with a cloth.
She adjusts her robes. Returns to professional distance.
<<say "Lysara" "You triggered the automated restraint table. Pressure plate near the examination area.">>
<<say "Lysara" "The device would have edged you for four hours before allowing release. I provided manual extraction to expedite the protocol.">>
<<say "Lysara" "Standard procedure for captured intruders.">>
You're still processing what just happened.
<<say $player.name "I... thank you?">>
She nods once.
<<say "Lysara" "You're welcome. I suggest avoiding the pressure plate in future visits.">>
A slight smile.
She hands you a small vial.
<<say "Lysara" "This will help you recover from the extraction protocol. Drink it before you leave.">>
You drink it. Immediate calming effect.
But also... drowsiness.
<<say "Lysara" "The stabilizer includes a mild sedative. To prevent shock after intense extraction.">>
Your vision blurs.
She supports you as your legs weaken.
<<say "Lysara" "Easy. The sedative will help you rest.">>
Walks you to the laboratory door.
<<say "Lysara" "You'll wake at the Archives entrance. Perfectly normal.">>
Everything fades.
[[...|Lysara_RestraintTable_Wakeup]]<h3>Archives Entrance</h3>
You wake slowly.
You're at the Archives entrance. Two hours have passed.
Your clothes are back on. She must have dressed you.
Your body feels... drained. Satisfied. Exhausted.
Faint smell of her perfume on your clothes.
<p class="internal-thought">Did that really just happen?</p>
<<set $player.corruption += 2>>
<div class="choice-container">
<<vchoice "Return to Vault Hub" "Vault_Hub" "move" "forward">>
</div><<run VaultUI.setBackground("cell")>>
<<run VaultUI.setTimeOfDay("night")>>
<<set $temp.dayActions += 1>>
<<set $temp.lysaraEncounters += 1>>
<<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.
<<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.
<<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.
<<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.
<<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.
<<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.
<<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.
<<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.
<<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)>>
She twists side to side. Rolls her neck. Bends backward, then forward, fingertips touching the floor.
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.
<</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>>
<<set $flags.lysaraIntimacyPathUnlocked to true>>
<</if>>
<<if $flags.lysaraCascadeArc is "contaminated_drool">>
<<set $player.lust to 100>>
<<set _droolTier to $flags.lysaraDroolTier || 0>>
<<if _droolTier is 0>>
<<set $flags.lysaraIntimacyEvent to 101>>
<<goto "Cell_Spy_Drool_T1">>
<<elseif _droolTier is 1>>
<<set $flags.lysaraIntimacyEvent to 201>>
<<goto "Cell_Spy_Drool_T2">>
<<else>>
<<set $flags.lysaraIntimacyEvent to 301>>
<<goto "Cell_Spy_Drool_T3">>
<</if>>
<</if>>
<<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 is 0 && !$flags.lysaraCascadeArc && random(1, 100) lte 10>>
<<set $flags.lysaraCascadeArc to "contaminated_drool">>
<<set $flags.lysaraIntimacyEvent to 101>>
<<goto "Cell_Spy_Drool_T1">>
<</if>>
<<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.">>
<<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.">>
<<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.">>
<<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.">>
<<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?">>
<<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.
<<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.
<<say "Lysara" "The gas in your system... it will peak tomorrow. You need to be prepared for what that means.">>
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.
<<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.
<</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.">>
<<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.
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.
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.">>
Another pause. Still holding the bridge. Legs spread. Everything on display.
<<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.">>
<<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.">>
<<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."
<<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.
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...">>
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.
<</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. Full 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...">>
She sighs. Sets the robes aside. Stands there naked, seemingly lost in thought.
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.
<<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.">>
<<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. The pink folds 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.
<<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.
<<say "Lysara" "I should get up. But I can't quite reach the vial.">>
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>>
<<else>>
<<set _spyEvent to random(1, 10)>>
<<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.
<<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.
<<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.
<<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.
<<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.
<<elseif _spyEvent is 6>>
Lysara is washing her hands in a basin. The water runs down her forearms, dripping from her elbows.
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.
<<elseif _spyEvent is 8>>
Lysara drops a vial. It shatters on the floor near your cell.
<<say "Lysara" "Oh. Clumsy.">>
She crouches to clean it up. 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.
<<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.
<<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.
<</if>>
<</if>>
<</if>>
<<if $flags.feralLevel >= 10 && !$flags.lysaraDeviceUsed && !$flags.feralPathTriggered>>
<<goto "Cell_Feral_Surrender">>
<<elseif $flags.feralLevel >= 5 && !$flags.lysaraDeviceUsed && !$flags.feralPathTriggered && !$flags.feralWarningShown>>
<<goto "Cell_Feral_Warning">>
<<else>>
<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 $flags.lysaraIntimacyPathUnlocked && !$flags.lysaraDeviceUsed>>
<<set _evt to $flags.lysaraIntimacyEvent || 0>>
<<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>>
<<vchoice "Just suffer" "Cell_Suffer" "action" "health">>
<<else>>
<<vchoice "Rest until nightfall" "Cell_Day_End" "action" "night">>
<</if>>
</div>
<</if>><<widget "travelNarrative">>
<<silently>>
<<getJourneyCompanion>>
<<set _kiraTitsOut to ($clothing && $clothing.kira && $clothing.kira.titsExposed)>>
<<set _kiraPussyOut to ($clothing && $clothing.kira && $clothing.kira.pussyExposed)>>
<<set _kiraNaked to ($journey && $journey.exposure.companion.naked)>>
<<set _playerDickOut to ($clothing && $clothing.player && $clothing.player.dickExposed)>>
<<set _playerNaked to ($journey && $journey.exposure.player.naked)>>
<<set _playerHighLust to ($player && $player.lust >= 70)>>
<<set _kiraHighLust to (_gc_companion && _gc_companion.lust >= 60)>>
<<set _bothHighLust to (_playerHighLust && _kiraHighLust)>>
<<if _kiraNaked && _playerNaked>>
<<set _travelState to "both_naked">>
<<elseif _kiraNaked>>
<<set _travelState to "kira_naked">>
<<elseif _playerNaked>>
<<set _travelState to "player_naked">>
<<elseif _kiraTitsOut && _kiraPussyOut>>
<<set _travelState to "kira_both_exposed">>
<<elseif (_kiraTitsOut || _kiraPussyOut) && _playerDickOut>>
<<set _travelState to "both_exposed">>
<<elseif _kiraPussyOut>>
<<set _travelState to "kira_pussy_exposed">>
<<elseif _kiraTitsOut>>
<<set _travelState to "kira_tits_exposed">>
<<elseif _playerDickOut>>
<<set _travelState to "player_dick_exposed">>
<<elseif _bothHighLust>>
<<set _travelState to "high_lust_both">>
<<elseif _kiraHighLust>>
<<set _travelState to "high_lust_kira">>
<<elseif _playerHighLust>>
<<set _travelState to "high_lust_player">>
<<else>>
<<set _travelState to "ambient_walking">>
<</if>>
<</silently>>
<<showTravelVideo _travelState>>
<<travelText _travelState>>
<</widget>>
<<widget "showTravelVideo">>
<<set _category to _args[0] || "ambient_walking">>
<<set _videoPath to "media/events/travel/" + _category>>
<div class="travel-video-container">
<<showEventMedia "travel/" + _category>>
</div>
<</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>>
<<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>>
<</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 _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>>
<</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>>
<<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>>
<<getJourneyCompanion>>
<<if ($player && $player.lust >= 70) || (_gc_companion && _gc_companion.lust >= 60)>>
<<arousalNarrative>>
<</if>>
<<if random(1, 3) === 1>>
<<kiraTravelComment>>
<</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 _kiraExposed to ($clothing.kira.titsExposed || $clothing.kira.pussyExposed)>>
<<set _bothExposed to (_playerExposed && _kiraExposed)>>
<<set _wrecked to ($flags.groupCNCBoth === true)>>
<<if _wrecked>>
<<goto "Vault_Arrival_Wrecked">>
<<elseif _bothExposed>>
<<goto "Vault_Arrival_Exposed">>
<<elseif _playerExposed || _kiraExposed>>
<<goto "Vault_Arrival_Exposed">>
<<else>>
<<goto "Vault_Arrival_Normal">>
<</if>><<setBackground "vault-entrance">>
<h2>The Vault</h2>
The heavy door seals behind you with a satisfying thunk. Safe.
The Groundskeeper's holographic form flickers to life.
<<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 $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 UInv.BagHasItem("player", "scrap cloth")>>
<<vchoice "Repair clothing at workbench" "Vault_Repair_Clothing" "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's holographic form flickers to life, sensors sweeping over both of you.
<<set _playerDickOut to $clothing.player.dickExposed>>
<<set _kiraExposed to ($clothing.kira.titsExposed || $clothing.kira.pussyExposed)>>
<<set _bothExposed to (_playerDickOut && _kiraExposed)>>
<<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>>
<<say "Groundskeeper" setup.textPools.vault_groundskeeper_exposed.notice_player.random()>>
<<if $player.lust >= 50>>
<p class="explicit">Your cock is still half-hard. There's no hiding it.</p>
<<say "Groundskeeper" setup.textPools.vault_groundskeeper_exposed.notice_player_aroused.random()>>
<<say "Kira" setup.textPools.vault_kira_reactions.flustered.random()>>
<</if>>
<<elseif $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 $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 UInv.BagHasItem("player", "scrap cloth")>>
<<vchoice "Repair clothing immediately" "Vault_Repair_Clothing" "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>
You half-crawl, half-stumble through the vault door. Kira is barely walking, leaning heavily on you.
The Groundskeeper's hologram appears. Pauses. Its form 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>
<<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 an AI, 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.kira.top to 0>>
<<set $clothing.kira.bottom to 0>>
<<set $player.energy to Math.max(30, $player.energy)>>
<<set $companions[0].energy to Math.max(25, $companions[0].energy)>><<setBackground "vault-storage">>
<h2>Clothing Repair Station</h2>
You find the repair station in storage. Proper tools, spare fabric, time to do it right.
<<set _hasScrapCloth to UInv.BagHasItem("player", "scrap cloth")>>
<<set _scrapClothCount to UInv.BagHasItem("player", "scrap cloth")>>
<<if _hasScrapCloth>>
<p>You have <<print _scrapClothCount>> scrap cloth available. Each piece can fully repair 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 UInv.DeleteItem("player", "scrap cloth")>>
<<set $clothing.player.top to 100>>
<<updateExposure "player">>
<<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 UInv.DeleteItem("player", "scrap cloth")>>
<<set $clothing.player.bottom to 100>>
<<set $clothing.player.underwear to 100>>
<<updateExposure "player">>
<<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 UInv.DeleteItem("player", "scrap cloth")>>
<<set $clothing.kira.top to 100>>
<<updateExposure "kira">>
<<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 UInv.DeleteItem("player", "scrap cloth")>>
<<set $clothing.kira.bottom to 100>>
<<set $clothing.kira.underwear to 100>>
<<updateExposure "kira">>
<<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 scrap cloth 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>>
<<clampStat "player.lust" random(1, 3)>>
<<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 && ($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>
<<clampStat "player.lust" random(3, 5)>>
<</if>>
<</if>>
<</widget>>
<<widget "startTravelSegment">>
<<set _destination to _args[0]>>
<<set $journey.ticksThisSegment to 0>>
<<resetExposureTurns>>
<<calculateEncounterRisk>>
<</widget>>
<<widget "advanceTravelSegment">>
<<set $journey.ticksThisSegment += 1>>
<<tickExposure>>
<</widget>>
<<widget "showExposureDuration">>
<div class="exposure-duration">
<h4>Exposure Duration</h4>
<<if $clothing.kira.titsExposed>>
<p>Kira's tits exposed: <<print $journey.exposure.companion.topExposedTurns>> turns
<<if $journey.exposure.companion.topExposedTurns >= 5>><span class="warning">(prolonged)</span><</if>></p>
<</if>>
<<if $clothing.kira.pussyExposed>>
<p>Kira's pussy exposed: <<print $journey.exposure.companion.bottomExposedTurns>> turns
<<if $journey.exposure.companion.bottomExposedTurns >= 5>><span class="warning">(prolonged)</span><</if>></p>
<</if>>
<<if $clothing.kira.assExposed>>
<p>Kira's ass exposed: <<print $journey.exposure.companion.assExposedTurns>> turns
<<if $journey.exposure.companion.assExposedTurns >= 5>><span class="warning">(prolonged)</span><</if>></p>
<</if>>
<<if $clothing.player.dickExposed>>
<p>Player's dick exposed: <<print $journey.exposure.player.turns>> turns
<<if $journey.exposure.player.turns >= 5>><span class="warning">(prolonged)</span><</if>></p>
<</if>>
<<if $clothing.player.assExposed>>
<p>Player's ass exposed: <<print $journey.exposure.player.assExposedTurns>> turns
<<if $journey.exposure.player.assExposedTurns >= 5>><span class="warning">(prolonged)</span><</if>></p>
<</if>>
</div>
<</widget>>
<<widget "describeExposure">>
<<set _target to _args[0]>>
<<set _style to _args[1] || "neutral">>
<<if _target === "player">>
<<if $clothing.player.top <= 0 && $clothing.player.bottom <= 0>>
<<if _style === "explicit">>
<p class="explicit">You're completely naked, your cock swinging freely as you move.</p>
<<else>>
<p>You're completely naked.</p>
<</if>>
<<elseif $clothing.player.dickExposed>>
<<if _style === "explicit">>
<p class="explicit">Your torn pants expose your cock to the Reclaimed air.</p>
<<else>>
<p>Your pants are torn, leaving you exposed.</p>
<</if>>
<</if>>
<<elseif _target === "kira">>
<<if $clothing.kira.top <= 0 && $clothing.kira.bottom <= 0>>
<<if _style === "explicit">>
<p class="explicit">Kira walks beside you completely naked, her tits bouncing with each step, pussy on full display.</p>
<<else>>
<p>Kira is completely naked.</p>
<</if>>
<<elseif $clothing.kira.titsExposed && $clothing.kira.pussyExposed>>
<<if _style === "explicit">>
<p class="explicit">Kira's torn clothing leaves both her tits and pussy exposed. She's not even trying to cover herself anymore.</p>
<<else>>
<p>Kira's clothing is badly torn, exposing her.</p>
<</if>>
<<elseif $clothing.kira.titsExposed>>
<<if _style === "explicit">>
<p class="explicit">Kira's torn shirt hangs open, her tits bouncing freely.</p>
<<else>>
<p>Kira's shirt is torn, exposing her chest.</p>
<</if>>
<<elseif $clothing.kira.pussyExposed>>
<<if _style === "explicit">>
<p class="explicit">The rip in Kira's pants exposes her pussy with every step.</p>
<<else>>
<p>Kira's pants are badly torn.</p>
<</if>>
<</if>>
<</if>>
<</widget>>
<<widget "kiraExposureComment">>
<<getJourneyCompanion>>
<<if !_gc_companion>><<return>><</if>>
<<set _commentRoll to random(1, 100)>>
<<if $clothing.kira && $clothing.kira.titsExposed && _commentRoll <= 30>>
<<set _commentType to random(1, 5)>>
<<switch _commentType>>
<<case 1>>
<<say "Kira" "Stop staring at my tits.">>
<<case 2>>
<<say "Kira" "I know they're out. You don't have to keep looking.">>
<<case 3>>
<<say "Kira" "Eyes up here, asshole.">>
<<case 4>>
<<say "Kira" "I'm aware of the situation, thanks.">>
<<case 5>>
<<say "Kira" "Focus on the road, not my chest.">>
<</switch>>
<<addTension "kira" 2>>
<<elseif $clothing.kira && $clothing.kira.pussyExposed && _commentRoll <= 25>>
<<set _commentType to random(1, 4)>>
<<switch _commentType>>
<<case 1>>
<<say "Kira" "I'd cover up if I could. Trust me.">>
<<case 2>>
<<say "Kira" "This is humiliating.">>
<<case 3>>
<<say "Kira" "Don't say a word.">>
<<case 4>>
<<say "Kira" "Let's just get back quickly.">>
<</switch>>
<<addTension "kira" 3>>
<<elseif $clothing.player.dickExposed && _commentRoll <= 20>>
<<set _commentType to random(1, 4)>>
<<switch _commentType>>
<<case 1>>
<<say "Kira" "Can you... put that away?">>
<<case 2>>
<<say "Kira" "You're, uh... very exposed right now.">>
<<case 3>>
<<say "Kira" "I'm trying not to look.">>
<<case 4>>
<<say "Kira" "That's... distracting.">>
<</switch>>
<<set _gc_companion.lust += 2>>
<</if>>
<</widget>><<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>>
<<set $journey.active to true>>
<<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.distanceTraveled to 0>>
<<set $journey.ticksThisSegment to 0>>
<<set $journey.fatigue to 0>>
<<set $survival.fatigueState to "fresh">>
<<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>>
<<set $journey.wetness to 0>>
<<set $journey.weatherChanged to false>>
<<set $journey.wetShirtTriggered to false>>
<<set $journey.wetShirtPending 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.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>>
<<set $journey.hoursSinceRest += 1>>
<<set $journey.hoursSinceFood += 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>>
<</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 _fromId to _args[0]>>
<<set _toId to _args[1]>>
<<set _from to $worldMap.nodes[_fromId]>>
<<set _to to $worldMap.nodes[_toId]>>
<<if !_from || !_to || !Number.isFinite(_from.x) || !Number.isFinite(_to.x)>>
<<set $journey.calculatedDistance to 2>>
<<else>>
<<set _dx to _to.x - _from.x>>
<<set _dy to _to.y - _from.y>>
<<set _visualDist to Math.sqrt(_dx * _dx + _dy * _dy)>>
<<set _baseTime to Math.max(1, Math.round(_visualDist / setup.travelConfig.distance.unitsPerHour))>>
<<set _destTerrain to _to.terrain || "reclaimed">>
<<set _terrainData to $worldMap.terrainTypes[_destTerrain]>>
<<if _terrainData && _terrainData.speedModifier && _terrainData.speedModifier !== 1.0>>
<<set _baseTime to Math.max(1, Math.round(_baseTime / _terrainData.speedModifier))>>
<</if>>
<<set $journey.calculatedDistance to _baseTime>>
<</if>>
<</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 "endJourney">>
<<set $journey.active to false>>
<<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">>
<<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">>
<<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>>
<</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.succubusEncounterComplete>>
<<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>>
<<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>>
<<if !$journey.party.solo && $companions && $companions[$journey.party.companionIndex]>>
<<set _companionId to $journey.party.companionId || "kira">>
<<set _companionClothing to $clothing[_companionId]>>
<<if _companionClothing>>
<<set _companionNaked to (_companionClothing.top <= 0 && _companionClothing.bottom <= 0)>>
<<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 !$journey.party.solo && $companions[$journey.party.companionIndex] && $companions[$journey.party.companionIndex].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: <<print _jh_progress>>%;"></div>
<span class="progress-text"><<print $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">>
<<set _jc_showRest to $journey.fatigue >= 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">>
<<if $journey.party.solo || !$companions || !$companions[$journey.party.companionIndex]>>
<<set _gc_companion to null>>
<<set _gc_companionId to null>>
<<else>>
<<set _gc_companion to $companions[$journey.party.companionIndex]>>
<<set _gc_companionId to $journey.party.companionId || _gc_companion.id || "kira">>
<</if>>
<</widget>>
<<widget "getCompanionClothing">>
<<set _gcc_companionId to _args[0] || _gc_companionId || $journey.party.companionId || "kira">>
<<if $journey.party.solo>>
<<set _gcc_clothing to null>>
<<elseif $clothing && $clothing[_gcc_companionId]>>
<<set _gcc_clothing to $clothing[_gcc_companionId]>>
<<else>>
<<set _gcc_clothing to $clothing.kira || null>>
<</if>>
<</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 "getCompanionConfig">>
<<set _gconf_id to _args[0] || _gc_companionId || $journey.party.companionId || "kira">>
<<set _gconf_config to setup.companionConfigs[_gconf_id] || null>>
<</widget>>
<<widget "companionName">>
<<getJourneyCompanion>>
<<if _gc_companion>>
<<getCompanionConfig _gc_companionId>>
<<set _cn_name to (_gconf_config && _gconf_config.name) ? _gconf_config.name : (_gc_companion.name || "Companion")>>
<<else>>
<<set _cn_name to "">>
<</if>>
<</widget>><<set _eventType to random(1, 100)>>
<<if _eventType <= 20 && ($journey.exposure.player.exposed || $journey.exposure.companion.exposed)>>
<<set _ambientType to random(1, 5)>>
<<switch _ambientType>>
<<case 1>><<goto "Journey_Ambient_WindGust">>
<<case 2>><<goto "Journey_Ambient_Thirst">>
<<case 3>><<goto "Journey_Ambient_Shame">>
<<case 4>><<goto "Journey_Ambient_Arousal">>
<<case 5>><<goto "Journey_Ambient_Memory">>
<</switch>>
<<elseif _eventType <= 60 && !$journey.encounter.happened>>
<<set $journey.encounter.happened to true>>
<<set $journeyHistory.encountersOnTravel++>>
<<set _encounterType to random(1, 3)>>
<<switch _encounterType>>
<<case 1>><<goto "Journey_Encounter_Scavenger">>
<<case 2>><<goto "Journey_Encounter_Raider">>
<<case 3>><<goto "Journey_Encounter_Opportunist">>
<</switch>>
<<else>>
<<goto "Journey_Segment">>
<</if>><<setBackground "reclaimed-travel">>
<<if !$journey.active>>
<<goto "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">>
<<vchoice "Make camp" "Journey_Camp" "action" "fire">>
<</if>>
</div>
<</if>><<setBackground "reclaimed-travel">>
<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>>
<<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><<travelTick>>
<<survivalTick>>
<<weatherTick>>
<<tickExposure>>
<<if $flags.survivalDeath>>
<<goto "Journey_Survival_Death">>
<</if>>
<<if $flags.companionCollapsed>>
<<set $flags.companionCollapsed to false>>
<<goto "Journey_Companion_Collapse">>
<</if>>
<<canTriggerCompanionEvent>>
<<if $journey.wetShirtPending && _cte_canTrigger>>
<<goto "Weather_WetShirt">>
<</if>>
<<if !$journey.active>>
<<goto "Journey_Arrive">>
<<else>>
<<checkSurvivalCrisis>>
<<if $survival.crisis>>
<<goto "Journey_Survival_Crisis">>
<</if>>
<<set _terrain to $journey.currentSegment.terrain>>
<<set _terrainData to $worldMap.terrainTypes[_terrain]>>
<<if _terrainData && _terrainData.backgrounds && _terrainData.backgrounds.length > 0>>
<<if $time.phase === "night" || $time.phase === "evening">>
<<setBackground _terrainData.backgrounds[_terrainData.backgrounds.length - 1]>>
<<else>>
<<setBackground _terrainData.backgrounds[0]>>
<</if>>
<<else>>
<<setBackground "reclaimed-travel">>
<</if>>
<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 _eventRoll <= _eventThreshold>>
<<travelNarrative>>
<<journeyChoices>>
<<else>>
<<setupLegacyTravel>>
<<goto "Journey_Event">>
<</if>>
<</if>><<endJourney>>
<<set _node to $worldMap.nodes[$currentLocation]>>
<<run VaultUI.setArrivalBackground($currentLocation, _node)>>
<h2>Arrived</h2>
<p>You've reached <strong><<print _node.name>></strong>.</p>
<<if _node.description>>
<p class="location-description"><<print _node.description>></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">>
<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 "camp-setup">>
<h2><<icon "fire">> Making Camp</h2>
<p>You find a defensible spot and begin setting up camp.</p>
<<set $journey.paused to true>>
<<canTriggerCompanionEvent>>
<<if _cte_canTrigger>><<getJourneyCompanion>><</if>>
<<if _cte_canTrigger && $journey.crisisCount >= 3 && $journey.fatigue >= 60 && random(1, 100) <= 20>>
<<goto "Journey_Survival_BreakdownComfort">>
<</if>>
<<if _cte_canTrigger && _gc_companion && _gc_companion.romanceStage >= 2 && $time.phase === "night" && random(1, 100) <= 15>>
<<goto "Journey_Survival_IntimateWarmth">>
<</if>>
<<survivalStatus>>
<<if _cte_canTrigger>>
<<if $journey.fatigue >= 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><<set _shelterType to "tent">>
<<goto "Journey_Camp_Wake">><<set _shelterType to "tarp">>
<<goto "Journey_Camp_Wake">><<set _shelterType to "none">>
<<goto "Journey_Camp_Wake">><<set _shelter to _shelterType || "none">>
<<campRest _shelter>>
<<setBackground "camp-morning">>
<h2><<icon "sunrise">> Morning</h2>
<<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>>
<<set _fatigueRecovered to setup.survival.campRecovery[_shelter] ? setup.survival.campRecovery[_shelter].fatigue : 20>>
<p class="system-info"><<icon "sleep">> Fatigue reduced by <<print _fatigueRecovered>>%</p>
<p class="system-info"><<icon "health">> +15 Health 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 "camp-setup">>
<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 "sleep">> Fatigue reduced by 20%</p>
<p class="system-info"><<icon "health">> +5 Health 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">>
<h2><<icon "wait">> Catching Your Breath</h2>
<p>You pause for an hour, sitting in the shade of a rocky outcrop.</p>
<<survivalStatus>>
<<canTriggerCompanionEvent>>
<<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><<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 "camp-morning">>
<<advanceTime "morning">>
<h2><<icon "sunrise">> Dawn</h2>
<p>Light creeps across the horizon. Another day in the Reclaimed.</p>
<<set _fatigueRecovery to setup.travelConfig.fatigueRecovery.dawnRest>>
<<set $journey.fatigue to Math.max(0, $journey.fatigue - _fatigueRecovery)>>
<<set $player.health to Math.min($player.maxHealth, $player.health + 15)>>
<p class="system-info"><<icon "sleep">> Fatigue reduced by <<print _fatigueRecovery>>%</p>
<p class="system-info"><<icon "health">> +15 Health restored</p>
<<canTriggerCompanionEvent>>
<<if _cte_canTrigger>>
<<getJourneyCompanion>>
<<set _gc_companion.health to Math.min(_gc_companion.maxHealth, _gc_companion.health + 15)>>
<<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>
<p>Before you venture out, make sure you're ready.</p>
<div class="prep-section">
<h3><<icon "companion">> Companion</h3>
<<if $companions && $companions.length > 0>>
<<for _comp range $companions>>
<<set _canTravel to true>>
<<set _unavailableReason to "">>
<<if $flags.kiraIsUnconscious && _comp.id === "kira">>
<<set _canTravel to false>>
<<set _unavailableReason to "Unconscious - in a coma">>
<<elseif _comp.currentLocation === "medical">>
<<set _canTravel to false>>
<<set _unavailableReason to "Recovering in Medical Bay">>
<<elseif _comp.health <= 30>>
<<set _canTravel to false>>
<<set _unavailableReason to "Health too low (" + _comp.health + "/" + _comp.maxHealth + ")">>
<</if>>
<<if _canTravel>>
<div class="companion-option">
<<radiobutton "$expeditionCompanion" _comp.id checked>>
<span class="name"><<print _comp.name>></span>
<span class="stats">(HP: <<print _comp.health>>/<<print _comp.maxHealth>>)</span>
</div>
<<else>>
<div class="companion-option disabled">
<span class="name"><<print _comp.name>></span>
<span class="warning">(<<print _unavailableReason>>)</span>
</div>
<</if>>
<</for>>
<div class="companion-option">
<<radiobutton "$expeditionCompanion" "">>
<span class="name">Go alone</span>
<span class="warning">(More dangerous)</span>
</div>
<<else>>
<p class="note">No companions available.</p>
<<set $expeditionCompanion to "">>
<</if>>
</div>
<div class="prep-section">
<h3><<icon "loot">> Supplies</h3>
<p>Pack supplies from vault storage for your journey.</p>
<div class="supply-row">
<span class="label">Food (<<print $vault.food>> in vault):</span>
<span class="control">
<<numberbox "$player.carriedFood" 2 0 Math.min(5, $vault.food)>>
</span>
</div>
<div class="supply-row">
<span class="label">Water (<<print $vault.water>> in vault):</span>
<span class="control">
<<numberbox "$player.carriedWater" 2 0 Math.min(5, $vault.water)>>
</span>
</div>
<p class="note-small">Supplies will be deducted from vault storage when you depart.</p>
</div>
<div class="prep-section status-check">
<h3><<icon "health">> Status</h3>
<div class="status-grid">
<div class="status-item">
<span class="label">Your Health:</span>
<span class="value <<if $player.health < 50>>warning<</if>>"><<print $player.health>>/<<print $player.maxHealth>></span>
</div>
<<if $companions[0]>>
<div class="status-item">
<span class="label">Kira's Health:</span>
<span class="value <<if $companions[0].health < 50>>warning<</if>>"><<print $companions[0].health>>/<<print $companions[0].maxHealth>></span>
</div>
<</if>>
<div class="status-item">
<span class="label">Time of Day:</span>
<span class="value"><<print $time.phase.charAt(0).toUpperCase() + $time.phase.slice(1)>></span>
</div>
</div>
</div>
<div class="choice-container">
<<vchoice "Depart to the Reclaimed" "Travel_Depart" "action" "journey">>
<<vchoice "Cancel" "Vault_Hub" "action" "return">>
</div><<set $vault.food -= $player.carriedFood>>
<<set $vault.water -= $player.carriedWater>>
<<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">><<startJourney "outpost">>
<<goto "Journey_Start">><<startJourney "convoy">>
<<goto "Journey_Start">><<startJourney "overgrown_ruins">>
<<goto "Journey_Start">><<startJourney "vault">>
<<goto "Journey_Start">><<run setup.survival = {
hunger: {
satisfied: 70,
hungry: 50,
veryHungry: 30,
starving: 10
},
fatigue: {
fresh: 30,
tired: 50,
fatigued: 70,
exhausted: 90,
collapsing: 100
},
terrainFatigue: {
reclaimed: 3,
ruins: 4,
highway: 2,
forest: 4,
urban: 3,
industrial: 4,
ravine: 5,
swamp: 6,
mountains: 5
},
terrainEnergyDrain: {
reclaimed: 4,
ruins: 5,
highway: 3,
forest: 5,
urban: 4,
industrial: 5,
ravine: 6,
swamp: 7,
mountains: 6
},
campRecovery: {
none: { fatigue: 30, description: "Rough rest on the ground" },
tarp: { fatigue: 45, description: "Basic shelter from the elements" },
tent: { fatigue: 60, description: "Proper shelter and rest" },
shelter: { fatigue: 50, description: "Found shelter provides decent cover" }
}
}>>
<<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>>
<<set _baseFatigue to setup.survival.terrainFatigue[_terrain] || 3>>
<<if $player.energy <= 15>>
<<set _baseFatigue += 3>>
<<elseif $player.energy <= 30>>
<<set _baseFatigue += 2>>
<<elseif $player.energy <= 50>>
<<set _baseFatigue += 1>>
<</if>>
<<if $journey.weather === "storm">>
<<set _baseFatigue += 2>>
<<elseif $journey.weather === "rain">>
<<set _baseFatigue += 1>>
<</if>>
<<if $player.hunger <= 20>>
<<set _baseFatigue += 2>>
<<elseif $player.hunger <= 50>>
<<set _baseFatigue += 1>>
<</if>>
<<clampStat "journey.fatigue" _baseFatigue>>
<<if $player.hunger <= 10>>
<<clampStat "player.health" (-2) 0 100>>
<<getJourneyCompanion>>
<<if _gc_companion>>
<<set _gc_companion.health -= 1>>
<<if _gc_companion.health <= 0>>
<<set $flags.companionCollapsed to true>>
<</if>>
<</if>>
<</if>>
<<if $player.health <= 0>>
<<set $flags.survivalDeath to true>>
<<if $player.hunger <= 5>>
<<set $flags.deathCause to "starvation">>
<<elseif $journey.fatigue >= 100>>
<<set $flags.deathCause to "exhaustion">>
<<else>>
<<set $flags.deathCause to "starvation">>
<</if>>
<</if>>
<</widget>>
<<widget "getHungerState">>
<<if $player.hunger >= 70>>
<<set $survival.hungerState to "satisfied">>
<<elseif $player.hunger >= 40>>
<<set $survival.hungerState to "hungry">>
<<elseif $player.hunger >= 20>>
<<set $survival.hungerState to "very_hungry">>
<<else>>
<<set $survival.hungerState to "starving">>
<</if>>
<</widget>>
<<widget "getFatigueState">>
<<if $journey.fatigue < setup.survival.fatigue.fresh>>
<<set $survival.fatigueState to "fresh">>
<<elseif $journey.fatigue < setup.survival.fatigue.tired>>
<<set $survival.fatigueState to "tired">>
<<elseif $journey.fatigue < setup.survival.fatigue.fatigued>>
<<set $survival.fatigueState to "fatigued">>
<<elseif $journey.fatigue < 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 $journey.fatigue >= 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 "journey.fatigue" -5>>
<</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 + 15)>>
<</if>>
<</widget>>
<<widget "shortRest">>
<<set _restHours to _args[0] || 2>>
<<advanceTime _restHours>>
<<clampStat "journey.fatigue" (-(_restHours * 10))>>
<<set $journey.hoursSinceRest to 0>>
<</widget>>
<<widget "campRest">>
<<set _quality to _args[0] || "none">>
<<set _recovery to setup.survival.campRecovery[_quality] || setup.survival.campRecovery.none>>
<<set _hoursToMorning to 0>>
<<switch $time.phase>>
<<case "morning">><<set _hoursToMorning to 24>>
<<case "afternoon">><<set _hoursToMorning to 18>>
<<case "evening">><<set _hoursToMorning to 12>>
<<case "night">><<set _hoursToMorning to 6>>
<<case "dawn">><<set _hoursToMorning to 24>>
<</switch>>
<<advanceTime _hoursToMorning>>
<<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 _negFatigueRecovery to -_recovery.fatigue>>
<<clampStat "journey.fatigue" _negFatigueRecovery>>
<<set $journey.hoursSinceRest to 0>>
<<set $journey.campedTonight to true>>
<<set $player.health to Math.min($player.maxHealth, $player.health + 15)>>
<<getJourneyCompanion>>
<<if _gc_companion>>
<<set _gc_companion.health to Math.min(_gc_companion.maxHealth, _gc_companion.health + 15)>>
<</if>>
<<clampStat "player.hunger" -10>>
<<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 <<if $survival.hungerState !== 'satisfied'>>warning<</if>>">
<<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 <<if $survival.fatigueState !== 'fresh'>>warning<</if>>">
<<icon "sleep">>
<<switch $survival.fatigueState>>
<<case "fresh">>Rested
<<case "tired">>Tired
<<case "fatigued">>Fatigued
<<case "exhausted">>Exhausted
<<case "collapsing">>Collapsing!
<</switch>>
</div>
</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 _eventRoll to random(1, 100)>>
<<if $journey.crisisCount >= 2 && _eventRoll <= 20 && $journey.fatigue >= 90 && _hasCompanion>>
<<goto "Journey_Survival_CollapseFound">>
<<elseif $journey.crisisCount >= 3 && _eventRoll <= 30 && $survival.crisisType === "starvation" && _hasCompanion>>
<<goto "Journey_Survival_RaiderToll">>
<<elseif _eventRoll <= 12 && $player.hunger <= 20 && _hasCompanion>>
<<goto "Journey_Survival_DeliriumTouch">>
<<elseif $journey.crisisCount >= 4 && _eventRoll <= 25 && _hasCompanion && _gc_companion && _gc_companion.trust >= 50>>
<<goto "Journey_Survival_KiraOffer">>
<</if>>
<<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 $journey.fatigue >= 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">You cannot continue without rest.</p>
<<case "dehydration">>
<h2><<icon "water">> Severe Dehydration</h2>
<p>Your throat is raw. Your lips are cracked. Every step feels like wading through mud.</p>
<<if _hallucinating>>
<p class="hallucination">You hear water. A stream, trickling somewhere nearby. You turn toward it—but there's nothing. Just more trees and tangled undergrowth. The sound fades like a whisper.</p>
<</if>>
<<if _hasCompanion>>
<<set _reactions to setup.survivalReactions.dehydration[_reactionTier]>>
<<set _reaction to _reactions[random(0, _reactions.length - 1)]>>
<<say "Kira" _reaction>>
<<if _reactionTier === "intimate" && _gc_companion && _gc_companion.affection >= 60>>
<p>She cups your face, her own cracked lips pressing briefly to your forehead.</p>
<<say "Kira" "Stay with me. Please.">>
<</if>>
<</if>>
<p class="warning">You're losing health from dehydration. Find water immediately.</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", "stimpack")>>
<<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>>
<<elseif $survival.crisisType === "dehydration">>
<<if UInv.BagHasItem("player", "water") || UInv.BagHasItem("player", "canteen")>>
<<vchoice "Drink water" "Journey_Survival_Drink" "action" "water">>
<</if>>
<<vchoice "Search for water source" "Journey_Survival_SearchWater" "action" "search">>
<<vchoice "Push on despite thirst" "Journey_Tick" "action" "forward">>
<<if $journey.crisisCount >= 3>>
<<vchoice "Desperate measures..." "Journey_Survival_DesperateMeasures" "action" "broken-heart">>
<</if>>
<<elseif $survival.crisisType === "starvation">>
<<if UInv.BagHasItem("player", "ration") || UInv.BagHasItem("player", "food")>>
<<vchoice "Eat food" "Journey_Survival_Eat" "action" "food">>
<</if>>
<<vchoice "Search for food" "Journey_Survival_SearchFood" "action" "search">>
<<vchoice "Push on despite hunger" "Journey_Tick" "action" "forward">>
<<if $journey.crisisCount >= 3>>
<<vchoice "Desperate measures..." "Journey_Survival_DesperateMeasures" "action" "broken-heart">>
<</if>>
<</if>>
</div><<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", "stimpack", 1)>>
<<clampStat "journey.fatigue" (-setup.travelConfig.fatigueRecovery.stimpack)>>
<<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>>
<<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 + 15)>>
<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">>
<<vchoice "Push on" "Journey_Tick" "action" "forward">>
</div>
<</if>><<set _roll to random(1, 100)>>
<<setBackground "reclaimed-travel">>
<<canTriggerCompanionEvent>>
<h2><<icon "search">> Foraging</h2>
<<advanceTime 1>>
<<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>>
<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">>
<<vchoice "Push on" "Journey_Tick" "action" "forward">>
</div>
<</if>><<setBackground "reclaimed-travel">>
<<getJourneyCompanion>>
<<set _cfg to setup.travelConfig.fatigueRecovery>>
<<set $journey.fatigue to Math.max(_cfg.kiraSupportMinFatigue, $journey.fatigue - _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 _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>
<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">
<<vchoice "Focus... push through" "Journey_Tick" "action" "forward">>
<<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 $survival.crisisType === "dehydration">>
<<if _cte_canTrigger && _gc_companion && _gc_companion.trust >= 40>>
<<vchoice "Ask Kira if she has any water" "Journey_Survival_AskKiraWater" "companion" "water">>
<</if>>
<<vchoice "Keep searching..." "Journey_Survival_SearchWater" "action" "search">>
<<elseif $survival.crisisType === "starvation">>
<<if _cte_canTrigger && _gc_companion && _gc_companion.trust >= 40>>
<<vchoice "Ask Kira to share her rations" "Journey_Survival_AskKiraFood" "companion" "food">>
<</if>>
<<vchoice "Keep foraging..." "Journey_Survival_SearchFood" "action" "search">>
<</if>>
<<vchoice "Endure it" "Journey_Tick" "action" "forward">>
</div><<setBackground "reclaimed-travel">>
<h2><<icon "water">> Kira's Help</h2>
<<if $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 + 15)>>
<<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 + 15)>>
<<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 + 15)>>
<</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 "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.">>
<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.">>
<p>But the way her hands linger as she presses against you says otherwise.</p>
<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>>
<<clampStat "journey.fatigue" (-setup.travelConfig.fatigueRecovery.kiraWarmthClose)>>
<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.">>
<<clampStat "journey.fatigue" (-setup.travelConfig.fatigueRecovery.kiraWarmthDistant)>>
<div class="choice-container">
<<vchoice "Rest" "Journey_Morning" "action" "sleep">>
</div>
<</if>><<setBackground "camp-night">>
<p>You hold each other through the night, skin against skin, sharing what warmth you have. Nothing more.</p>
<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>
<<clampStat "journey.fatigue" (-setup.travelConfig.fatigueRecovery.kiraWarmthOnly)>>
<<addTrust "kira" 1>>
<<addAffection "kira" 1>>
<div class="choice-container">
<<vchoice "Sleep" "Journey_Morning" "action" "sleep">>
</div><<setBackground "camp-night">>
<p>The cold becomes an excuse. Then the excuse becomes unnecessary.</p>
<<say "Kira" "I... yes. Please.">>
<p>What starts as shared warmth becomes something more. Desperate. Hungry. Two people clinging to each other against the void of the Reclaimed.</p>
<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>
<<clampStat "journey.fatigue" (-setup.travelConfig.fatigueRecovery.kiraWarmthIntimate)>>
<<addAffection "kira" 1>>
<<clampStat "companions[0].lust" (-30)>>
<<clampStat "player.lust" (-30)>>
<<if $companions[0].romanceStage < 5>>
<<set $companions[0].romanceStage++>>
<</if>>
<div class="choice-container">
<<vchoice "Sleep tangled together" "Journey_Morning" "action" "sleep">>
</div><<setBackground "reclaimed-travel">>
<<set _numRaiders to random(2, 3)>>
<<set _raiderGender to either("male", "female", "mixed")>>
<h2><<icon "danger">> Raider Checkpoint</h2>
<p>They emerge from the rocks like ghosts. <<print _numRaiders>> raiders, armed and blocking your path.</p>
<<if _raiderGender === "male">>
<p>All men. Their eyes rake over Kira's body before anything else.</p>
<<elseif _raiderGender === "female">>
<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.">>
<<say $player.name "We don't have much.">>
<p>The leader looks at your depleted supplies. At your exhausted state. At Kira.</p>
<<if _raiderGender === "male" || _raiderGender === "mixed">>
<<say "Raider" "Your girl's got something we want.">>
<<if $companions[0]>>
<<say "Kira" "Fuck off.">>
<<say "Raider" "Feisty. That'll make it more fun.">>
<</if>>
<<else>>
<<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.">>
<</if>>
<p class="warning">You're too weak to fight. They know it.</p>
<div class="choice-container">
<<if $survival.crisisType === "starvation" || $survival.crisisType === "dehydration">>
<<if _raiderGender === "male" || _raiderGender === "mixed">>
<<if $companions[0] && $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>>
<<else>>
<<vchoice "Agree to their terms" "Journey_Survival_RaiderToll_PlayerUsed" "intimate" "submission">>
<</if>>
<</if>>
<<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">>
<p>You look at Kira. She reads your expression instantly.</p>
<<if $companions[0].trust >= 60>>
<p>Her jaw tightens. Something passes between you—understanding born of shared desperation.</p>
<<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>
<<say "Kira" "But he watches. And if any of you try anything after—I'll gut you in your sleep.">>
<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?">>
<p>She looks at you with disbelief. Betrayal.</p>
<<say "Kira" "You'd let them...?">>
<<set $companions[0].trust -= 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>>
<p>They make her kneel in the dirt.</p>
<<say "Raider" "Boyfriend can watch. Make sure she does it right.">>
<p>Kira looks at you once—her eyes unreadable—then turns to the first raider.</p>
<p class="explicit">She takes him in her mouth without being told. Efficient. Detached. Like she's done this before.</p>
<<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>>
<p class="internal-thought">She's doing this for both of you. Because you couldn't protect her.</p>
<</if>>
<p class="explicit">The first one finishes in her mouth. She swallows without hesitation, then moves to the next.</p>
<<say "Kira" "...">>
<p>She doesn't look at you. Her hands work mechanically. Mouth, hands, whatever they want.</p>
<p class="explicit">By the time she's done, cum drips from her chin. Her knees are scraped raw from the rough ground.</p>
<<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 UInv.AddItem("player", "ration", 2)>>
<<run UInv.AddItem("player", "water", 2)>>
<<set $companions[0].submission += 5>>
<<set $companions[0].trust -= 1>>
<p>Kira wipes her mouth and stands. She doesn't look at you.</p>
<<say "Kira" "Don't. Just... don't.">>
<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]>>
<p>Kira's head whips toward you.</p>
<<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>
<p class="explicit">Muffled moans. The slap of flesh. Someone grunting.</p>
<<say "Raider" "She's tighter than she looks!">>
<p>You could intervene. You don't.</p>
<<clampStat "player.lust" 30>>
<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...">>
<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 UInv.AddItem("player", "ration", 3)>>
<<run UInv.AddItem("player", "water", 2)>>
<p>Kira stumbles out. Her clothes are torn. Cum leaks down her thighs.</p>
<p>She doesn't say anything. Just walks past you.</p>
<<set $companions[0].trust -= 6>>
<<set $companions[0].affection -= 4>>
<<set $companions[0].submission += 15>>
<p class="guilt">You traded her like currency. And she'll never forget it.</p>
<div class="choice-container">
<<vchoice "Follow her" "Journey_Tick" "action" "forward">>
</div><<setBackground "reclaimed-travel">>
<<set $flags.playerPaidToll to true>>
<p>You kneel in the dirt. The female raiders circle you like predators.</p>
<<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 $companions[0]>>
<p>Kira watches, her expression unreadable.</p>
<<say "Kira" "...">>
<</if>>
<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>
<<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 UInv.AddItem("player", "ration", 2)>>
<<run UInv.AddItem("player", "water", 2)>>
<<set $player.lust to 20>>
<<if $companions[0]>>
<<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. Dehydrated. But you won't give them what they want.</p>
<<say $player.name "We'll take our chances.">>
<<set _fightRoll to random(1, 100)>>
<<if _fightRoll <= 20>>
<p>Desperation makes you dangerous. You catch them off-guard.</p>
<<if $companions[0]>>
<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>
<<say "Kira" "Holy shit. We actually...">>
<p>You find a small cache on the bodies.</p>
<<run UInv.AddItem("player", "ration", 1)>>
<<set $player.hunger to Math.min($player.maxHunger, $player.hunger + 20)>>
<div class="choice-container">
<<vchoice "Keep moving" "Journey_Tick" "action" "forward">>
</div>
<<else>>
<p>They beat you down in seconds. Too weak to fight.</p>
<<clampStat "player.health" (-15) 0 100>>
<<if $companions[0]>>
<<clampStat "companions[0].health" (-10) 0 100>>
<</if>>
<p>They take what little you have and leave you bleeding in the dirt.</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. Kira follows.</p>
<p>Somehow, you lose them in the ruins. Luck, nothing more.</p>
<<set $journey.fatigue += 20>>
<<say "Kira" "That was... too close.">>
<div class="choice-container">
<<vchoice "Keep moving" "Journey_Tick" "action" "forward">>
</div>
<<else>>
<p>You try to run. They catch you in three steps.</p>
<<say "Raider" "Wrong choice.">>
<p>They beat you both down. Take everything.</p>
<<clampStat "player.health" (-20) 0 100>>
<<if $companions[0]>>
<<clampStat "companions[0].health" (-15) 0 100>>
<</if>>
<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>>
<<goto "Journey_Survival_RaiderToll_Fight">><<setBackground "reclaimed-travel">>
<<set $flags.forcedKiraToPayToll to true>>
<<addCorruption 15>>
<<say $player.name "I'm sorry. We need the supplies.">>
<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!"`>>
<p>You stand there.</p>
<p class="explicit">They bend her over a rusted car hood. Tear her pants down. She screams when the first one pushes inside.</p>
<<say "Raider" "Fight all you want, bitch. Makes it better.">>
<p>You watch. You tell yourself it's necessary. That this is survival.</p>
<p class="explicit">They use her roughly. One after another. She stops screaming eventually. Just takes it, face pressed against cold metal.</p>
<<clampStat "player.lust" 20>>
<<set $player.hunger to Math.min($player.maxHunger, $player.hunger + 60)>>
<<set $journey.hoursSinceFood to 0>>
<<run UInv.AddItem("player", "ration", 3)>>
<<run UInv.AddItem("player", "water", 3)>>
<p>When they're done, they toss the supplies at your feet.</p>
<<say "Raider" "Worth every cap. Thanks for the gift.">>
<p>Kira slides off the hood. Her legs don't quite work right.</p>
<<set $companions[0].trust -= 8>>
<<set $companions[0].affection -= 6>>
<<set $companions[0].submission += 20>>
<p>She won't look at you. Won't speak to you.</p>
<p class="guilt">You broke something that might never heal.</p>
<div class="choice-container">
<<vchoice "Keep moving" "Journey_Tick" "action" "forward">>
</div><<setBackground "reclaimed-travel">>
<<set $flags.collapseEvent to true>>
<h2><<icon "danger">> Collapse</h2>
<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>
<<advanceTime 2>>
<p>Voices. Footsteps. Someone found you.</p>
<<set _finderType to either("scavengers", "raiders", "travelers")>>
<<if _finderType === "scavengers">>
<p>Two scavengers, male and female, stand over you.</p>
<<say "Scavenger" "Well, well. What do we have here?">>
<<say "Scavenger F" "They're half-dead. Should we help them?">>
<<say "Scavenger" "Help costs. What've they got?">>
<p>They search your packs. Find almost nothing.</p>
<<say "Scavenger" "Nothing worth shit.">>
<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>
<<elseif _finderType === "raiders">>
<p>Raiders. Three of them. They prod you with boots.</p>
<<say "Raider" "Still breathing. Barely.">>
<<say "Raider 2" "The girl too. Could have some fun before they die.">>
<div class="choice-container">
<<if $extremeContent.cnc>>
<<vchoice "Stay still... see what happens" "Journey_Survival_CollapseFound_RaiderUse" "intimate" "search">>
<</if>>
<<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 $companions[0]>>
<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.">>
<p class="explicit">He spreads her legs and pushes inside. Kira makes a small sound—not quite conscious, not quite asleep.</p>
<<clampStat "player.lust" 30>>
<p>You could stop this. You don't.</p>
<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>
<<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...">>
<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!">>
<p>She's shaking. Tears cut tracks through the dirt on her face.</p>
<<set $companions[0].trust -= 5>>
<<set $companions[0].affection -= 4>>
<<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>
<div class="choice-container">
<<vchoice "Follow her" "Journey_Tick" "action" "forward">>
</div><<setBackground "reclaimed-travel">>
<<set $flags.raidersUsedBoth to true>>
<<addCorruption 5>>
<p>You can't fight. Can barely breathe. So you lie still.</p>
<<say "Raider" "Dibs on the girl.">>
<<say "Raider 2" "Fine. I'll take the guy.">>
<p>Wait. What?</p>
<p class="explicit">Rough hands flip you onto your stomach. Someone yanks your pants down.</p>
<<say "Raider 2" "Been a while since I had a tight ass.">>
<p>You hear Kira being handled nearby. Her weak protests.</p>
<p class="explicit">Pain. The raider pushes inside you without prep, without mercy.</p>
<<say $player.name "Ghhk—!">>
<p class="explicit">They use you both. Kira on her back being fucked. You face-down being taken from behind. The sounds of flesh and grunting fill the empty Reclaimed.</p>
<<clampStat "player.health" (-5) 0 100>>
<<clampStat "companions[0].health" (-5) 0 100>>
<p class="explicit">When they finish, they leave you both leaking and broken in the dirt.</p>
<<say "Raider" "Thanks for the fuck. Good luck surviving.">>
<p>They're gone. You and Kira lie there, too exhausted to move, too ashamed to speak.</p>
<p>Eventually, you help each other up. Neither mentions what happened.</p>
<<addTrust "kira" 1>>
<div class="choice-container">
<<vchoice "Continue in silence" "Journey_Tick" "action" "forward">>
</div><<setBackground "reclaimed-travel">>
<<say $player.name "Wait... we can pay. We have...">>
<p>You force yourself to speak despite your parched throat.</p>
<<set _negotiateRoll to random(1, 100) + Math.floor(($player.charm || 10) / 3)>>
<<if _negotiateRoll >= 50>>
<p>The scavengers exchange glances.</p>
<<say "Scavenger F" "They're desperate. Might be useful later. Let's just take their stuff and go.">>
<<say "Scavenger" "Fine.">>
<p>They take what little you have and leave. You're alive. Barely.</p>
<<say "Kira" "...that could've been worse.">>
<div class="choice-container">
<<vchoice "Keep moving" "Journey_Tick" "action" "forward">>
</div>
<<else>>
<<say "Scavenger" "You've got nothing we want. Except...">>
<p>His eyes move to Kira again.</p>
<<goto "Journey_Survival_CollapseFound_Watch">>
<</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.">>
<p>They take everything and leave you broken in the dust.</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 caps. You have none.</p>
<<say "Trader" "No caps, no deal. Simple as that.">>
<p>Kira pulls you aside, out of earshot.</p>
<<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 UInv.AddItem("player", "ration", 4)>>
<<run UInv.AddItem("player", "water", 3)>>
<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.">>
<p>Something shifts in her expression. Hurt? Arousal? Both?</p>
<<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>
<p class="explicit">Kira kneels. Takes out the trader's cock. Starts working him with practiced efficiency.</p>
<<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>
<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>
<<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 UInv.AddItem("player", "ration", 4)>>
<<run UInv.AddItem("player", "water", 3)>>
<p>Outside, Kira wipes her mouth.</p>
<<say "Kira" "Happy now?">>
<<set $companions[0].trust -= 1>>
<<set $companions[0].submission += 8>>
<<set $companions[0].exhibitionism += 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>>
<h2><<icon "eye">> Delirium</h2>
<p>The heat. The thirst. Everything blurs together.</p>
<p>You're sitting against a rock. Kira is beside you—or is she? Hard to tell what's real anymore.</p>
<p class="hallucination">She's touching you. Her hand on your thigh. Moving higher.</p>
<<say "Kira" "It's okay... I want to...">>
<p>Is this real? Her voice sounds distant, echoey.</p>
<p class="hallucination">Her lips on your neck. Her hand finding your cock through your pants.</p>
<<clampStat "player.lust" 20>>
<<if $player.hunger <= 15 || $journey.fatigue >= 95>>
<p class="warning">You're too far gone to know what's real.</p>
<div class="choice-container">
<<vchoice "Give in to the hallucination" "Journey_Survival_DeliriumTouch_GiveIn" "intimate" "high-arousal">>
<<vchoice "Try to focus... is this real?" "Journey_Survival_DeliriumTouch_Focus" "action" "eye">>
</div>
<<else>>
<p>Your head clears slightly. Kira is sitting nearby, but not touching you.</p>
<<say "Kira" "Hey... you okay? You were mumbling.">>
<p>Hallucination. Just a hallucination.</p>
<<clampStat "player.lust" 10>>
<div class="choice-container">
<<vchoice "\"Fine. Just... seeing things.\"" "Journey_Tick" "action" "forward">>
</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...">>
<p class="explicit">You pull her into your lap. Push inside her. She's warm and wet and perfect.</p>
<p class="hallucination">This is what she wants. What you both need. Just survival instinct. Nothing wrong with it.</p>
<<clampStat "player.lust" (-40)>>
<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">>
<p>You squeeze your eyes shut. Open them. Force clarity.</p>
<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">>
<<vchoice "Push on" "Journey_Tick" "action" "forward">>
</div><<setBackground "camp-night">>
<h2><<icon "partner">> Breaking Point</h2>
<p>Night camp. You're both at the end of your rope.</p>
<p>Kira sits across from you, staring into the small fire. Then, suddenly—she breaks.</p>
<<say "Kira" "I can't do this anymore.">>
<p>Tears stream down her face. Her composure cracks completely.</p>
<<say "Kira" "Every day it's just... fight, starve, almost die. What's the point?">>
<<if $companions[0].trust >= 60>>
<p>You move to her side. She doesn't pull away.</p>
<<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 "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 "journey.fatigue" -20>>
<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 "camp-night">>
<p>You cup her face. Wipe her tears with your thumb.</p>
<p>Then you kiss her.</p>
<p>She freezes for a moment—then melts into it. Desperate. Hungry.</p>
<<say "Kira" "Please... I need...">>
<p>She doesn't finish. Just pulls you closer.</p>
<<if $companions[0].romanceStage >= 3>>
<<goto "Journey_Survival_BreakdownComfort_Intimate">>
<<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">
<<vchoice "Hold her until morning" "Journey_Morning" "action" "sleep">>
</div>
<</if>><<setBackground "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.">>
<p class="explicit">You make love by firelight. Not the desperate rutting of survival—something gentler. More meaningful.</p>
<p>She clings to you like you're the only real thing in the world.</p>
<<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)>>
<<clampStat "journey.fatigue" -40>>
<<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 "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>
<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>
<<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)>>
<<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 "warning">> Kira Collapses</h2>
<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>>
<<set $journey.paused to true>>
<p class="system-info"><<icon "warning">> Kira has collapsed from exhaustion. You must rest before continuing.</p>
<div class="choice-container">
<<vchoice "Set up camp immediately" "Journey_Camp_Setup" "action" "tent">>
</div><<setBackground "reclaimed-travel">>
<<set $journey.active to false>>
<h2><<icon "death">> Darkness Takes You</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>
<<default>>
<p>The Reclaimed claims another victim. You fall, and the darkness swallows you whole.</p>
<</switch>>
<<if $companions[0]>>
<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.ClearBag("player")>>
<<set $clothing.player.top to 0>>
<<set $clothing.player.bottom to 0>>
<<set $clothing.player.titsExposed to true>>
<<set $clothing.player.pussyExposed to true>>
<<set $player.health to 5>>
<<set $player.hunger to 15>>
<<set $journey.hoursSinceFood to 12>>
<<set $journey.fatigue to 70>>
<<if !$flags.deathCount>><<set $flags.deathCount to 0>><</if>>
<<set $flags.deathCount++>>
<<set $flags.kiraMissing to true>>
<<set $flags.kiraLocation to either("nearby_ruins", "raider_camp", "scavenger_den")>>
<<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>
<p>You open your eyes. Dust. Rock. A sky painted in shades of dying light.</p>
<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>
<li>Kira is nowhere to be seen.</li>
</ul>
<p class="warning">Your supplies, weapons, and clothing have been stolen.</p>
<<if $companions[0]>>
<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">
<<vchoice "Force yourself to stand" "Journey_Survival_Death_Search" "action" "strength">>
</div><<setBackground "reclaimed-evening">>
<h2><<icon "search">> Finding Your Bearings</h2>
<p>You stagger upright. Naked. Vulnerable. Alone.</p>
<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 20>>
<<set $clothing.player.pussyExposed 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>
<<goto "Journey_Survival_FindKira_Ruins">>
<<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>
<<goto "Journey_Survival_FindKira_Raiders">>
<<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>
<<goto "Journey_Survival_FindKira_Scavengers">>
<</switch>><<setBackground "reclaimed-ruins">>
<h2><<icon "danger">> The Ruins</h2>
<p>A lone scavenger stands over Kira. She's tied to a rusted pipe, arms above her head, clothes torn away.</p>
<p>He hasn't noticed you yet. Too focused on his prize.</p>
<<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 "raider-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>
<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 "interior-dark">>
<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 "raider-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>
<<goto "Journey_Survival_FindKira_Rescue">><<setBackground "raider-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.">>
<p class="explicit">He grabs her, forces her legs apart despite her struggling.</p>
<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 "raider-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>
<<goto "Journey_Survival_FindKira_Rescue">><<setBackground "raider-camp">>
<<set $flags.watchedKiraGangRape to true>>
<<addCorruption 20>>
<p>You stay hidden. Watch.</p>
<p class="explicit">They take turns with her. One after another. Kira fights at first, then stops. Just endures.</p>
<<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>
<<say "Kira" "...you... you were there?">>
<p>Her voice is hollow. Broken.</p>
<<say "Kira" "The whole time?">>
<<set $companions[0].trust -= 10>>
<<set $companions[0].affection -= 8>>
<<set $companions[0].submission += 25>>
<<goto "Journey_Survival_FindKira_Rescue_Dark">><<setBackground "raider-camp">>
<<set $flags.watchedKiraRaiderUse to true>>
<<addCorruption 15>>
<p>You wait. Watch the first raider finish with Kira.</p>
<p class="explicit">He grunts, thrusting hard, then pulls out. Cum drips down her thighs.</p>
<<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>
<p>Kira stares at you as you cut her bonds.</p>
<<say "Kira" "You... waited.">>
<p>It's not a question.</p>
<<set $companions[0].trust -= 4>>
<<goto "Journey_Survival_FindKira_Rescue">><<setBackground "interior-dark">>
<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>
<<goto "Journey_Survival_FindKira_Rescue">><<setBackground "interior-dark">>
<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>
<<goto "Journey_Survival_FindKira_Rescue">><<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>
<<goto "Journey_Survival_FindKira_Rescue">>
<<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.">>
<<goto "Journey_Survival_FindKira_Captured">>
<</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?!">>
<<goto "Journey_Survival_FindKira_Rescue">><<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>
<p class="explicit">The scavenger pushes Kira's legs apart. She struggles, but tied as she is, there's nothing she can do.</p>
<<say "Kira" "No—get OFF—">>
<p class="explicit">He enters her roughly. She screams—pain, rage, helplessness.</p>
<<clampStat "player.lust" 30>>
<p>You watch. Your cock hardens despite—or because of—everything.</p>
<p class="explicit">He fucks her against the pipe, grunting with each thrust. Kira's screams fade to whimpers, then to silence.</p>
<<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>
<p>Kira stares at you. Eyes wide. Cum still dripping down her thighs.</p>
<<say "Kira" "You... you were THERE?!">>
<p>She realizes. Horror and betrayal twist her features.</p>
<<say "Kira" "You WATCHED?!">>
<<set $companions[0].trust -= 8>>
<<set $companions[0].affection -= 6>>
<<goto "Journey_Survival_FindKira_Rescue_Dark">><<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>>
<<goto "Journey_Survival_FindKira_Rescue">><<setBackground "reclaimed-ruins">>
<h2><<icon "partner">> Reunion</h2>
<p>You cut her bonds. She falls into your arms, shaking.</p>
<<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 20>>
<<set $clothing.kira.bottom to 20>>
<<set $clothing.kira.titsExposed to false>>
<<set $clothing.kira.pussyExposed to false>>
<p>You search the scavenger's body. Find a knife, some scraps of food, a torn shirt.</p>
<<run UInv.AddItem("player", "combat knife", 1)>>
<<set $player.hunger to Math.min($player.maxHunger, $player.hunger + 20)>>
<<set $clothing.player.top to 25>>
<<set $clothing.player.titsExposed 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">>
<h2><<icon "partner">> Bitter Reunion</h2>
<p>You cut her bonds. She doesn't fall into your arms. She shoves you away.</p>
<<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>
<<set $flags.kiraMissing to false>>
<<set $companions[0].submission += 20>>
<<set $clothing.kira.top to 20>>
<<set $clothing.kira.bottom to 20>>
<<set $clothing.kira.titsExposed to false>>
<<set $clothing.kira.pussyExposed to false>>
<p>She wipes her face. Gets dressed in what scraps remain. Won't look at you.</p>
<<say "Kira" "Let's go. Before more show up.">>
<p>The silence between you is deafening.</p>
<<run UInv.AddItem("player", "combat knife", 1)>>
<<set $clothing.player.top to 25>>
<<set $clothing.player.titsExposed 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>
<p>He ties you up next to Kira. Both of you naked. Both helpless.</p>
<<say "Scavenger" "Two for one. My lucky day.">>
<p>He looks between you, deciding.</p>
<<say "Scavenger" "Tell you what. I'll let you choose. Her or you?">>
<<say $player.name "What?">>
<<say "Scavenger" "Someone's getting fucked. Pick.">>
<div class="choice-container">
<<vchoice "\"Me. Leave her alone.\"" "Journey_Survival_FindKira_Captured_Self" "action" "shield">>
<<vchoice "\"...her.\"" "Journey_Survival_FindKira_Captured_Her" "intimate" "corruption">>
<<vchoice "Stay silent" "Journey_Survival_FindKira_Captured_Silent" "action" "submission">>
</div><<setBackground "reclaimed-ruins">>
<<say $player.name "Me. Take me. Leave her alone.">>
<p>Kira's head snaps toward you.</p>
<<say "Kira" "No—you don't have to—">>
<<say "Scavenger" "Shut up. He made his choice.">>
<p class="explicit">He pushes you onto your stomach. You feel him position himself behind you.</p>
<<say "Scavenger" "Noble. Stupid, but noble.">>
<p class="explicit">Pain. He doesn't bother with prep. Just forces himself inside.</p>
<<clampStat "player.health" (-5) 0 100>>
<p>You bite down on a scream. Don't give him the satisfaction.</p>
<p>Through the haze of pain, you see Kira. Tears streaming down her face. But not looking away.</p>
<<say "Kira" "I'm here. I'm right here.">>
<p class="explicit">It seems to last forever. When he finishes and pulls out, you feel hollow. Used.</p>
<<say "Scavenger" "Not bad. Maybe I'll keep both of you.">>
<p>He wanders off to take a piss. His mistake.</p>
<p>Kira has been working at her bonds. She slips free.</p>
<<goto "Journey_Survival_FindKira_Escape">><<setBackground "reclaimed-ruins">>
<<addCorruption 15>>
<<set $flags.choseKiraForAbuse to true>>
<<say $player.name "...her.">>
<p>Kira's face goes white.</p>
<<say "Kira" "What?">>
<<say $player.name "I said her.">>
<p>The scavenger grins.</p>
<<say "Scavenger" "Cold. I like it.">>
<p class="explicit">He takes Kira while you watch. She screams. Cries. Calls your name.</p>
<p>You don't look away.</p>
<<set $companions[0].trust -= 7>>
<<set $companions[0].affection -= 5>>
<<set $companions[0].submission += 15>>
<<clampStat "player.lust" 25>>
<p>When he's done, Kira won't look at you. Won't speak.</p>
<<say "Scavenger" "Entertaining. Now what to do with you two...">>
<p>He wanders off, leaving you both tied. Kira is already working at her bonds, rage giving her strength.</p>
<<goto "Journey_Survival_FindKira_Escape">><<setBackground "reclaimed-ruins">>
<p>You say nothing.</p>
<<say "Scavenger" "No preference? Fine. Ladies first.">>
<p class="explicit">He takes Kira while you're forced to watch. She fights at first, then goes still. Enduring.</p>
<<say "Scavenger" "Now you.">>
<p class="explicit">He uses you too. Both of you. Takes his time.</p>
<<clampStat "player.health" (-3) 0 100>>
<p>When he finally finishes, he's tired. Careless. Wanders off without checking the bonds.</p>
<p>Kira has already worked herself free.</p>
<<set $companions[0].trust -= 2>>
<<set $companions[0].submission += 10>>
<<goto "Journey_Survival_FindKira_Escape">><<setBackground "reclaimed-ruins">>
<h2><<icon "run">> Escape</h2>
<p>Kira frees herself, then you. Silent. Efficient.</p>
<p>She picks up a rock. Moves toward where the scavenger went.</p>
<p>You hear a crack. A thud. She returns, blood on her hands.</p>
<<say "Kira" "He won't hurt anyone else.">>
<p>Her voice is flat. Dead.</p>
<<set $flags.kiraMissing to false>>
<<run UInv.AddItem("player", "combat knife", 1)>>
<<set $clothing.player.top to 25>>
<<set $clothing.player.bottom to 20>>
<<set $clothing.player.titsExposed to false>>
<<set $clothing.player.pussyExposed to false>>
<<set $clothing.kira.top to 20>>
<<set $clothing.kira.bottom to 20>>
<<set $clothing.kira.titsExposed to false>>
<<set $clothing.kira.pussyExposed to false>>
<<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>
<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>
<p>And you have a destination. The vault. Safety. Rebuild.</p>
<<if $flags.watchedKiraPostDeath || $flags.choseKiraForAbuse>>
<p>Kira walks ahead of you. Silent. A wall between you that wasn't there before.</p>
<p class="guilt">Some things can't be taken back.</p>
<<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>>
<<set $journey.destination to "vault">>
<<set $journey.active to false>>
<p>The vault is still far. But you'll make it. You have to.</p>
<div class="choice-container">
<<vchoice "Head back to the vault" "Vault_Hub" "action" "forward">>
</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>>
<</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>
<<if $companions && $companions[0]>>
<<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 !$companions || !$companions[0]>>
<<goto "Journey_Tick">>
<</if>>
<<set _exhib to $companions[0].exhibitionism || 0>>
<<if _exhib < 20>>
<<dialogue "Kira" "companion">>Damn it! My shirt...<</dialogue>>
<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>
<p>She crosses her arms tightly over her chest, face burning red.</p>
<<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>>
<p class="explicit">Her wet shirt clings to every curve. There's no hiding anything now - her full breasts are on display, dark nipples pressing against the soaked fabric.</p>
<p>She makes a half-hearted attempt to cover herself, then sighs and drops her arms.</p>
<<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>>
<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>
<p>She notices your stare and smirks, stretching her arms above her head. The motion lifts her breasts, making them even more prominent.</p>
<<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>>
<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>
<p>She runs her hands down her sides, smoothing the wet material against her skin. The motion is deliberate. Provocative.</p>
<<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 !$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": "exterior/lake_house_day",
"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",
"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] || "reclaimed-day/placeholder">>
<<run VaultUI.setBackground(_bgPath)>>
<<run (function() {
var currentLoc = State.variables.currentLocation || 'vault';
var currentNode = State.variables.worldMap.nodes[currentLoc];
var terrainTypes = State.variables.worldMap.terrainTypes;
State.variables.mapTravelTimes = {};
for (var nodeId in State.variables.worldMap.nodes) {
if (nodeId === currentLoc) continue;
var node = State.variables.worldMap.nodes[nodeId];
var travelTime = 2;
if (currentNode && node && Number.isFinite(currentNode.x) && Number.isFinite(node.x)) {
var dx = node.x - currentNode.x;
var dy = node.y - currentNode.y;
var visualDist = Math.sqrt(dx * dx + dy * dy);
travelTime = Math.max(1, Math.round(visualDist / setup.travelConfig.distance.unitsPerHour));
var destTerrain = node.terrain || 'reclaimed';
var terrainData = terrainTypes ? terrainTypes[destTerrain] : null;
if (terrainData && terrainData.speedModifier && terrainData.speedModifier !== 1.0) {
travelTime = Math.max(1, Math.round(travelTime / terrainData.speedModifier));
}
}
State.variables.mapTravelTimes[nodeId] = travelTime;
}
})()>>
<h2><<icon "map">> Beyond the Vault</h2>
<<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/placeholders/background.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" && $companions[0] && $companions[0].health < 20>>
<<set _travelBlocked to _playerCritical || _companionCritical>>
<<if _travelBlocked>>
<div class="map-warning critical">
<span class="warning-icon"><<icon "alert">></span>
<span class="warning-text">
<<if _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 resting before traveling.</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 _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 _isStoryLocked to false>>
<<set _storyLockReason to "">>
<<if _nodeId === "overgrown_ruins" && $flags.succubusFirstEncounter>>
<<set _isStoryLocked to true>>
<<set _storyLockReason to "Velith will summon you when ready">>
<</if>>
<<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);
})>>
<<for _dest range _destinations>>
<<if _dest.isRevealed>>
<div class="destination-option <<if _travelBlocked || _dest.isStoryLocked>>disabled<</if>>">
<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-<<print _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 _travelBlocked>>
<span class="travel-disabled">Too Injured</span>
<<else>>
<<capture _dest>>
<<link "Travel">>
<<startJourney _dest.id>>
<<goto "Journey_Start">>
<</link>>
<</capture>>
<</if>>
<</if>>
</div>
<<elseif _dest.node.type === "location">>
<div class="destination-option undiscovered">
<div class="dest-info">
<span class="dest-name">??? (Undiscovered)</span>
<span class="dest-stats">Explore to reveal</span>
</div>
</div>
<</if>>
<</for>>
</div>
<div class="choice-container">
<<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>><<set _cfg to setup.travelConfig.events.playerLooking>>
<<if $clothing.kira.titsExposed && $journey.exposure.companion.topExposedTurns >= _cfg.remarkMinTurns>>
<<if random(1, 100) <= _cfg.remarkChance>>
<<goto "Journey_Ambient_KiraTits_Remark_Scene">>
<</if>>
<</if>><<getJourneyCompanion>>
<<showEventMedia "travel_kira_tits_remark">>
<div class="travel-ambient-event">
<p class="narrator"><<randomLine "travel_kira_tits_remark" "notice">></p>
<p class="explicit"><<randomLine "travel_kira_tits_remark" "notice">></p>
<<set _line to randomLine("travel_kira_tits_remark", "player_remark")>>
<<say $player.name _line>>
<<set _line to randomLine("travel_kira_tits_remark", "kira_response")>>
<<say "Kira" _line>>
<p class="narrator"><<randomLine "travel_kira_tits_remark" "narrator">></p>
<<clampStat "player.lust" 5>>
<<set _gc_companion.lust += 8>>
<<addTension "kira" 5>>
<<relationChange "kira" "affection" 2>>
</div>
<<journeyEventReturn>><<set _cfg to setup.travelConfig.events.playerLooking>>
<<if $clothing.kira.titsExposed && $player.lust >= _cfg.staringMinLust>>
<<if random(1, 100) <= _cfg.staringChance>>
<<goto "Journey_Ambient_KiraTits_Staring_Scene">>
<</if>>
<</if>><<getJourneyCompanion>>
<<showEventMedia "travel_kira_tits_staring">>
<div class="travel-ambient-event">
<p class="explicit"><<randomLine "travel_kira_tits_staring" "cant_stop">></p>
<p class="narrator"><<randomLine "travel_kira_tits_staring" "cant_stop">></p>
<<set _line to randomLine("travel_kira_tits_staring", "she_notices")>>
<<say "Kira" _line>>
<<set _line to randomLine("travel_kira_tits_staring", "player_response")>>
<<say $player.name _line>>
<<if $clothing.player.dickExposed>>
<p class="explicit"><<randomLine "travel_kira_tits_staring" "cant_stop">></p>
<<set _line to randomLine("travel_kira_tits_staring", "she_notices")>>
<<say "Kira" _line>>
<<set _line to randomLine("travel_kira_tits_staring", "player_response")>>
<<say $player.name _line>>
<p class="narrator"><<randomLine "travel_kira_tits_staring" "kira_blush">></p>
<<set _gc_companion.lust += 12>>
<<else>>
<p class="narrator"><<randomLine "travel_kira_tits_staring" "cant_stop">></p>
<<set _line to randomLine("travel_kira_tits_staring", "she_notices")>>
<<say "Kira" _line>>
<<set _line to randomLine("travel_kira_tits_staring", "player_response")>>
<<say $player.name _line>>
<p class="narrator"><<randomLine "travel_kira_tits_staring" "kira_blush">></p>
<<set _gc_companion.lust += 10>>
<</if>>
<<clampStat "player.lust" 10>>
<<addTension "kira" 8>>
</div>
<<journeyEventReturn>><<if $clothing.kira.titsExposed && _gc_companion.tension >= 60>>
<<set _gropeRoll to random(1, 100)>>
<<if _gropeRoll <= 35>>
<<goto "Journey_Ambient_KiraTits_Grope_Option">>
<</if>>
<</if>><<getJourneyCompanion>>
<div class="travel-ambient-event">
<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>
</div><<getJourneyCompanion>>
<div class="travel-ambient-event">
<p class="narrator">Fuck it.</p>
<p class="explicit">You reach out and grab her tits with both hands. They're soft, warm, perfect in your palms.</p>
<<say "Kira" "Hey! What the— nngh...">>
<p class="explicit">You squeeze. Her nipples press against your palms. She gasps.</p>
<<say $player.name "Sorry. Couldn't help it.">>
<<say "Kira" "You— you can't just— ah—">>
<p class="explicit">You give them one more firm squeeze, thumbs brushing over her nipples. They're rock hard.</p>
<<if _gc_companion.lust >= 50>>
<p class="explicit">Kira's breathing hard now, her thighs pressing together. She's into it.</p>
<<say "Kira" "...okay. Okay, that's enough.">>
<<say $player.name "You sure?">>
<p class="explicit">You pinch her nipples lightly. She whimpers.</p>
<<say "Kira" "Fuck— yes— stop— we need to— we can't—">>
<p class="narrator">You let go. She stands there, panting, nipples even harder than before.</p>
<<say "Kira" "You're an asshole.">>
<<say $player.name "You liked it.">>
<<say "Kira" "...shut up.">>
<<set _gc_companion.lust += 15>>
<<addTension "kira" 5>>
<<relationChange "kira" "affection" 1>>
<<else>>
<p class="narrator">Kira shoves you back. Hard.</p>
<<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.">>
<p class="narrator">She's pissed. But you also notice her nipples are harder than before.</p>
<<set _gc_companion.lust += 8>>
<<addTension "kira" 10>>
<<relationChange "kira" "affection" -1>>
<</if>>
<<clampStat "player.lust" 12>>
</div>
<<journeyEventReturn>><<getJourneyCompanion>>
<div class="travel-ambient-event">
<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 exposed 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>>
<<set _gc_companion.lust += 5>>
<<relationChange "kira" "trust" 1>>
<<relationChange "kira" "affection" 1>>
</div>
<<journeyEventReturn>><<set _cfg to setup.travelConfig.events.playerLooking>>
<<if $clothing.kira.titsExposed && _gc_companion.lust >= _cfg.snapsMinLust>>
<<if random(1, 100) <= _cfg.snapsChance>>
<<goto "Journey_Ambient_KiraTits_Snaps_Scene">>
<</if>>
<</if>><<getJourneyCompanion>>
<div class="travel-ambient-event">
<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>
<<say "Kira" "Are you going to stare at my tits the entire fucking way back?!">>
<<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>>
<<set _gc_companion.lust += 18>>
<<addTension "kira" 15>>
<<set $flags.kiraTitsOutburst to true>>
</div>
<<journeyEventReturn>><<if $clothing.kira.assExposed && $player.lust >= 50>>
<<set _watchRoll to random(1, 100)>>
<<if _watchRoll <= 20>>
<<goto "Journey_Ambient_KiraAss_Watch_Scene">>
<</if>>
<</if>><<getJourneyCompanion>>
<<showEventMedia "travel_kira_ass_watch">>
<div class="travel-ambient-event">
<p class="explicit"><<randomLine "travel_kira_tits_remark" "notice">></p>
<p class="narrator"><<randomLine "travel_kira_tits_staring" "cant_stop">></p>
<p class="explicit"><<randomLine "travel_kira_tits_remark" "notice">></p>
<<if $clothing.kira.pussyExposed>>
<p class="explicit">Wait. You can already see everything. Her pussy lips peek out with each stride, 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 slightly as she walks. Is she... showing off?</p>
<<set _gc_companion.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.">>
<p class="narrator">She didn't turn around. How did she know?</p>
<<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>
<<set _gc_companion.lust += 8>>
<<addTension "kira" 7>>
<<clampStat "player.lust" 12>>
<</if>>
</div>
<<journeyEventReturn>><<if $clothing.kira.pussyExposed && $journey.exposure.companion.bottomExposedTurns >= 5>>
<<set _frictionRoll to random(1, 100)>>
<<if _frictionRoll <= 30>>
<<goto "Journey_Ambient_KiraPussy_Friction_Scene">>
<</if>>
<</if>><<getJourneyCompanion>>
<div class="travel-ambient-event">
<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 exposed 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 _gc_companion.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 as Kira's knees buckle, as she gasps and moans, as she cums from nothing but the friction of walking with her pussy exposed.</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>
<<set _gc_companion.lust to 40>>
<<set _gc_companion.tension -= 10>>
<<clampStat "player.lust" 20>>
<<set $flags.kiraFrictionOrgasm to true>>
<<else>>
<<set _gc_companion.lust += 15>>
<<clampStat "player.lust" 8>>
<</if>>
</div>
<<journeyEventReturn>><<if $clothing.player.dickExposed && $journey.exposure.player.turns >= 2>>
<<set _commentRoll to random(1, 100)>>
<<if _commentRoll <= 40>>
<<goto "Journey_Ambient_Kira_Comments_Scene">>
<</if>>
<</if>><<getJourneyCompanion>>
<<showEventMedia "travel_kira_comments_dick">>
<div class="travel-ambient-event">
<p class="narrator"><<randomLine "travel_kira_comments_dick" "notice">></p>
<<set _line to randomLine("travel_kira_comments_dick", "kira_comment")>>
<<say "Kira" _line>>
<<set _line to randomLine("travel_kira_comments_dick", "player_response")>>
<<say $player.name _line>>
<p class="narrator"><<randomLine "travel_kira_comments_dick" "tension_build">></p>
<<if _gc_companion.lust >= 50>>
<p class="narrator"><<randomLine "travel_kira_comments_dick" "notice">></p>
<<set _line to randomLine("travel_kira_comments_dick", "kira_comment")>>
<<say "Kira" _line>>
<<set _line to randomLine("travel_kira_comments_dick", "player_response")>>
<<say $player.name _line>>
<p class="explicit"><<randomLine "travel_kira_comments_dick" "tension_build">></p>
<<set _gc_companion.lust += 12>>
<<addTension "kira" 8>>
<<else>>
<<set _line to randomLine("travel_kira_comments_dick", "kira_comment")>>
<<say "Kira" _line>>
<<set _line to randomLine("travel_kira_comments_dick", "player_response")>>
<<say $player.name _line>>
<p class="narrator"><<randomLine "travel_kira_comments_dick" "notice">></p>
<<set _gc_companion.lust += 8>>
<<addTension "kira" 5>>
<</if>>
<<clampStat "player.lust" 10>>
</div>
<<journeyEventReturn>><<if $clothing.player.dickExposed && _gc_companion.lust >= 50>>
<<set _staringRoll to random(1, 100)>>
<<if _staringRoll <= 35>>
<<goto "Journey_Ambient_Kira_Staring_Scene">>
<</if>>
<</if>><<getJourneyCompanion>>
<div class="travel-ambient-event">
<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 unconsciously. 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>
<<set _gc_companion.lust += 15>>
<<addTension "kira" 12>>
<<clampStat "player.lust" 12>>
<<set $flags.kiraOfferedHelp to true>>
</div>
<<journeyEventReturn>><<if $clothing.player.dickExposed && _gc_companion.lust >= 50>>
<<set _offersRoll to random(1, 100)>>
<<if _offersRoll <= 25>>
<<goto "Journey_Ambient_Kira_OffersHelp_Scene">>
<</if>>
<</if>><<getJourneyCompanion>>
<<showEventMedia "travel_kira_offers_help">>
<div class="travel-ambient-event">
<p class="narrator"><<randomLine "travel_kira_offers_help" "stop">></p>
<p class="narrator"><<randomLine "travel_kira_comments_dick" "notice">></p>
<<set _line to randomLine("travel_kira_offers_help", "offer")>>
<<say "Kira" _line>>
<p class="narrator"><<randomLine "travel_kira_offers_help" "hesitation">></p>
<p class="explicit"><<randomLine "travel_kira_comments_dick" "tension_build">></p>
<<set _line to randomLine("travel_kira_offers_help", "hesitation")>>
<<say "Kira" _line>>
<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>
</div><<getJourneyCompanion>>
<div class="travel-ambient-event">
<<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 down a blowjob?">>
<<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.">>
<<set _gc_companion.lust += 10>>
<<addTension "kira" 15>>
<<clampStat "player.lust" 5>>
<<relationChange "kira" "affection" 1>>
<<set $flags.kiraRainCheck to true>>
</div>
<<journeyEventReturn>><<if $clothing.player.dickExposed && _gc_companion.lust >= 70 && _gc_companion.tension >= 70>>
<<set _initiativeRoll to random(1, 100)>>
<<if _initiativeRoll <= 35>>
<<goto "Journey_Ambient_Kira_TakesInitiative_Scene">>
<</if>>
<</if>><<getJourneyCompanion>>
<<showEventMedia "travel_kira_takes_initiative">>
<div class="travel-ambient-event">
<p class="narrator"><<randomLine "travel_kira_takes_initiative" "snap">></p>
<p class="explicit"><<randomLine "travel_kira_takes_initiative" "blowjob">></p>
<p class="explicit"><<randomLine "travel_kira_takes_initiative" "blowjob">></p>
<p class="explicit"><<randomLine "travel_kira_takes_initiative" "blowjob">></p>
<<set _line to randomLine("travel_kira_takes_initiative", "demands_more")>>
<<say "Kira" _line>>
<p class="explicit"><<randomLine "travel_kira_takes_initiative" "fucking">></p>
<<set _line to randomLine("travel_kira_takes_initiative", "finish")>>
<<say "Kira" _line>>
<<set $player.lust to 20>>
<<set _gc_companion.lust to 50>>
<<set _gc_companion.tension -= 20>>
<<relationChange "kira" "affection" 2>>
<<relationChange "kira" "trust" 1>>
<<set $flags.kiraTookInitiative to true>>
<div class="choice-container">
<<vchoice "Continue walking" $journey.returnPassage "action" "run">>
<<if _gc_companion.lust >= 50>>
<<vchoice "\"Your turn.\" — Go down on her" "Journey_Ambient_ReturnFavor" "intimate" "lips">>
<</if>>
</div>
</div><<getJourneyCompanion>>
<div class="travel-ambient-event">
<<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 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 arousal. She stares at you, panting.</p>
<<say "Kira" "...fuck.">>
<<say $player.name "Good?">>
<<say "Kira" "...yeah. Really fucking good.">>
<<set _gc_companion.lust to 30>>
<<set _gc_companion.tension to 20>>
<<relationChange "kira" "affection" 3>>
<<relationChange "kira" "trust" 2>>
<<set $flags.mutualOralTravel to true>>
</div>
<<journeyEventReturn>><<getJourneyCompanion>>
<<showEventMedia "travel_kira_handjob">>
<div class="travel-ambient-event">
<p class="explicit"><<randomLine "travel_kira_handjob" "start">></p>
<p class="explicit"><<randomLine "travel_kira_handjob" "during">></p>
<<set _line to randomLine("travel_kira_handjob", "during")>>
<<say "Kira" _line>>
<p class="explicit"><<randomLine "travel_kira_handjob" "during">></p>
<p class="explicit"><<randomLine "travel_kira_handjob" "climax">></p>
<<set _line to randomLine("travel_kira_handjob", "after")>>
<<say "Kira" _line>>
<<set $player.lust to 15>>
<<set _gc_companion.lust to 45>>
<<set _gc_companion.tension -= 15>>
<<relationChange "kira" "affection" 2>>
<<relationChange "kira" "trust" 1>>
<<set $flags.kiraHandjobTravel to true>>
</div>
<<journeyEventReturn>><<getJourneyCompanion>>
<<showEventMedia "travel_kira_blowjob">>
<div class="travel-ambient-event">
<p class="explicit"><<randomLine "travel_kira_blowjob" "start">></p>
<p class="explicit"><<randomLine "travel_kira_blowjob" "during">></p>
<p class="explicit"><<randomLine "travel_kira_blowjob" "during">></p>
<p class="narrator"><<randomLine "travel_kira_handjob" "during">></p>
<p class="explicit"><<randomLine "travel_kira_blowjob" "climax">></p>
<<set _line to randomLine("travel_kira_blowjob", "after")>>
<<say "Kira" _line>>
<p class="explicit"><<randomLine "travel_kira_comments_dick" "tension_build">></p>
<<set $player.lust to 10>>
<<set _gc_companion.lust to 65>>
<<set _gc_companion.tension -= 10>>
<<relationChange "kira" "affection" 2>>
<<relationChange "kira" "trust" 2>>
<<set $flags.kiraBlowjobTravel to true>>
</div>
<<journeyEventReturn>><<if $player.energy <= 10 && $clothing.player.dickExposed>>
<<set _restRoll to random(1, 100)>>
<<if _restRoll <= 60>>
<<goto "Journey_Ambient_ForcedRest_Scene">>
<</if>>
<</if>><<getJourneyCompanion>>
<<showEventMedia "travel_forced_rest">>
<div class="travel-ambient-event">
<p class="narrator"><<randomLine "travel_forced_rest" "collapse">></p>
<p class="narrator"><<randomLine "travel_forced_rest" "situation">></p>
<p class="explicit"><<randomLine "travel_forced_rest" "takes_him">></p>
<p class="explicit"><<randomLine "travel_forced_rest" "takes_him">></p>
<p class="explicit"><<randomLine "travel_forced_rest" "climax">></p>
<<set _line to randomLine("travel_forced_rest", "climax")>>
<<say "Kira" _line>>
<<set $player.lust to 5>>
<<set $player.energy to 30>>
<<set _gc_companion.lust to 25>>
<<set _gc_companion.tension to 20>>
<<relationChange "kira" "affection" 3>>
<<relationChange "kira" "trust" 2>>
<<set $flags.kiraForcedRestSex to true>>
</div>
<div class="choice-container">
<<link "Wake up and continue" $journey.returnPassage>><</link>>
</div><<if ($clothing.kira.titsExposed || $clothing.kira.pussyExposed) && $clothing.player.dickExposed && $player.lust >= 60 && _gc_companion.lust >= 60>>
<<set _mutualRoll to random(1, 100)>>
<<if _mutualRoll <= 30>>
<<goto "Journey_Ambient_MutualNeed_Scene">>
<</if>>
<</if>><<getJourneyCompanion>>
<<showEventMedia "travel_mutual_need">>
<div class="travel-ambient-event">
<p class="narrator"><<randomLine "travel_mutual_need" "breaking_point">></p>
<p class="explicit"><<randomLine "travel_mutual_need" "crash">></p>
<<set _line to randomLine("travel_mutual_need", "crash")>>
<<say "Kira" _line>>
<p class="explicit"><<randomLine "travel_mutual_need" "fucking">></p>
<<set _line to randomLine("travel_kira_takes_initiative", "fucking")>>
<<say "Kira" _line>>
<p class="explicit"><<randomLine "travel_mutual_need" "fucking">></p>
<p class="narrator"><<randomLine "travel_mutual_need" "aftermath">></p>
<<set $player.lust to 20>>
<<set _gc_companion.lust to 35>>
<<set _gc_companion.tension to 15>>
<<relationChange "kira" "affection" 3>>
<<relationChange "kira" "trust" 3>>
<<set $flags.mutualNeedSex to true>>
<<set _gc_companion.romanceStage to Math.max(_gc_companion.romanceStage, 2)>>
</div>
<<journeyEventReturn>><<widget "checkTravelAmbient">>
<<getJourneyCompanion>>
<<if !_gc_companion>><<return>><</if>>
<<set _ambientTriggered to false>>
<<set _pCfg to setup.travelConfig.events.playerLooking>>
<<set _kCfg to setup.travelConfig.events.kiraLooking>>
<<set _sCfg to setup.travelConfig.events.sexual>>
<<if $clothing.kira.titsExposed && !_ambientTriggered>>
<<if $journey.exposure.companion.topExposedTurns >= _pCfg.remarkMinTurns && random(1, 100) <= _pCfg.remarkChance && !$flags.kiraTitsRemarkDone>>
<<goto "Journey_Ambient_KiraTits_Remark_Scene">>
<<set _ambientTriggered to true>>
<</if>>
<<if !_ambientTriggered && $player.lust >= _pCfg.staringMinLust && random(1, 100) <= _pCfg.staringChance>>
<<goto "Journey_Ambient_KiraTits_Staring_Scene">>
<<set _ambientTriggered to true>>
<</if>>
<<if !_ambientTriggered && _gc_companion.tension >= _pCfg.gropeMinTension && random(1, 100) <= _pCfg.gropeChance>>
<<goto "Journey_Ambient_KiraTits_Grope_Option">>
<<set _ambientTriggered to true>>
<</if>>
<<if !_ambientTriggered && _gc_companion.lust >= _pCfg.snapsMinLust && random(1, 100) <= _pCfg.snapsChance>>
<<goto "Journey_Ambient_KiraTits_Snaps_Scene">>
<<set _ambientTriggered to true>>
<</if>>
<</if>>
<<if $clothing.kira.assExposed && !_ambientTriggered>>
<<if $player.lust >= _pCfg.assWatchMinLust && random(1, 100) <= _pCfg.assWatchChance>>
<<goto "Journey_Ambient_KiraAss_Watch_Scene">>
<<set _ambientTriggered to true>>
<</if>>
<</if>>
<<if $clothing.kira.pussyExposed && !_ambientTriggered>>
<<if $journey.exposure.companion.bottomExposedTurns >= _pCfg.pussyFrictionMinTurns && random(1, 100) <= _pCfg.pussyFrictionChance>>
<<goto "Journey_Ambient_KiraPussy_Friction_Scene">>
<<set _ambientTriggered to true>>
<</if>>
<</if>>
<<if $clothing.player.dickExposed && !_ambientTriggered>>
<<if $journey.exposure.player.turns >= _kCfg.commentsMinTurns && random(1, 100) <= _kCfg.commentsChance && !$flags.kiraCommentsDone>>
<<goto "Journey_Ambient_Kira_Comments_Scene">>
<<set _ambientTriggered to true>>
<</if>>
<<if !_ambientTriggered && _gc_companion.lust >= _kCfg.staringMinLust && random(1, 100) <= _kCfg.staringChance>>
<<goto "Journey_Ambient_Kira_Staring_Scene">>
<<set _ambientTriggered to true>>
<</if>>
<<if !_ambientTriggered && _gc_companion.lust >= _kCfg.offersHelpMinLust && random(1, 100) <= _kCfg.offersHelpChance>>
<<goto "Journey_Ambient_Kira_OffersHelp_Scene">>
<<set _ambientTriggered to true>>
<</if>>
<<if !_ambientTriggered && _gc_companion.lust >= _kCfg.initiativeMinLust && _gc_companion.tension >= _kCfg.initiativeMinTension && random(1, 100) <= _kCfg.initiativeChance>>
<<goto "Journey_Ambient_Kira_TakesInitiative_Scene">>
<<set _ambientTriggered to true>>
<</if>>
<</if>>
<<if !_ambientTriggered>>
<<if $player.energy <= _sCfg.forcedRestMaxEnergy && $clothing.player.dickExposed && random(1, 100) <= _sCfg.forcedRestChance>>
<<goto "Journey_Ambient_ForcedRest_Scene">>
<<set _ambientTriggered to true>>
<</if>>
<<if !_ambientTriggered && ($clothing.kira.titsExposed || $clothing.kira.pussyExposed) && $clothing.player.dickExposed && $player.lust >= _sCfg.mutualNeedMinLust && _gc_companion.lust >= _sCfg.mutualNeedMinLust && random(1, 100) <= _sCfg.mutualNeedChance>>
<<goto "Journey_Ambient_MutualNeed_Scene">>
<<set _ambientTriggered to true>>
<</if>>
<</if>>
<</widget>><<setBackground "reclaimed-ambush">>
<<showEventMedia "cnc_ambush_kira_grabbed">>
<h2>Ambush!</h2>
Movement. Too late to react.
<<if $journey.exposure.companion.naked || $journey.exposure.companion.exposed>>
<p class="explicit"><<randomLine "cnc_ambush_kira_grabbed" "grab">> <<randomLine "cnc_ambush_kira_grabbed" "grab">></p>
<<set _line to randomLine("cnc_ambush_kira_grabbed", "grab")>>
<<say "Raider" _line>>
<<set _line to 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 randomLine("cnc_ambush_kira_grabbed", "grab")>>
<<say "Raider" _line>>
<p class="explicit"><<randomLine "cnc_ambush_kira_grabbed" "forced">> <<randomLine "cnc_ambush_kira_grabbed" "grab">></p>
<<set _line to randomLine("cnc_ambush_kira_grabbed", "grab")>>
<<say "Raider" _line>>
<p class="explicit"><<randomLine "cnc_ambush_kira_grabbed" "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>
<<say "Scavenger" "Lucky for me. On your knees. Both of you. Now.">>
<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: $expeditionCompanion || 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",
returnPassage: "Travel_Ambush_Aftermath_Killed",
defeatPassage: "Combat_Defeat"
}>>
<h2>Fight!</h2>
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>
<div class="choice-container">
<<vchoice "Begin Combat" "Combat_Start" "action" "map">>
</div><<showEventMedia "cnc_ambush_watch">>
<<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 "cnc_ambush_watch" "watching">> <<randomLine "cnc_ambush_watch" "watching">></p>
<<else>>
<p class="narrator"><<randomLine "cnc_ambush_watch" "watching">> <<randomLine "cnc_ambush_watch" "watching">></p>
<</if>>
<p class="explicit"><<randomLine "cnc_ambush_kira_grabbed" "forced">> <<randomLine "cnc_ambush_kira_grabbed" "kira_struggle">></p>
<<set _line to randomLine("cnc_ambush_watch", "kira_used")>>
<<say "Kira" _line>>
<p class="explicit"><<randomLine "cnc_ambush_kira_grabbed" "forced">> <<randomLine "cnc_ambush_kira_grabbed" "reaction">></p>
<<set _line to randomLine("cnc_ambush_kira_grabbed", "reaction")>>
<<say "Raider" _line>>
<p class="explicit"><<randomLine "cnc_ambush_kira_grabbed" "forced">> <<randomLine "cnc_ambush_kira_grabbed" "reaction">></p>
<<set _line to randomLine("cnc_ambush_watch", "kira_used")>>
<<say "Kira" _line>>
<p class="explicit"><<randomLine "cnc_ambush_kira_grabbed" "forced">> <<randomLine "cnc_ambush_watch" "kira_used">></p>
<<set _line to randomLine("cnc_ambush_kira_grabbed", "reaction")>>
<<say "Raider" _line>>
<p class="explicit"><<randomLine "cnc_ambush_watch" "kira_used">> <<randomLine "cnc_ambush_watch" "watching">></p>
<p class="explicit"><<randomLine "cnc_ambush_kira_grabbed" "reaction">> <<randomLine "cnc_ambush_watch" "kira_used">></p>
<<set _line to randomLine("cnc_ambush_watch", "kira_used")>>
<<say "Kira" _line>>
<p class="explicit"><<randomLine "cnc_ambush_kira_grabbed" "reaction">> <<randomLine "cnc_ambush_kira_grabbed" "forced">></p>
<<set _line to randomLine("cnc_ambush_kira_grabbed", "reaction")>>
<<say "Raider" _line>>
<p class="explicit"><<randomLine "cnc_ambush_kira_grabbed" "forced">> <<randomLine "cnc_ambush_watch" "kira_used">></p>
<p class="explicit"><<randomLine "cnc_ambush_watch" "kira_used">> <<randomLine "cnc_ambush_kira_grabbed" "reaction">></p>
<p class="explicit"><<randomLine "cnc_ambush_watch" "finish">> <<randomLine "cnc_ambush_watch" "finish">></p>
<<set _line to randomLine("cnc_ambush_watch", "finish")>>
<<say "Raider" _line>>
<p class="explicit"><<randomLine "cnc_ambush_watch" "finish">></p>
<p class="explicit"><<randomLine "cnc_ambush_watch" "finish">> <<randomLine "cnc_ambush_watch" "finish">></p>
<<say "Kira" ".....">>
<p class="narrator"><<randomLine "cnc_ambush_watch" "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 -= 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>
<<say "Kira" "Don't... don't say anything.">>
<<say $player.name "I should have—">>
<<say "Kira" "I said don't.">>
<p class="explicit">Cum leaks down her thighs as she tries to cover herself. She can't meet your eyes.</p>
<<say "Kira" "Just... let's get back. Before someone else finds us.">>
<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">
<<vchoice "Continue to vault" "Vault_Arrival" "action" "map">>
</div><<addTrust "kira" 1>>
<<set $companions[0].lust to 35>>
<<say $player.name "Kira... are you okay?">>
<p>She laughs. It's a broken sound.</p>
<<say "Kira" "Do I fucking look okay?">>
<p class="explicit">She's sitting in the dirt, naked, covered in cum. 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>
<div class="choice-container">
<<vchoice "Continue to vault" "Vault_Arrival" "action" "map">>
</div><<set $flags.sloppy_seconds_kira to true>>
<<set $player.lust to 5>>
<<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>
<<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">
<<vchoice "Help her up and head back" "Vault_Arrival" "action" "map">>
</div><<addTrust "kira" 2>>
<<addAffection "kira" 1>>
<<addTension "kira" -5>>
<h2>Victory</h2>
<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>
<<if $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>>
<p>You loot the bodies quickly and continue toward the vault.</p>
<<addItem "scrap_metal" 2>>
<<addItem "dirty_water" 1>>
<div class="choice-container">
<<vchoice "Continue" "Travel_Safe" "action" "map">>
</div><<clampStat "player.lust" 15>>
<<clampStat "companions[0].lust" 20>>
<<set $flags.compliedCNC to true>>
<p>You both sink to your knees slowly. No point getting shot.</p>
<<say "Scavenger" "Smart. I like smart prey.">>
<p class="explicit">She circles you both, 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>
<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>
<<say "Kira" "What the fuck—">>
<<say "Scavenger" "Quiet. Or you're next.">>
<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>
<<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>>
<<set $companions[0].lust to 40>>
<<addTension "kira" 10>>
<div class="choice-container">
<<vchoice "Continue to vault" "Vault_Arrival" "action" "map">>
</div><<setBackground "reclaimed-road">>
<<showEventMedia "cnc_toll_demand">>
<h2>Toll Road</h2>
<p><<randomLine "cnc_toll_demand" "setup">> <<randomLine "cnc_toll_demand" "setup">></p>
<<set _line to randomLine("cnc_toll_demand", "setup")>>
<<say "Leader" _line>>
<<set _line to randomLine("cnc_toll_demand", "setup")>>
<<say $player.name _line>>
<p><<randomLine "cnc_toll_demand" "setup">></p>
<<if $journey.exposure.player.exposed>>
<<set _line to randomLine("cnc_toll_demand", "setup")>>
<<say "Leader" _line>>
<p class="explicit"><<randomLine "cnc_toll_demand" "setup">> <<randomLine "cnc_toll_demand" "setup">></p>
<<set _line to randomLine("cnc_toll_demand", "setup")>>
<<say "Leader" _line>>
<<set _line to randomLine("cnc_toll_demand", "threat")>>
<<say "Kira" _line>>
<<set _line to randomLine("cnc_toll_demand", "threat")>>
<<say "Leader" _line>>
<p><<randomLine "cnc_toll_demand" "threat">></p>
<div class="choice-container">
<<vchoice "Fight them" "Travel_Toll_Fight" "action" "attack">>
<<vchoice "Pay the toll" "Travel_Toll_Pay" "intimate" "shower">>
<<if $companions[0].lust >= 50>>
<<vchoice '"Kira can help pay the toll"' "Travel_Toll_Both" "intimate" "seduce">>
<</if>>
</div>
<<elseif $journey.exposure.companion.exposed>>
<<say "Leader" "Her. She'll pay for both of you.">>
<p class="explicit">She's pointing at Kira's exposed body.</p>
<<say "Kira" "Like hell I will.">>
<<say "Leader" "Then you don't pass. Simple.">>
<div class="choice-container">
<<vchoice "Fight them" "Travel_Toll_Fight" "action" "attack">>
<<vchoice "Let Kira pay (she'll hate you)" "Travel_Toll_Kira_Forced" "intimate" "corruption">>
<<if $clothing.player.dickExposed>>
<<vchoice "Offer yourself instead" "Travel_Toll_Pay" "intimate" "rapid-strikes">>
<</if>>
</div>
<<else>>
<<say "Leader" "You know the deal. Pay up, or find another way.">>
<<say $player.name "We don't have anything worth trading.">>
<<say "Leader" "Then find another route. Or pay another way.">>
<p class="explicit">Her eyes suggest exactly what "another way" means.</p>
<div class="choice-container">
<<vchoice "Fight them" "Travel_Toll_Fight" "action" "attack">>
<<vchoice "Find another route (longer journey)" "Travel_Detour" "action" "run">>
</div>
<</if>><<set $combat = {
active: true,
companionInCombat: $expeditionCompanion || null,
enemies: [
{
id: "bandit_1",
name: "Bandit Leader",
type: "bandit",
tier: "elite",
health: 70,
maxHealth: 70,
damage: 10,
dodge: 25,
armor: 2,
gender: "female",
lust: 0,
maxLust: 100,
lustResistance: 30,
aggression: 70,
loot: ["weapon", "scrap_metal"]
},
{
id: "bandit_2",
name: "Bandit",
type: "bandit",
tier: "standard",
health: 50,
maxHealth: 50,
damage: 8,
dodge: 20,
armor: 0,
gender: "female",
lust: 0,
maxLust: 100,
lustResistance: 20,
aggression: 60,
loot: ["ammo", "food"]
},
{
id: "bandit_3",
name: "Bandit",
type: "bandit",
tier: "standard",
health: 50,
maxHealth: 50,
damage: 8,
dodge: 20,
armor: 0,
gender: "female",
lust: 0,
maxLust: 100,
lustResistance: 20,
aggression: 60,
loot: ["scrap_cloth", "stimpak"]
}
],
turn: 0,
phase: "player",
returnPassage: "Travel_Toll_Aftermath",
defeatPassage: "Combat_Defeat"
}>>
<h2>Fight!</h2>
<p>You're not paying their damn toll.</p>
<<say "Leader" "Wrong choice, idiots.">>
<p>Weapons are drawn. This is going to be bloody.</p>
<div class="choice-container">
<<vchoice "Begin Combat" "Combat_Start" "action" "map">>
</div><<showEventMedia "cnc_toll_demand">>
<<set $flags.tollPayment to true>>
<<set $player.lust to 10>>
<<clampStat "companions[0].lust" 25>>
<<set $companions[0].jealousy += 15>>
<<addTension "kira" 10>>
<<set _line to randomLine("cnc_toll_demand", "threat")>>
<<say $player.name _line>>
<<set _line to randomLine("cnc_toll_demand", "threat")>>
<<say "Leader" _line>>
<p><<randomLine "cnc_toll_demand" "threat">></p>
<<set _line to randomLine("cnc_toll_demand", "used")>>
<<say "Leader" _line>>
<p class="explicit"><<randomLine "cnc_toll_demand" "used">> <<randomLine "cnc_toll_demand" "used">></p>
<<set _line to randomLine("cnc_toll_demand", "used")>>
<<say "Leader" _line>>
<p class="explicit"><<randomLine "cnc_toll_demand" "used">> <<randomLine "cnc_toll_demand" "used">></p>
<p class="explicit"><<randomLine "cnc_toll_demand" "used">> <<randomLine "cnc_toll_demand" "used">></p>
<<set _line to randomLine("cnc_toll_demand", "used")>>
<<say "Bandit" _line>>
<p class="explicit"><<randomLine "cnc_toll_demand" "used">> <<randomLine "cnc_toll_demand" "used">></p>
<<set _line to randomLine("cnc_toll_demand", "used")>>
<<say "Leader" _line>>
<p class="explicit"><<randomLine "cnc_toll_demand" "used">> <<randomLine "cnc_toll_demand" "used">></p>
<<say "Kira" "...">>
<p class="narrator"><<randomLine "cnc_toll_demand" "release">> <<randomLine "cnc_toll_demand" "release">></p>
<p class="explicit"><<randomLine "cnc_toll_demand" "used">> <<randomLine "cnc_toll_demand" "used">></p>
<<set _line to randomLine("cnc_toll_demand", "used")>>
<<say "Leader" _line>>
<p class="explicit"><<randomLine "cnc_toll_demand" "used">> <<randomLine "cnc_toll_demand" "used">></p>
<p class="explicit"><<randomLine "cnc_toll_demand" "used">> <<randomLine "cnc_toll_demand" "used">></p>
<p class="explicit"><<randomLine "cnc_toll_demand" "used">></p>
<<set _line to randomLine("cnc_toll_demand", "release")>>
<<say "Leader" _line>>
<p><<randomLine "cnc_toll_demand" "release">> <<randomLine "cnc_toll_demand" "release">></p>
<<if $companions[0].tension >= 40>>
<<say "Kira" "...you done?">>
<p class="narrator">Her voice is tight. She watched the whole thing.</p>
<p class="explicit">You can see her nipples hard through her torn clothes. Her thighs are pressed together.</p>
<<say "Kira" "Let's just go.">>
<</if>>
<div class="choice-container">
<<vchoice "Continue" "Travel_Safe" "action" "map">>
</div><<showEventMedia "cnc_toll_demand">>
<<set $flags.tollPaymentBoth to true>>
<<set $player.lust to 5>>
<<set $companions[0].lust to 30>>
<<addCorruption 5 "kira">>
<<addTension "kira" -10>>
<<say $player.name "Kira can help. Right, Kira?">>
<<say "Kira" "What?! I'm not—">>
<<set _line to randomLine("cnc_toll_demand", "threat")>>
<<say "Leader" _line>>
<p><<randomLine "cnc_toll_demand" "threat">></p>
<<say "Kira" `$player.name + ", I swear to fuck—"`>>
<<set _line to randomLine("cnc_toll_demand", "used")>>
<<say "Leader" _line>>
<p class="explicit"><<randomLine "cnc_group_both" "ambush">> <<randomLine "cnc_group_both" "both_used">></p>
<<set _line to randomLine("cnc_toll_demand", "used")>>
<<say "Leader" _line>>
<p class="explicit"><<randomLine "cnc_toll_demand" "used">> <<randomLine "cnc_group_both" "player_ridden">></p>
<<set _line to randomLine("cnc_toll_demand", "used")>>
<<say "Leader" _line>>
<p class="explicit"><<randomLine "cnc_toll_demand" "used">> <<randomLine "cnc_group_both" "player_ridden">></p>
<p class="explicit"><<randomLine "cnc_group_both" "both_used">></p>
<p class="explicit"><<randomLine "cnc_toll_demand" "used">> <<randomLine "cnc_group_both" "kira_triple">></p>
<<set _line to randomLine("cnc_group_both", "kira_triple")>>
<<say "Leader" _line>>
<p class="explicit"><<randomLine "cnc_group_both" "both_used">> <<randomLine "cnc_toll_demand" "release">></p>
<p class="explicit"><<randomLine "cnc_toll_demand" "used">> <<randomLine "cnc_group_both" "both_used">></p>
<p class="explicit"><<randomLine "cnc_group_both" "both_used">></p>
<<set _line to randomLine("cnc_toll_demand", "used")>>
<<say "Leader" _line>>
<p class="explicit"><<randomLine "cnc_group_both" "both_used">> <<randomLine "cnc_toll_demand" "release">></p>
<<say "Kira" "I... we shouldn't...">>
<p>The leader smacks Kira's ass hard.</p>
<<set _line to randomLine("cnc_toll_demand", "threat")>>
<<say "Leader" _line>>
<p class="explicit"><<randomLine "cnc_group_both" "both_used">> <<randomLine "cnc_group_both" "both_used">></p>
<<say "Kira" `"Oh fuck— " + $player.name + "— you're so— this is so wrong—"`>>
<p class="explicit"><<randomLine "cnc_group_both" "both_used">> <<randomLine "cnc_group_both" "both_used">></p>
<<say "Kira" "No— I can't— not like this— I'M CUMMING!">>
<p class="explicit"><<randomLine "cnc_group_both" "both_used">> <<randomLine "cnc_group_both" "both_used">></p>
<p class="explicit"><<randomLine "cnc_group_both" "both_used">> <<randomLine "cnc_toll_demand" "release">></p>
<<set _line to randomLine("cnc_toll_demand", "release")>>
<<say "Leader" _line>>
<p><<randomLine "cnc_toll_demand" "release">></p>
<<set _line to randomLine("cnc_group_both", "both_used")>>
<<say "Kira" _line>>
<<set _line to randomLine("cnc_group_both", "both_used")>>
<<say $player.name _line>>
<p class="narrator"><<randomLine "cnc_toll_demand" "release">> <<randomLine "cnc_toll_demand" "release">></p>
<div class="choice-container">
<<vchoice "Continue" "Travel_Safe" "action" "map">>
</div><<setBackground "reclaimed-ruins">>
<<showEventMedia "cnc_group_both">>
<h2>Surrounded!</h2>
<p><<randomLine "cnc_group_both" "ambush">> <<randomLine "cnc_group_both" "ambush">></p>
<<set _line to randomLine("cnc_group_both", "ambush")>>
<<say "Leader" _line>>
<p><<randomLine "cnc_group_both" "ambush">> <<randomLine "cnc_group_both" "ambush">></p>
<<say "Kira" "Fuck.">>
<<say $player.name "Yeah.">>
<p>You both drop your weapons.</p>
<<set _line to randomLine("cnc_group_both", "ambush")>>
<<say "Leader" _line>>
<<say "Kira" "What? No—">>
<p>A weapon cocks. The message is clear.</p>
<p class="explicit"><<randomLine "cnc_group_both" "ambush">> <<randomLine "cnc_group_both" "ambush">></p>
<<set _line to randomLine("cnc_group_both", "ambush")>>
<<say "Leader" _line>>
<<set _line to randomLine("cnc_group_both", "ambush")>>
<<say "Kira" _line>>
<<set _line to randomLine("cnc_group_both", "ambush")>>
<<say "Man" _line>>
<p class="explicit"><<randomLine "cnc_group_both" "ambush">></p>
<div class="choice-container">
<<vchoice "Continue" "Travel_Group_BothTaken" "action" "map">>
</div><<showEventMedia "cnc_group_both">>
<<set $flags.groupCNCBoth to true>>
<<set $player.lust to 5>>
<<set $player.energy to 20>>
<<set $companions[0].lust to 50>>
<<set $companions[0].energy to 15>>
<<addCorruption 10 "kira">>
<<addTension "kira" -20>>
<h2>Used</h2>
<p class="explicit"><<randomLine "cnc_group_both" "kira_triple">> <<randomLine "cnc_group_both" "kira_triple">></p>
<<set _line to randomLine("cnc_group_both", "kira_triple")>>
<<say "Man" _line>>
<p class="explicit"><<randomLine "cnc_group_both" "kira_triple">> <<randomLine "cnc_group_both" "kira_triple">></p>
<<set _line to randomLine("cnc_group_both", "kira_triple")>>
<<say "Kira" _line>>
<p class="explicit"><<randomLine "cnc_group_both" "kira_triple">> <<randomLine "cnc_group_both" "kira_triple">></p>
<<set _line to randomLine("cnc_group_both", "kira_triple")>>
<<say "Man" _line>>
<<set _line to randomLine("cnc_group_both", "kira_triple")>>
<<say "Man" _line>>
<p class="explicit"><<randomLine "cnc_group_both" "kira_triple">> <<randomLine "cnc_group_both" "kira_triple">></p>
<<say "Kira" "Glk— mmph— ahh— mmm!">>
<p class="narrator">Meanwhile, you face your own ordeal.</p>
<p class="explicit"><<randomLine "cnc_group_both" "player_ridden">> <<randomLine "cnc_group_both" "player_ridden">></p>
<<set _line to randomLine("cnc_group_both", "player_ridden")>>
<<say "Woman" _line>>
<p class="explicit"><<randomLine "cnc_group_both" "player_ridden">> <<randomLine "cnc_group_both" "player_ridden">></p>
<<set _line to randomLine("cnc_group_both", "player_ridden")>>
<<say "Woman" _line>>
<p class="explicit"><<randomLine "cnc_group_both" "player_ridden">> <<randomLine "cnc_group_both" "player_ridden">></p>
<p class="explicit"><<randomLine "cnc_group_both" "player_ridden">> <<randomLine "cnc_group_both" "kira_triple">></p>
<<set _line to randomLine("cnc_group_both", "kira_triple")>>
<<say "Man" _line>>
<<say "Kira" "No— not there— please— AHHHHH!">>
<p class="explicit"><<randomLine "cnc_group_both" "kira_triple">> <<randomLine "cnc_group_both" "kira_triple">></p>
<<set _line to randomLine("cnc_group_both", "kira_triple")>>
<<say "Man" _line>>
<p class="explicit"><<randomLine "cnc_group_both" "player_ridden">> <<randomLine "cnc_group_both" "both_used">></p>
<<set _line to randomLine("cnc_group_both", "both_used")>>
<<say "Woman" _line>>
<p class="explicit"><<randomLine "cnc_group_both" "both_used">> <<randomLine "cnc_group_both" "both_used">></p>
<p class="explicit"><<randomLine "cnc_group_both" "both_used">> <<randomLine "cnc_group_both" "kira_triple">></p>
<<say "Kira" "FUCK— I'M— I CAN'T— CUMMING— AHHH!">>
<<set _line to randomLine("cnc_group_both", "kira_triple")>>
<<say "Man" _line>>
<p class="explicit"><<randomLine "cnc_group_both" "both_used">> <<randomLine "cnc_group_both" "both_used">></p>
<p class="explicit"><<randomLine "cnc_group_both" "both_used">></p>
<p class="explicit"><<randomLine "cnc_group_both" "both_used">> <<randomLine "cnc_group_both" "both_used">></p>
<<set _line to randomLine("cnc_group_both", "both_used")>>
<<say "Leader" _line>>
<p class="explicit"><<randomLine "cnc_group_both" "both_used">> <<randomLine "cnc_group_both" "both_used">></p>
<p class="explicit"><<randomLine "cnc_group_both" "both_used">> <<randomLine "cnc_group_both" "both_used">></p>
<p class="explicit"><<randomLine "cnc_group_both" "both_used">></p>
<<set _line to randomLine("cnc_group_both", "both_used")>>
<<say "Leader" _line>>
<p><<randomLine "cnc_group_both" "both_used">></p>
<div class="choice-container">
<<vchoice "Continue" "Travel_Group_Aftermath" "action" "map">>
</div><p class="explicit">You kneel there, side by side, too exhausted to move. Every part of your body aches. You're both covered in cum — faces, hair, chest, everywhere.</p>
<p class="explicit">Kira's hand finds yours again. Her fingers are sticky.</p>
<<say "Kira" "...that happened.">>
<<say $player.name "Yeah.">>
<p class="explicit">Cum drips from her chin. Her pussy is leaking it. Her ass. You're in the same state.</p>
<<say "Kira" "Never. Ever. We never speak of this.">>
<<say $player.name "Agreed.">>
<p class="narrator">But something changed. You both know it. You were violated together. Survived together. Came together.</p>
<<say "Kira" "Can you... can you walk?">>
<<say $player.name "I think so. You?">>
<<say "Kira" "Everything hurts. But yeah.">>
<p>You help each other up. Standing is agony. Everything aches. You're both cum-covered, naked, exhausted.</p>
<p>But you're alive.</p>
<<say "Kira" "The vault. Let's just... get to the fucking vault.">>
<p>You lean on each other and start walking.</p>
<p class="narrator">The Reclaimed doesn't care about your trauma. But at least you have each other.</p>
<div class="choice-container">
<<vchoice "Crawl toward the vault" "Vault_Arrival_Wrecked" "action" "map">>
</div><<advanceTime 2 0>>
<<clampStat "player.energy" (-10) 0 50>>
<<set $companions[0].energy -= 10>>
<p>You take the long way around. It adds hours to your journey and exhausts you both.</p>
<<say "Kira" "Should have just paid the fucking toll.">>
<<say $player.name "With what?">>
<<say "Kira" "...good point.">>
<p>You eventually make it back to the vault, tired but unmolested.</p>
<div class="choice-container">
<<vchoice "Arrive at vault" "Vault_Arrival" "action" "map">>
</div><<addTrust "kira" 1>>
<<addAffection "kira" 1>>
<h2>Victory</h2>
<p>The bandits lie dead. You fought well.</p>
<<say "Kira" "Fuck their toll.">>
<p>You loot the bodies and continue.</p>
<<addItem "scrap_metal" 2>>
<<addItem "dirty_water" 1>>
<<addItem "bandage" 1>>
<div class="choice-container">
<<vchoice "Continue" "Travel_Safe" "action" "map">>
</div><<set $flags.allowedKiraCNC to true>>
<<set $companions[0].trust -= 4>>
<<set $companions[0].affection -= 3>>
<<set $companions[0].lust to 40>>
<<addCorruption 5 "kira">>
<<addTension "kira" 20>>
<<say $player.name "...do what they want, Kira.">>
<p>The silence is deafening.</p>
<<say "Kira" "What?">>
<<say $player.name "Just... pay the toll. We need to get back.">>
<<say "Kira" "You're seriously going to let them—">>
<<say $player.name "I'm sorry. But we don't have a choice.">>
<p class="narrator">The look she gives you could kill.</p>
<<say "Kira" "...fine. FINE.">>
<p class="explicit">The three women grab Kira, forcing her to the ground. They strip her completely, spreading her legs.</p>
<<say "Leader" "Pretty pussy. Let's see how it tastes.">>
<p class="explicit">The leader buries her face between Kira's thighs. Kira gasps, her body jerking.</p>
<<say "Kira" "Fuck— stop— you—">>
<p class="explicit">The other two bandits hold Kira down, one sitting on her face, forcing Kira to eat her out.</p>
<<say "Bandit" "Lick it, slut. Your boyfriend's watching.">>
<p class="explicit">Kira's muffled protests turn to moans as the leader tongue-fucks her mercilessly. Despite herself, Kira's hips start moving.</p>
<p class="explicit">They use her for twenty minutes. Making her cum three times, forcing her to pleasure them in return. You watch the whole thing.</p>
<p class="explicit">When they're done, Kira lies in the dirt, pussy dripping, face wet with another woman's juices.</p>
<<say "Leader" "Good girl. You can pass.">>
<p>Kira won't look at you as you continue toward the vault.</p>
<<say "Kira" "...">>
<p class="narrator">She doesn't speak to you the entire way back. You may have just destroyed whatever trust you'd built.</p>
<div class="choice-container">
<<vchoice "Continue in silence" "Vault_Arrival" "action" "map">>
</div><<set _playerNaked to ($clothing.player.top <= 0 && $clothing.player.bottom <= 0)>>
<<set _kiraNaked to ($clothing.kira.top <= 0 && $clothing.kira.bottom <= 0)>>
<<set _playerExposed to ($clothing.player.dickExposed || $clothing.player.assExposed)>>
<<set _kiraExposed to ($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>>
<<set $journey.encounter.happened to false>>
<<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>>
<<set $journey.ticksThisSegment to 0>>
<<if UInv.BagHasItem("player", "sewing kit")>>
<<goto "PostBattle_QuickRepair_Option">>
<<else>>
<<goto "PostBattle_Travel_Start">>
<</if>><<setBackground "reclaimed-aftermath">>
<h2>Before You Leave</h2>
You have a sewing kit. You could do a quick patch job before heading back.
<<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 $journey.exposure.player.naked && $journey.exposure.companion.naked>>
<p class="explicit">You're both completely naked. The journey back is going to be... intense.</p>
<<elseif $journey.exposure.player.naked>>
<p class="explicit">You're naked. Every step is going to feel very exposed.</p>
<<elseif $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.dickExposed || $clothing.player.top <= 25>>
<<vchoice "Patch your clothes (quick fix)" "PostBattle_QuickRepair_Player" "action" "armor">>
<</if>>
<<if $clothing.kira.titsExposed || $clothing.kira.pussyExposed>>
<<vchoice "Patch Kira's clothes" "PostBattle_QuickRepair_Kira" "action" "armor">>
<</if>>
<<vchoice "No time — let's go" "PostBattle_Travel_Start" "action" "run">>
</div><<setBackground "reclaimed-aftermath">>
You pull out the sewing kit and do a rough patch job on your clothes.
<<clampStat "clothing.player.top" 30 0 50>>
<<clampStat "clothing.player.bottom" 30 0 50>>
<<updateExposure "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>>
<<set $journey.exposure.player.exposed to false>>
<<set $journey.encounter.risk -= 15>>
<p>At least you're decent now. That should reduce the risk on the way back.</p>
<</if>>
<<say "Kira" "Better than nothing, I guess.">>
<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.">>
<<clampStat "clothing.kira.top" 30 0 50>>
<<clampStat "clothing.kira.bottom" 30 0 50>>
<<updateExposure "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>>
<<set $journey.exposure.companion.exposed to false>>
<<set $journey.encounter.risk -= 15>>
<p>It's not perfect, but she's covered now. That should help on the journey back.</p>
<</if>>
<<say "Kira" "...thanks.">>
<div class="choice-container">
<<vchoice "Continue" "PostBattle_QuickRepair_Option" "action" "map">>
</div><<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>
<div class="choice-container">
<<vchoice "Begin the trek" "Journey_Tick" "action" "map">>
</div><<if $journey.active>>
<<goto "Journey_Event_Continue">>
<</if>>
<<set $journey.ticksThisSegment += 1>>
<<tickExposure>>
<<if random(1, 100) <= 15>>
<<set _ambientRoll to random(1, 5)>>
<<switch _ambientRoll>>
<<case 1>>
<<goto "Journey_Ambient_WindGust">>
<<case 2>>
<<goto "Journey_Ambient_Thirst">>
<<case 3>>
<<goto "Journey_Ambient_Shame">>
<<case 4>>
<<goto "Journey_Ambient_Arousal">>
<<case 5>>
<<goto "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>><<goto "Journey_Encounter_Scavenger">>
<<case 2>><<goto "Journey_Encounter_Raider">>
<<case 3>><<goto "Journey_Encounter_Opportunist">>
<</switch>>
<<else>>
<<goto "Journey_Segment">>
<</if>><<setBackground "reclaimed-travel">>
<<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>>
<<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>>
<p class="narrator">You keep moving. The vault is still ahead.</p>
<<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>><<setBackground "reclaimed-travel">>
<h2>Sudden Gust</h2>
A powerful gust of wind tears across the Reclaimed, catching you off guard.
<<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 $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 $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>><<setBackground "reclaimed-travel">>
<h2>Dry Throat</h2>
The sun is merciless. Your throat is dry, lips cracked.
<<say "Kira" "Water?">>
<<say $player.name "We're rationing. We'll drink when we get back.">>
<<say "Kira" "Right. When we get back.">>
<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 50>>
<<set $companions[0].energy -= 5>>
<<journeyEventReturn>><<setBackground "reclaimed-travel">>
<h2>The Weight of Exposure</h2>
<<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 $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>><<setBackground "reclaimed-travel">>
<h2>Unwanted Reaction</h2>
<<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>
<<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 "player.lust" 10>>
<<clampStat "companions[0].lust" 10>>
<<addTension "kira" 10>>
<<elseif $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>><<setBackground "reclaimed-travel">>
<h2>Echoes</h2>
<<if $flags.postBattleSexKira>>
<p class="narrator">You remember what happened right after the fight. Her body against yours. The desperate fucking.</p>
<<if $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>
Movement. A figure emerges from behind rubble — a lone scavenger, armed with a makeshift weapon.
<<if $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">>
<<if $player.lust >= 70 && ($journey.exposure.player.exposed || $journey.exposure.player.naked)>>
<<vchoice "Submit to their demands" "Journey_Encounter_Submit" "intimate" "strength">>
<</if>>
</div><<setBackground "reclaimed-ambush">>
<<createRaiderGroup 2 5>>
<<set $journey.encounter.enemies to _returnRaiderGroup>>
<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 <<if _raider.gender === 'female'>>female<<else>>male<</if>>">
<<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 $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>
<<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 $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>>
<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 $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 "kira" true>>
<<goto "Combat_Start">><<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))>>
<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"; })>>
<<if _femaleRaiders.length === $journey.encounter.enemies.length && _femaleRaiders.length > 0>>
<p class="explicit"><<randomLine "raider_female_only" "taunt_player">></p>
<<say "Kira" "<<randomLine 'kira_jokes' 'awkward_moment'>>">>
<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 $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>
<<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 $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>>
<p class="narrator">The lead raider looks you both over, calculating.</p>
<<say _leadRaider.name "You got supplies? Weapons? Something worth more than your lives?">>
<</if>>
<div class="choice-container">
<<if $vault.scrap >= 20>>
<<vchoice "Offer supplies (20 scrap)" "Travel_Raider_Negotiate_Supplies" "trade" "scrap">>
<</if>>
<<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 _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><<setBackground "reclaimed-ambush">>
<<set _leadRaider to $journey.encounter.enemies[0]>>
<h2>Paying the Toll</h2>
<<set $vault.scrap -= 20>>
<<say $player.name "Here. Twenty units of scrap. Now let us pass.">>
<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 $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.">>
<p class="explicit"><<randomLine "raider_kira_flash" "compliance">></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" 15>>
<<set $companions[0].submission += 5>>
<<for _e range $journey.encounter.enemies>>
<<set _e.lust to Math.min(100, (_e.lust || 0) + 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>
<p class="narrator">You step behind Kira and grab the hem of her top.</p>
<<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 -= 2>>
<<set $companions[0].fear += 10>>
<<for _e range $journey.encounter.enemies>>
<<set _e.lust to Math.min(100, (_e.lust || 0) + 35)>>
<</for>>
<<say "Kira" "I'll never forgive you for this...">>
<<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—">>
<p class="explicit"><<randomLine "raider_kira_flash" "forced_raiders">></p>
<<say "Kira" "NO! Get off me!">>
<p class="explicit"><<randomLine "raider_kira_grope" "response_forced">></p>
<<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 -= 4>>
<<set $companions[0].fear += 15>>
<<for _e range $journey.encounter.enemies>>
<<set _e.lust to Math.min(100, (_e.lust || 0) + 45)>>
<</for>>
<<say _leadRaider.name "Fuck, look at those tits. Hold her still...">>
<p class="explicit"><<randomLine "raider_kira_grope" "initial">></p>
<<say "Kira" "Please... just let us go...">>
<p class="narrator">Her defiance is crumbling.</p>
<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 Math.min(100, (_e.lust || 0) + 50)>>
<</for>>
<p class="explicit"><<randomLine "raider_kira_strip" "display">></p>
<p class="explicit"><<randomLine "raider_kira_flash" "raider_reaction">></p>
<<say _leadRaider.name "Turn around. Slowly. Let us see everything.">>
<p class="explicit"><<randomLine "raider_kira_strip" "display">></p>
<<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.">>
<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 Math.min(100, (_e.lust || 0) + 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?">>
<p class="explicit"><<randomLine "raider_kira_pose" "arousal_betrayal">></p>
<<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>
<<say $player.name "Kira. Get on your knees and spread.">>
<<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>
<<clampStat "companions[0].lust" 25>>
<<set $companions[0].submission += 25>>
<<set $companions[0].trust -= 3>>
<<set $companions[0].fear += 20>>
<<for _e range $journey.encounter.enemies>>
<<set _e.lust to Math.min(100, (_e.lust || 0) + 65)>>
<</for>>
<<say _leadRaider.name "Spread that pussy open. I want to see inside.">>
<p class="explicit"><<randomLine "raider_kira_pose" "directions">></p>
<<say "Kira" "I hate you... I hate all of you...">>
<p class="explicit"><<randomLine "raider_kira_pose" "arousal_betrayal">></p>
<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.exposure.companion.exposed>>
<<say $player.name "Strip her.">>
<<say "Kira" "WHAT?! NO!">>
<p class="explicit"><<randomLine "raider_kira_strip" "forced">></p>
<<say "Kira" "GET OFF ME! Let go!">>
<<else>>
<<say $player.name "Take the rest off her.">>
<<say "Kira" "No! Please!">>
<p class="explicit"><<randomLine "raider_kira_strip" "forced">></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 -= 5>>
<<set $companions[0].fear += 20>>
<<for _e range $journey.encounter.enemies>>
<<set _e.lust to Math.min(100, (_e.lust || 0) + 55)>>
<</for>>
<<say _leadRaider.name "Now THAT'S more like it. Turn her around, let us see everything.">>
<p class="explicit"><<randomLine "raider_kira_strip" "display">></p>
<<say "Kira" "Please... just let us go...">>
<<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.">>
<p class="explicit">Kira stays naked as you leave. You can feel their eyes on her until you're out of sight.</p>
<<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">
<<vchoice "Continue to the vault" "Travel_Continue" "action" "map">>
</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.">>
<p class="explicit"><<randomLine "raider_kira_grope" "initial">></p>
<<clampStat "companions[0].lust" 25>>
<<set $companions[0].submission += 20>>
<<for _e range $journey.encounter.enemies>>
<<set _e.lust to Math.min(100, (_e.lust || 0) + 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.">>
<p class="explicit"><<randomLine "raider_kira_grope" "forced">></p>
<<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 -= 6>>
<<set $companions[0].fear += 25>>
<<for _e range $journey.encounter.enemies>>
<<set _e.lust to Math.min(100, (_e.lust || 0) + 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>
<<say "Kira" "Please... please stop... I can't...">>
<p class="explicit"><<randomLine "raider_kira_grope" "response_forced">></p>
<<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>
<<goto "Travel_Raider_Negotiate">>
<<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'>>">>
<p class="explicit"><<randomLine "raider_single_male" "kira_oral_start">></p>
<<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.">>
<<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>
<<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.">>
<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>
<<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>>
<div class="choice-container">
<<vchoice "Get out of here" "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>Used</h2>
<p class="narrator">You step back. You don't stop them.</p>
<<say "Kira" "Wait— you're not—">>
<<if _maleCount === 1>>
<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>
<<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>
<<goto "Travel_Continue">>
<<else>>
<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>
<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>
<<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...">>
<<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.">>
<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>
<<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++>>
<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>
<<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>>
<<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.">>
<p class="explicit"><<randomLine "raider_single_male" "kira_fuck_action">></p>
<p class="explicit">You watch as the raider uses Kira completely. She moans despite herself, her body responding even as you stand there doing nothing.</p>
<<set $companions[0].lust to 80>>
<<set $companions[0].submission += 25>>
<<clampStat "player.lust" 25>>
<<say "Kira" "You're just... going to watch?">>
<p class="explicit">Her eyes meet yours as another man fucks her. There's something in her gaze — anger, arousal, or both.</p>
<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>
<<say "Kira" "I hope you enjoyed the show.">>
<p class="narrator">Her voice is cold. She's not happy about your choice.</p>
<<set $companions[0].trust -= 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.">>
<p class="explicit"><<randomLine "raider_kira_oral" "forced_start">></p>
<<say "Kira" "Mmph—!">>
<p class="explicit"><<randomLine "raider_kira_grope" "response_forced">></p>
<<clampStat "companions[0].lust" 25>>
<<set $companions[0].submission += 35>>
<<set $companions[0].trust -= 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>>
<p class="explicit">_raider.name is the last. <<randomLine "raider_kira_oral" "facial">></p>
<<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" "...">>
<p class="explicit">She won't look at you. Won't speak. Just shakes.</p>
<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>
<<say "Kira" "NO! STOP! Please! Don't do this!">>
<p class="explicit"><<randomLine "raider_kira_gangbang" "start">></p>
<<clampStat "companions[0].lust" 25>>
<<set $companions[0].submission += 50>>
<<set $companions[0].trust -= 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.">>
<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>
<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 _femaleRaiders to $journey.encounter.enemies.filter(function(e) { return e.gender === "female"; })>>
<<set _femaleCount to _femaleRaiders.length>>
<h2>Counter-Offer</h2>
<<say $player.name "How about this — I service your women, 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">The female raiders exchange looks. Then grins.</p>
<<say _femaleLeader.name "Get your cock out. Let's see what you're working with.">>
<p class="explicit">You comply. The women like what they see.</p>
<<for _i, _raider range _femaleRaiders>>
<<if _i === 0>>
<p class="explicit">_raider.name pushes you against a wall and rides you aggressively, her nails raking your chest.</p>
<<else>>
<p class="explicit">_raider.name takes her turn next, demanding you eat her pussy before fucking her.</p>
<</if>>
<</for>>
<<set $player.lust to 20>>
<<set $stats.sexScenes.player.total += _femaleCount>>
<<set $stats.sexScenes.player.vaginal += _femaleCount>>
<<for _e range _femaleRaiders>>
<<set _e.lust to 15>>
<</for>>
<<say _femaleLeader.name "Mm. He's good. Let them go, boys.">>
<<say _leadRaider.name "What about us?">>
<<say _femaleLeader.name "Not my problem. Let's go.">>
<p class="narrator">The female raiders leave satisfied. The males glare but don't pursue it.</p>
<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>The Women's Demand</h2>
<<say _femaleLeader.name "<<randomLine 'raider_female_only' 'demand_player'>>">>
<<say $player.name "If that's what it takes to walk out of here...">>
<p class="explicit"><<randomLine "kira_jealousy" "watching_player">></p>
<<if _femaleCount === 1>>
<p class="explicit"><<randomLine "raider_female_only" "player_action">></p>
<<say _femaleLeader.name "Not bad. You can go.">>
<<else>>
<<for _i, _raider range _femaleRaiders>>
<<if _i === 0>>
<p class="explicit"><<randomLine "raider_female_only" "player_action">></p>
<<elseif _i lt 3>>
<p class="explicit">_raider.name demands her turn. <<randomLine "raider_female_only" "player_action">></p>
<<else>>
<p class="explicit">You lose count of how many times you've cum.</p>
<</if>>
<</for>>
<<if 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>
<<clampStat "companions[0].lust" 25>>
<<set $stats.sexScenes.kira.oral_given += _femaleCount>>
<</if>>
<</if>>
<<set $player.lust to 15>>
<<set $stats.sexScenes.player.total += _femaleCount>>
<<set $stats.sexScenes.player.vaginal += _femaleCount>>
<<for _e range _femaleRaiders>>
<<set _e.lust to 10>>
<</for>>
<p class="explicit"><<randomLine "raider_female_only" "aftermath">></p>
<<say _femaleLeader.name "Worth the ambush. Get out of here.">>
<<if $companions[0].lust >= 60>>
<<say "Kira" "<<randomLine 'kira_jealousy' 'aroused_watching'>>">>
<p class="explicit"><<randomLine "kira_jealousy" "wants_turn">></p>
<<else>>
<<say "Kira" "<<randomLine 'kira_jealousy' 'teasing_after'>>">>
<</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>>
<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>
<<say _leadRaider.name "Kill him. Take the woman.">>
<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.">>
<p class="narrator">Their eyes are on Kira. There's no mistaking their intent.</p>
<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>>
<h2>Fight!</h2>
<p class="narrator">Negotiations have failed. But the raiders are... distracted. Their arousal is obvious, making them sloppy.</p>
<<if $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 "kira" true>>
<<goto "Combat_Start">><<setBackground "reclaimed-ruins">>
<h2>Opportunist</h2>
A figure watches from the shadows. Then steps out — clearly assessing whether you're worth the risk.
<<if $journey.exposure.player.exposed || $journey.exposure.companion.naked>>
<<say "Opportunist" "You look like you've had a rough day.">>
<<say $player.name "We're fine. Move along.">>
<<say "Opportunist" "I could help. For a price.">>
<p class="narrator">Their eyes linger on exposed skin.</p>
<<say "Opportunist" "I have supplies. Water. Even some clothing. But nothing's free in the Reclaimed.">>
<<else>>
<<say "Opportunist" "Travelers. Interesting.">>
<<say $player.name "We don't want any trouble.">>
<<say "Opportunist" "Neither do I. But I do want to eat. What have you got to trade?">>
<p class="narrator">They look more desperate than dangerous.</p>
<</if>>
<div class="choice-container">
<<vchoice "Refuse and keep walking" "Journey_Encounter_Refuse" "action" "run">>
<<vchoice "Hear them out" "Journey_Encounter_Negotiate" "talk" "talk">>
<<if $player.lust >= 60 || $companions[0].lust >= 60>>
<<vchoice "Consider their offer" "Journey_Encounter_Deal" "intimate" "hand">>
<</if>>
</div><<setBackground "reclaimed-combat">>
<h2>Fight!</h2>
You attack without hesitation. The element of surprise works in your favor.
<<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 $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>>
<p>You drive them off, though it costs you energy.</p>
<<clampStat "player.energy" (-15) 0 50>>
<<set $companions[0].energy -= 10>>
<div class="choice-container">
<<vchoice "Continue to vault" "Travel_Continue" "action" "map">>
</div><<setBackground "reclaimed-ruins">>
<h2>Negotiation</h2>
<<say $player.name "We don't want trouble. Let us pass.">>
<<if $journey.exposure.companion.exposed>>
<<say "Scavenger" "Then cover her up. That's distracting as hell.">>
<<say "Kira" "I would if I could!">>
<</if>>
<p>After tense negotiation, they agree to let you pass — in exchange for some supplies.</p>
<<set $vault.scrap -= 10>>
<<say "Scavenger" "Smart choice. Now get moving.">>
<div class="choice-container">
<<vchoice "Continue" "Travel_Continue" "action" "map">>
</div><<setBackground "reclaimed-travel">>
<h2>Walking Away</h2>
<<say $player.name "We're not interested.">>
<<say "Opportunist" "Your loss.">>
<p class="narrator">They melt back into the ruins. You keep walking, staying alert.</p>
<div class="choice-container">
<<vchoice "Continue" "Travel_Continue" "action" "map">>
</div><<setBackground "reclaimed-ruins">>
<h2>Submission</h2>
<p class="explicit">You're too aroused, too exhausted to fight. Part of you wants this.</p>
<<say "Scavenger" "Smart. On your knees.">>
<p class="explicit">You comply. Kira watches, shocked.</p>
<<say "Kira" "What are you doing?!">>
<<say $player.name "Just— let it happen.">>
<p class="explicit">The scavenger uses your mouth roughly, fucking your face while Kira watches. You're humiliated, aroused, overwhelmed.</p>
<p class="explicit">When they finish, they leave you there, cum dripping from your lips.</p>
<<say "Kira" "...we don't talk about this.">>
<<set $player.lust to 20>>
<<addCorruption 5>>
<<set $flags.submittedToScavenger to true>>
<div class="choice-container">
<<vchoice "Continue to vault" "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.">>
<p class="explicit">They fuck her right there, in the dirt, both of them taking turns. She screams, moans, cums twice.</p>
<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">>
<h2>The Deal</h2>
<<say "Opportunist" "I'll give you water and supplies. In exchange, I get one of you for an hour.">>
<<if $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 them. You wait, listening to her moans echoing from the ruins.</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.">>
<p class="explicit">You let them use you — mouth, ass, whatever they want. When you return to Kira, you're sore but satisfied.</p>
<<say "Kira" "...you okay?">>
<<say $player.name "Fine. We got what we needed.">>
<<set $player.lust to 15>>
<<set $vault.water += 20>>
<<set $companions[0].energy += 10>>
<</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.exposure.player.naked || $journey.exposure.companion.naked>>
<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 $journey.exposure.companion.naked>>
<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 || $journey.exposure.companion.exposed>>
<p>Your torn clothes offer minimal protection, but you push onward.</p>
<<else>>
<p>You adjust your gear and press on toward the vault.</p>
<</if>>
<<if $expeditionCompanion === "kira">>
<<say "Kira" "Let's keep moving. The sooner we're back, the better.">>
<</if>>
<p class="narrator">The vault is still ahead. You need to keep going.</p>
<div class="choice-container">
<<vchoice "Continue traveling" "Travel_Continue" "action" "run">>
</div><<if $journey.active && $journey.active>>
<<set $journey.active to false>>
<<set $journey.currentNode to $journey.destination>>
<<goto "Journey_Arrive">>
<</if>>
<<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>
<<goto "Vault_Arrival_Exposed">>
<<else>>
<p>You survived the journey. The vault door opens, welcoming you back.</p>
<<goto "Vault_Arrival">>
<</if>><h1>Cheats</h1>
<div class="warning-banner" style="background: rgba(255, 100, 100, 0.15); border: 1px solid #ff6b6b; border-radius: 4px; padding: 0.75em 1em; margin-bottom: 1em;">
<strong style="color: #ff6b6b;">⚠ Early Access Warning:</strong>
<span style="color: #ccc;">This game is in early development. Using cheats may cause unexpected behavior or break your save. Use with caution.</span>
</div>
<<if !setup._ui._i()>>
<div class="settings-section">
<div class="section-header">Enter Code</div>
<div class="setting-row">
<div class="setting-info">
<div class="setting-label">Cheat Code</div>
<div class="setting-description">Enter a valid code to unlock cheats</div>
</div>
<div class="setting-control">
<<textbox "_cheatCode" "" autofocus>>
<<button "Unlock">>
<<set _result to setup._ui._v(_cheatCode)>>
<<if _result.valid>>
<<run setup._ui._u(_result)>>
<<run setup._ui._m()>>
<<goto "Cheats_Menu">>
<<else>>
<<if !_result.silent>>
<<replace "#cheat-error">>Invalid code.<</replace>>
<</if>>
<</if>>
<</button>>
</div>
</div>
<div id="cheat-error" style="color: #e74c3c; text-align: center; margin-top: 0.5rem;"></div>
</div>
<<else>>
<div class="settings-section">
<div class="section-header"><<icon "health">> Player Survival</div>
<div class="setting-row">
<div class="setting-info">
<div class="setting-label">Health</div>
<div class="setting-description">$player.health / $player.maxHealth</div>
</div>
<div class="setting-control">
<<button "+25">><<set $player.health to Math.min($player.maxHealth, $player.health + 25)>><<goto "Cheats_Menu">><</button>>
<<button "Max">><<set $player.health to $player.maxHealth>><<goto "Cheats_Menu">><</button>>
</div>
</div>
<div class="setting-row">
<div class="setting-info">
<div class="setting-label">Energy</div>
<div class="setting-description">$player.energy / $player.maxEnergy</div>
</div>
<div class="setting-control">
<<button "+25">><<set $player.energy to Math.min($player.maxEnergy, $player.energy + 25)>><<goto "Cheats_Menu">><</button>>
<<button "Max">><<set $player.energy to $player.maxEnergy>><<goto "Cheats_Menu">><</button>>
</div>
</div>
<div class="setting-row">
<div class="setting-info">
<div class="setting-label">Hunger</div>
<div class="setting-description">$player.hunger / $player.maxHunger</div>
</div>
<div class="setting-control">
<<button "+25">><<set $player.hunger to Math.min($player.maxHunger, $player.hunger + 25)>><<goto "Cheats_Menu">><</button>>
<<button "Max">><<set $player.hunger to $player.maxHunger>><<goto "Cheats_Menu">><</button>>
</div>
</div>
<div class="setting-row">
<div class="setting-info">
<div class="setting-label">Full Restore</div>
<div class="setting-description">Heal everything at once</div>
</div>
<div class="setting-control">
<<button "Heal All">>
<<set $player.health to $player.maxHealth>>
<<set $player.energy to $player.maxEnergy>>
<<set $player.hunger to $player.maxHunger>>
<<goto "Cheats_Menu">>
<</button>>
</div>
</div>
</div>
<div class="settings-section">
<div class="section-header"><<icon "strength">> Player Stats</div>
<div class="setting-row">
<div class="setting-info">
<div class="setting-label">Strength</div>
<div class="setting-description">$player.strength / 50</div>
</div>
<div class="setting-control">
<<button "+5">><<set $player.strength to Math.min(50, $player.strength + 5)>><<goto "Cheats_Menu">><</button>>
<<button "+10">><<set $player.strength to Math.min(50, $player.strength + 10)>><<goto "Cheats_Menu">><</button>>
</div>
</div>
<div class="setting-row">
<div class="setting-info">
<div class="setting-label">Agility</div>
<div class="setting-description">$player.agility / 50</div>
</div>
<div class="setting-control">
<<button "+5">><<set $player.agility to Math.min(50, $player.agility + 5)>><<goto "Cheats_Menu">><</button>>
<<button "+10">><<set $player.agility to Math.min(50, $player.agility + 10)>><<goto "Cheats_Menu">><</button>>
</div>
</div>
<div class="setting-row">
<div class="setting-info">
<div class="setting-label">Will</div>
<div class="setting-description">$player.will / 50</div>
</div>
<div class="setting-control">
<<button "+5">><<set $player.will to Math.min(50, $player.will + 5)>><<goto "Cheats_Menu">><</button>>
<<button "+10">><<set $player.will to Math.min(50, $player.will + 10)>><<goto "Cheats_Menu">><</button>>
</div>
</div>
<div class="setting-row">
<div class="setting-info">
<div class="setting-label">Magic</div>
<div class="setting-description">$player.magic / 50</div>
</div>
<div class="setting-control">
<<button "+5">><<set $player.magic to Math.min(50, $player.magic + 5)>><<goto "Cheats_Menu">><</button>>
<<button "+10">><<set $player.magic to Math.min(50, $player.magic + 10)>><<goto "Cheats_Menu">><</button>>
</div>
</div>
<div class="setting-row">
<div class="setting-info">
<div class="setting-label">Max All</div>
<div class="setting-description">Set all stats to 50</div>
</div>
<div class="setting-control">
<<button "Max Stats">>
<<set $player.strength to 50>>
<<set $player.agility to 50>>
<<set $player.will to 50>>
<<set $player.magic to 50>>
<<goto "Cheats_Menu">>
<</button>>
</div>
</div>
</div>
<div class="settings-section">
<div class="section-header"><<icon "charm">> Social Stats</div>
<div class="setting-row">
<div class="setting-info">
<div class="setting-label">Charm</div>
<div class="setting-description">$player.charm / 50</div>
</div>
<div class="setting-control">
<<button "+5">><<set $player.charm to Math.min(50, $player.charm + 5)>><<goto "Cheats_Menu">><</button>>
<<button "+10">><<set $player.charm to Math.min(50, $player.charm + 10)>><<goto "Cheats_Menu">><</button>>
</div>
</div>
<div class="setting-row">
<div class="setting-info">
<div class="setting-label">Dominance</div>
<div class="setting-description">$player.dominance / 50</div>
</div>
<div class="setting-control">
<<button "+5">><<set $player.dominance to Math.min(50, $player.dominance + 5)>><<goto "Cheats_Menu">><</button>>
<<button "+10">><<set $player.dominance to Math.min(50, $player.dominance + 10)>><<goto "Cheats_Menu">><</button>>
</div>
</div>
<div class="setting-row">
<div class="setting-info">
<div class="setting-label">Allure</div>
<div class="setting-description">$player.allure / 50</div>
</div>
<div class="setting-control">
<<button "+5">><<set $player.allure to Math.min(50, $player.allure + 5)>><<goto "Cheats_Menu">><</button>>
<<button "+10">><<set $player.allure to Math.min(50, $player.allure + 10)>><<goto "Cheats_Menu">><</button>>
</div>
</div>
</div>
<div class="settings-section">
<div class="section-header"><<icon "lust">> Special Meters</div>
<div class="setting-row">
<div class="setting-info">
<div class="setting-label">Lust</div>
<div class="setting-description">$player.lust / $player.maxLust</div>
</div>
<div class="setting-control">
<<button "0">><<set $player.lust to 0>><<goto "Cheats_Menu">><</button>>
<<button "+25">><<set $player.lust to Math.min($player.maxLust, $player.lust + 25)>><<goto "Cheats_Menu">><</button>>
<<button "Max">><<set $player.lust to $player.maxLust>><<goto "Cheats_Menu">><</button>>
</div>
</div>
<div class="setting-row">
<div class="setting-info">
<div class="setting-label">Corruption</div>
<div class="setting-description">$player.corruption / $player.maxCorruption</div>
</div>
<div class="setting-control">
<<button "0">><<set $player.corruption to 0>><<goto "Cheats_Menu">><</button>>
<<button "+25">><<set $player.corruption to Math.min($player.maxCorruption, $player.corruption + 25)>><<goto "Cheats_Menu">><</button>>
<<button "Max">><<set $player.corruption to $player.maxCorruption>><<goto "Cheats_Menu">><</button>>
</div>
</div>
</div>
<div class="settings-section">
<div class="section-header"><<icon "vault">> Vault Resources</div>
<div class="setting-row">
<div class="setting-info">
<div class="setting-label">Power</div>
<div class="setting-description">$vault.power / $vault.maxPower</div>
</div>
<div class="setting-control">
<<button "+25">><<set $vault.power to Math.min($vault.maxPower, $vault.power + 25)>><<goto "Cheats_Menu">><</button>>
<<button "Max">><<set $vault.power to $vault.maxPower>><<goto "Cheats_Menu">><</button>>
</div>
</div>
<div class="setting-row">
<div class="setting-info">
<div class="setting-label">Food</div>
<div class="setting-description">$vault.food</div>
</div>
<div class="setting-control">
<<button "+25">><<set $vault.food to $vault.food + 25>><<goto "Cheats_Menu">><</button>>
<<button "+100">><<set $vault.food to $vault.food + 100>><<goto "Cheats_Menu">><</button>>
</div>
</div>
<div class="setting-row">
<div class="setting-info">
<div class="setting-label">Water</div>
<div class="setting-description">$vault.water</div>
</div>
<div class="setting-control">
<<button "+25">><<set $vault.water to $vault.water + 25>><<goto "Cheats_Menu">><</button>>
<<button "+100">><<set $vault.water to $vault.water + 100>><<goto "Cheats_Menu">><</button>>
</div>
</div>
<div class="setting-row">
<div class="setting-info">
<div class="setting-label">Medical</div>
<div class="setting-description">$vault.medical</div>
</div>
<div class="setting-control">
<<button "+10">><<set $vault.medical to $vault.medical + 10>><<goto "Cheats_Menu">><</button>>
<<button "+50">><<set $vault.medical to $vault.medical + 50>><<goto "Cheats_Menu">><</button>>
</div>
</div>
<div class="setting-row">
<div class="setting-info">
<div class="setting-label">Magic Crystals</div>
<div class="setting-description">$vault.magicCrystals</div>
</div>
<div class="setting-control">
<<button "+5">><<set $vault.magicCrystals to $vault.magicCrystals + 5>><<goto "Cheats_Menu">><</button>>
<<button "+25">><<set $vault.magicCrystals to $vault.magicCrystals + 25>><<goto "Cheats_Menu">><</button>>
</div>
</div>
<div class="setting-row">
<div class="setting-info">
<div class="setting-label">Fill All</div>
<div class="setting-description">Max out all resources</div>
</div>
<div class="setting-control">
<<button "Fill Resources">>
<<set $vault.power to $vault.maxPower>>
<<set $vault.food to 200>>
<<set $vault.water to 200>>
<<set $vault.medical to 100>>
<<set $vault.magicCrystals to 50>>
<<goto "Cheats_Menu">>
<</button>>
</div>
</div>
</div>
<<if $companions.length > 0>>
<div class="settings-section">
<div class="section-header"><<icon "companion">> Kira</div>
<div class="setting-row">
<div class="setting-info">
<div class="setting-label">Trust</div>
<div class="setting-description">$companions[0].trust / 100</div>
</div>
<div class="setting-control">
<<button "+10">><<set $companions[0].trust to Math.min(100, $companions[0].trust + 10)>><<goto "Cheats_Menu">><</button>>
<<button "+25">><<set $companions[0].trust to Math.min(100, $companions[0].trust + 25)>><<goto "Cheats_Menu">><</button>>
<<button "Max">><<set $companions[0].trust to 100>><<goto "Cheats_Menu">><</button>>
</div>
</div>
<div class="setting-row">
<div class="setting-info">
<div class="setting-label">Affection</div>
<div class="setting-description">$companions[0].affection / 100</div>
</div>
<div class="setting-control">
<<button "+10">><<set $companions[0].affection to Math.min(100, $companions[0].affection + 10)>><<goto "Cheats_Menu">><</button>>
<<button "+25">><<set $companions[0].affection to Math.min(100, $companions[0].affection + 25)>><<goto "Cheats_Menu">><</button>>
<<button "Max">><<set $companions[0].affection to 100>><<goto "Cheats_Menu">><</button>>
</div>
</div>
<div class="setting-row">
<div class="setting-info">
<div class="setting-label">Tension</div>
<div class="setting-description">$companions[0].tension / 100</div>
</div>
<div class="setting-control">
<<button "0">><<set $companions[0].tension to 0>><<goto "Cheats_Menu">><</button>>
<<button "+25">><<set $companions[0].tension to Math.min(100, $companions[0].tension + 25)>><<goto "Cheats_Menu">><</button>>
<<button "Max">><<set $companions[0].tension to 100>><<goto "Cheats_Menu">><</button>>
</div>
</div>
<div class="setting-row">
<div class="setting-info">
<div class="setting-label">Lust</div>
<div class="setting-description">$companions[0].lust / 100</div>
</div>
<div class="setting-control">
<<button "0">><<set $companions[0].lust to 0>><<goto "Cheats_Menu">><</button>>
<<button "+25">><<set $companions[0].lust to Math.min(100, $companions[0].lust + 25)>><<goto "Cheats_Menu">><</button>>
<<button "Max">><<set $companions[0].lust to 100>><<goto "Cheats_Menu">><</button>>
</div>
</div>
<div class="setting-row">
<div class="setting-info">
<div class="setting-label">Health</div>
<div class="setting-description">$companions[0].health / $companions[0].maxHealth</div>
</div>
<div class="setting-control">
<<button "Max">>
<<set $companions[0].health to $companions[0].maxHealth>>
<<if $companions[0].currentLocation === "medical" && !$flags.kiraIsUnconscious>>
<<set $companions[0].currentLocation to "kira_quarters">>
<</if>>
<<goto "Cheats_Menu">>
<</button>>
</div>
</div>
<div class="setting-row">
<div class="setting-info">
<div class="setting-label">Location</div>
<div class="setting-description"><<print $companions[0].currentLocation || "unknown">></div>
</div>
<div class="setting-control">
<<button "→ Her Room">><<set $companions[0].currentLocation to "kira_quarters">><<goto "Cheats_Menu">><</button>>
</div>
</div>
</div>
<</if>>
<</if>>
<div class="settings-buttons">
<<link "Return to Settings">><<goto "Settings_Menu">><</link>>
</div><<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>><<set _results to []>>
<<set _passed to 0>>
<<set _failed to 0>>
<h2>Journey System Audit Tests</h2>
<<silently>>
<<set $journey.weather to "clear">>
<<weatherSpeedModifier>>
<<set _clearMod to _weatherSpeedMod>>
<<set $journey.weather to "rain">>
<<weatherSpeedModifier>>
<<set _rainMod to _weatherSpeedMod>>
<<set $journey.weather to "storm">>
<<weatherSpeedModifier>>
<<set _stormMod to _weatherSpeedMod>>
<</silently>>
<h3>CRIT-01: Weather Speed Modifier</h3>
<<if _clearMod === 1.0>>
<p class="test-pass">✅ Clear weather = 1.0</p><<set _passed++>>
<<else>>
<p class="test-fail">❌ Clear weather = <<= _clearMod>> (expected 1.0)</p><<set _failed++>>
<</if>>
<<if _rainMod > 1.0>>
<p class="test-pass">✅ Rain modifier = <<= _rainMod>> (> 1.0, slows travel)</p><<set _passed++>>
<<else>>
<p class="test-fail">❌ Rain modifier = <<= _rainMod>> (should be > 1.0)</p><<set _failed++>>
<</if>>
<<if _stormMod > _rainMod>>
<p class="test-pass">✅ Storm modifier = <<= _stormMod>> (> rain)</p><<set _passed++>>
<<else>>
<p class="test-fail">❌ Storm modifier = <<= _stormMod>> (should be > <<= _rainMod>>)</p><<set _failed++>>
<</if>>
<<silently>>
<<set _origPlayerTurns to $journey.exposure.player.turns>>
<<set _origCompanionTop to $journey.exposure.companion.topExposedTurns>>
<<set $clothing.player.dickExposed to true>>
<<set $clothing.kira.titsExposed to true>>
<<set $journey.party.solo to false>>
<<set $journey.exposure.player.turns to 5>>
<<set $journey.exposure.companion.topExposedTurns to 5>>
<<updateJourneyExposure>>
<<set _afterUpdate to $journey.exposure.player.turns>>
<<set $journey.exposure.player.turns to 5>>
<<set $journey.exposure.companion.topExposedTurns to 5>>
<<tickExposure>>
<<set _afterTick to $journey.exposure.player.turns>>
<<set $journey.exposure.player.turns to _origPlayerTurns>>
<<set $journey.exposure.companion.topExposedTurns to _origCompanionTop>>
<</silently>>
<h3>CRIT-02: No Duplicate Exposure Increments</h3>
<<if _afterUpdate === 5>>
<p class="test-pass">✅ updateJourneyExposure did NOT increment (stayed at 5)</p><<set _passed++>>
<<else>>
<p class="test-fail">❌ updateJourneyExposure incremented to <<= _afterUpdate>> (should stay 5)</p><<set _failed++>>
<</if>>
<<if _afterTick === 6>>
<p class="test-pass">✅ tickExposure incremented to 6</p><<set _passed++>>
<<else>>
<p class="test-fail">❌ tickExposure = <<= _afterTick>> (expected 6)</p><<set _failed++>>
<</if>>
<<silently>>
<<set $journey.party.solo to false>>
<<set $journey.party.companionIndex to 0>>
<<getJourneyCompanion>>
<<set _withCompanion to _gc_companion>>
<<set $journey.party.solo to true>>
<<getJourneyCompanion>>
<<set _soloCompanion to _gc_companion>>
<<set $journey.party.solo to false>>
<</silently>>
<h3>CRIT-06: Party System Normalization</h3>
<<if _withCompanion !== null && _withCompanion.id === "kira">>
<p class="test-pass">✅ getJourneyCompanion returns Kira when not solo</p><<set _passed++>>
<<else>>
<p class="test-fail">❌ getJourneyCompanion returned <<= _withCompanion>></p><<set _failed++>>
<</if>>
<<if _soloCompanion === null>>
<p class="test-pass">✅ getJourneyCompanion returns null when solo</p><<set _passed++>>
<<else>>
<p class="test-fail">❌ Solo mode returned <<= _soloCompanion>> (should be null)</p><<set _failed++>>
<</if>>
<<silently>>
<<set _origHealth to $companions[0].health>>
<<set _origFlag to $flags.companionCollapsed>>
<<set $companions[0].health to 1>>
<<set $player.hunger to 5>>
<<set $flags.companionCollapsed to false>>
<<survivalTick>>
<<set _collapseTriggered to $flags.companionCollapsed>>
<<set $companions[0].health to _origHealth>>
<<set $player.hunger to 50>>
<<set $flags.companionCollapsed to _origFlag>>
<</silently>>
<h3>HIGH-02: Companion Collapse Check</h3>
<<if _collapseTriggered === true>>
<p class="test-pass">✅ Companion collapse flag triggered when health <= 0</p><<set _passed++>>
<<else>>
<p class="test-fail">❌ Companion collapse flag not set</p><<set _failed++>>
<</if>>
<<silently>>
<<set _origSolo to $journey.party.solo>>
<<set _origTurns to $journey.exposure.companion.topExposedTurns>>
<<set $journey.party.solo to true>>
<<set $journey.exposure.companion.topExposedTurns to 0>>
<<set $clothing.kira.titsExposed to true>>
<<tickExposure>>
<<set _soloCompanionTurns to $journey.exposure.companion.topExposedTurns>>
<<set $journey.party.solo to _origSolo>>
<<set $journey.exposure.companion.topExposedTurns to _origTurns>>
<</silently>>
<h3>HIGH-03: Solo Travel Guards</h3>
<<if _soloCompanionTurns === 0>>
<p class="test-pass">✅ Solo mode: companion exposure not incremented</p><<set _passed++>>
<<else>>
<p class="test-fail">❌ Solo mode incremented companion turns to <<= _soloCompanionTurns>></p><<set _failed++>>
<</if>>
<hr>
<h3>Results: <<= _passed>> / <<= _passed + _failed>> passed</h3>
<<if _failed === 0>>
<p class="test-summary-pass">All journey audit fixes verified!</p>
<<else>>
<p class="test-summary-fail"><<= _failed>> test(s) failed - review fixes</p>
<</if>>
<div class="choice-container">
<<link "Return to Hub" "Vault_Hub">><</link>>
</div>
<style>
.test-pass { color: #32cd32; margin: 0.3em 0; }
.test-fail { color: #dc143c; margin: 0.3em 0; font-weight: bold; }
.test-summary-pass { font-size: 1.2em; color: #32cd32; font-weight: bold; }
.test-summary-fail { font-size: 1.2em; color: #dc143c; font-weight: bold; }
</style><<widget "loadMediaManifest">>
<<set _path to _args[0]>>
<<set _fullPath to $media.root + _path + "/manifest.json">>
<<if !$media.manifests[_path]>>
<<run
(function() {
var path = State.temporary.path;
var fullPath = State.temporary.fullPath;
if (window.OFFLINE_MANIFESTS && window.OFFLINE_MANIFESTS[path]) {
State.variables.media.manifests[path] = window.OFFLINE_MANIFESTS[path];
return;
}
if (!State.variables.media.loading) {
State.variables.media.loading = {};
}
if (!State.variables.media.loading[path]) {
State.variables.media.loading[path] = true;
$.ajax({
url: fullPath,
dataType: 'json',
async: true,
success: function(data) {
State.variables.media.manifests[path] = data;
delete State.variables.media.loading[path];
},
error: function(jqXHR, textStatus, errorThrown) {
console.warn('Failed to load manifest: ' + fullPath, textStatus, errorThrown);
State.variables.media.manifests[path] = { media: [] };
delete State.variables.media.loading[path];
}
});
}
if (!State.variables.media.manifests[path]) {
State.variables.media.manifests[path] = { media: [] };
}
})();
>>
<</if>>
<</widget>>
<<widget "selectMediaFromPool">>
<<set _path to _args[0]>>
<<set _filters to _args[1] || {}>>
<<if !$media.manifests[_path]>>
<<loadMediaManifest _path>>
<</if>>
<<set _manifest to $media.manifests[_path]>>
<<if _manifest && _manifest.media && _manifest.media.length > 0>>
<<set _pool to _manifest.media.filter(function(m) {
if (_filters.file) {
return m.file === _filters.file;
}
for (var key in _filters) {
if (_filters.hasOwnProperty(key)) {
var filterVal = _filters[key];
var mediaVal = m.tags ? m.tags[key] : undefined;
if (mediaVal !== filterVal && mediaVal !== "any" && filterVal !== "any") {
return false;
}
}
}
return true;
})>>
<<if _pool.length === 0>>
<<set _pool to _manifest.media>>
<</if>>
<<set _totalWeight to _pool.reduce(function(sum, m) { return sum + (m.weight || 1); }, 0)>>
<<set _roll to Math.random() * _totalWeight>>
<<set _selected to _pool[0]>>
<<for _i, _m range _pool>>
<<set _roll -= (_m.weight || 1)>>
<<if _roll <= 0>>
<<set _selected to _m>>
<<break>>
<</if>>
<</for>>
<<set _result to {
file: $media.root + _path + "/" + _selected.file,
format: _selected.format || "webp",
tags: _selected.tags || {}
}>>
<<else>>
<<set _placeholderType to _path.split("/")[0]>>
<<set _fallbackFile to $media.fallbacks[_placeholderType] || $media.fallbacks.background>>
<<set _result to {
file: $media.root + _fallbackFile,
format: "webp",
tags: {}
}>>
<</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>>
<<if typeof _filters !== "object" || _filters === null>>
<<set _filters to {}>>
<</if>>
<<if !_filters.time && State.variables.time && State.variables.time.phase>>
<<set _filters.time to $time.phase>>
<</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.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 (function() {
if (!document.getElementById('scene-background')) {
var timePhase = State.variables.time ? State.variables.time.phase : 'afternoon';
$('body').prepend(`
<div id="scene-background" class="scene-background"></div>
<div class="scene-foreground"></div>
<div class="vignette-overlay"></div>
<div class="time-filter" data-time="${timePhase}"></div>
<div class="character-layer"></div>
<div class="scene-transition"></div>
`);
}
})()>>
<<if $time && $time.phase>>
<<run $('.time-filter').attr('data-time', State.variables.time.phase)>>
<</if>>
<<run (function() {
var bg = document.getElementById('scene-background');
var resultFile = _result.file;
var transitionDuration = State.variables.media.settings.transitionSpeed / 2;
if (bg) {
bg.style.opacity = '0';
setTimeout(function() {
bg.style.backgroundImage = 'url(' + 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 _c to $clothing.kira>>
<<if _c.titsExposed && _c.pussyExposed>>
<<set _clothing to "naked">>
<<elseif _c.titsExposed>>
<<set _clothing to "exposed_tits">>
<<elseif _c.pussyExposed>>
<<set _clothing to "exposed_pussy">>
<<elseif _c.top <= 50>>
<<set _clothing to "torn_top">>
<<elseif _c.bottom <= 50>>
<<set _clothing to "torn_bottom">>
<<else>>
<<set _clothing to "base">>
<</if>>
<<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>>
<<set _filters to {
mood: _expression
}>>
<<set _path to "characters/" + _charId + "/" + _clothing>>
<<selectMediaFromPool _path _filters>>
<<run VaultUI.showCharacter(_charId, _position, _expression)>>
<<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">
<img @src="_result.file" @alt="_charId">
</div>
<</if>>
<</widget>>
<<widget "showEventMedia">>
<<set _eventId to _args[0]>>
<<set _filters to _args[1] || {}>>
<<set _path to "events/" + _eventId>>
<<selectMediaFromPool _path _filters>>
<<set $media.current.event to _result>>
<<set _manifest to $media.manifests[_path]>>
<<set $media.current.reaction to null>>
<<if _manifest && _manifest.secondary_pool && $media.settings.showReactions>>
<<selectMediaFromPool _manifest.secondary_pool>>
<<set $media.current.reaction to _result>>
<</if>>
<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"
autoplay loop muted playsinline></video>
<<else>>
<img class="primary-media event-image"
@src="$media.current.event.file" alt="">
<</if>>
<<if $media.current.reaction>>
<div class="secondary-media">
<img class="reaction-image"
@src="$media.current.reaction.file" alt="">
</div>
<</if>>
</div>
<</widget>>
<<widget "showCombatEvent">>
<<set _eventType to _args[0]>>
<<set _filters to _args[1] || {}>>
<<getEventFolderForAttack _eventType>>
<<set _eventId to "combat/" + _eventFolder>>
<<showEventMedia _eventId _filters>>
<</widget>>
<<widget "getEventFolderForAttack">>
<<set _attackType to _args[0]>>
<<switch _attackType>>
<<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 _target to _args[0]>>
<<set _damage to _args[1] || 5>>
<<set _videoFilters to {}>>
<<if _target === "kira">>
<<if $clothing && $clothing.kira>>
<<if $clothing.kira.titsExposed && $clothing.kira.pussyExposed>>
<<set _videoFilters.clothing to "naked">>
<<elseif $clothing.kira.titsExposed>>
<<set _videoFilters.clothing to "exposed_tits">>
<<elseif $clothing.kira.pussyExposed>>
<<set _videoFilters.clothing to "exposed_pussy">>
<<elseif $clothing.kira.top <= 50 || $clothing.kira.bottom <= 50>>
<<set _videoFilters.clothing to "torn">>
<<else>>
<<set _videoFilters.clothing to "clothed">>
<</if>>
<</if>>
<<elseif _target === "player">>
<<if $clothing && $clothing.player>>
<<if $clothing.player.dickExposed>>
<<set _videoFilters.clothing to "exposed_dick">>
<<elseif $clothing.player.top <= 50 || $clothing.player.bottom <= 50>>
<<set _videoFilters.clothing to "torn">>
<<else>>
<<set _videoFilters.clothing to "clothed">>
<</if>>
<</if>>
<</if>>
<<if _damage >= 12>>
<<set _videoFilters.intensity to "hard">>
<<elseif _damage >= 7>>
<<set _videoFilters.intensity to "medium">>
<<else>>
<<set _videoFilters.intensity to "light">>
<</if>>
<<if $combat && $combat.positions>>
<<if _target === "kira" && $combat.positions.kira>>
<<set _videoFilters.position to $combat.positions.kira>>
<<elseif _target === "player" && $combat.positions.player>>
<<set _videoFilters.position to $combat.positions.player>>
<</if>>
<</if>>
<</widget>>
<<widget "showCombatAttackVideo">>
<<set _attackType to _args[0]>>
<<set _target to _args[1]>>
<<set _damage to _args[2] || 5>>
<<getEventFolderForAttack _attackType>>
<<getCombatVideoFilters _target _damage>>
<div class="combat-video-container">
<<showCombatEvent _eventFolder _videoFilters>>
</div>
<</widget>>
<<widget "showKnockdownVideo">>
<<set _target to _args[0]>>
<<set _position to _args[1]>>
<<switch _position>>
<<case "kneeling">>
<<set _eventFolder to "force_kneel">>
<<case "prone_front" "prone_back">>
<<set _eventFolder to "knockdown">>
<<case "bent_over">>
<<set _eventFolder to "knockdown">>
<<case "pinned">>
<<set _eventFolder to "pin_down">>
<<default>>
<<set _eventFolder to "knockdown">>
<</switch>>
<<getCombatVideoFilters _target 8>>
<div class="combat-video-container knockdown-video">
<<showCombatEvent _eventFolder _videoFilters>>
</div>
<</widget>>
<<widget "selectMediaWithRace">>
<<set _basePath to _args[0]>>
<<set _filters to _args[1] || {}>>
<<set _enemy to _args[2]>>
<<set _foundMedia to false>>
<<if _enemy && (_enemy.race || _enemy.class)>>
<<set _archetype to (_enemy.class || "generic").toLowerCase()>>
<<set _race to (_enemy.race || "white").toLowerCase()>>
<<set _resolvedPath to setup.resolveCombatPath(_basePath, _archetype, _race)>>
<<if $media.manifests[_resolvedPath] && $media.manifests[_resolvedPath].media && $media.manifests[_resolvedPath].media.length > 0>>
<<selectMediaFromPool _resolvedPath _filters>>
<<if _result && _result.file>>
<<set _foundMedia to true>>
<</if>>
<</if>>
<</if>>
<<if !_foundMedia>>
<<selectMediaFromPool _basePath _filters>>
<</if>>
<</widget>>
<<widget "selectCombatMedia">>
<<set _action to _args[0]>>
<<set _archetype to _args[1] || "generic">>
<<set _race to _args[2] || "white">>
<<set _filters to _args[3] || {}>>
<<set _basePath to "combat/attacks/" + _action>>
<<set _resolvedPath to setup.resolveCombatPath(_basePath, _archetype, _race)>>
<<selectMediaFromPool _resolvedPath _filters>>
<</widget>>
<<widget "selectCharacterMedia">>
<<set _charType to _args[0]>>
<<set _archetype to _args[1] || "generic">>
<<set _race to _args[2] || "white">>
<<set _expression to _args[3] || "neutral">>
<<set _resolvedPath to setup.resolveCharacterPath(_charType, _archetype, _race)>>
<<selectMediaFromPool _resolvedPath {mood: _expression}>>
<</widget>>
<<widget "showEnemyCombatMedia">>
<<set _attackType to _args[0]>>
<<set _enemyIndex to _args[1]>>
<<if typeof _enemyIndex === "undefined">>
<<set _enemyIndex to $combat.currentEnemyIndex || 0>>
<</if>>
<<set _enemy to $combat.enemies[_enemyIndex]>>
<<set _archetype to _enemy.class || "generic">>
<<set _race to _enemy.race || "white">>
<<getCombatVideoFilters "player" 5>>
<<selectCombatMedia _attackType _archetype _race _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"
autoplay loop muted playsinline></video>
<<else>>
<img class="primary-media combat-image"
@src="_result.file" alt="">
<</if>>
</div>
<</if>>
<</widget>><<widget "pointOfNoReturn">>
<<set _decisionName to _args[0]>>
<<set _description to _args[1]>>
<div class="point-of-no-return">
<strong>POINT OF NO RETURN</strong><br><br>
<<print _description>><br><br>
<em>An auto-save has been created.</em>
</div>
<</widget>>
<<widget "lustIndicator">>
<<if $uiVisible.lustMeter && $player.lust >= 40>>
<span class="lust-indicator">
<<if $player.lust >= 80>>Overwhelmed<<elseif $player.lust >= 60>>Aroused<<else>>Distracted<</if>>
</span>
<</if>>
<</widget>>
<<widget "tensionIndicator">>
<<set _compId to _args[0]>>
<<getCompanion _compId>>
<<if $uiVisible.tensionMeter && $tempCompanion && $tempCompanion.tension >= 30>>
<span class="tension-indicator">
Tension: <<print $tempCompanion.tension>>%
</span>
<</if>>
<</widget>>
<<widget "toggleSwitch">>
<<set _varName to _args[0]>>
<<set _currentValue to State.getVar(_varName)>>
<div class="toggle-switch <<if _currentValue>>active<</if>>" data-var="<<print _varName>>"></div>
<</widget>>
<<widget "showNotification">>
<<set _message to _args[0]>>
<<set _type to _args[1] || "info">>
<div class="notification notification-<<print _type>> toast-notification">
<<print _message>>
</div>
<</widget>>
<<widget "showStatChange">>
<<set _stat to _args[0]>>
<<set _change to _args[1]>>
<<if $preferences.showStatChanges>>
<span class="stat-change <<if _change > 0>>positive<<else>>negative<</if>>">
<<print _stat>>: <<if _change > 0>>+<</if>><<print _change>>
</span>
<</if>>
<</widget>>
<<widget "choiceLink">>
<<set _text to _args[0]>>
<<set _passage to _args[1]>>
<<set _category to _args[2] || "default">>
<<set _requirement to _args[3]>>
<<if _requirement === undefined>><<set _requirement to true>><</if>>
<<if _requirement>>
<<link _text _passage>><</link>>
<<else>>
<span class="choice-link locked"><<print _text>></span>
<</if>>
<</widget>><<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>>
<<if setup.textPools[_rlCategory] && setup.textPools[_rlCategory][_rlType]>>
<<set _rlPool to setup.textPools[_rlCategory][_rlType]>>
<<set _rlLine to _rlPool.random()>>
<<set _rlLine to _rlLine.replace(/\[Player\]/g, $player.name)>>
<<if !_rlEnemyName && $combat && $combat.enemies && $combat.currentEnemyIndex !== undefined>>
<<set _rlEnemyName to $combat.enemies[$combat.currentEnemyIndex] ? $combat.enemies[$combat.currentEnemyIndex].name : "[Enemy]">>
<</if>>
<<set _rlEnemyName to _rlEnemyName || "[Enemy]">>
<<set _rlLine to _rlLine.replace(/\[Enemy\]/g, _rlEnemyName)>>
<<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 $player.health < $player.maxHealth>>
<<set $player.health to Math.min($player.maxHealth, $player.health + 20)>>
<</if>>
<<if $companions && $companions[0] && $companions[0].health < $companions[0].maxHealth>>
<<set $companions[0].health to Math.min($companions[0].maxHealth, $companions[0].health + 25)>>
<</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 "setTime">>
<<set $time.hour to $args[0]>>
<<set $time.minute to $args[1] || 0>>
<<updateTimePhase>>
<</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 50>>
<</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>
<div class="stat-row">
<span class="stat-label">Food</span>
<div class="stat-bar hunger-bar" @title="'Food: ' + $player.hunger + ' / ' + $player.maxHunger">
<div class="stat-fill <<if $player.hunger <= 20>>critical<</if>>" @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 <<if $player.lust >= 80>>critical<</if>>" @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 + ' / 100'">
<div class="stat-fill" @style="'width:' + $player.corruption + '%'"></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 <<if $vault.power < 20>>low<</if>>" title="Power">
<<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 <<if $vault.food < 10>>low<</if>>" title="Food">
<<icon "food" "medium">>
<span class="resource-value"><<print $vault.food>></span>
</div>
<div class="resource-item <<if $vault.water < 10>>low<</if>>" title="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>' "Journal">>
<<if !["Journal", "Companions_Menu", "Companion_Detail", "Inventory_Menu", "Settings_Menu", "Cheats_Menu"].includes(passage())>><<set $returnTo to passage()>><</if>>
<</link>>
<<link '<span class="btn-label">Companions</span>' "Companions_Menu">>
<<if !["Journal", "Companions_Menu", "Companion_Detail", "Inventory_Menu", "Settings_Menu", "Cheats_Menu"].includes(passage())>><<set $returnTo to passage()>><</if>>
<</link>>
<<link '<span class="btn-label">Backpack</span>' "Inventory_Menu">>
<<if !["Journal", "Companions_Menu", "Companion_Detail", "Inventory_Menu", "Settings_Menu", "Cheats_Menu"].includes(passage())>><<set $returnTo to passage()>><</if>>
<</link>>
<<link '<span class="btn-label">Settings</span>' "Settings_Menu">>
<<if !["Journal", "Companions_Menu", "Companion_Detail", "Inventory_Menu", "Settings_Menu", "Cheats_Menu"].includes(passage())>><<set $returnTo to passage()>><</if>>
<</link>>
</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>
<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)>>
<<goto "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)>>
<<goto "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>>
<<goto "Settings_Menu">>
<</link>>
<<else>>
<<link "Disabled">>
<<set $settings.keyboardShortcutsEnabled to true>>
<<goto "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"><<if setup._ui._i()>>Unlocked<<else>>Enter code to unlock<</if>></div>
</div>
<div class="setting-control">
<<link "Open">><<goto "Cheats_Menu">><</link>>
</div>
</div>
</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">
<button class="btn-apply" onclick="SugarCube.State.display(SugarCube.State.passage)">Apply Changes</button>
<<link "Return">><<set _dest to ($returnTo && !["Journal", "Companions_Menu", "Companion_Detail", "Inventory_Menu", "Settings_Menu", "Cheats_Menu"].includes($returnTo)) ? $returnTo : "Vault_Hub">><<goto _dest>><</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 <<if !_comp.alive>>deceased<</if>>">
<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>>
<<goto "Companion_Detail">>
<</link>>
<</capture>>
<</if>>
</div>
<</for>>
</div>
<</if>>
<div class="menu-buttons">
<<link "Return">><<set _dest to ($returnTo && !["Journal", "Companions_Menu", "Companion_Detail", "Inventory_Menu", "Settings_Menu", "Cheats_Menu"].includes($returnTo)) ? $returnTo : "Vault_Hub">><<goto _dest>><</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 <<if $tempCompanion.health <= $tempCompanion.maxHealth * 0.25>>critical<<elseif $tempCompanion.health <= $tempCompanion.maxHealth * 0.5>>warning<</if>>" @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 <<if $tempCompanion.energy <= 25>>critical<<elseif $tempCompanion.energy <= 50>>warning<</if>>" @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 <<if $tempCompanion.trust < 0>>negative<</if>>" @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 <<if $tempCompanion.affection < 0>>negative<</if>>" @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 <<if $tempCompanion.tension >= 70>>critical<</if>>" @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 <<if $tempCompanion.jealousy >= 50>>warning<</if>>" @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 <<if $tempCompanion.fear >= 50>>critical<</if>>" @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">
<<vchoice "Return" "Companions_Menu" "action" "return">>
</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")>>
<<set _wpnImageId to _equippedWeapon.replace(/ /g, "_").replace(/-/g, "_").replace(/^a_|^an_/, "")>>
<div class="item-image">
<img @src="'assets/images/items/' + _wpnImageId + '.webp'" 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>>
<<goto "Inventory_Menu">>
<</link>>
<</capture>>
</div>
<<else>>
<div class="slot-empty">Empty</div>
<</if>>
</div>
<div class="equipment-slot" data-slot="armor">
<div class="slot-label">Armor</div>
<<if _equippedArmor>>
<<set _armName to (UInv.GetItemPropertyValue("player equipped", _equippedArmor, "singular") || _equippedArmor).replace(/^a |^an /i, "")>>
<<set _armDef to UInv.GetItemPropertyValue("player equipped", _equippedArmor, "defense")>>
<<set _armImageId to _equippedArmor.replace(/ /g, "_").replace(/-/g, "_").replace(/^a_|^an_/, "")>>
<div class="item-image">
<img @src="'assets/images/items/' + _armImageId + '.webp'" alt="" onerror="this.style.display='none'">
</div>
<div class="slot-item">
<<print _armName>>
<<if _armDef>><span class="stat-badge">DEF: +<<print _armDef>></span><</if>>
</div>
<div class="slot-actions">
<<capture _equippedArmor>>
<<link "[Unequip]">>
<<uinvUnequip _equippedArmor>>
<<goto "Inventory_Menu">>
<</link>>
<</capture>>
</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") || 20>>
<div class="section-header">Backpack (<<print _items.length>>/<<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")>>
<<set _imageId to _itemName.replace(/ /g, "_").replace(/-/g, "_").replace(/^a_|^an_/, "")>>
<div class="inventory-slot <<print _rarity>>" data-item-id="<<print _itemName>>">
<div class="item-image">
<img @src="'assets/images/items/' + _imageId + '.webp'" 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>>
<<goto "Inventory_Menu">>
<</link>>
<</capture>>
<</if>>
<<if _isConsumable>>
<<capture _itemName, _healAmount>>
<<link "[Use]">>
<<uinvUseItem _itemName>>
<<goto "Inventory_Menu">>
<</link>>
<</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">><<set _dest to ($returnTo && !["Journal", "Companions_Menu", "Companion_Detail", "Inventory_Menu", "Settings_Menu", "Cheats_Menu"].includes($returnTo)) ? $returnTo : "Vault_Hub">><<goto _dest>><</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">>
<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 $flags.succubusFirstEncounter && !$flags.succubusExplained>>
<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>>
</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>
<<if $stats.combat.enemiesDefeated>><p>Enemies defeated: <<print $stats.combat.enemiesDefeated>></p><</if>>
<</if>>
</div>
<div class="menu-buttons">
<<link "Return">><<set _dest to ($returnTo && !["Journal", "Companions_Menu", "Companion_Detail", "Inventory_Menu", "Settings_Menu", "Cheats_Menu"].includes($returnTo)) ? $returnTo : "Vault_Hub">><<goto _dest>><</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: <<print _comp.trust>> / 100">
<div class="stat-fill <<if _comp.trust < 0>>negative<</if>>" style="width: <<print 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: <<print _comp.affection>> / 100">
<div class="stat-fill <<if _comp.affection < 0>>negative<</if>>" style="width: <<print 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: <<print _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 <<if _comp.tension >= 70>>critical<</if>>" style="width: <<print _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: <<print _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">
<<getCombatPortrait "kira">>
<video class="combat-portrait" autoplay loop muted playsinline>
<source src="<<print _portraitPath>>" type="video/webm">
</video>
</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: <<print 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 <<if $companions[0].tension >= 70>>critical<</if>>"
style="width: <<print $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">
<<getCombatPortrait "player">>
<video class="combat-portrait" autoplay loop muted playsinline>
<source src="<<print _portraitPath>>" type="video/webm">
</video>
</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: <<print 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: <<print 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 <<if $player.lust >= 80>>critical<</if>>"
style="width: <<print $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 <<print _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 <<if _partner.lust >= 80>>close<</if>>" style="width: <<print _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 <<if $player.lust >= 80>>close<</if>>" style="width: <<print $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>>SECTION 21: VIDEO WIDGETS
============================================================= */
<<widget "intimateVideo">>
<<set _src to _args[0]>>
<<set _caption to _args[1] || "">>
<<set _loop to _args[2] !== false>>
<div class="video-container video-intimate">
<video
class="intimate-video"
autoplay
<<if _loop>>loop<</if>>
muted
playsinline
controls>
<source src="<<print _src>>" type="video/mp4">
<source src="<<print _src.replace('.mp4', '.webm')>>" type="video/webm">
Your browser doesn't support video playback.
</video>
<<if _caption>>
<div class="video-caption"><<print _caption>></div>
<</if>>
</div>
<</widget>>
<<widget "combatVideo">>
<<set _src to _args[0]>>
<<set _loop to _args[1] || false>>
<div class="combat-action-visual">
<video
class="combat-video"
autoplay
<<if _loop>>loop<</if>>
muted
playsinline>
<source src="<<print _src>>" type="video/mp4">
<source src="<<print _src.replace('.mp4', '.webm')>>" type="video/webm">
</video>
</div>
<</widget>>
/* =============================================================<<widget "setBackgroundOld">>
<<set _location to _args[0]>>
<<set _effects to _args[1] || []>>
<<run $currentLocation = _location>>
<<run $("#scene-background").attr("data-location", _location)>>
<<if _effects.includes("dream")>>
<<run $("#game-container").addClass("scene-mode-dream")>>
<<elseif _effects.includes("combat")>>
<<run $("#game-container").addClass("scene-mode-combat")>>
<<elseif _effects.includes("intimate")>>
<<run $("#game-container").addClass("scene-mode-intimate")>>
<</if>>
<</widget>>
<<widget "setTimeOfDay">>
<<set _time to _args[0]>>
<<run $(".time-filter").attr("data-time", _time)>>
<<run $("#scene-background").attr("data-time-filter", _time)>>
<</widget>>
<<widget "setMood">>
<<set _mood to _args[0]>>
<<run $(".time-filter").attr("data-mood", _mood)>>
<<run $("#scene-background").attr("data-mood", _mood)>>
<</widget>>
<<widget "clearMood">>
<<run $(".time-filter").removeAttr("data-mood")>>
<<run $("#scene-background").removeAttr("data-mood")>>
<</widget>>
<<widget "setIndoor">>
<<set _isIndoor to _args[0] !== false>>
<<if _isIndoor>>
<<run $(".time-filter").attr("data-indoor", "true")>>
<<else>>
<<run $(".time-filter").removeAttr("data-indoor")>>
<</if>>
<</widget>>
<<widget "applyTimeFilter">>
<<set _phase to $time.phase || "afternoon">>
<<setTimeOfDay _phase>>
<<if $currentLocation && ($currentLocation.includes("vault") || $currentLocation.includes("archives") || $currentLocation.includes("medbay") || $currentLocation.includes("quarters") || $currentLocation.includes("commons") || $currentLocation.includes("storage") || $currentLocation.includes("kitchen") || $currentLocation.includes("bathroom") || $currentLocation.includes("power"))>>
<<setIndoor true>>
<<else>>
<<setIndoor false>>
<</if>>
<</widget>>
<<widget "hideAllCharacters">>
<<run $(".character-sprite").fadeOut(500, function() { $(this).remove(); })>>
<</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 "transition">>
<<set _type to _args[0] || "fade">>
<<set _duration to _args[1] || 500>>
<<run $(".scene-transition").removeClass("active transition-fade transition-dissolve transition-supernatural").addClass("transition-" + _type)>>
<<timed 50ms>>
<<run $(".scene-transition").addClass("active")>>
<</timed>>
<<timed `_duration + "ms"`>>
<<run $(".scene-transition").removeClass("active")>>
<</timed>>
<</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 "narrate">>
<<set _text to _args[0]>>
<<run $(".character-sprite").removeClass("speaking not-speaking")>>
<div class="narration-box"><<print _text>></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 "hotspot">>
<<set _target to _args[0]>>
<<set _label to _args[1]>>
<<set _icon to _args[2] || "<<icon "search">>">>
<<set _x to _args[3]>>
<<set _y to _args[4]>>
<<set _w to _args[5] || 10>>
<<set _h to _args[6] || 15>>
<<set _type to _args[7] || "">>
<div class="hotspot <<print _type>>"
data-passage="<<print _target>>"
style="left: <<print _x>>%; top: <<print _y>>%; width: <<print _w>>%; height: <<print _h>>%;"
onclick="SugarCube.Engine.play('<<print _target>>')">
<div class="hotspot-indicator">
<span class="hotspot-icon"><<print _icon>></span>
<span class="hotspot-label"><<print _label>></span>
</div>
</div>
<</widget>>
<<widget "setWeather">>
<<set _weather to _args[0]>>
<<run $(".weather-overlay").remove()>>
<<switch _weather>>
<<case "rain">>
<<run $(".scene-foreground").append('<div class="rain-overlay weather-overlay"></div>')>>
<<case "storm">>
<<run $(".scene-foreground").append('<div class="rain-overlay weather-overlay storm"></div>')>>
<<case "fog">>
<<run $(".scene-foreground").append('<div class="fog-overlay weather-overlay"></div>')>>
<<case "cloudy">>
<<run $(".scene-foreground").append('<div class="cloudy-overlay weather-overlay"></div>')>>
<<case "dust">>
<<run $(".scene-foreground").append('<div class="particles weather-overlay"></div>')>>
<<case "clear">>
<</switch>>
<</widget>>
<<widget "syncWeather">>
<<setWeather $weather>>
<</widget>>
<<widget "clearSceneMode">>
<<run $("#game-container").removeClass("scene-mode-dream scene-mode-combat scene-mode-intimate")>>
<</widget>>
<<widget "toggleImmersive">>
<<run $("body").toggleClass("immersive-mode")>>
<</widget>>
<<widget "enableImmersive">>
<<run $("body").addClass("immersive-mode")>>
<</widget>>
<<widget "disableImmersive">>
<<run $("body").removeClass("immersive-mode")>>
<</widget>>
<<widget "showVignette">>
<<if $(".vignette-overlay").length === 0>>
<<run $("body").append('<div class="vignette-overlay"></div>')>>
<</if>>
<</widget>>
<<widget "hideVignette">>
<<run $(".vignette-overlay").remove()>>
<</widget>>
<<widget "setupScene">>
<<set _location to _args[0]>>
<<set _timePhase to _args[1] || $time.phase>>
<<if $("#scene-background").length === 0>>
<<run $("body").prepend(`
<div id="scene-background" class="scene-background" data-location="${_location}"></div>
<div class="scene-foreground"></div>
<div class="vignette-overlay"></div>
<div class="time-filter" data-time="${_timePhase}"></div>
<div class="character-layer"></div>
<div class="scene-transition"></div>
`)>>
<<else>>
<<run $("#scene-background").attr("data-location", _location)>>
<<run $(".time-filter").attr("data-time", _timePhase)>>
<</if>>
<</widget>>
<<widget "cleanupScene">>
<<run $("#scene-background, .scene-foreground, .vignette-overlay, .time-filter, .character-layer, .scene-transition, .hotspot-layer").remove()>>
<<run $("body").removeClass("immersive-mode scene-mode-dream scene-mode-combat scene-mode-intimate")>>
<</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: <<print _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">+<<print $equippedArmorData.magicResist>> Magic Resist</p>
<</if>>
<<if $equippedArmorData.magicBonus>>
<p class="effect-item">+<<print $equippedArmorData.magicBonus>> Magic</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 | +5 Magic Resist, +2 Magic</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">>
<<uinvEquipArmor _armor.name>>
<<set $flags.newArmorEquipped to true>>
<<goto "Wardrobe_Armor_Menu">>
<</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>>
<<link "Repair">>
<<uinvRepairArmor _actualRepair>>
<<set $vault.scrap -= _cost>>
<<goto "Armor_Repair_Complete">>
<</link>>
<<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: <<print _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> <<print "+" + $equippedArmorData.magicResist>> to magic defense</li>
<</if>>
<<if $equippedArmorData.magicBonus>>
<li><strong>Magic Power:</strong> <<print "+" + $equippedArmorData.magicBonus>> to spell effectiveness</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 _armor>>
<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 $equipped.armor.currentDurability>>/<<print $equipped.armor.maxDurability>></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.currentDurability>>/<<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.currentDurability>>/<<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><<widget "rollClothingLoot">>
<<set _location to _args[0]>>
<<set _table to $clothingLoot[_location]>>
<<if _table>>
<<set _roll to random(1, 100)>>
<<if _roll <= 5>>
<<set _item to _table.rare.random()>>
<<elseif _roll <= 25>>
<<set _item to _table.uncommon.random()>>
<<else>>
<<set _item to _table.common.random()>>
<</if>>
<<set _foundClothing to _item>>
<</if>>
<</widget>><<rollClothingLoot $currentLocation.type>>
<<switch _foundClothing>>
<<case "salvaged_lingerie">>
<p>You find a drawer that somehow survived intact. Inside: pre-war lingerie, still in decent condition.</p>
<p class="loot-find">Found: <strong>Salvaged Lingerie</strong></p>
<p class="item-desc">Delicate lace and silk. Fragile but beautiful.</p>
<<if $companions[0].present>>
<<getExhibTier "kira">>
<<if _exhibTier >= 3>>
<<say "Kira" "Ooh." She takes it, holds it up. "This is actually nice.">>
<<else>>
<<say "Kira" "That's, um..." She blushes. "Put it away before someone sees.">>
<</if>>
<</if>>
<<run $wardrobe.kira.intimate.push("lingerie")>>
<<case "military_armor">>
<p>Hidden under debris: a full set of pre-Cataclysm military body armor. Heavy, but intact.</p>
<p class="loot-find">Found: <strong>Military Body Armor</strong></p>
<p class="item-desc">+10 Defense. Still in good condition.</p>
<<addItem "military_armor" 1>>
<<case "leather_jacket">>
<p>A pre-war motorcycle jacket, still bearing the scuff marks of its previous owner. The leather is cracked but functional.</p>
<p class="loot-find">Found: <strong>Leather Jacket</strong></p>
<p class="item-desc">+3 Defense. Worn but reliable.</p>
<<addItem "leather_jacket" 1>>
<<case "raider_scraps">>
<p>Patchwork armor cobbled together from various raider gear. It's intimidating but fragile.</p>
<p class="loot-find">Found: <strong>Raider Scraps</strong></p>
<p class="item-desc">+4 Defense. Intimidating but unreliable.</p>
<<addItem "raider_scraps" 1>>
<<case "reinforced_vest">>
<p>Heavy padding arranged over vital areas. It's bulky but offers solid protection.</p>
<p class="loot-find">Found: <strong>Reinforced Vest</strong></p>
<p class="item-desc">+6 Defense. Restricts movement slightly.</p>
<<addItem "reinforced_vest" 1>>
<<case "vault_security_gear">>
<p>Official Vault security armor with the overseer's seal. It's an instant symbol of authority here.</p>
<p class="loot-find">Found: <strong>Vault Security Gear</strong></p>
<p class="item-desc">+5 Defense. Grants trust bonus with vault dwellers.</p>
<<addItem "vault_security" 1>>
<<case "mage_robes">>
<p>Enchanted fabric shimmers with barely perceptible runes. The air around them feels charged with magic.</p>
<p class="loot-find">Found: <strong>Mage Robes</strong></p>
<p class="item-desc">+2 Defense. +5 Magic Resistance, +2 Magic Bonus.</p>
<<addItem "mage_robes" 1>>
<<case "standard_underwear">>
<p>Basic underwear, practical and plain. Not what anyone dreams of finding, but functional.</p>
<p class="loot-find">Found: <strong>Standard Underwear</strong></p>
<p class="item-desc">Standard protection. Replaceable.</p>
<<addItem "standard_underwear" 1>>
<<case "worn_clothes">>
<p>Just some worn, weathered clothing. Could be salvaged for scraps or used as padding.</p>
<p class="loot-find">Found: <strong>Worn Clothes</strong></p>
<p class="item-desc">Could be useful for something.</p>
<<addItem "worn_clothes" 1>>
<<case "reinforced_shorts">>
<p>Heavy-duty shorts with extra padding and stitching. Definitely designed for combat.</p>
<p class="loot-find">Found: <strong>Reinforced Shorts</strong></p>
<p class="item-desc">Extra protection. Well-made.</p>
<<addItem "reinforced_shorts" 1>>
<<case "tight_briefs">>
<p>Pre-war athletic wear, form-fitting and surprisingly intact. Very snug.</p>
<p class="loot-find">Found: <strong>Tight Salvaged Briefs</strong></p>
<p class="item-desc">Form-fitting. Doesn't leave much to imagination.</p>
<<addItem "tight_briefs" 1>>
<<case "sheer_salvage">>
<p>Delicate, see-through fabric. Probably someone's idea of lingerie once upon a time.</p>
<p class="loot-find">Found: <strong>Sheer Salvage</strong></p>
<p class="item-desc">Extremely revealing. Not practical but... interesting.</p>
<<addItem "sheer_salvage" 1>>
<<case "raider_scraps">>
<p>Patchwork armor cobbled together from various raider kills. It's intimidating but fragile.</p>
<p class="loot-find">Found: <strong>Raider Scraps</strong></p>
<p class="item-desc">+4 Defense. Intimidating but unreliable.</p>
<<addItem "raider_scraps" 1>>
<<case "stolen_underwear">>
<p>It's underwear. Someone else's underwear. How did this survive the apocalypse?</p>
<p class="loot-find">Found: <strong>Stolen Underwear</strong></p>
<p class="item-desc">Secondhand. Questionable origin.</p>
<<addItem "stolen_underwear" 1>>
<<case "vault_jumpsuit">>
<p>A pre-war Vault-Tec jumpsuit, still bearing the iconic vault number on the back. Almost a collectors item.</p>
<p class="loot-find">Found: <strong>Vault Jumpsuit</strong></p>
<p class="item-desc">Pre-war issue. Intact and surprisingly clean.</p>
<<addItem "vault_jumpsuit" 1>>
<<case "sports_wrap">>
<p>Supportive athletic wear designed for active movement. Still in good shape.</p>
<p class="loot-find">Found: <strong>Sports Wrap</strong></p>
<p class="item-desc">Practical and supportive.</p>
<<addItem "sports_wrap" 1>>
<<case "sewing_kit">>
<p>A small collection of needles, thread, and patches. Useful for maintaining your gear.</p>
<p class="loot-find">Found: <strong>Sewing Kit</strong></p>
<p class="item-desc">Can repair damaged clothing.</p>
<<addItem "sewing_kit" 1>>
<<case "reinforced_wraps">>
<p>Sturdy wraps designed to protect vital areas. Not pretty, but effective.</p>
<p class="loot-find">Found: <strong>Reinforced Wraps</strong></p>
<p class="item-desc">Practical protection. Not attractive.</p>
<<addItem "reinforced_wraps" 1>>
<<case "survivor_shirt">>
<p>You uncover a faded pre-war t-shirt with makeshift patches sewn in. Someone tried to keep this thing going.</p>
<p class="loot-find">Found: <strong>Survivor's Shirt</strong></p>
<<if !$wardrobe.player.tops.includes("survivor_shirt")>>
<<run $wardrobe.player.tops.push("survivor_shirt")>>
<p>Added to your wardrobe!</p>
<<else>>
<p>You already have one of these.</p>
<</if>>
<<case "tank_top">>
<p>A sleeveless shirt tucked away in a drawer. Minimal fabric, maximum mobility.</p>
<p class="loot-find">Found: <strong>Tank Top</strong></p>
<<if !$wardrobe.player.tops.includes("tank_top")>>
<<run $wardrobe.player.tops.push("tank_top")>>
<p>Added to your wardrobe!</p>
<<else>>
<p>You already have one of these.</p>
<</if>>
<<case "flannel_shirt">>
<p>A rugged button-up flannel shirt, still in decent shape. Practical for life in the Reclaimed.</p>
<p class="loot-find">Found: <strong>Flannel Shirt</strong></p>
<<if !$wardrobe.player.tops.includes("flannel_shirt")>>
<<run $wardrobe.player.tops.push("flannel_shirt")>>
<p>Added to your wardrobe!</p>
<<else>>
<p>You already have one of these.</p>
<</if>>
<<case "tactical_shirt">>
<p>Hidden in a footlocker: a military-style utility shirt with reinforced elbows. Someone knew what they were doing.</p>
<p class="loot-find">Found: <strong>Tactical Shirt</strong></p>
<<if !$wardrobe.player.tops.includes("tactical_shirt")>>
<<run $wardrobe.player.tops.push("tactical_shirt")>>
<p>Added to your wardrobe!</p>
<<else>>
<p>You already have one of these.</p>
<</if>>
<<case "formal_shirt">>
<p>You find a pre-war dress shirt, still crisp despite the decades. Impractical but undeniably stylish.</p>
<p class="loot-find">Found: <strong>Formal Shirt</strong></p>
<<if !$wardrobe.player.tops.includes("formal_shirt")>>
<<run $wardrobe.player.tops.push("formal_shirt")>>
<p>Added to your wardrobe!</p>
<<else>>
<p>You already have one of these.</p>
<</if>>
<<case "hoodie">>
<p>A comfortable hooded sweatshirt, worn but functional. Perfect for cold nights in the vault.</p>
<p class="loot-find">Found: <strong>Hoodie</strong></p>
<<if !$wardrobe.player.tops.includes("hoodie")>>
<<run $wardrobe.player.tops.push("hoodie")>>
<p>Added to your wardrobe!</p>
<<else>>
<p>You already have one of these.</p>
<</if>>
<<case "cargo_pants">>
<p>Sturdy pants with an abundance of pockets. A Reclaimed classic.</p>
<p class="loot-find">Found: <strong>Cargo Pants</strong></p>
<<if !$wardrobe.player.bottoms.includes("cargo_pants")>>
<<run $wardrobe.player.bottoms.push("cargo_pants")>>
<p>Added to your wardrobe!</p>
<<else>>
<p>You already have one of these.</p>
<</if>>
<<case "jeans">>
<p>Classic denim jeans, worn and faded but still durable. The apocalypse hasn't killed fashion.</p>
<p class="loot-find">Found: <strong>Jeans</strong></p>
<<if !$wardrobe.player.bottoms.includes("jeans")>>
<<run $wardrobe.player.bottoms.push("jeans")>>
<p>Added to your wardrobe!</p>
<<else>>
<p>You already have one of these.</p>
<</if>>
<<case "shorts">>
<p>Lightweight shorts that allow for easy movement. Not much protection, but comfortable.</p>
<p class="loot-find">Found: <strong>Shorts</strong></p>
<<if !$wardrobe.player.bottoms.includes("shorts")>>
<<run $wardrobe.player.bottoms.push("shorts")>>
<p>Added to your wardrobe!</p>
<<else>>
<p>You already have one of these.</p>
<</if>>
<<case "tactical_pants">>
<p>Military-grade cargo pants with reinforced knees. Built to last in harsh conditions.</p>
<p class="loot-find">Found: <strong>Tactical Pants</strong></p>
<<if !$wardrobe.player.bottoms.includes("tactical_pants")>>
<<run $wardrobe.player.bottoms.push("tactical_pants")>>
<p>Added to your wardrobe!</p>
<<else>>
<p>You already have one of these.</p>
<</if>>
<<case "dress_pants">>
<p>Pre-war formal trousers, somehow still pressed. Utterly impractical for survival, but they'd make an impression.</p>
<p class="loot-find">Found: <strong>Dress Pants</strong></p>
<<if !$wardrobe.player.bottoms.includes("dress_pants")>>
<<run $wardrobe.player.bottoms.push("dress_pants")>>
<p>Added to your wardrobe!</p>
<<else>>
<p>You already have one of these.</p>
<</if>>
<<case "skirt">>
<p>A short skirt, offering mobility at the cost of protection. Bold choice for the Reclaimed.</p>
<p class="loot-find">Found: <strong>Skirt</strong></p>
<<if !$wardrobe.player.bottoms.includes("skirt")>>
<<run $wardrobe.player.bottoms.push("skirt")>>
<p>Added to your wardrobe!</p>
<<else>>
<p>You already have one of these.</p>
<</if>>
<<default>>
<p>You find some old clothes, but they're not worth keeping.</p>
<</switch>>
<<link "Continue" $currentLocation.return>><</link>><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 $equipped.armor.currentDurability < 50>>
<span class="clothing-state ruined">(Damaged)</span>
<<elseif $equipped.armor.currentDurability < 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>>
<<set _equippedTop to $wardrobe.player.equippedTop>>
<<set _equippedBottom to $wardrobe.player.equippedBottom>>
<<set _topData to $clothingDatabase.tops[_equippedTop]>>
<<set _bottomData to $clothingDatabase.bottoms[_equippedBottom]>>
<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 UInv.BagHasItem("player", "sewing kit")>>
| <<link "Repair top" "Wardrobe_Player_Clothes">><<set $clothing.player.top to Math.min(100, $clothing.player.top + 50)>><<run UInv.DeleteItem("player", "sewing kit")>><</link>>
<<else>>
| <span class="disabled">Repair top (no sewing kit)</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 UInv.BagHasItem("player", "sewing kit")>>
| <<link "Repair bottom" "Wardrobe_Player_Clothes">><<set $clothing.player.bottom to Math.min(100, $clothing.player.bottom + 50)>><<run UInv.DeleteItem("player", "sewing kit")>><</link>>
<<else>>
| <span class="disabled">Repair bottom (no sewing kit)</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"></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"></div>
<div class="item-name">Go Commando</div>
<div class="item-meta">exposed</div>
<div class="item-actions">
<<link "[Select]">>
<<set $wardrobe.player.equipped to "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 _eqImageId to setup.itemImageId($equippedArmor)>>
<<set _eqDur to $equippedArmorData.durability || 100>>
<<set _eqMax to $equippedArmorData.maxDurability || 100>>
<<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="'assets/images/items/' + _eqImageId + '.webp'" 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 _imageId to setup.itemImageId(_armor.name)>>
<<set _durPercent to Math.round((_armor.durability / _armor.maxDurability) * 100)>>
<<capture _armor, _imageId, _durPercent>>
<div class="wardrobe-card">
<div class="item-image">
<img @src="'assets/images/items/' + _imageId + '.webp'" 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"></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 $equipped.armor && $equipped.armor.currentDurability < $equipped.armor.maxDurability>>
<<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>
<<updateExposure "player">>
<</if>>
<<if _hasArmorDamage>>
<h3>Armor</h3>
<p><<print $equipped.armor.name>>: <<print $equipped.armor.currentDurability>>/<<print $equipped.armor.maxDurability>> <<icon "forward">> </p>
<<set $equipped.armor.currentDurability to $equipped.armor.maxDurability>>
<p><strong><<print $equipped.armor.maxDurability>>/<<print $equipped.armor.maxDurability>></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>
<<if !$savedOutfits>><<set $savedOutfits to { player: [], kira: [] }>><</if>>
<<if !$savedOutfits.player>><<set $savedOutfits.player to []>><</if>>
<<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()>>
Outfit saved successfully.
<<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 <<if $wardrobe.player.equipped === _itemId>>equipped<</if>>">
<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 <<if _item.effects.lustGain > 1>>negative<<else>>positive<</if>>">
<<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">• Visible bulge 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 class="intimate-selection">
<<for _itemId range $wardrobe.kira.intimate>>
<<capture _itemId>>
<<set _item to $intimateApparel.kira[_itemId]>>
<div class="intimate-card <<if $wardrobe.kira.equipped === _itemId>>equipped<</if>>">
<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 <<if $exhibitionism.kira >= _item.requires.exhibitionism>>met<<else>>unmet<</if>>">
<<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 <<if $companions[0].trust >= _item.requires.trust>>met<<else>>unmet<</if>>">
<<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">>
<<say $player.name "Actually, you know what? Your call. Wear what you're comfortable with.">>
<<kiraChoosesOwnClothes>>
<<relationChange "kira" "trust" 1>>
<<goto "Vault_Hub">>
<</link>>
</div>
<div class="choice-container">
<<vchoice "Never mind" "Vault_Hub" "action" "check">>
</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 <<if _item.effects.lustGain > 1>>negative<<else>>positive<</if>>">
<<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">Visible Bulge</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 "kiraGreeting">>
<<getExhibTier "kira">>
<<set _pool to null>>
<<if _exhibTier <= 1>>
<<set _pool to setup.textPools.kira_vault_greetings.shy>>
<<elseif _exhibTier <= 3>>
<<set _pool to setup.textPools.kira_vault_greetings.comfortable>>
<<else>>
<<set _pool to setup.textPools.kira_vault_greetings.confident>>
<</if>>
<<if _pool && _pool.length > 0>>
<p class="kira-greeting"><<print _pool.random()>></p>
<</if>>
<</widget>>
<<widget "kiraIdleDescription">>
<<getExhibTier "kira">>
<<set _pool to null>>
<<if _exhibTier <= 1>>
<<set _pool to setup.textPools.kira_vault_idle.shy>>
<<elseif _exhibTier <= 3>>
<<set _pool to setup.textPools.kira_vault_idle.comfortable>>
<<else>>
<<set _pool to setup.textPools.kira_vault_idle.confident>>
<</if>>
<<if _pool && _pool.length > 0>>
<p class="kira-idle"><<print _pool.random()>></p>
<</if>>
<</widget>>
<<widget "kiraNoticesArousal">>
<<if $player.lust >= 50>>
<<getExhibTier "kira">>
<<set _pool to null>>
<<if _exhibTier <= 1>>
<<set _pool to setup.textPools.kira_arousal_comments.shy_notices>>
<<elseif _exhibTier <= 3>>
<<set _pool to setup.textPools.kira_arousal_comments.comfortable_notices>>
<<else>>
<<set _pool to setup.textPools.kira_arousal_comments.confident_notices>>
<</if>>
<<if _pool && _pool.length > 0>>
<p class="kira-arousal-notice"><<print _pool.random()>></p>
<</if>>
<</if>>
<</widget>>
<<widget "kiraTouchReaction">>
<<getExhibTier "kira">>
<<set _pool to null>>
<<if _exhibTier <= 1>>
<<set _pool to setup.textPools.kira_vault_reactions.shy_touch>>
<<elseif _exhibTier <= 3>>
<<set _pool to setup.textPools.kira_vault_reactions.comfortable_touch>>
<<else>>
<<set _pool to setup.textPools.kira_vault_reactions.confident_touch>>
<</if>>
<<if _pool && _pool.length > 0>>
<p class="kira-touch-reaction"><<print _pool.random()>></p>
<</if>>
<</widget>>
<<widget "kiraTensionComment">>
<<if $companions && $companions[0] && $companions[0].tension >= 80>>
<<set _pool to setup.textPools.kira_tension_release.desperate>>
<<if _pool && _pool.length > 0>>
<<say "Kira" _pool.random()>>
<</if>>
<</if>>
<</widget>>
<<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 arousal is obvious. 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.",
"You can't meet Kira's eyes. She's definitely looking.",
"Every instinct screams to find cover. There is none.",
"You're frozen, exposed and helpless."
],
embarrassed: [
"You cover yourself with one hand, cheeks red.",
"You try to angle away from Kira. Doesn't really work.",
"\"Sorry, I— this is—\" You can't finish the sentence.",
"You're very aware of how exposed you are.",
"You catch Kira glancing. She looks away quickly. Mostly."
],
uncomfortable: [
"You cup yourself loosely. It's something.",
"Not ideal, but you can function like this.",
"\"We should probably find me some pants.\"",
"You notice Kira noticing. Pretend you don't.",
"It's awkward, but manageable."
],
tolerant: [
"You've stopped bothering to cover.",
"Kira's seen it all by now anyway.",
"You walk normally, exposed but unbothered.",
"When Kira looks, you just shrug.",
"It is what it is."
],
shameless: [
"You catch Kira staring. Let her.",
"If she's going to look, might as well give her something to see.",
"You stretch, not hiding anything.",
"\"Enjoying the view?\" you ask casually.",
"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."
]
}>>
<<print _reactions[_exhibName].random()>>
<</widget>>
<<widget "kiraReactsToClothingStyle">>
<<if !$wardrobe or !$wardrobe.player or !$wardrobe.player.equippedTop>>
<<return>>
<</if>>
<<set _equippedTop to $wardrobe.player.equippedTop>>
<<set _topStyle to "">>
<<if $clothingDatabase and $clothingDatabase.tops and $clothingDatabase.tops[_equippedTop]>>
<<set _topStyle to $clothingDatabase.tops[_equippedTop].style>>
<</if>>
<<if !_topStyle>>
<<return>>
<</if>>
<<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>>
<</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);">
<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);">
<h3 style="color: var(--accent-gold); margin-bottom: var(--space-lg);">Kira's Clothing</h3>
<div class="item-actions">
<<link "[Browse Wardrobe]" "Storage_Kira_Wardrobe">><</link>>
</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 false>>
<<set _clothCount to 0>>
<<if typeof UInv !== 'undefined' && UInv.BagExists("player") && UInv.BagHasItem("player", "cloth")>>
<<set _hasCloth to true>>
<<set _clothCount to UInv.GetItemPropertyValue("player", "cloth", "UInvQuantity") || 1>>
<</if>>
<<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;"><<= _clothCount>> cloth available</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"></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]">><<set $clothing.player.top to Math.min(100, $clothing.player.top + 50)>><<updateExposure "player">><<uinvRemoveItem "cloth" 1>><<goto "Vault_Storage">><</link>></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"></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]">><<set $clothing.player.bottom to Math.min(100, $clothing.player.bottom + 50)>><<updateExposure "player">><<uinvRemoveItem "cloth" 1>><<goto "Vault_Storage">><</link>></div>
<</if>>
</div>
</div>
<<if $clothing.kira>>
<<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"></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]">><<set $clothing.kira.top to Math.min(100, $clothing.kira.top + 50)>><<updateExposure "kira">><<uinvRemoveItem "cloth" 1>><<goto "Vault_Storage">><</link>></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"></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]">><<set $clothing.kira.bottom to Math.min(100, $clothing.kira.bottom + 50)>><<updateExposure "kira">><<uinvRemoveItem "cloth" 1>><<goto "Vault_Storage">><</link>></div>
<</if>>
</div>
</div>
<</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 $clothing.player.underwear || 100>>
<<set _underwearData to $intimateApparel && $intimateApparel.player ? $intimateApparel.player[_underwearId] : null>>
<<set _underwearFallbackImages to {
"standard": "media/clothing/intimate/player/standard_v2.webp",
"reinforced": "media/clothing/intimate/player/reinforced_v2.webp",
"tight": "media/clothing/intimate/player/tight_v2.webp"
}>>
<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"></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"></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 (_underwearData && _underwearData.image) ? _underwearData.image : (_underwearFallbackImages[_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]">>
<<set $wardrobe.player.equipped to "commando">>
<<goto "Storage_Player_Wardrobe">>
<</link>>
</div>
<<elseif _underwearId === "commando">>
<div class="item-image"></div>
<div class="slot-item">Commando</div>
<div class="slot-actions">
<<link "[Change]" "Wardrobe_Change_Underwear">><</link>>
</div>
<<else>>
<div class="item-image"></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>>
<<set _armorImageId to setup.itemImageId($equippedArmor)>>
<div class="item-image">
<img @src="'assets/images/items/' + _armorImageId + '.webp'" 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"></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]">>
<<set $clothing.player.top to 100>>
<<set $wardrobe.player.equippedTop to _topId>>
<<run $storage.spareClothes.tops.splice(_i, 1)>>
<<updateExposure "player">>
<<goto "Storage_Player_Wardrobe">>
<</link>>
</div>
</div>
<</capture>>
<</for>>
<</if>>
<div class="wardrobe-card">
<div class="item-image"></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]">>
<<set $clothing.player.bottom to 100>>
<<set $wardrobe.player.equippedBottom to _bottomId>>
<<run $storage.spareClothes.bottoms.splice(_i, 1)>>
<<updateExposure "player">>
<<goto "Storage_Player_Wardrobe">>
<</link>>
</div>
</div>
<</capture>>
<</for>>
<</if>>
<div class="wardrobe-card">
<div class="item-image"></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]">>
<<set $clothing.player.top to 100>>
<<set $wardrobe.player.equippedTop to _topId>>
<<run $storage.spareClothes.tops.splice(_i, 1)>>
<<updateExposure "player">>
<<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]">>
<<set $clothing.player.bottom to 100>>
<<set $wardrobe.player.equippedBottom to _bottomId>>
<<run $storage.spareClothes.bottoms.splice(_i, 1)>>
<<updateExposure "player">>
<<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 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"></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"></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">
<<vchoice "Back to Storage" "Vault_Storage" "action" "return">>
</div><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>Suggest What Kira Should Wear</h2>
<p>You have enough trust with Kira to suggest what she wears.</p>
<<getCompanion "kira">>
<<if !$tempCompanion>>
<p class="system-error">Kira is not available.</p>
<<else>>
<div class="suggestion-options">
<h3>What should Kira wear?</h3>
<<link "Suggest something revealing">>
<<say $player.name "I think you should wear something that shows off more... assets.">>
<<say "Kira" "Well, okay. If you want me to...">>
<<set _revealingBottoms to $wardrobe.kira.bottoms.filter(id => $clothingDatabase.bottoms[id] && $clothingDatabase.bottoms[id].style === "revealing")>>
<<if _revealingBottoms.length > 0>>
<<set $wardrobe.kira.equippedBottom to _revealingBottoms[0]>>
<<else>>
<<if $wardrobe.kira.bottoms.includes("shorts")>>
<<set $wardrobe.kira.equippedBottom to "shorts">>
<</if>>
<</if>>
<<set $clothing.kira.top to 100>>
<<set $clothing.kira.bottom to 100>>
<<updateExposure "kira">>
<<relationChange "kira" "lust" 8>>
<<relationChange "kira" "submission" 3>>
<<goto "Storage_Kira_Wardrobe">>
<</link>>
<<link "Suggest something modest">>
<<say $player.name "Cover up a bit more. I like some mystery.">>
<<say "Kira" "Alright. If that's what you prefer.">>
<<set _modestTops to $wardrobe.kira.tops.filter(id => $clothingDatabase.tops[id] && ($clothingDatabase.tops[id].style === "tactical" || $clothingDatabase.tops[id].style === "rugged"))>>
<<set _modestBottoms to $wardrobe.kira.bottoms.filter(id => $clothingDatabase.bottoms[id] && ($clothingDatabase.bottoms[id].style === "tactical" || $clothingDatabase.bottoms[id].style === "rugged"))>>
<<if _modestTops.length > 0>>
<<set $wardrobe.kira.equippedTop to _modestTops[0]>>
<</if>>
<<if _modestBottoms.length > 0>>
<<set $wardrobe.kira.equippedBottom to _modestBottoms[0]>>
<</if>>
<<set $clothing.kira.top to 100>>
<<set $clothing.kira.bottom to 100>>
<<updateExposure "kira">>
<<relationChange "kira" "submission" 2>>
<<goto "Storage_Kira_Wardrobe">>
<</link>>
<<link "Suggest combat gear">>
<<say $player.name "Wear something practical. We might need to fight.">>
<<say "Kira" "Good call. Always ready.">>
<<set _tacticalTops to $wardrobe.kira.tops.filter(id => $clothingDatabase.tops[id] && $clothingDatabase.tops[id].style === "tactical")>>
<<set _tacticalBottoms to $wardrobe.kira.bottoms.filter(id => $clothingDatabase.bottoms[id] && $clothingDatabase.bottoms[id].style === "tactical")>>
<<if _tacticalTops.length > 0>>
<<set $wardrobe.kira.equippedTop to _tacticalTops[0]>>
<</if>>
<<if _tacticalBottoms.length > 0>>
<<set $wardrobe.kira.equippedBottom to _tacticalBottoms[0]>>
<</if>>
<<set $clothing.kira.top to 100>>
<<set $clothing.kira.bottom to 100>>
<<updateExposure "kira">>
<<relationChange "kira" "trust" 1>>
<<goto "Storage_Kira_Wardrobe">>
<</link>>
</div>
<</if>>
<div class="choice-container">
<<vchoice "Back to Wardrobe" "Storage_Kira_Wardrobe" "action" "return">>
</div><h2>Repair Station</h2>
<p>Use cloth materials to restore damaged clothing. Each repair uses 1 cloth and restores 50 durability.</p>
<<set _hasCloth to false>>
<<set _clothCount to 0>>
<<if typeof UInv !== 'undefined' && UInv.BagExists("player")>>
<<if UInv.BagHasItem("player", "cloth")>>
<<set _hasCloth to true>>
<<set _clothCount to UInv.GetItemPropertyValue("player", "cloth", "UInvQuantity") || 1>>
<</if>>
<</if>>
<<if _hasCloth>>
<p class="system-info">You have <strong><<= _clothCount>></strong> cloth available for repairs.</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 $clothing.player.top || 100>>
<<set _playerTopData to _playerTop ? $clothingDatabase.tops[$wardrobe.player.equippedTop] : null>>
<<uinvGetWornClothing "bottom" "player">>
<<set _playerBottom to $wornItem>>
<<set _playerBottomDur to $clothing.player.bottom || 100>>
<<set _playerBottomData to _playerBottom ? $clothingDatabase.bottoms[$wardrobe.player.equippedBottom] : 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%]">>
<<set $clothing.player.top to Math.min(100, $clothing.player.top + 50)>>
<<updateExposure "player">>
<<uinvRemoveItem "cloth" 1>>
<<goto "Storage_Repair_Station">>
<</link>>
</div>
<<elseif _playerTopDur >= 100>>
<div class="item-meta">Good condition</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%]">>
<<set $clothing.player.bottom to Math.min(100, $clothing.player.bottom + 50)>>
<<updateExposure "player">>
<<uinvRemoveItem "cloth" 1>>
<<goto "Storage_Repair_Station">>
<</link>>
</div>
<<elseif _playerBottomDur >= 100>>
<div class="item-meta">Good condition</div>
<</if>>
</div>
</div>
<<if $clothing.kira>>
<<set _kiraTopDur to $clothing.kira.top || 100>>
<<set _kiraBottomDur to $clothing.kira.bottom || 100>>
<<set _kiraTopData to $clothingDatabase.tops[$wardrobe.kira.equippedTop]>>
<<set _kiraBottomData to $clothingDatabase.bottoms[$wardrobe.kira.equippedBottom]>>
<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%]">>
<<set $clothing.kira.top to Math.min(100, $clothing.kira.top + 50)>>
<<updateExposure "kira">>
<<uinvRemoveItem "cloth" 1>>
<<goto "Storage_Repair_Station">>
<</link>>
</div>
<<elseif _kiraTopDur >= 100>>
<div class="item-meta">Good condition</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%]">>
<<set $clothing.kira.bottom to Math.min(100, $clothing.kira.bottom + 50)>>
<<updateExposure "kira">>
<<uinvRemoveItem "cloth" 1>>
<<goto "Storage_Repair_Station">>
<</link>>
</div>
<<elseif _kiraBottomDur >= 100>>
<div class="item-meta">Good condition</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 <<print _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") || 20>>
<p class="storage-info">Your backpack: <<print _playerItems.length>>/<<print _maxSlots>> slots 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 <<print _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 "damageClothingWithArmor">>
<<set _who to _args[0]>>
<<set _part to _args[1]>>
<<set _damage to Number(_args[2]) || 15>>
<<if _who === "player" && $equipped.armor>>
<<set _currentDur to Number($equipped.armor.currentDurability)>>
<<if isNaN(_currentDur)>><<set _currentDur to 0>><</if>>
<<set $equipped.armor.currentDurability to _currentDur>>
<<if _currentDur gt 0>>
<<set _armorAbsorb to Math.min(_damage, _currentDur)>>
<<set $equipped.armor.currentDurability -= _armorAbsorb>>
<<set _remainingDamage to _damage - _armorAbsorb>>
<<if $equipped.armor.currentDurability <= 0>>
<<set _brokenArmor to $equipped.armor>>
<<set $equipped.armor to null>>
<p class="system-alert">Your <<print _brokenArmor.name>> breaks apart!</p>
<</if>>
<<if _remainingDamage > 0>>
<<damageClothing _who _part _remainingDamage>>
<<else>>
<</if>>
<<else>>
<<damageClothing _who _part _damage>>
<</if>>
<<else>>
<<damageClothing _who _part _damage>>
<</if>>
<</widget>>
<<widget "repairArmor">>
<<set _amount to _args[0] || 25>>
<<if $equipped.armor>>
<<set $equipped.armor.currentDurability to Math.min(
$equipped.armor.maxDurability,
$equipped.armor.currentDurability + _amount
)>>
<</if>>
<</widget>>
<<widget "equipIntimate">>
<<set _who to _args[0]>>
<<set _itemId to _args[1]>>
<<if _who === "player">>
<<if $wardrobe.player.intimate.includes(_itemId)>>
<<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>>
<</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)>>
<<set $flags.exposedToday 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 _armor.currentDurability <= (_armor.maxDurability * 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 "describeClothingState">>
<<set _who to _args[0]>>
<<set _c to $clothing[_who] || {}>>
<<set _top to _c.top || 0>>
<<set _bottom to _c.bottom || 0>>
<<set _isExposed to _c.titsExposed || _c.pussyExposed || _c.dickExposed>>
<div class="clothing-description">
<<print setup.getClothingDescription(_who, "top", _top)>>.
<<print setup.getClothingDescription(_who, "bottom", _bottom)>>.
<<if _isExposed>>
<p class="exposure-warning">
<<print setup.clothingDescriptions.exposure[(_who === "player") ? "player" : "other"]>>
</p>
<</if>>
</div>
<</widget>>
<<widget "saveOutfit">>
<<set _who to _args[0]>>
<<set _name to _args[1]>>
<<set _outfit to {
name: _name,
armor: clone($equipped.armor),
top: $wardrobe[_who].equippedTop,
bottom: $wardrobe[_who].equippedBottom,
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 $equipped.armor>>
<<uinvUnequipArmor>>
<</if>>
<<if _outfit.armor && _outfit.armor.name>>
<<uinvEquipArmor _outfit.armor.name>>
<<else>>
<<set $equipped.armor to null>>
<</if>>
<<if _outfit.top>>
<<set $wardrobe.player.equippedTop to _outfit.top>>
<</if>>
<<if _outfit.bottom>>
<<set $wardrobe.player.equippedBottom to _outfit.bottom>>
<</if>>
<<equipIntimate "player" _outfit.intimate>>
<<set $clothing.player.top to 100>>
<<set $clothing.player.bottom to 100>>
<<updateExposure "player">>
<<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">>
<<if $clothing.kira.titsExposed && !$flags.kiraFirstTitsExposure>>
<<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>>
<<set $flags.kiraFirstPussyExposure to true>>
<<set $flags.exposureEventPending to "Event_First_Exposure_Kira_Pussy">>
<</if>>
<</if>>
<</widget>>