<center><h2>Content Disclaimer</h2></center>
This is a dark, post-apocalyptic survival game featuring morally complex choices, adult themes, and strong consequences.
The game does not glorify violence or immoral behavior - instead, it presents players with difficult decisions and lets them face the consequences.
All NSFW scenes involve consensual interactions between fictional characters and are portrayed within the narrative context.
The world is brutal, but your choices define who you become - for better or worse.
<<button "Agree">><<goto "MainMenu">><</button>><<script>>
const ts = Date.now(); // cache-buster
importScripts("js/nsfwMediaIndex.js?v=" + ts)
.then(() => {
console.log("[NSFW] mediaIndex loaded:", setup.mediaIndex);
window.setup = setup;
})
.catch(err => alert("Nie udało się wczytać nsfwMediaIndex.js: " + err));
<</script>>
<<script>>
setup.sceneIDToFolder = sceneID => {
const [gender, race] = sceneID.split("_");
return gender === "female" ? race + "fem" : race + "man";
};
setup.getRandomNSFWMedia = (sceneID, action) => {
const folder = setup.sceneIDToFolder(sceneID);
const list = setup.mediaIndex?.[folder]?.[action];
if (!list || list.length === 0) return null;
return `assets/characters/${folder}/${action}/${list.random()}`;
};
window.setup = setup;
<</script>>
<<script>>
setup.getRandomCompanionMedia = function (companionId, action) {
const list = setup.mediaIndex?.[companionId]?.[action];
if (!list || list.length === 0) return null;
return `assets/characters/${companionId}/${action}/${setup.random(list)}`;
};
setup.resolveCompanionNSFWMedia = function () {
const v = State.variables;
if (!v || !v.currentCompanion || !v.lastAction) return;
const media = setup.getRandomCompanionMedia(v.currentCompanion, v.lastAction);
if (media) v.currentMedia = media;
};
window.setup = setup;
<</script>>
<<set $sessionTimestamp = Date.now()>>
<<set setup.textFemale = JSON.parse(Story.get("TextFemale").text)>>
<<run setup.textFemale = JSON.parse(Story.get("TextFemale").text.trim()); window.setup = setup >>
<<set setup.textMale = JSON.parse(Story.get("TextMale").text)>>
<<run setup.textMale = JSON.parse(Story.get("TextMale").text.trim()); window.setup = setup >>
<<set setup.nsfwOptions = JSON.parse(Story.get("RandomNSFWoptions").text)>>
<<run
setup.sceneIDToFolder = function (sceneID) {
const [gender, race] = sceneID.split("_");
return gender === "female" ? race + "fem" : race + "man";
};
setup.getRandomNSFWMedia = function (sceneID, action) {
const folder = setup.sceneIDToFolder(sceneID);
const list = setup.mediaIndex?.[folder]?.[action];
if (!list || list.length === 0) return null;
return `assets/characters/${folder}/${action}/${setup.random(list)}`;
};
window.setup = setup;
>>
<<set $lastRecruitOfferDay = null>>
<<set $recruitCandidateId = null>>
<<set $recruitAllowSwap = true>>
<<set $version = 0.01>>
<<set $day = 1>>
<<set $gameTime = new Date(1970,0,1,6,0)>>
<<set $eventToday = false>>
<<set $seenEvents = []>>
<<set $showBar = false>>
<<set $unlockedLocations = []>>
<<set $shower = false>>
<<set $nap = false>>
<<set $camera = false>>
<<set $catAngel = false>>
<<set $reputation = 0>>
<<set $currency = 0>>
<<set $traderRep = 0>>
<<set $trader = true>>
<<set $player = {
name: "",
energy: 100,
maxEnergy: 100,
health: 100,
maxHealth: 100,
hunger: 0,
maxHunger: 100,
thirst: 0,
maxThirst: 100,
strength: 0,
endurance: 0,
intelligence: 0,
inventory: [],
companions: []
}>>
<<set $barHiddenPassages = ["Start","PreGame","SelectProfile","EnterName"]>>
<<set $randomEvents = []>>
<<set $npcs = [
{ id: "dee", name: "Dee", gender: "female", strengthMin: 1, strengthMax: 4, enduranceMin: 4, enduranceMax: 9, intelligenceMin: 4, intelligenceMax: 9 },
{ id: "rose", name: "Rose", gender: "female", strengthMin: 2, strengthMax: 5, enduranceMin: 3, enduranceMax: 7, intelligenceMin: 4, intelligenceMax: 9 },
{ id: "mia", name: "Mia", gender: "female", strengthMin: 1, strengthMax: 3, enduranceMin: 3, enduranceMax: 6, intelligenceMin: 4, intelligenceMax: 9 },
{ id: "isabel", name: "Isabel", gender: "female", strengthMin: 2, strengthMax: 5, enduranceMin: 2, enduranceMax: 5, intelligenceMin: 4, intelligenceMax: 9 },
{ id: "maria", name: "Maria", gender: "female", strengthMin: 3, strengthMax: 7, enduranceMin: 3, enduranceMax: 8, intelligenceMin: 4, intelligenceMax: 9 },
{ id: "lana", name: "Lana", gender: "female",
strengthMin: 4, strengthMax: 8,
enduranceMin: 2, enduranceMax: 5,
intelligenceMin: 1, intelligenceMax: 3 }
]>>
<<script>>
State.variables.npcs.forEach(npc => {
npc.hunger = npc.hunger ?? 0;
npc.maxHunger = npc.maxHunger ?? 100;
npc.thirst = npc.thirst ?? 0;
npc.maxThirst = npc.maxThirst ?? 100;
});
State.variables.player.hunger = State.variables.player.hunger ?? 0;
State.variables.player.maxHunger = State.variables.player.maxHunger ?? 100;
State.variables.player.thirst = State.variables.player.thirst ?? 0;
State.variables.player.maxThirst = State.variables.player.maxThirst ?? 100;
State.variables.companionRel = State.variables.companionRel || {};
State.variables.npcs.forEach(npc => {
if (State.variables.companionRel[npc.id] == null) {
State.variables.companionRel[npc.id] = 0; // start od 0
}
});
<</script>>
<<script>>State.variables.unlockedLocations = setup.nightLocations
.filter(loc => loc.starter)
.map(loc => loc.id);
State.variables.items = setup.itemDefs;<</script>>
<<set $selectedCompanions = [null, null]>>
<<set $unlockedCompanions = []>>
<<set $gymUpgrade = false>>
<<set $bedUpgrade = false>>
<<set $showerUpgrade = false>>
<<set $radio = false>>
<<set $dailyradio = true>><<if $player.energy < 1>><<set $player.energy = 0>><</if>>
<<include "widget - death">><<include "widget - UpdateStatuses">><<include "check version">><<nobr>>
<<set $player.energy = $player.maxEnergy>>
<<set $player.sleepQuality = "normal">>
<<if $player.beatenDaysLeft <= 0>>
<<set $player.beaten = false>>
<</if>>
<<if $player.bleeding or $player.beaten>>
<<set $player.energy -= 30>>
<<set $player.sleepQuality = "restless">>
<<elseif $player.arousal >= 80>>
<<set $player.energy -= 20>>
<<set $player.sleepQuality = "horny">>
<</if>>
<<set $player.energy = Math.clamp($player.energy, 0, $player.maxEnergy)>>
<<if not $player.bleeding and not $player.beaten>>
<<set $player.health += 30>>
<</if>>
<<set $player.health = Math.clamp($player.health, 0, $player.maxHealth)>>
<<for _char range $player.companions>>
<<set _h = setup.getHunger(_char)>>
<<set _t = setup.getThirst(_char)>>
<<run setup.setHunger(_char, Math.min(setup.getMaxHun(_char), _h + 5))>>
<<run setup.setThirst(_char, Math.min(setup.getMaxThr(_char), _t + 7))>>
<</for>>
<<set $player.hunger += 5>>
<<set $player.thirst += 7>>
<<set $eventToday = false>>
<<adddays 1>>
<<if $player.beaten>>
<<set $player.beatenDaysLeft -= 1>>
<<if $player.beatenDaysLeft <= 0>>
<<set $player.beaten = false>>
<</if>>
<</if>>
<<if $day % 3 is 0>>
<<set Save.autosave.save()>>
<</if>>
<<if $trader>>
<<set $traderToday = (random(99) < 35)>>
<</if>>
<<set $dailyradio = true>>
<</nobr>><<nobr>><<set _toKick = []>>
<<for _c range $player.companions>>
<<set _id = (typeof _c === 'string') ? _c : _c.id>>
<<if _id>>
<<set _h = State.variables[_id + 'Hunger'] ?? 0>>
<<set _t = State.variables[_id + 'Thirst'] ?? 0>>
<<if _h >= 100 or _t >= 100>>
<<set _toKick.push(_id)>>
<</if>>
<</if>>
<</for>>
<<if _toKick.length>>
<<run _toKick.forEach(id => {
setup.kickCompanion(id);
const V = State.variables;
delete V[`${id}Hunger`];
delete V[`${id}Thirst`];
const name = (V.npcs || []).find(n => n.id===id)?.name || id;
V.lastDeathMessage = `${name} left the bunker due to starvation/dehydration.`;
})>>
<</if>>
<<if $player.bleeding is true>><<set $player.health -= 1>><</if>><</nobr>><<run setup.playMusic('main', 'assets/audio/musicMain.mp3', true)>>\
<div id="bunker-grid" class="option-grid">\
<<if $traderToday is true>><<navbutton "trader" "Trader">><</if>>
<<navbutton "bedroom" "Bedroom">>
<<navbutton "kitchen" "Kitchen">>
<<navbutton "training room" "Training room">>
<<navbutton "crafting" "Crafting">>
</div>\<div id="npc-modal" class="npc-modal"></div><center><h2>The Last Minutes</h2></center>
<p>Your hands tremble as the alarm echoes. You drop into the chair, almost frozen. On the screen, the world outside collapses into fire and dust…</p>
<center><video width="480" height="320" controls autoplay playsinline loop>
<source src="assets/ui/introvid.mp4" type="video/mp4">
</video>
</center>
<p>The broadcast cuts to static. You draw a deep breath, grab the handle, and pull. The heavy bunker hatch slams shut. Darkness swallows you…</p>
<<button "Enter the Bunker">><<goto "Bunker">><</button>><<run $("#ui-bar").hide()>>
<div class="main-menu">
<<link "New Game">><<goto "Intro">><</link>>
<<link "Load Game">><<goto "LoadMenu">><</link>>
<<link "Credits">><<goto "Credits">><</link>>
</div><center><h2>What do you take with you?</h2></center>
<p>The old radio crackles with a desperate broadcast: “Seek shelter immediately! Take only what you can carry!"</p>
<div id="pre-game-grid" class="option-grid"></div>
<button id="pre-game-continue">Continue</button><center><h2>Hey, $player.name! Choose your profile.</h2></center>
<p>You rush to the window. Outside, chaos reigns. People scream, cars crash, smoke already rises in the distance.</p>
<div class="profile-choose" id="profile-grid">\
<div class="profile-tile" data-profile="bodybuilder">\
<img src="assets/ui/profile_bodybuilder.jpg" alt="Bodybuilder">\
<div class="label">Bodybuilder</div>\
</div>\
<div class="profile-tile" data-profile="runner">\
<img src="assets/ui/profile_runner.jpg" alt="Runner">\
<div class="label">Runner</div>\
</div>\
<div class="profile-tile" data-profile="student">\
<img src="assets/ui/profile_student.jpg" alt="Student">\
<div class="label">Student</div>\
</div>\
</div>\
<button id="profile-continue" style="display:none" disabled>Continue</button><center><h2>The sirens are howling...</h2></center>
<p>Before you run... Tell me, survivor, what is your name?</p>
<input id="nameInput"
type="text"
placeholder="Your name..."
maxlength="20"
value="John">
<br><br>
<button id="name-continue"> Continue</button><<set _ev = $currentEvent>>\
\
<div class="event-container">\
\
<<if _ev.title>>\
<h2 class="event-title"><<=_ev.title>></h2>\
<</if>>\
<<if $camera and _ev.imageWithCamera>>\
<<print '<center><img src="' + _ev.imageWithCamera + '" class="event-image" style="max-height:500px;"></center>'>>\
<<elseif _ev.image>>\
<<print '<center><img src="' + _ev.image + '" class="event-image" style="max-height:500px;"></center>'>>\
<</if>>\
\
<p class="event-text">\
<<if $camera and _ev.textWithCamera>>\
<<=_ev.textWithCamera>>\
<<else>>\
<<=_ev.text>>\
<</if>>\
</p>\
<div class="event-choices"><<for _i = 0; _i < _ev.choices.length; _i++>>
<<set _c = _ev.choices[_i]>><<capture _c>><div class="event-choice"><<button _c.text>><<if _c.applyEffects>><<run setup.applyEventEffects()>><<else>><<run State.variables._eventEffectBuffer = []>><</if>><<goto _c.passage>>
<</button>></div><</capture>><</for>></div></div><h2>Want to send someone on a scavenge mission?</h2>
<<button "Yes">><<goto "SelectCompanionForNight">><</button>>
<<button "No – Just sleep through the night">><<goto "NewDay">><</button>><div class="map-container"><img src="assets/ui/nightmap.jpg" alt="Nightmap"></div><center><h2>Night Mission Summary</h2></center>
\
<<run setup.applyNightLootOnce()>>\
\
<<set _actor = $nightActor || 'player'>>\
<<set _isPlayer = (_actor === 'player')>>\
<<set _compName = _isPlayer ? 'You' : ($npcs.find(n => n.id === _actor)?.name || _actor)>>\
\
<<if $lastDeathMessage>>\
<div class="alert danger" style="margin:8px 0; padding:10px; border:1px solid #a33; background:#2a0000; color:#f2caca; border-radius:6px;">\
<<=$lastDeathMessage>>
</div>\
<<set $lastDeathMessage = null>>\
<<else>>\
<<= setup.buildLootGrid($lastNightLoot, {
emptyHtml: _isPlayer
? '<p style="text-align:center;opacity:.8;">You found nothing.</p>'
: '<p style="text-align:center;opacity:.8;">' + _compName + ' found nothing.</p>'
}) >>\
<</if>>\
<div style="text-align:center; margin-top:1em;">\
<<button "Continue">><<goto "Bunker">><</button>>
</div><center><h2>Night expedition</h2></center>
<p>Who will go on night reconnaissance?</p>
<div id="night-actor-grid" class="npc-pick-grid"></div>
<button id="night-actor-continue" style="display:none; margin-top:20px; padding:10px 20px; font-size:16px;">Continue</button><h2>Choose gear for the mission</h2>
<div id="night-loadout-grid" class="loadout-grid"></div>
<<button "Continue">><<run setup.rememberLastNightLoadout()>><<goto "SelectNightLocation">><</button>><<set $items = [
/* ————— SURVIVAL ————— */
{
id: "water",
name: "Water Bottle",
type: "consumable",
icon: "assets/ui/water.jpg",
description: "Clean water – restores 30 thirst.",
thirstRestore: 30,
value: 20,
tradeChance: 0.6,
tags: ["survival"]
},
{
id: "cannedFood",
name: "Canned Food",
type: "consumable",
icon: "assets/ui/cannedFood.jpg",
description: "Canned meal – restores 40 hunger.",
hungerRestore: 40,
value: 10,
tradeChance: 0.6,
tags: ["survival"]
},
/* ————— MEDICAL ————— */
{
id: "firstAid",
name: "First Aid Kit",
type: "medical",
icon: "assets/ui/firstAid.jpg",
description: "Heals 50 HP",
healAmount: 50,
value: 50,
tradeChance: 0.4,
tags: ["medical"]
},
{
id: "bandage",
name: "Bandages",
type: "medical",
icon: "assets/ui/bandage.jpg",
description: "Stops bleeding (removes bleed rate).",
removeBleed: true,
value: 10,
tradeChance: 0.6,
tags: ["medical"]
},
/* ————— GEAR (for night expeditions) ————— */
{
id: "flashlight",
name: "Flashlight",
type: "tool",
icon: "assets/ui/flashlight.jpg",
description: "Allows vision at night. +10% loot chance.",
durability: 100,
lootBonus: 0.10,
tradeChance: 0.2,
value: 100,
tags: ["gear","night"]
},
{
id: "knife",
name: "Knife",
type: "weapon",
icon: "assets/ui/knife.jpg",
description: "Basic weapon. Damage: 5.",
durability: 100,
damage: 5,
value: 150,
tradeChance: 0.2,
tags: ["gear","night"]
},
{
id: "map",
name: "Map",
type: "utility",
icon: "assets/ui/map.jpg",
description: "Unlocks 2 new locations after use.",
unlocks: 2,
value: 100,
tradeChance: 0.2,
tags: ["gear","night"]
},
{
id: "bag",
name: "Backpack",
type: "container",
icon: "assets/ui/bag.jpg",
description: "Backpack - adds +2 loot slots.",
capacityBonus: 2,
value: 80,
tradeChance: 0.4,
tags: ["gear","night"]
},
{
id: "suitcase",
name: "Suitcase",
type: "container",
icon: "assets/ui/suitcase.jpg",
description: "Suitcase - adds +4 loot slots.",
capacityBonus: 4,
value: 140,
tradeChance: 0.3,
tags: ["gear","night"]
},
/* ————— CRAFTING ————— */
{
id: "scrapMetal",
name: "Scrap Metal",
type: "crafting",
icon: "assets/ui/scrapMetal.jpg",
description: "Component for crafting.",
value: 5,
tradeChance: 0.9,
tags: ["craft"]
},
{
id: "wood",
name: "Wood",
type: "crafting",
icon: "assets/ui/wood.jpg",
description: "Used for construction and crafting.",
value: 5,
tradeChance: 0.9,
tags: ["craft"]
},
{
id: "electronics",
name: "Electronics",
type: "crafting",
icon: "assets/ui/electronics.jpg",
description: "Used for crafting.",
value: 20,
tradeChance: 0.5,
tags: ["craft"]
},
/* ————— STAT BOOSTERS ————— */
{
id: "steroids",
name: "Steroids",
type: "booster",
icon: "assets/ui/steroids.jpg",
description: "Increases strength by 1.",
stat: "strength",
bonus: 1,
value: 300,
tradeChance: 0.2,
tags: ["booster"]
},
{
id: "book",
name: "Book",
type: "booster",
icon: "assets/ui/book.jpg",
description: "Increases intelligence by 1.",
stat: "intelligence",
bonus: 1,
value: 200,
tradeChance: 0.3,
tags: ["booster"]
},
/* ————— EXTRA WEAPONS ————— */
{
id: "bat",
name: "Baseball Bat",
type: "weapon",
icon: "assets/ui/bat.jpg",
description: "Sturdy melee weapon. Damage: 8.",
durability: 120,
damage: 8,
value: 180,
tradeChance: 0.2,
tags: ["gear","night"]
},
{
id: "pistol",
name: "Pistol",
type: "weapon",
icon: "assets/ui/pistol.jpg",
description: "Firearm. High damage: 15.",
durability: 80,
damage: 15,
value: 500,
tradeChance: 0.1,
tags: ["gear","night"]
},
/* ————— TRADEABLES & RARE ————— */
{
id: "goldRing",
name: "Gold Ring",
type: "trade",
icon: "assets/ui/goldRing.jpg",
description: "Valuable item for trading.",
value: 100,
tags: ["trade"]
},
{
id: "goldWatch",
name: "Gold Watch",
type: "trade",
icon: "assets/ui/goldWatch.jpg",
description: "Rare and expensive – great for barter.",
value: 200,
tags: ["trade"]
},
{
id: "gasMask",
name: "Gas Mask",
type: "gear",
icon: "assets/ui/gasMask.jpg",
description: "Allows entry to contaminated zones.",
unlockZones: true,
value: 500,
tradeChance: 0.1,
tags: ["gear","night"]
}
]>>
<<set _fight = $currentFight>>\
<<if !_fight>>\
<<goto "Bunker">><<stop>>\
<</if>>\
\
<<set _actor = _fight.party[_fight.turnIndex]>>\
\
<<if !_actor.isPlayer>>\
<<run setup.enemyAttack()>>\
<<goto setup.resolveTurn()>>\
<</if>>\
\
<<set _player = _fight.party.find(c => c.isPlayer)>>\
<<set _pPct = Math.round(_player.hp / _player.maxHp * 100)>>\
\
<center><h1>Combat</h1></center>
\
<div class="enemies-section" style="display:flex;gap:20px;justify-content:center;">\
<<set _canAct = _actor.isPlayer>>\
<<for _i = 0; _i < _fight.party.length; _i++>>\
<<set _enemy = _fight.party[_i]>>\
<<if !_enemy.isPlayer>>\
\
<<capture _enemy>>\
<<set _ePct = Math.round(_enemy.hp / _enemy.maxHp * 100)>>\
<<set _imgPath = 'assets/characters/enemies/' + _enemy.spritePrefix + '_' + _enemy.weapon + '.jpg'>>\
<<set _imgHTML = '<img src="' + _imgPath + '" class="enemy-sprite">'>>\
\
<div class="enemy-card" style="text-align:center;">\
<<if _canAct and _enemy.hp > 0>>\
<<linkreplace _imgHTML>>\
<<run setup.playerAttackTarget(_enemy.id)>>\
<<goto setup.resolveTurn()>>\
<</linkreplace>>\
<<else>><<print _imgHTML>><</if>>\
<div><strong><<= _enemy.name>></strong>
(<<= _enemy.weaponName || "?" >>)</div>
\
<<print '<div class="hp-bar enemy">' + '<div class="hp-bar__fill" style="width:' + _ePct + '%;"></div>' + '<div class="hp-bar__text">' + _enemy.hp + ' / ' + _enemy.maxHp + '</div>' + '</div>'>>
<</capture>>\
\
<</if>>\
<</for>>\
</div>\
\
<<if _fight.lastMessage>><div class="combat-log"><p><<= _fight.lastMessage>></p></div><</if>>
\
<div class="fight-ui"><div class="player-section" style="text-align:center;">\
<img src="assets/characters/player/avatar.jpg" style="width: 160px">
<div><strong>You</strong></div>
<<print
'<div class="hp-bar">' +
'<div class="hp-bar__fill" style="width:' + _pPct + '%;"></div>' +
'<div class="hp-bar__text">' + _player.hp + ' / ' + _player.maxHp + '</div>' +
'</div>'>>
</div>
</div><<run setup.startCombat({
enemies: [
{ id: "raider1", name: "Bandyta", maxHp: 30, damage: 4 },
{ id: "raider2", name: "Drugi Bandyta", maxHp: 30, damage: 4 }
],
allies: [],
onWin: "AfterCombat",
onLose: "GameOver"
})>><<if $catAngel is true>><center><img src="assets/ui/death.jpg"></center>
You were lying on the ground, covered in blood and expecting to die. Suddenly, you heard a meow. Then you lost consciousness. Some time later, you woke up in your bunker, but there was no sign of the cat. This time, your guardian angel was watching over you.
<<button "Continue">><<set $catAngel = false>><<set $player.energy = 10>><<set $player.health = 10>><<if $player.hunger >= $player.maxHunger>><<set $player.hunger = 80>><</if>><<if $player.thirst >= $player.maxThirst>><<set $player.thirst = 80>><</if>><<goto "Bunker">><</button>><<elseif $catAngel is false>>\
<center><h1>Game Over</h1></center>
<center><img src="assets/ui/death.jpg"></center>
\
<<set _deadFromHunger = ($player.hunger >= $player.maxHunger)>>\
<<set _deadFromThirst = ($player.thirst >= $player.maxThirst)>>\
<<set _deadFromWounds = ($player.health <= 0)>>\
<<if _deadFromHunger and _deadFromThirst>>\
You black out from starvation and dehydration… You died.
<<elseif _deadFromHunger>>\
You black out from starvation… You died.
<<elseif _deadFromThirst>>\
You black out from dehydration… You died.
<<elseif _deadFromWounds>>\
You black out from losing too much blood… You died.
<<else>>\
You didn't make it... You died.
<</if>>\
<<button "Continue">>
<<run (function(){
try {
if (Save?.autosave?.exists?.() && Save.autosave.load) { Save.autosave.load(); return; }
} catch(e) {}
Engine.restart();
})()>>
<</button>>
<</if>><h2>Something rustles around the corner...</h2>
<p>You see a shadow in the darkness. Prepare for battle.</p>
\
<<set _tier = $currentNightTier>> \
<<set _enemies = setup.generateTieredEnemies(_tier)>>\
\
<<button "Fight">><<run setup.startCombat({
enemies: _enemies,
allies: [],
onWin: "NightMissionSummary",
onLose: "GameOver"
})>>
<<goto "Combat">><</button>><<script>>
$(document).on(':passagedisplay', ev => {
const V = State.variables;
if (ev.passage.title === 'GameOver' || V.__deathGate) return;
const dead =
(V.player.health <= 0) ||
(V.player.hunger >= V.player.maxHunger) ||
(V.player.thirst >= V.player.maxThirst);
if (dead) {
V.__deathGate = true; // bramka przed pętlą
setup.currentFight = null;
SugarCube.Engine.play('GameOver');
}
});
<</script>><<if $showHUD is not false>> \
<<include "HUD">> \
<</if>>\<center><h1>Bedroom</h1></center>
<div id="bunker-grid" class="option-grid">
<<if $radio and $dailyradio == true>><<navbutton "radio" "Use radio">><</if>>
<<navbutton "companions" "Companions">>
<<navbutton "nap" "Nap">>
<<navbutton "shower" "Shower">>
<<navbutton "NightPhase1" "End day">>
</div>
<<button "Back">><<goto "Bunker">><</button>><center><h1>Kitchen</h1></center>
<div id="kitchen-feed-grid"></div>
<<button "Back">><<goto "Bunker">><</button>><center><h1>Training room</h1></center>
<div id="training-grid" class="training-grid">
<<set _needS = 15>><<set _canS = $player.energy >= _needS>><div class="training-tile"><<if _canS>><a data-passage="TrainingSelectPartner" data-setter="$trainingStat = 'strength';"><<print '<img src="assets/ui/strength.jpg" alt="Strength">'>><div class="label">Train Strength</div></a><<else>><div class="tile-block"><<print '<img src="assets/ui/strength.jpg" alt="Strength">'>><div class="label">Not enough energy</div></div><</if>></div>\
\
<<set _needE = 20>>\
<<set _canE = $player.energy >= _needE>>\
<div class="training-tile">\
<<if _canE>>\
<a data-passage="TrainingSelectPartner" data-setter="$trainingStat = 'endurance';">\
<<print '<img src="assets/ui/endurance.jpg" alt="Endurance">'>> \
<div class="label">Train Endurance</div>\
</a>\
<<else>>\
<div class="tile-block">\
<<print '<img src="assets/ui/endurance.jpg" alt="Endurance">'>> \
<div class="label">Not enough energy</div>\
</div>\
<</if>>\
</div>\
\
<<set _needI = 5>>\
<<set _canI = $player.energy >= _needI>>\
<div class="training-tile">\
<<if _canI>>\
<a data-passage="TrainingSelectPartner" data-setter="$trainingStat = 'intelligence';">\
<<print '<img src="assets/ui/intelligence.jpg" alt="Intelligence">'>> \
<div class="label">Study</div>\
</a>\
<<else>>\
<div class="tile-block">\
<<print '<img src="assets/ui/intelligence.jpg" alt="Intelligence">'>> \
<div class="label">Not enough energy</div>\
</div>\
<</if>>\
</div>\
</div>\
<<button "Back">><<goto "Bunker">><</button>><center><img src="assets/locations/nap.webp"></center><<if $nap is false>><<if $bedUpgrade is false>><<set $player.energy += 20>><<elseif $bedUpgrade is true>><<set $player.energy += 30>><</if>><<set $nap to true>><<addmins 90>>
<<if $bedUpgrade is false>>You took a nap and regained some energy.<<elseif $bedUpgrade is true>>You took a nap on your comfortable bed and regained a lot of energy.<</if>><<elseif $nap is true>><<addmins 5>><<set $player.energy += 1>>You lay down for a moment, but you couldn't fall asleep again that day.<</if>>
<<button "Next">><<goto "bedroom">><</button>><center><img src="assets/locations/shower.webp"></center>
<<if $shower is true>><<addmins 5>><<set $player.energy += 1>><<set _alreadyShower = [
"You splash some water on your face, but you've already showered today.",
"You stand under the water briefly, but it doesn’t feel as good the second time.",
"You rinse off quickly, already feeling clean enough."
]>><<print _alreadyShower.random()>><<elseif $shower is false>><<if $showerUpgrade is false>><<set $player.energy += 10>><<elseif $showerUpgrade is true>><<set $player.energy += 20>><</if>><<addmins 20>><<set $shower to true>><<if $showerUpgrade is false>>
You take a quick, cold shower. It's not exactly relaxing, but it helps you feel a bit more awake.<<elseif $showerUpgrade is true>>You enjoy a refreshing hot shower, thanks to your upgraded bathroom. You feel recharged and relaxed.<</if>><</if>>
<<button "Next">><<goto "bedroom">><</button>><<run setup.updateMaxHealth()>>\
<<run setup.updateMaxEnergy()>>\
<<set _stat = ($trainingStat || '').toLowerCase()>>\
<<set _pool = setup.trainingGifs[_stat] ? setup.trainingGifs[_stat] : setup.trainingGifs.default>>\
<<set _gif = _pool.random()>>\
<<print '<center><img src="' + _gif + '" class="training-gif" alt="training ' + _stat + '"></center>'>>\
\
<<if $trainingPartner is null>>\
<<set _base = setup.getTrainingBaseDelta(_stat)>>\
<<if setup.train($trainingStat)>>\
You practice your <<= $trainingStat >> alone and gain +<<=_base>>.
Your new <<= $trainingStat >> is <<= State.variables.player[_stat] >>.
<<else>>\
You're too tired to train.
<</if>>\
<<else>>\
<<set _npc = $npcs.find(n => n.id === $trainingPartner)>>\
<<set _bonus = setup.getTrainingBonus($trainingPartner, _stat)>>\
<<set _base = setup.getTrainingBaseDelta(_stat)>>\
<<if setup.trainWithNPC($trainingStat, $trainingPartner)>>\
You train your <<= $trainingStat >> with <<= _npc ? _npc.name : $trainingPartner >> and gain +<<=_base>><<= _bonus ? ' (+' + _bonus + ' bonus)' : '' >>.
Your new <<= $trainingStat >> is <<= State.variables.player[_stat] >>.
<<set _statsNow = W.getCompanionStats($trainingPartner)>>
Their new <<= $trainingStat >> is <<= _statsNow[_stat] >>.
Your relationship raised.
<<else>>\
You're too tired to train with <<= _npc ? _npc.name : $trainingPartner >>.
<</if>>\
<</if>>\
<<button "Next">><<goto "training room">><</button>>
<div style="text-align: center;"><img src="assets/ui/smalllogo.png" style="max-width: 180px; margin-bottom: 6px;" alt="Game Logo">
<div style="color: #777; font-size: 12px;">Demo version 0.01</div></div>
<hr>
<div class="section-title">Day</div><<= $day>> | <<time24hr>>
<div class="section-title">Stats</div>
<div class="stat-box">⚡ Energy: <span class="ui-value" id="energyDisplay"><<= $player.energy >></span>
❤️ Health: <span class="ui-value" id="healthDisplay"><<= $player.health >></span>
💧 Hydration: <span class="ui-value" id="hydrationDisplay"><<= 100 - Math.max(0, Math.min(100, $player.thirst)) >></span>
🍖 Fullness: <span class="ui-value" id="fullnessDisplay"><<= 100 - Math.max(0, Math.min(100, $player.hunger)) >></span>
</div>\
<div class="section-title">Skills</div>
<div class="stat-box">Str: <span class="ui-value"><<= $player.strength >></span> | End: <span class="ui-value"><<= $player.endurance >></span> | Int: <span class="ui-value"><<= $player.intelligence >></span></div>
<hr>
<div class="section-title">Reputation</div><div class="stat-box reputation"><<= setup.getReputationDisplay() >></div>
<<if $player.bleeding is true>><div class="stat-box ui-danger">You're bleeding...</div><</if>>\
<<if $player.beaten is true>><div class="stat-box ui-danger">You're beaten...</div><</if>>\
<a data-passage="Inventory" class="special-button">📦 Inventory</a>
<a id="wait-60" class="special-button">⏳ Wait 1 hour</a>
<hr>
<a href="https://www.patreon.com/TestovironTesto"><img src="assets/ui/3.png" style="max-width: 180px" alt="Patreon"></a>
<a href="https://subscribestar.adult/testoviron"><img src="assets/ui/sslogo.png" style="max-width: 190px" alt="SubscribeStar"></a>
Join our community and support the development of the game!
<div class="custom-buttons-wrapper"><a href="#" class="special-button saves">💾SAVES</a>
<a href="#" class="special-button settings">⚙️SETTINGS</a>
<a href="#" class="special-button restart">🔄RESTART</a></div><div class="relation-label">Relation: <<print $companionRel[$currentCompanion]>></div><<nobr>><<run setup.resolveCompanionNSFWMedia()>><<if !$currentCompanion and $lastCompanion>><<set $currentCompanion = $lastCompanion>><</if>>
<<if (!$nsfwSceneInitialized) or ($currentScene !== $currentCompanion)>>
<<run setup.startCompanionNSFW({ scenes: $currentCompanion, text: "female" })>>
<</if>>
<<set _npcLabel = 'Her arousal'>>
<<set _sex = $fuckPussyAction>>
<<set _anal = $fuckAssAction>>
<<set $fuckPussyAction = false>>
<<set $fuckAssAction = false>>
<<set $currentScene = $currentCompanion>>
<<run setup.loadNSFWMedia($currentScene)>>
<<run setup.loadNSFWText && setup.loadNSFWText('female')>>
<<run setup.resolveNSFWText && setup.resolveNSFWText()>>
<<set $nsfwMedia = State.variables.nsfwMedia>>
<<set $nsfwGender = 'female'>><</nobr>>\
<div id="nsfw-main">\
<<if !$companionSceneInitialized>>\
<<set $companionSceneInitialized = true>>\
<<set $nsfwSceneStarted = false>>\
<<set $nsfwSceneEnded = false>>\
<<set $playerFinished = false>>\
<<set $currentMedia = setup.getRandomCompanionMedia($currentCompanion, "intro")>>\
<<set _introArray = setup.textFemale?.introText || []>>\
<<set $lastActionText = _introArray.length ? _introArray.random() : "⚠️ Missing introText">>\
<</if>>\
\
<<if $ArousalNPC >= 100>>\
<<run (function(){
const v = State.variables;
// NPC u kompanów = female
if ((State.temporary._sex || State.temporary._anal) && setup.hasCompanionNSFW('finishhersex')) {
setup.pickCompanionNSFW('finishhersex');
} else if (setup.hasCompanionNSFW('finishher')) {
setup.pickCompanionNSFW('finishher');
}
v.ArousalNPC = 45; // cooldown
})()>>\
<</if>>\
\
<<set _mediaData = $nsfwMedia[$currentScene]>>\
<<if !$currentMedia and _mediaData and _mediaData.intro and _mediaData.intro.length > 0>>\
<<set $currentMedia = setup.getRandomCompanionMedia($currentScene, "intro")>>\
<</if>>\
<div class="nsfw-frame"><div class="arousal-col"><<print '<div class="arousal-meter npc female" style="--level:' + $ArousalNPC + '%;" data-level="' + $ArousalNPC + '"></div>'>><div class="arousal-label"><<= _npcLabel>></div></div>\
<div class="nsfw-media"><center><<if $currentMedia and (!$nsfwSceneEnded or $nsfwEndCard)>><<if $currentMedia.endsWith(".mp4")>><<print '<video src="' + $currentMedia + '" autoplay muted loop style="max-width:100%; max-height:400px; border-radius:8px;"></video>'>><<else>><<print '<img src="' + $currentMedia + '" style="max-width:100%; max-height:400px; border-radius:8px;" />'>><</if>><</if>></center></div>
<div class="arousal-col"><<print '<div class="arousal-meter player" style="--level:' + $ArousalPlayer + '%;" data-level="' + $ArousalPlayer + '"></div>'>><div class="arousal-label">Your arousal</div></div></div>
<<if $lastActionText>><p class="nsfw-text"><<=$lastActionText>></p><</if>>
<<if !$nsfwSceneEnded>>\
<<if $player.energy >= 2 and ($ArousalPlayer lt 100) and (!$playerFinished)>>\
<<CompanionNSFWButtons>>\
<</if>>\
<div style="text-align:center; margin-top:1em;">\
<<button "End scene">>
<<run setup.exitNSFWMusic()>>\
<<goto "companions">>\
<</button>>\
</div>\
<</if>>\
\
<<if ($ArousalPlayer gte 100) and (!$playerFinished)>><div class="finish-options" style="display:flex; flex-direction:column; align-items:center; gap:12px; margin-top:16px;">\
\
<<if _sex and setup.hasCompanionNSFW('cuminpussy')>>\
<<button "Finish Inside">>\
<<run setup.pickCompanionNSFW('cuminpussy')>>\
<<set $ArousalPlayer = 0>><<set $playerFinished = true>>\
<<goto "CompanionScene">>\
<</button>>\
<</if>>\
\
<<if _anal and setup.hasCompanionNSFW('cuminass')>>\
<<button "Finish in Ass">>\
<<run setup.pickCompanionNSFW('cuminass')>>\
<<set $ArousalPlayer = 0>><<set $playerFinished = true>>\
<<goto "CompanionScene">>\
<</button>>\
<</if>>\
\
<<if setup.hasCompanionNSFW('cumonface')>>\
<<button "Finish on Face">>\
<<run setup.pickCompanionNSFW('cumonface')>>\
<<set $ArousalPlayer = 0>><<set $playerFinished = true>>\
<<goto "CompanionScene">>\
<</button>>\
<</if>>\
\
<<if $playerFinished>>\
<div style="text-align:center; margin-top:1em;">\
<<button "End scene">>\
<<run setup.exitNSFWMusic()>>\
<<goto "companions">>\
<</button>>\
</div>\
<</if>><</if>>\<<widget InitCharVars>>
<<set _char = $args[0]>>
<<set State.temporary._char = _char>>
<<set State.temporary._data = State.variables.companionMedia[_char]>>
<<set State.temporary._rel = State.variables[_char + "Relation"] || 0>>
<<set State.temporary._aro = State.variables[_char + "Arousal"] || 0>>
<<set State.temporary._ene = State.variables.player.energy || 0>>
<</widget>><<nobr>><<widget "CompanionNSFWButtons">>
<<set _cfg = setup.actionsConfig || {}>>
<<set _id = $currentCompanion>>
<<set _npc = $npcs ? $npcs.find(n => n.id === _id) : null>>
<<set _gender = _npc?.gender || "female">>
<<set _textData = (_gender === "male") ? setup.textMale : setup.textFemale>>
<div class="nsfw-buttons" style="display:flex; flex-wrap:wrap; justify-content:center; gap:12px;">
<<for _key range Object.keys(_cfg)>>
<<set _act = _cfg[_key]>>
<<set _rel = ($companionRel && $companionRel[_id]) || 0>>
<<set _needRel = _act.requiredRelation || 0>>
<<set _needAro = _act.requiredArousal || 0>>
<<set _needEng = _act.energyCost || 0>>
<<set _genderOK = (!_act.allowedGenders || _act.allowedGenders.includes(_gender))>>
<<set _available = _genderOK and ($ArousalNPC >= _needAro) and ($player.energy >= _needEng) and (_rel >= _needRel)>>
<<set _tooltip = _available
? _act.label
: 'Locked'
+ (_genderOK ? '' : '\nWrong gender')
+ (_rel < _needRel ? '\nNeed Relation ' + _needRel : '')
+ ($ArousalNPC < _needAro ? '\nNeed Arousal ' + _needAro : '')
+ ($player.energy < _needEng ? '\nNeed Energy ' + _needEng : '')>>
<<set _icon = _available ? ('assets/ui/icons/' + _key + '.png') : 'assets/ui/icons/locked.png'>>
<<capture _key _act _available _tooltip _icon>>
<<print `
<img
src="${_icon}"
class="nsfw-action-icon"
title="${_tooltip}"
onclick="
if (!${_available}) return; /* zablokowane nic nie robi */
const vars = SugarCube.State.variables;
const setup = window.setup;
vars.lastActionKey = '${_key}';
vars.lastAction = '${_key}';
setup.resolveCompanionNSFWMedia();
vars.lastActionText = (
setup?.['${_gender}' === 'male' ? 'textMale' : 'textFemale']?.['${_key}']?.random?.()
) || '⚠️ Missing text for ${_key}';
vars.ArousalNPC += ${_act.gainArousal || 0};
vars.player.energy -= ${_act.energyCost || 0};
vars.ArousalPlayer = (vars.ArousalPlayer || 0) + (${_act.playerArousalGain || 0});
vars.companionRel = vars.companionRel || {};
const id = vars.currentCompanion;
if (id) {
const cur = Number(vars.companionRel[id] || 0);
const delta = Number(${_act.gainRelation || 0});
vars.companionRel[id] = Math.max(0, Math.min(100, cur + delta));
}
vars.fuckPussyAction = ('${_key}' === 'fuckPussy');
vars.fuckAssAction = ('${_key}' === 'fuckAss');
setup.advanceTime(${_act.timeCost || 1});
SugarCube.Engine.play('CompanionScene');
">
`>>
<</capture>>
<</for>>
</div>
<</widget>><</nobr>>
<<nobr>><<widget "bubbleProgress">>
<<set _char = ($args.length > 0) ? $args[0] : $currentCompanion>>
<<if _char>>
<<set _val = ($companionRel and $companionRel[_char]) ? $companionRel[_char] : 0>>
<<set _val = Math.max(0, Math.min(100, Math.round(_val)))>>
<<print setup.bubbleBar(_val)>>
<</if>>
<</widget>><</nobr>><<nobr>><<widget "circularBar">>
<<set _char = ($args.length > 0) ? $args[0] : $currentCompanion>>
<<if _char>>
<<set _rel = ($companionRel and $companionRel[_char]) ? $companionRel[_char] : 0>>
<<set _percent = Math.min(100, Math.round(_rel))>>
<<set _color = _percent < 33 ? "red"
: _percent < 66 ? "orange"
: "green">>
<<print
'<div class="progress-circle" '
+ 'style="--percent:' + _percent + '; --color:' + _color + ';">'
+ '<span class="label">' + _percent + '%</span>'
+ '</div>'
>>
<</if>>
<</widget>><</nobr>>{
"introText": [
"She looked at you waiting for your move."
],
"chat": [
"You started talking about recent events in the bunker.",
"She asked you if you slept well.",
"She asked if you remembered what day it was.",
"You chatted about your favorite meals before the catastrophe.",
"She wondered if there's still a world left outside the bunker."
],
"flirt": [
"She smiled flirtatiously and asked if you often look like that.",
"She gently touched your hand and looked into your eyes.",
"She gave you a playful wink as she walked past.",
"She leaned in, brushing your arm with hers.",
"She twirled a strand of hair and said you looked stronger today."
],
"kiss": [
"She leaned closer and kissed you gently.",
"Her lips trembled against yours.",
"She paused, looking into your eyes before slowly leaning in.",
"You both moved closer until your lips met in silence.",
"She gave you a short, warm kiss and smiled."
],
"teasing": [
"She playfully brushed her hand along your arm, smirking.",
"Her eyes lingered on you as she bit her lip mischievously.",
"She leaned closer, whispering something that made your heart race.",
"She started undressing, showing you her body.",
"She gave you a sly smile, clearly enjoying making you wait."
],
"blowjob": [
"She got down slowly and opened her mouth. Her tongue traced the outline of your member before taking it into her hot, moist mouth.",
"Her eyes locked onto yours as she started bobbing her head up and down, taking more of you in with each movement.",
"You watched in awe as she expertly suckled on your cock, her cheeks hollowing out with each deep thrust of her head.",
"Feeling yourself about to climax, you reached out to touch her hair, but she pulled away with a teasing smile.",
"She released you from her mouth and looked up at you, a mischievous glint in her eye. 'Is that all you've got?' She purred."
],
"touchAss": [
"You circled her waist with your hand, feeling the softness of her skin.",
"She leaned back against the wall, arching her hips slightly to give you better access.",
"Her breath quickened as you traced small circles around her ass cheeks.",
"Without warning, she pressed herself into your touch, moaning softly in pleasure.",
"You took this as a cue to explore further, slipping one finger inside her panties and teasing her sensitive entrance."
],
"touchPussy": [
"Your fingers touched her throbbing vagina.",
"You slipped your hand under her dress and felt the moist warmth",
"You rubbed her naked curves with your fingers.",
"Her soft lips curled into a gentle smile."
],
"handjob": [
"Her hand caresses your body, rubbing against your hard shaft.",
"Her sensual hand guides your member, gently scrubbing it.",
"Her warm hands pull you toward her, nestling into your crotch.",
"The quick strokes of her fingers make your body tremble with pleasure."
],
"touchTits": [
"You circled her chest with your hands, feeling the softness of her skin. She arched into your touch, moaning softly in pleasure.",
"Her breath quickened as you brushed against a particularly sensitive nipple.",
"You squeezed her boobs making her moan."
],
"lickNipples": [
"You leaned down, taking one of her hard nipples between your lips. You circled it with your tongue, teasing and flicking against the sensitive tip.",
"She moaned loudly, arching her back and pressing her chest further into your face."
],
"lickYourAss": [
"You told her to lick your ass and so she did.",
"Her tongue performs a magical dance between your buttocks.",
"Despite the initial discomfort, you found yourself beginning to relax into the sensation.",
"As she focused on stimulating your prostate, you felt a wave of pleasure wash over you that left you breathless.",
"Her tongue movements were steady and rhythmic, drawing out moans from deep within you."
],
"fingerPussy": [
"You circled her pussy with your fingers, feeling the softness of her skin. She arched into your touch, moaning softly in pleasure.",
"Her breath quickened as you brushed against a particularly sensitive area."
],
"fistPussy": [
"You smashed her pussy with your fist, feeling the wetness of her juices. She arched into your touch, moaning loudly in pleasure.",
"Her breath quickened as you thrust deeper inside her."
],
"fingerAss": [
"You circled her ass with your fingers, feeling the softness of her skin. She arched back against the wall, inviting you to explore further.",
"Her breath quickened as you brushed against a particularly sensitive area."
],
"fistAss": [
"You devastated her ass with your fist, feeling the firmness of her muscles. She arched back, moaning in pleasure as you pushed deeper inside.",
"Her breath quickened and her body trembled with anticipation."
],
"fingerYourAss": [
"You tensed up at the unexpected sensation of her fingers circling around your tight entrance.",
"You took a deep breath and she slowly began pushing one finger inside of you, causing you to gasp in both pain and pleasure.",
"You heard her breathing became ragged as she moved in and out of you faster, eliciting soft moans from you.",
"Despite the initial discomfort, you couldn't help but feel a strange mix of pleasure and excitement."
],
"fistYourAss": [
"Without warning, she thrust her entire fist into your tight hole, causing you to cry out in pain mixed with pleasure.",
"Her knuckles brushed against something deep inside of you as she began pumping her fist in and out rapidly.",
"You arched your back involuntarily, meeting each of her thrusts with a loud moan that filled the room.",
"The sensation of being so completely filled and dominated left you trembling and aching for release."
],
"lickPussy": [
"You circled her pussy with your tongue, teasing and flicking against the sensitive skin. She moaned loudly in pleasure.",
"Her breath quickened and her hips bucked against your face."
],
"lickAss": [
"You licked her ass, tracing small circles around her tight entrance. She moaned in pleasure as you pushed deeper inside.",
"Her breath quickened and she arched back into you."
],
"fuckPussy": [
"You positioned yourself between her legs and slowly pushed inside her wet pussy. She moaned loudly in pleasure as you began thrusting deeper.",
"Her pussy tightened around your cock, pulling you closer to her core. The sensation was overwhelming, sending waves of pleasure coursing through your body.",
"You increased the pace, slamming into her over and over again. She met your thrusts with equal force, their bodies moving in perfect syncopation.",
"Her moans turned to gasps as you reached deeper inside her than ever before. The feeling of being completely filled by you sent shivers down her spine.",
"As you approached your climax, you gripped her hips tighter and began pounding into her with all your might. She screamed in ecstasy as she felt the wave of pleasure wash over them both."
],
"fuckAss": [
"You positioned yourself behind her and lifted her leg up. With one hand, you spread her cheeks apart to reveal her tight little hole.",
"Slowly, you pushed your cock inside her ass. At first, it felt tight and resistant, but as she adjusted to the intrusion, she began to relax into it.",
"You picked up the pace, slamming into her rhythmically. The sound of skin hitting skin echoed throughout the room, adding to their intense pleasure.",
"Her body arched backward in response to your thrusts, driving you deeper inside her.The sensation was unlike anything either of you had ever experienced before.",
"As you neared your climax, you pulled out slightly and then plunged back into her ass with all your might. She screamed out in pleasure as she felt the full force of your orgasm shooting deep inside her."
],
"fuckTits": [
"You pushed your cock between her breasts and started thrusting.",
"She wrapped her boobs around your cock and started stroking it."
],
"spit": [
"You moved closer to her and leaned down, spitting onto the center of her forehead. The saliva dripped down onto her skin, creating a small puddle.",
"Slowly, you traced your finger along the path of the spit, drawing a line from her forehead down towards her chin. Her body trembled in anticipation of what was to come.",
"You repeated the process with both hands, creating a web of saliva on her face. Then, you leaned in close and whispered against her ear.",
"As you pulled back slightly, she opened her eyes wide and gasped for air. The unexpected sensation had shocked her but also ignited something within her."
],
"spankAss": [
"You moved behind her and raised your hand, causing her to tense up slightly. Then, you brought it down hard on her round ass cheek. The sound of skin smacking against skin reverberated through the room.",
"She yelped in surprise at the sting, but then moaned as she felt the heat radiating from her now reddened flesh. You continued spanking her in a steady rhythm.",
"After several more hard smacks, you pulled her panties down to her ankles and resumed spanking her bare ass. The slapping sound became louder with each smack, adding to the intensity of the situation.",
"Her body began to tremble as she felt your hand connecting with her flesh over and over again. She gasped for air between moans, begging you not to stop."
],
"slap": [
"You moved slowly towards her, not wanting to startle her. When you were close enough, you leaned in and slapped her across the cheek hard enough to leave a red handprint.",
"She let out a gasp of surprise but remained still as she looked up at you with wide eyes filled with confusion and perhaps even a hint of arousal.",
"You didn't say anything, instead choosing to trail your fingers lightly down her cheek where you had just slapped her. The gentle touch contrasted sharply against the sting in her skin.",
"As she continued to gaze up at you, you noticed a slight flush appear on her neck and face. It was clear that this wasn't something she was used to or comfortable with yet.",
"Without breaking eye contact, you reached out and gently brushed a strand of hair behind her ear before leaning in close enough for your breath to caress her skin softly. The mix of tenderness and dominance left her feeling both scared and turned on at the same time."
],
"choke": [
"You moved behind her, placing your hands around her neck firmly but not too tightly. Your thumbs rested lightly against the side of her throat as you leaned in close to whisper into her ear.",
"The warmth from your breath sent shivers down her spine as she felt the power emanating from your touch. She couldn't help but squirm slightly under your grasp, wanting more yet afraid of what might happen next.",
"As you continued to hold her in this position, you noticed how responsive she was becoming despite herself. Her breathing had become shallow and rapid, indicating that she was aroused despite the fear coursing through her veins.",
"You pulled back slightly, allowing just enough air for her to catch her breath before leaning in close again. This time, you pressed your lips against hers roughly, forcing your tongue into her mouth.",
"Her body went limp in surprise at first but then began to respond eagerly as she gave herself over completely to the sensations coursing through her. The combination of pain and pleasure left her reeling, unable to think clearly or resist any longer."
],
"finishhersex": [
"She came hard on your dick."
],
"finishher": [
"She came hard."
],
"cumonface": [
"You sprayed your cum on her face."
],
"cuminpussy": [
"You moaned and pushed your load straight into her pussy."
],
"cuminass": [
"You smashed her tight ass and left your load inside."
],
"ending": [
"After everything, she sits there, watching you quietly.",
"You both take a breath. The air feels warmer now."
]
}{
"introText": [
"He watched and waited to see what you would do."
],
"kiss": [
"He moved closer and brushed his lips against yours gently.",
"His breath was hot against your skin as he leaned into the kiss.",
"The tension between you both grew palpable as he hesitated for a moment",
"Suddenly, he closed the distance and their lips met passionately.",
"You could feel his heart racing beneath your touch."
],
"blowjob": [
"He knelt down in front of you, his eyes never leaving contact with yours.",
"Slowly, he took your erect shaft into his mouth, stretching his lips around it.",
"As he began to bob his head up and down, sucking gently on the tip of your cock, you felt a wave of pleasure wash over you.",
"You placed your hands on the back of his head, urging him to go faster or harder as desired.",
"His warm saliva dripped down onto your stomach, adding to the sensation."
],
"touchAss": [
"You squeezed his glutes hard.",
"You got a nice feel of his bum.",
"The sensation of being touched intimately ignited something within him, making him even more aroused."
],
"lickNipples": [
"You started licking his nipples making him hard.",
"He reacted positively to your wet tongue on his nipples."
],
"touchCock": [
"You wrapped your hands around his erect shaft and began stroking it slowly.",
"His breath hitched as you gripped him tighter, increasing the intensity of his pleasure.",
"He closed his eyes and moaned softly, losing himself in the sensation of being touched intimately.",
"You moved your hands up and down his shaft, feeling the heat radiating from it.",
"As he grew closer to reaching climax, you sped up your strokes, matching the pace of his rapid breathing."
],
"fingerAss": [
"You slowly inserted one finger into his tight hole, feeling him tense up at first but then begin to relax.",
"As he adjusted to the intrusion, you added another finger and began moving them in and out of his ass.",
"His breathing became faster, and he bit down on his lip to stifle a moan.",
"You could feel how hot and wet he was becoming inside and outside.",
"The sensation of being touched so intimately ignited something deep within him that made him tremble with anticipation."
],
"fingerYourAss": [
"You tensed up at the unexpected sensation of his fingers circling around your tight entrance.",
"He took a deep breath and slowly began pushing one finger inside of you, causing you to gasp in both pain and pleasure.",
"As he found a rhythm that felt good for both of you, you began to relax more into his touch.",
"His breathing became ragged as he moved in and out of you faster, eliciting soft moans from deep within him.",
"Despite the initial discomfort, you couldn't help but feel a strange mix of pleasure and excitement."
],
"fistYourAss": [
"He moved closer and placed both hands on your ass cheeks, spreading them wide open.",
"Without warning, he thrust his entire fist into your tight hole, causing you to cry out in pain mixed with pleasure.",
"His knuckles brushed against something deep inside of you as he began pumping his fist in and out rapidly.",
"You arched your back involuntarily, meeting each of his thrusts with a loud moan that filled the room.",
"The sensation of being so completely filled and dominated left you both trembling and aching for release."
],
"fistAss": [
"You leaned forward and wrapped your hand around his erect shaft, feeling the heat radiating from it.",
"Slowly, you began pushing your fist into his tight hole, watching as he bit down on his lip to stifle a moan.",
"As you felt him adjust to the intrusion, you increased the intensity of your movements, matching the pace of his rapid breathing.",
"His body shook with each thrust, and his moans grew louder."
],
"lickAss": [
"You moved closer and slowly ran your tongue along his tight entrance, tasting the sweetness between his cheeks.",
"His breath hitched as you began to lap at him, circling your tongue around his anus with increasing intensity.",
"He squirmed slightly, unable to contain the pleasure coursing through his body.",
"As your tongue made contact with his prostate, he let out a soft moan that vibrated through you."
],
"lickYourAss": [
"You tensed up at the unexpected touch as his tongue circled around your tight entrance.",
"He slowly began to lap at you, causing a shiver to run down your spine.",
"Despite the initial discomfort, you found yourself beginning to relax into the sensation.",
"As he focused on stimulating your prostate, you felt a wave of pleasure wash over you that left you breathless.",
"His tongue movements were steady and rhythmic, drawing out moans from deep within you."
],
"suckCock": [
"You leaned forward and took him into your mouth, feeling the heat of his shaft against your tongue.",
"Slowly, you began to bob your head up and down on his erect cock, matching the pace of his rapid breathing.",
"His hips buckled slightly as he lost control of himself in your mouth.",
"As you sucked harder, you could feel the veins bulging on his shaft, signaling that he was close to reaching climax.",
"The sensation of being so completely worshipped left him weak-kneed and begging for more."
],
"fuckAss": [
"You positioned yourself behind him and slowly began to push your erect shaft into his tight hole.",
"He let out a soft moan as you entered him, feeling the fullness spread through his body.",
"As you picked up speed, slamming into him harder and deeper with each thrust, he bit down on his lip to stifle his cries of pleasure.",
"His ass clenched around you, urging you to go faster as he felt himself losing control.",
"The sensation of being filled so completely and powerfully left him both aroused and overwhelmed."
],
"fuckYourAss": [
"You tensed up at the sudden invasion as he began to thrust his hips into you roughly.",
"His erect cock slammed against your prostate with each forceful stroke, causing waves of pleasure to wash over you.",
"Despite the initial pain, you found yourself beginning to enjoy the sensation of being taken so completely and roughly.",
"As he pounded into you faster and harder, you felt yourself losing control, moaning loudly with each thrust that hit your sweet spot.",
"The rough sex left both of you breathless and aching for release."
],
"spit": [
"You leaned in close and spat directly onto his face, watching as he flinched at the unexpected sensation.",
"He closed his eyes tightly, trying to block out the saliva dripping down his cheeks.",
"Despite his discomfort, you couldn't help but feel a twisted sense of power and dominance in that moment.",
"You spat in his face as he opened his mouth to speak, ready to continue your rough and intimate encounter."
],
"spankAss": [
"You raised your hand high above his exposed ass cheeks and brought it down hard, leaving a bright red mark on his skin.",
"He let out a yelp of pain mixed with pleasure as he felt the sting radiate through his body.",
"Despite the initial shock, he found himself begging for more, arching his back in anticipation of another smack.",
"As you continued to spank him in time with your thrusts, he lost control completely, crying out with each impact and orgasmming hard around your cock."
],
"slap": [
"You raised your hand high above his face and brought it down hard, leaving a loud smack echoing in the room.",
"His eyes widened in shock as he felt the sting on his cheek, but there was also an undeniable rush of adrenaline and arousal coursing through him.",
"Despite the initial surprise, he couldn't help but moan softly at the mix of pain and pleasure that accompanied the slap.",
"As you continued to dominate him physically and sexually, pushing him further than he ever thought possible, he found himself falling deeper under your spell."
],
"choke": [
"You grabbed him by the throat, cutting off his air supply momentarily as you looked into his eyes with a mix of lust and power.",
"His face flushed red from lack of oxygen, but he didn't struggle or beg for release; instead, he met your gaze with an almost hungry look in his eyes.",
"As you released him slightly, allowing him to gasp for air, you continued to dominate him both physically and sexually, taking him to heights of pleasure he never knew existed.",
"Their encounter was intense and primal, leaving them both breathless and spent."
],
"finishhimsex": ["He groans and finishes while thrusting into you."],
"finishhimoral": ["He grunts and finishes in your mouth."],
"finishhim": ["He finishes all over you."],
"cumonface": ["You finish on his face."],
"cummouth": ["You finish in his mouth."],
"cuminass": ["You finish inside his ass."]
}<<set $trainPage = $trainPage ?? 0>>\
<<set _pageSize = 3>>\
<<set _entries = ["__solo__"].concat($player.companions)>>\
<<set _total = _entries.length>>\
<<set _pageCount = Math.ceil(_total / _pageSize)>>\
<<set $trainPage = Math.clamp($trainPage, 0, _pageCount - 1)>>\
<<set _start = $trainPage * _pageSize>>\
<<set _slice = _entries.slice(_start, _start + _pageSize)>>\
\
<h2>Who do you want to train your <<= $trainingStat >> with?</h2>
<div class="training-grid">\
<<for _e range _slice>>\
<<if _e === "__solo__">>\
<div class="training-tile">\
<a class="companion-link"
data-passage="Training"
data-setter="$trainingPartner = null;">\
<<print '<img src="assets/ui/alone.jpg" alt="Train alone">'>>\
<div class="label">Train Alone</div>\
</a>\
</div>\
<<else>>\
<<set _npc = $npcs.find(n => n.id === _e)>>\
<<if _npc>>\
<<capture _id>>\
<<set _id = _e>>\
<<set _stats = setup.getCompanionStats ? setup.getCompanionStats(_id) : {strength:0,endurance:0,intelligence:0}>>\
<div class="training-tile">\
<div class="mini-chips">\
<span class="mini-chip <<= $trainingStat === 'strength' ? 'is-primary' : '' >>"><span class="icon">💪</span><span class="val"><<= _stats.strength>></span></span>
<span class="mini-chip <<= $trainingStat === 'endurance' ? 'is-primary' : '' >>"><span class="icon">🏃</span><span class="val"><<= _stats.endurance>></span></span>
<span class="mini-chip <<= $trainingStat === 'intelligence' ? 'is-primary' : '' >>"><span class="icon">🧠</span><span class="val"><<= _stats.intelligence>></span></span>
</div>\
<a class="companion-link"
data-passage="Training"
data-setter="$trainingPartner = _id;">\
<<print '<img src="assets/characters/' + _id + '/training.jpg" alt="Train with ' + _npc.name + '">'>>\
<div class="label"><<=_npc.name>></div>\
</a>\
</div>\
<</capture>>\
<</if>>\
<</if>>\
<</for>>\
</div>\
<div class="pager"><<if $trainPage > 0>><<button "← Prev">><<set $trainPage -= 1>><<goto "TrainingSelectPartner">><</button>><</if>><<if ($trainPage + 1) < _pageCount>><<button "Next →">><<set $trainPage += 1>><<goto "TrainingSelectPartner">><</button>><</if>></div>
<<button "Back">><<goto "training room">><</button>>
<<include "SleepLogic">><center><img src="assets/ui/dreams/dream.gif"></center>
You went to bed, but considering recent events, you didn't sleep very well.
<<button "Next">><<goto "Bunker">><</button>><<widget "DreamGif">><<set _list = [
"assets/ui/dreams/dream1.gif",
"assets/ui/dreams/dream2.gif",
"assets/ui/dreams/dream3.gif"
]>>
<<set _gif = _list.random()>>
<<print '<img src="' + _gif + '" class="dream-gif">'>>
<</widget>>[
{
"id": "generousNeighbor",
"effects": [
{
"type": "eventItems",
"mode": "add",
"items": "generated",
"lootRange": [
30,
90
]
}
],
"image": "assets/characters/neighbor/banging.jpg",
"title": "Loud banging",
"text": "You hear loud banging on the bunker hatch.",
"textWithCamera": "Before opening it, you decided to use your camera. In front of the bunker, you noticed a friendly-looking figure. You hear loud banging on the bunker hatch.",
"imageWithCamera": "assets/characters/neighbor/cameragenerous.jpg",
"minReputation": 0,
"repeatable": true,
"choices": [
{
"text": "Open It",
"passage": "generousNeighbor"
},
{
"text": "Ignore it",
"passage": "Bunker"
}
]
},
{
"id": "needyNeighborItem",
"effects": [
{
"type": "eventItems",
"mode": "give",
"items": "owned"
},
{
"type": "statBoost",
"statPool": [
"intelligence",
"endurance",
"strength"
]
}
],
"image": "assets/characters/neighbor/banging.jpg",
"imageWithCamera": "assets/characters/neighbor/cameraneedy.jpg",
"title": "Loud banging",
"text": "You hear loud banging on the bunker hatch.",
"textWithCamera": "You peek through the camera before reacting. You noticed a couple of people who looked friendly.",
"minReputation": 0,
"repeatable": true,
"choices": [
{
"text": "Open It",
"passage": "needyNeighbor"
},
{
"text": "Ignore it",
"passage": "Bunker"
}
]
},
{
"id": "needyNeighbor",
"effects": [
{
"type": "statBoost",
"statPool": [
"intelligence",
"endurance",
"strength"
]
}
],
"image": "assets/characters/neighbor/banging.jpg",
"imageWithCamera": "assets/characters/neighbor/cameraneedy.jpg",
"title": "Loud banging",
"text": "You hear loud banging on the bunker hatch.",
"textWithCamera": "You peek through the camera before reacting. You noticed a couple of people who looked friendly.",
"minReputation": 0,
"repeatable": true,
"choices": [
{
"text": "Open It",
"passage": "needyNeighbor"
},
{
"text": "Ignore it",
"passage": "Bunker"
}
]
},
{
"id": "hornyNeighbor",
"effects": [
{
"type": "eventItems",
"mode": "give",
"items": "owned"
},
{
"type": "randomRoll5050",
"randomKey": "hornyRoll"
}
],
"image": "assets/characters/neighbor/banging.jpg",
"imageWithCamera": "assets/characters/neighbor/cameraHorny.webp",
"title": "Loud banging",
"text": "You hear loud banging on the bunker hatch.",
"textWithCamera": "You peek through the camera before reacting. You notice a woman who looks horny.",
"repeatable": true,
"choices": [
{
"text": "Open It",
"passage": "hornyNeighbor"
},
{
"text": "Ignore it",
"passage": "Bunker"
}
]
},
{
"id": "bunkerBandits",
"effects": [],
"image": "assets/characters/neighbor/banging.jpg",
"imageWithCamera": "assets/characters/neighbor/cameraBandits.webp",
"title": "Loud banging",
"text": "You hear loud banging on the bunker hatch.",
"textWithCamera": "You peek through the camera before reacting. You noticed a few men who looked like bandits.",
"repeatable": true,
"choices": [
{
"text": "Open It",
"passage": "bunkerBandits"
},
{
"text": "Ignore it",
"passage": "Bunker"
}
]
},
{
"id": "bunkerSoldiers",
"effects": [
{
"type": "eventItems",
"mode": "give",
"items": "owned"
},
{
"type": "eventItems",
"mode": "add",
"items": "generated",
"lootRange": [
50,
120
]
}
],
"image": "assets/characters/neighbor/banging.jpg",
"imageWithCamera": "assets/characters/neighbor/soldier.webp",
"title": "Loud banging",
"text": "You hear loud banging on the bunker hatch.",
"textWithCamera": "You peek through the camera before reacting. You noticed a soldier, but you felt that he was not alone.",
"repeatable": true,
"choices": [
{
"text": "Open It",
"passage": "bunkerSoldiers"
},
{
"text": "Ignore it",
"passage": "Bunker"
}
]
},
{
"id": "hiddenStash",
"effects": [
{
"type": "eventItems",
"mode": "add",
"items": "generated",
"lootRange": [
50,
120
]
},
{
"type": "randomRoll5050",
"randomKey": "stashRoll"
},
{
"type": "statChange",
"healthRange": [
-10,
-1
]
}
],
"image": "assets/characters/neighbor/hiddenStash.webp",
"title": "Hidden stash",
"text": "While cleaning up, you came across some hidden supplies that you had forgotten about.",
"repeatable": true,
"choices": [
{
"text": "Open it",
"passage": "hiddenStash"
},
{
"text": "Leave it alone",
"passage": "Bunker"
}
]
},
{
"id": "oldManual",
"image": "assets/characters/neighbor/book.jpg",
"title": "Old manual",
"text": "While cleaning up, you came across some old manual book.",
"repeatable": true,
"effects": [
{
"type": "statBoost",
"statPool": [
"intelligence"
]
}
],
"choices": [
{ "text": "Read it", "passage": "manualRead", "applyEffects": true },
{
"text": "Toss it",
"passage": "Bunker"
}
]
},
{
"id": "spoiledFood",
"effects": [
{
"type": "eventItems",
"mode": "give",
"items": [
{
"id": "cannedFood",
"qtyRange": [
1,
3
]
}
]
}
],
"image": "assets/characters/neighbor/checkFood.jpg",
"title": "Spoiled food",
"text": "You smelled something. It must be the food supplies.",
"repeatable": true,
"minItem": {
"cannedFood": 1
},
"choices": [
{
"text": "Inspect the supplies",
"passage": "checkSpoiledFood"
},
{
"text": "Throw them away",
"passage": "removeSpoiledFood"
}
]
},
{
"id": "ratInfestation",
"effects": [
{
"type": "eventItems",
"mode": "give",
"items": [
{
"id": "cannedFood",
"qtyRange": [
1,
3
]
}
]
}
],
"image": "assets/characters/neighbor/rats.webp",
"title": "Rats",
"text": "You noticed rats running around the bunker.",
"repeatable": true,
"minItem": {
"cannedFood": 1
},
"choices": [
{
"text": "Set traps",
"passage": "ratTrap"
},
{
"text": "Burn infested food",
"passage": "ratBurn"
}
]
},
{
"id": "toxicGasWarning",
"effects": [
{
"type": "eventItems",
"mode": "add",
"items": "generated",
"lootRange": [
80,
150
]
}
],
"image": "assets/characters/neighbor/toxicGas.webp",
"title": "Toxic Warning",
"text": "A sudden high-pitched siren echoed through the bunker walls. Seconds later, green gas began seeping in through the air vents. You rushed to the control panel and managed to shut off the flow.You wonder if stepping outside would reveal the source of the alert.",
"textWithCamera": "Your camera detected no movement near the hatch. Yet, green gas lingers around the vents. The siren still rings in your ears.",
"imageWithCamera": "assets/characters/neighbor/toxicGas.webp",
"minReputation": 0,
"repeatable": true,
"choices": [
{
"text": "Put on gas mask and step outside",
"passage": "toxicGasLoot",
"condition": "$gasMask > 0"
},
{
"text": "Stay inside and wait",
"passage": "Bunker"
}
]
},
{
"id": "dullKnife",
"minItem": {
"knife": 1
},
"image": "assets/characters/neighbor/brokenKnife.webp",
"title": "Dull Blade",
"text": "You realise that your knife blade is losing its edge. In this state, it's useless in a fight.",
"repeatable": false,
"choices": [
{
"text": "Try to fix it",
"condition": "$scrapMetal > 0",
"passage": "knifeFix"
},
{
"text": "Leave it be",
"passage": "knifeIgnore"
}
]
},
{
"id": "wetMapCorner",
"title": "Wet map",
"image": "assets/characters/neighbor/brokenMap.jpg",
"text": "While examining your map, you tore one corner. Moments later, you knocked over a cup of water, soaking it. The ink is already smudging.",
"repeatable": false,
"minItem": {
"map": 1
},
"choices": [
{
"text": "Patch it",
"passage": "mapFix"
},
{
"text": "Throw it",
"passage": "mapIgnore"
}
]
},
{
"id": "brokenSuitcaseHandle",
"title": "Broken Handle",
"image": "assets/characters/neighbor/suitcaseBroken.jpg",
"text": "While sprinting, the handle of your suitcase gave in with a loud snap. Carrying it like this will be cumbersome.",
"repeatable": false,
"minItem": {
"suitcase": 1
},
"choices": [
{
"text": "Fix it",
"passage": "suitcaseFix"
},
{
"text": "Leave it broken",
"passage": "suitcaseIgnore"
}
]
},
{
"id": "tornBackpack",
"title": "Torn Backpack",
"image": "assets/characters/neighbor/bagBroken.jpg",
"text": "As you squeezed through a tight corridor, your backpack caught on something sharp and tore open.",
"repeatable": false,
"minItem": {
"bag": 1
},
"choices": [
{
"text": "Sew it carefully",
"passage": "backpackFix"
},
{
"text": "Leave it behind",
"passage": "backpackIgnore"
}
]
},
{
"id": "damagedPistol",
"title": "Jammed Gun",
"image": "assets/characters/neighbor/pistolBroken.jpg",
"text": "Your pistol misfired. It’s dirty, and the mechanism seems worn down. You fear it might backfire next time.",
"repeatable": false,
"minItem": {
"pistol": 1
},
"choices": [
{
"text": "Disassemble and repair it",
"condition": "$scrapMetal > 0",
"passage": "pistolFix"
},
{
"text": "Discard it",
"passage": "pistolIgnore"
}
]
},
{
"id": "crackedBat",
"title": "Cracked Bat",
"image": "assets/characters/neighbor/batBroken.jpg",
"text": "After smashing something too hard, your bat now has a long split down its middle. One more hit and it might shatter.",
"repeatable": false,
"minItem": {
"bat": 1
},
"choices": [
{
"text": "Reinforce it",
"condition": "$wood > 0",
"passage": "batFix"
},
{
"text": "Toss it",
"passage": "batIgnore"
}
]
},
{
"id": "leakingBottle",
"title": "Leaking Bottle",
"image": "assets/characters/neighbor/waterBroken.jpg",
"text": "You notice a slow drip from your water bottle. The cap seems loose or cracked.",
"repeatable": false,
"minItem": {
"water": 1
},
"choices": [
{
"text": "Seal it with some scrap",
"condition": "$scrapMetal > 0",
"passage": "waterFix"
},
{
"text": "Drink what you can and toss it",
"passage": "waterIgnore"
}
]
},
{
"id": "moldyBandages",
"title": "Moldy Bandages",
"image": "assets/characters/neighbor/bandageBroken.jpg",
"text": "You check your medical box and discover that some bandages are damp and growing mold.",
"repeatable": false,
"minItem": {
"bandage": 1
},
"choices": [
{
"text": "Dry them near a heat source",
"passage": "bandageFix"
},
{
"text": "Toss the moldy ones",
"passage": "bandageIgnore"
}
]
},
{
"id": "expiredMedkit",
"title": "Expired Medkit",
"image": "assets/characters/neighbor/firstAidFix.jpg",
"text": "While organizing your supplies, you notice the medkit is past its expiration date.",
"repeatable": false,
"minItem": {
"firstAid": 1
},
"choices": [
{
"text": "Keep it - it might still work",
"passage": "medkitKeep"
},
{
"text": "Dismantle for useful parts",
"passage": "medkitScrap"
}
]
},
{
"id": "flickeringFlashlight",
"title": "Flickering Flashlight",
"image": "assets/characters/neighbor/flashlightBroken.jpg",
"text": "Your flashlight started flickering, making it unreliable for exploration.",
"repeatable": false,
"minItem": {
"flashlight": 1
},
"choices": [
{
"text": "Open and try to repair it",
"condition": "$scrapMetal > 0",
"passage": "flashlightFix"
},
{
"text": "Toss it away",
"passage": "flashlightIgnore"
}
]
},
{
"id": "strangerWomanKnockWhite",
"image": "assets/characters/neighbor/banging.jpg",
"title": "Loud Banging",
"text": "You hear loud banging on the bunker hatch.",
"textWithCamera": "Before opening it, you decided to use your camera. A woman stands outside, looking exhausted but harmless. She keeps banging on the metal hatch.",
"imageWithCamera": "assets/characters/neighbor/avatarwomanbegging.jpg",
"repeatable": false,
"choices": [
{
"text": "Open it",
"passage": "strangerWomanRequestWhite"
},
{
"text": "Ignore it",
"passage": "Bunker"
}
]
},
{
"id": "strangerManKnockWhite",
"image": "assets/characters/neighbor/banging.jpg",
"title": "Loud Banging",
"text": "You hear loud banging on the bunker hatch.",
"textWithCamera": "Before opening it, you decided to use your camera. A man stands outside, looking exhausted but harmless. He keeps banging on the metal hatch.",
"imageWithCamera": "assets/characters/neighbor/avatarsad.jpg",
"repeatable": false,
"choices": [
{
"text": "Open it",
"passage": "strangerManRequestWhite"
},
{
"text": "Ignore it",
"passage": "Bunker"
}
]
},
{
"id": "strangerWomanKnockBlack",
"image": "assets/characters/neighbor/banging.jpg",
"title": "Loud Banging",
"text": "You hear loud banging on the bunker hatch.",
"textWithCamera": "Before opening it, you decided to use your camera. A woman stands outside, looking exhausted but harmless. She keeps banging on the metal hatch.",
"imageWithCamera": "assets/characters/neighbor/avatarwomanbeggingblack.jpg",
"repeatable": false,
"choices": [
{
"text": "Open it",
"passage": "strangerWomanRequestBlack"
},
{
"text": "Ignore it",
"passage": "Bunker"
}
]
},
{
"id": "strangerManKnockBlack",
"image": "assets/characters/neighbor/banging.jpg",
"title": "Loud Banging",
"text": "You hear loud banging on the bunker hatch.",
"textWithCamera": "Before opening it, you decided to use your camera. A man stands outside, looking exhausted but harmless. He keeps banging on the metal hatch.",
"imageWithCamera": "assets/characters/neighbor/avatarblackmanbeg.jpg",
"repeatable": false,
"choices": [
{
"text": "Open it",
"passage": "strangerManRequestBlack"
},
{
"text": "Ignore it",
"passage": "Bunker"
}
]
},
{
"id": "strangerWomanKnockAsian",
"image": "assets/characters/neighbor/banging.jpg",
"title": "Loud Banging",
"text": "You hear loud banging on the bunker hatch.",
"textWithCamera": "Before opening it, you decided to use your camera. A woman stands outside, looking exhausted but harmless. She keeps banging on the metal hatch.",
"imageWithCamera": "assets/characters/neighbor/avatarwomanbeggingasian.jpg",
"repeatable": false,
"choices": [
{
"text": "Open it",
"passage": "strangerWomanRequestAsian"
},
{
"text": "Ignore it",
"passage": "Bunker"
}
]
},
{
"id": "strangerShemaleRequest",
"image": "assets/characters/neighbor/banging.jpg",
"title": "Loud Banging",
"text": "You hear loud banging on the bunker hatch.",
"textWithCamera": "You decided to use your camera before opening it. A woman was standing outside and smiling at the camera.",
"imageWithCamera": "assets/characters/neighbor/shemaleRequest.webp",
"repeatable": false,
"choices": [
{
"text": "Open it",
"passage": "strangerShemaleRequest"
},
{
"text": "Ignore it",
"passage": "Bunker"
}
]
},
{
"id": "travelerWithCaptive",
"image": "assets/characters/neighbor/banging.jpg",
"title": "Loud banging",
"text": "You hear loud banging on the bunker hatch.",
"textWithCamera": "On the camera, you noticed a man wearing a gas mask carrying a woman in his arms.",
"imageWithCamera": "assets/characters/neighbor/cameraTravelerWithCaptive.jpg",
"repeatable": false,
"choices": [
{
"text": "Open it",
"passage": "travelerWithCaptive"
},
{
"text": "Ignore it",
"passage": "Bunker"
}
]
},
{
"id": "hungryOrphans",
"effects": [],
"image": "assets/characters/neighbor/softknock.jpg",
"imageWithCamera": "assets/characters/neighbor/hungryOrphans.jpg",
"title": "Soft knocking",
"text": "You hear soft, hesitant knocking on the bunker hatch. It's not aggressive - more like someone pleading.",
"textWithCamera": "You peek through the camera. A group of ragged children are outside your bunker. Thin, cold, and clearly starving. They hold up empty cans, hoping for mercy.",
"repeatable": false,
"choices": [
{
"text": "Open it",
"passage": "hungryOrphans"
},
{
"text": "Ignore it",
"passage": "Bunker"
}
]
},
{
"id": "manSellingWife",
"effects": [
{
"type": "eventItems",
"mode": "give",
"items": [
{
"id": "cannedFood",
"qty": [
3
]
}
]
}
],
"image": "assets/characters/neighbor/banging.jpg",
"imageWithCamera": "assets/characters/neighbor/cameragenerous.jpg",
"title": "Loud banging",
"text": "You hear loud banging on the bunker hatch.",
"textWithCamera": "Before opening it, you decided to use your camera. In front of the bunker, you noticed a friendly-looking figure. You hear loud banging on the bunker hatch.",
"repeatable": true,
"choices": [
{
"text": "Open it",
"passage": "manSellingWife"
},
{
"text": "Ignore it",
"passage": "Bunker"
}
]
},
{
"id": "gangSurvivor",
"title": "Soft knocking",
"image": "assets/characters/neighbor/softknock.jpg",
"text": "You hear soft knocking on the bunker hatch. Someone is gently trying to get your attention.",
"textWithCamera": "You turn on the camera. A wounded man slumps against the hatch, blood on his clothes. His breathing is shallow.",
"imageWithCamera": "assets/characters/neighbor/cameraGangSurvivor.jpg",
"repeatable": false,
"choices": [
{
"text": "Open it",
"passage": "gangSurvivor"
},
{
"text": "Ignore it",
"passage": "Bunker"
}
]
},
{
"id": "knifeWoman",
"title": "Loud banging",
"image": "assets/characters/neighbor/banging.jpg",
"text": "You hear loud banging on the bunker hatch. Whoever it is, they want in - badly.",
"textWithCamera": "Looking through the camera, you spotted a frail-looking woman. She appeared desperate, pacing nervously in front of the bunker hatch. One of her hands was hidden behind her back.",
"imageWithCamera": "assets/characters/neighbor/womanGenerator.webp",
"repeatable": false,
"choices": [
{
"text": "Open it",
"passage": "knifeWoman"
},
{
"text": "Ignore it",
"passage": "Bunker"
}
]
},
{
"id": "silenceAfterStorm",
"title": "Silence After the Storm",
"image": "assets/characters/neighbor/silenceAfterStorm.webp",
"text": "After several nights of howling winds and thunder shaking the bunker walls, the world outside has gone completely silent. No rain. No wind. No birds. Just… Stillness.",
"textWithCamera": "The camera shows an eerily still landscape. Mud and broken branches litter the area, but not a soul is in sight. The silence is deafening.",
"imageWithCamera": "assets/characters/neighbor/cameraSilenceAfterStorm.webp",
"repeatable": false,
"choices": [
{
"text": "Continue",
"passage": "Bunker"
}
]
},
{
"id": "distantScream",
"title": "Distant Scream",
"image": "assets/characters/neighbor/scream.jpg",
"text": "You hear a scream in the distance. Sharp. Human. Then… A gunshot. Then silence.",
"textWithCamera": "The camera picks up nothing but fog and faint rustling. Whatever happened, it’s over now. The silence that follows is somehow worse.",
"imageWithCamera": "assets/characters/neighbor/cameraDistantScream.jpg",
"repeatable": false,
"choices": [
{
"text": "Continue",
"passage": "Bunker"
}
]
},
{
"id": "blockedHatch",
"effects": [
{
"type": "eventItems",
"mode": "add",
"items": "generated",
"lootRange": [
50,
150
]
}
],
"title": "Loud Banging",
"image": "assets/characters/neighbor/banging.jpg",
"text": "You hear loud banging on the bunker hatch.",
"textWithCamera": "The camera showed a dirty man holding a crowbar. He was staring directly into the lens, gesturing wildly as if trying to point you toward something across the street.",
"imageWithCamera": "assets/characters/neighbor/cameraBlockedHatch.jpg",
"repeatable": false,
"choices": [
{
"text": "Open it",
"passage": "blockedHatch"
},
{
"text": "Ignore it",
"passage": "Bunker"
}
]
},
{
"id": "trappedChild",
"title": "Loud Banging",
"image": "assets/characters/neighbor/banging.jpg",
"text": "You hear loud banging on the bunker hatch.",
"textWithCamera": "The camera revealed a desperate woman, slamming her fists against the hatch and waving her hands toward the lens, pleading as if begging for help.",
"imageWithCamera": "assets/characters/neighbor/avatarwomanbegging.jpg",
"repeatable": false,
"choices": [
{
"text": "Open it",
"passage": "trappedChild"
},
{
"text": "Ignore it",
"passage": "Bunker"
}
]
},
{
"id": "subtleCoughing",
"effects": [
{
"type": "eventItems",
"mode": "add",
"items": [
{
"id": "goldWatch",
"qty": [
1
]
},
{
"id": "goldRing",
"qty": [
1
]
}
]
}
],
"title": "Soft knocking",
"image": "assets/characters/neighbor/softknock.jpg",
"text": "You hear soft knocking on the bunker hatch. Someone is gently trying to get your attention.",
"textWithCamera": "The camera shows an old man sitting by the bunker wall. He is wrapped in rags and trembling. He softly knocks, coughs, and stares directly at the camera.",
"imageWithCamera": "assets/characters/neighbor/cameraGangSurvivor.jpg",
"repeatable": false,
"choices": [
{
"text": "Open it",
"passage": "subtleCoughing"
},
{
"text": "Ignore it",
"passage": "Bunker"
}
]
},
{
"id": "womanGenerator",
"title": "Loud Banging",
"image": "assets/characters/neighbor/banging.jpg",
"text": "You hear loud banging on the bunker hatch.",
"textWithCamera": "On the camera feed, a desperate woman is hammering at the hatch with both fists. A battered car is parked behind her, trunk wide open. She keeps turning around, pointing toward it, and gesturing frantically at the camera.",
"imageWithCamera": "assets/characters/neighbor/avatarwomanbegging.jpg",
"repeatable": false,
"choices": [
{
"text": "Open it",
"passage": "womanGenerator"
},
{
"text": "Ignore it",
"passage": "Bunker"
}
]
},
{
"id": "sickMan",
"title": "Soft knocking",
"text": "You hear soft, hesitant knocking on the bunker hatch. It's not aggressive - more like someone pleading.",
"image": "assets/characters/neighbor/softknock.jpg",
"textWithCamera": "On the camera feed, a sweating man lies on the ground, clearly feverish. He clutches his side and murmurs incoherently, occasionally reaching toward the hatch.",
"imageWithCamera": "assets/characters/neighbor/cameraGangSurvivor.jpg",
"repeatable": false,
"choices": [
{
"text": "Open it",
"passage": "sickMan"
},
{
"text": "Ignore it",
"passage": "Bunker"
}
]
},
{
"id": "guardianAngel",
"image": "assets/characters/neighbor/banging.jpg",
"title": "Loud banging",
"text": "You hear loud banging on the bunker hatch.",
"textWithCamera": "Before opening it, you decided to use your camera. In front of the bunker, you noticed a figure running away. Only a cute-looking cat remained under the hatch.",
"imageWithCamera": "assets/characters/neighbor/guardianAngel.webp",
"repeatable": false,
"choices": [
{
"text": "Open It",
"passage": "guardianAngel"
},
{
"text": "Ignore it",
"passage": "Bunker"
}
]
},
{
"id": "recruitVisit",
"effects": [
{
"type": "newCompanion"
}
],
"title": "Loud banging",
"text": "You hear loud banging on the bunker hatch.",
"image": "assets/characters/neighbor/banging.jpg",
"textWithCamera": "Before opening it, you decided to use your camera. In front of the bunker, you noticed a friendly looking person.",
"imageWithCamera": "assets/characters/neighbor/recruitDecision.jpg",
"repeatable": true,
"isRecruit": true,
"choices": [
{
"text": "Open It",
"passage": "RecruitDecision"
},
{
"text": "Ignore it",
"passage": "Bunker"
}
]
},
{
"id": "earthquakeTremor",
"title": "Earthquake Tremor",
"image": "assets/characters/neighbor/earthquakeTremor.webp",
"text": "The ground shuddered. Dust rained from the ceiling. Something heavy toppled over in the storage room.",
"repeatable": true,
"minItem": {
"cannedFood": 1,
"water": 1
},
"effects": [
{ "type": "statChange", "healthRange": [-5, -1] },
{
"type": "eventItems",
"mode": "give",
"items": [
{ "id": "cannedFood", "qtyRange": [1, 2] },
{ "id": "water", "qtyRange": [1, 2] }
]
}
],
"choices": [
{ "text": "Continue", "passage": "earthquakeTremor", "applyEffects": true }
]
},
{
"id": "waterLeak",
"title": "Water Leak",
"image": "assets/characters/neighbor/waterLeak.webp",
"text": "A pipe inside the wall burst. A puddle spreads under your shelves as precious water trickles away.",
"repeatable": true,
"minItem": {
"water": 1
},
"effects": [
{
"type": "eventItems",
"mode": "give",
"items": [{ "id": "water", "qtyRange": [1, 3] }]
}
],
"choices": [
{ "text": "Continue", "passage": "waterLeak" }
]
},
{
"id": "quietGift",
"image": "assets/characters/neighbor/banging.jpg",
"title": "Loud banging",
"text": "You hear loud banging on the bunker hatch.",
"textWithCamera": "The camera shows an empty street. Whoever left the parcel is long gone.",
"imageWithCamera": "assets/characters/neighbor/quietGift.jpg",
"repeatable": false,
"minReputation": 1,
"effects": [
{
"type": "eventItems",
"mode": "add",
"items": "generated",
"lootRange": [40, 90]
}
],
"choices": [
{ "text": "Open the hatch", "passage": "quietGift" },
{ "text": "Ignore it", "passage": "Bunker" }
]
},
{
"id": "warningShout",
"title": "Warning Shout",
"image": "assets/characters/neighbor/warningShout.jpg",
"text": "A voice outside shouts a warning about raiders nearby. Then, silence.",
"textWithCamera": "The camera catches a fleeting shadow sprinting past the lens, then nothing.",
"imageWithCamera": "assets/characters/neighbor/warningShout.jpg",
"repeatable": true,
"minReputation": 1,
"effects": [
{ "type": "statBoost", "statPool": ["intelligence"] }
],
"choices": [
{ "text": "Continue", "passage": "warningShout" }
]
},
{
"id": "graffitiOnHatch",
"image": "assets/characters/neighbor/banging.jpg",
"title": "Loud banging",
"text": "You hear loud banging on the bunker hatch.",
"textWithCamera": "The camera feed shows only a fragment of fresh scrape marks on the metal near the lens.",
"imageWithCamera": "assets/characters/neighbor/cameraNothing.jpg",
"repeatable": true,
"maxReputation": -1,
"effects": [
{ "type": "statChange", "healthRange": [-2, -1] }
],
"choices": [
{ "text": "Open the hatch", "passage": "graffitiOnHatch", "applyEffects": true },
{ "text": "Ignore it", "passage": "Bunker" }
]
},
{
"id": "stoneThrow",
"image": "assets/characters/neighbor/banging.jpg",
"title": "Loud banging",
"text": "You hear loud banging on the bunker hatch.",
"textWithCamera": "The camera catches the tail of a coat as someone darts out of frame.",
"imageWithCamera": "assets/characters/neighbor/cameraGangSurvivor.jpg",
"repeatable": true,
"maxReputation": -1,
"effects": [
{ "type": "statChange", "healthRange": [-5, -2] }
],
"choices": [
{ "text": "Open the hatch", "passage": "stoneThrow", "applyEffects": true },
{ "text": "Ignore it", "passage": "Bunker" }
]
},
{
"id": "boobyTrap",
"image": "assets/characters/neighbor/banging.jpg",
"title": "Loud banging",
"text": "You hear loud banging on the bunker hatch.",
"textWithCamera": "The camera shows fresh grooves and metal shavings around the hatch.",
"imageWithCamera": "assets/characters/neighbor/cameraNothing.jpg",
"repeatable": true,
"maxReputation": -1,
"effects": [
{ "type": "statChange", "healthRange": [-15, -8] }
],
"choices": [
{ "text": "Open the hatch", "passage": "boobyTrap", "applyEffects": true },
{ "text": "Ignore it", "passage": "Bunker" }
]
},
{
"id": "coldNight",
"title": "Cold Night",
"image": "assets/characters/neighbor/coldNight.jpg",
"text": "The temperature dropped sharply. Sleep was shallow and stiff with shivers.",
"repeatable": true,
"effects": [
{ "type": "statChange", "healthRange": [-3, -1] }
],
"choices": [
{ "text": "Continue", "passage": "coldNight", "applyEffects": true }
]
},
{
"id": "ratsInWalls",
"title": "Rats in the Walls",
"image": "assets/characters/neighbor/ratsInWalls.jpg",
"text": "Scratching swells behind the walls. By morning, a torn sack is all that's left.",
"repeatable": true,
"minItem": {
"cannedFood": 1
},
"effects": [
{
"type": "eventItems",
"mode": "give",
"items": [{ "id": "cannedFood", "qtyRange": [1, 2] }]
}
],
"choices": [
{ "text": "Continue", "passage": "ratsInWalls" }
]
},
{
"id": "rustyPipe",
"title": "Rusty Pipe",
"image": "assets/characters/neighbor/waterLeak.webp",
"text": "A corroded pipe split overnight. The floor is damp and smells like metal.",
"repeatable": true,
"minItem": {
"cannedFood": 1,
"water": 1
},
"effects": [
{
"type": "eventItems",
"mode": "give",
"items": [
{ "id": "water", "qtyRange": [1, 2] },
{ "id": "cannedFood", "qtyRange": [0, 1] }
]
}
],
"choices": [
{ "text": "Continue", "passage": "rustyPipe" }
]
},
{
"id": "dustCloud",
"title": "Dust Cloud",
"image": "assets/characters/neighbor/dustCloud.jpg",
"text": "A fine cloud of dust fills the corridor after something shook loose.",
"repeatable": true,
"effects": [
{ "type": "statChange", "healthRange": [-8, -3] }
],
"choices": [
{ "text": "Continue", "passage": "dustCloud", "applyEffects": true }
]
},
{
"id": "safeKnock",
"title": "Soft knocking",
"text": "You hear soft, hesitant knocking on the bunker hatch. It's not aggressive - more like someone pleading.",
"image": "assets/characters/neighbor/softknock.jpg",
"textWithCamera": "A shy figure leaves the bundle and hurries away the moment your camera whirs.",
"imageWithCamera": "assets/characters/neighbor/safeKnock.jpg",
"repeatable": true,
"minReputation": 1,
"effects": [
{
"type": "eventItems",
"mode": "add",
"items": "generated",
"lootRange": [30, 70]
}
],
"choices": [
{ "text": "Open the hatch", "passage": "safeKnock" },
{ "text": "Ignore it", "passage": "Bunker" }
]
},
{
"id": "helpfulNote",
"title": "Soft knocking",
"text": "You hear soft, hesitant knocking on the bunker hatch. It's not aggressive - more like someone pleading.",
"image": "assets/characters/neighbor/softknock.jpg",
"textWithCamera": "A figure hesitates at the hatch, then slides a folded slip of paper toward the seam and vanishes.",
"imageWithCamera": "assets/characters/neighbor/helpfulNote.jpg",
"repeatable": true,
"minReputation": 1,
"effects": [
{ "type": "statBoost", "statPool": ["intelligence"] }
],
"choices": [
{ "text": "Open the hatch", "passage": "helpfulNote", "applyEffects": true },
{ "text": "Ignore it", "passage": "Bunker" }
]
},
{
"id": "returnedFavor",
"title": "Soft knocking",
"text": "You hear soft, hesitant knocking on the bunker hatch. It's not aggressive - more like someone pleading.",
"image": "assets/characters/neighbor/softknock.jpg",
"textWithCamera": "The camera shows only the bag and a fading set of footsteps in the dust.",
"imageWithCamera": "assets/characters/neighbor/quietGift.jpg",
"repeatable": false,
"minReputation": 1,
"effects": [
{
"type": "eventItems",
"mode": "add",
"items": [
{ "id": "bandage", "qty": [1] },
{ "id": "cannedFood", "qty": [1] }
]
}
],
"choices": [
{ "text": "Open the hatch", "passage": "returnedFavor" },
{ "text": "Ignore it", "passage": "Bunker" }
]
},
{
"id": "threateningMark",
"image": "assets/characters/neighbor/banging.jpg",
"title": "Loud banging",
"text": "You hear loud banging on the bunker hatch.",
"textWithCamera": "There was no one in front of the bunker hatch.",
"imageWithCamera": "assets/characters/neighbor/cameraNothing.jpg",
"repeatable": true,
"maxReputation": -1,
"effects": [
{ "type": "statChange", "healthRange": [-3, -1] }
],
"choices": [
{ "text": "Open the hatch", "passage": "threateningMark", "applyEffects": true },
{ "text": "Ignore it", "passage": "Bunker" }
]
},
{
"id": "friendlyTipSupermarket",
"title": "Soft knocking",
"text": "You hear soft, hesitant knocking on the bunker hatch. It's not aggressive - more like someone pleading.",
"image": "assets/characters/neighbor/softknock.jpg",
"textWithCamera": "The camera catches a lone figure jogging away from your hatch, hood pulled low.",
"imageWithCamera": "assets/characters/neighbor/friendlyTipSupermarket.jpg",
"repeatable": false,
"minReputation": 1,
"effects": [],
"choices": [
{ "text": "Open the hatch", "passage": "unlockSupermarket" },
{ "text": "Ignore it", "passage": "Bunker" }
]
}
]
<<switch $companionscount>>
<<case 0>>
You sit alone in silence. No one to argue with. Just you and your thoughts.
<<case 1>>
<<set _npc = $companions[0]>>
<<speech _npc _npc>>
I'm bored out of my mind... Can we *do* something?
<</speech>>
<<link "Play cards with them (-1 hour, +rel)" >>
<<set $time -= 1>>
<<set $relationship[_npc] += 5>>
<<goto "Bunker">>
<</link>>
<<link "Ignore them">>
<<set $relationship[_npc] -= 5>>
<<goto "Bunker">>
<</link>>
<<default>>
<<set _npc1 = $companions.random()>>
<<set _npc2 = $companions.random()>>
<<while _npc2 == _npc1>>
<<set _npc2 = $companions.random()>>
<</while>>
<<speech _npc1 _npc1>>
I'm sick of sharing my food with her. She's not doing anything!
<</speech>>
<<speech _npc2 _npc2>>
At least I'm not a control freak. You don’t even let us rest!
<</speech>>
<<link "Support $_npc1">>
<<set $relationship[_npc1] += 5>>
<<set $relationship[_npc2] -= 5>>
<<goto "Bunker">>
<</link>>
<<link "Support $_npc2">>
<<set $relationship[_npc2] += 5>>
<<set $relationship[_npc1] -= 5>>
<<goto "Bunker">>
<</link>>
<<link "Stay neutral">>
<<set $ego += 1>>
<<goto "Bunker">>
<</link>>
<</switch>><<set _roll = random(1)>><<set _forceHelp = (!$eventItemsGive || $eventItemsGive.length === 0)>><<if not _forceHelp>> <<set _item = $eventItemsGive[0]>> <center><img src="assets/characters/neighbor/beggingitem.jpg"> </center>
<<neighborsad>>Please, we really need your help. We’re not sure how we’ll manage without it. <</neighborsad>>
<center><b>Requested item:</b>
<<= setup.renderItemList($eventItemsGive)>></center>
<<button "Give the item">><<goto "needyNeighborGive">><</button>>
<<button "Refuse">><<goto "needyNeighborRefuse">><</button>><<else>> <center><img src="assets/characters/neighbor/begging.jpg"> </center>
<<neighborsad>>Please, we really need your help. We’re not sure how we’ll manage without it. <</neighborsad>>
<<button "Help them">><<run setup.rollRandomStatsReward()>><<goto "needyNeighborHelp">><</button>>
<<button "Refuse">><<goto "needyNeighborRefuse">><</button>><</if>><<run setup.AddItemsList("add")>> <center><img src="assets/characters/neighbor/gift.jpg"> </center><<addmins 60>>
<<neighborhappy>>I brought you some extra supplies that I have too many of. I hope that even in these difficult times we’ll help one another. So many people have turned into monsters in the face of this kind of life. Oh! I think someone’s coming, I’m heading back home! Take care!<</neighborhappy>>
<b>You received:</b>
<<= setup.renderItemList($eventItemsAdd, { style: "inline", size: 80 })>>
<<button "Next">><<goto "Bunker">><</button>><<set $hornySteal = Math.random() < 0.5>><center><<set _roll to random(2)>><<if _roll is 0>><img src="assets/characters/neighbor/hornyNeighbor.webp"><<elseif _roll is 1>><img src="assets/characters/neighbor/hornyNeighbor1.webp"><<elseif _roll is 2>><img src="assets/characters/neighbor/hornyNeighbor2.webp"><</if>></center>
<<womanhorny>>Hey... It’s cold out here, and I could use some warmth. Want some company tonight?<</womanhorny>>
<<button "Let her in and fuck her">><<run setup.startNSFW({
text: "female",
scenes: "female_white",
option: "maybeSteal"
})>><<goto "RandomNSFW">><</button>>
<<button "Close the door">><<goto "Bunker">><</button>><<addmins 60>><<set $player.energy -= 20>> <center><img src="assets/characters/neighbor/bunkerBandits.webp"></center>
<<bandit>>You will give us everything you have.<</bandit>>
<<button "Fight">> <<run setup.startCombat({
enemies: setup.generateTieredEnemies("banditsMedium"),
allies: [],
onWin: "banditsDefeated",
onLose: "GameOver"
})>> <<goto "Combat">><</button>><<addmins 120>><<set $player.energy -= 20>> <<if $stashRoll === 0>><<run setup.applyEventEffects()>><center><img src="assets/characters/neighbor/ratAttack.jpg"></center>
When you reached in to pull out one of the bags, you suddenly felt a sharp pain, followed by the shadow of a rat scurrying across the floor of the bunker.
You found nothing, but noticed that your hand was bleeding from the bite.
<<if $statChangeLog && $statChangeLog.length>><div style="margin-top: 1em; font-weight: bold; color: #c00;"><<for _i = 0; _i < $statChangeLog.length; _i++>><<set _e = $statChangeLog[_i]>><center><<print _e.stat>>: <<print _e.amount>></center><</for>></div><</if>>
<<button "Next">><<set $statChangeLog = []>><<goto "Bunker">><</button>><<else>> <<run setup.AddItemsList("add")>><center><img src="assets/characters/neighbor/stashGoods.jpg"></center>
<b>You found:</b>
<<= setup.renderItemList($eventItemsAdd, { style: "inline", size: 80 })>>
<<button "Next">><<goto "Bunker">><</button>><</if>><<addmins 60>><<set $player.energy -= 20>> <<if $reputation lt -20>><center><img src="assets/characters/neighbor/soldier.webp"></center>
<<soldier>>You're the bastard everyone warned us about!<</soldier>>
<<button "Fight them">> <<run setup.startCombat({
enemies: setup.generateTieredEnemies("soldiersMedium"),
allies: [],
onWin: "soldierCombatWin",
onLose: "GameOver"
})>><<goto "Combat">><</button>><<elseif $reputation gt 20>><<run setup.AddItemsList("add")>><center><img src="assets/characters/neighbor/soldier.webp"></center>
<<soldier>>It's you! We've heard about you, you help the local residents a lot. In such difficult times, it's rare to meet someone like you.<</soldier>>
<b>You received:</b>
<<= setup.renderItemList($eventItemsAdd, { style: "inline", size: 80 })>>
<<button "Next">><<goto "Bunker">><</button>><<elseif $reputation gt -21>><center><img src="assets/characters/neighbor/soldier.webp"></center>
<<soldier>>Hello! We are the 3rd Airborne Regiment... Or rather, what's left of it. We are collecting items from the neighbourhood so that we can continue to fight the bandits and protect you. Give us that.<</soldier>>
<center><b>Requested item:</b>
<<= setup.renderItemList($eventItemsGive)>></center>
<<nobr>><<if $eventItemsGive and $eventItemsGive.length > 0>><<button "Give the item">><<goto "bunkerSoldiersGive">><</button>><</if>>
<<button "Refuse">><<goto "bunkerSoldiersRefuse">><</button>><</nobr>><</if>><<run setup.generateTraderItems()>><<run setup.rebuildInventoryFromVars()>><<set $traderToday = false>><center><img src="assets/characters/neighbor/trader.jpg"></center>
<<trader>>Would you like to trade? I have something that might interest you.<</trader>>
<<nobr>><<button "Trade">><<goto "trading">><</button>>
<<button "Threaten him - give up everything">><<set $reputation -= 5>><<goto "traderFight">><</button>>
<<button "Not today">><<goto "Bunker">><</button>><</nobr>><<addmins 180>><<set $player.energy -= 30>><center><video width="480" height="320" controls autoplay playsinline loop>
<source src="assets/characters/neighbor/readManual.mp4" type="video/mp4">
</video>
</center>
<p><b>You spent a few hours reading what you found. Thanks to that, you learned a few tricks.</b></p>
<<if $statRewardMessage>><p><b><<print $statRewardMessage>></b></p><</if>>
<<button "Next">><<goto "Bunker">><</button>><<addmins 180>><<set $player.energy -= 30>><<set $reputation += 2>> <center> <img src="assets/characters/neighbor/avatarhappy.jpg"> </center>
<<neighborhappy>>Thank you from the bottom of our hearts. It really means a lot to us.<</neighborhappy>>
<<if $statRewardMessage>><p><b><<print $statRewardMessage>></b></p><</if>>
<<button "Next">><<goto "Bunker">><</button>><<run setup.applyEventItems("give", $eventItemsGive)>><<set $reputation += 2>> <<addmins 60>><<set $player.energy -= 10>> <center><img src="assets/characters/neighbor/avatarhappy.jpg"> </center>
<<neighborhappy>>Thank you from the bottom of our hearts. It really means a lot to us.<</neighborhappy>>
<center><b>You lost:</b></center>
<<= setup.renderItemList($eventItemsGive)>>
<<button "Next">><<goto "Bunker">><</button>><<set $reputation -= 2>> <center> <img src="assets/characters/neighbor/avatarsad.jpg"> </center>
<<neighborsad>>What did we expect... I hope we can survive without your help.<</neighborsad>>
<<button "Next">><<goto "Bunker">><</button>><<set $player.endurance += 1>><<addmins 120>><<set $player.energy -= 20>><<set _roll to random(2)>><center><<if _roll is 0>><img src="assets/characters/neighbor/hornyNeighborFuck.webp"><<elseif _roll is 1>><img src="assets/characters/neighbor/hornyNeighborFuck1.webp"><<elseif _roll is 2>><img src="assets/characters/neighbor/hornyNeighborFuck2.webp"><</if>></center>
<p>You let her in. She smiles, pulls you closer, and things escalate quickly in the dim light of your bunker...</p>
<<if $hornySteal and $eventItemsGive and $eventItemsGive.length > 0>><<run setup.applyEventItems("give", $eventItemsGive)>>
<p><b>Later, something feels off... You realize something's missing.</b></p>
<center><b>You lost:</b></center>
<<= setup.renderItemList($eventItemsGive)>>
<<else>><p><b>After a passionate night, she leaves quietly. Thankfully, nothing seems to be missing.</b></p><</if>>
<<button "Next">><<goto "Bunker">><</button>><<set $player.strength += 1>><<set $player.endurance += 1>><center><img src="assets/characters/neighbor/fightWon.webp"></center>
<p>You survived the brutal encounter. The fight hardened your muscles and taught you the limits of your endurance.</p>
<p><b>You gained +1 Strength and +1 Endurance.</b></p>
<p>The bandits are wounded and helpless. What do you want to do with them?</p>
<<button "Spare them">><</button>>
<<button "Kill them">><<goto "KillAfterFight">><</button>>
<<button "Negotiate their freedom">><<run setup.startNSFW({
text: "male",
scenes: "male_white",
option: "fight"
})>><<goto "RandomNSFW">><</button>><<set $respect += 2>><<set _roll to random(1)>><<if _roll is 0>><center><img src="assets/characters/neighbor/spare.webp"></center><<elseif _roll is 1>><center><img src="assets/characters/neighbor/spare1.webp"></center><</if>>
You spared that person, and they quickly got up from the ground and started running away.
<<button "Next">><<goto "Bunker">><</button>><<set $reputation -= 10>> <<set $player.hunger = 0>><center><img src="assets/characters/neighbor/cannibal.webp"></center>
<p>Survival has changed you. You're no longer bound by taboo. You butcher their corpses and eat the meat.</p>
<<button "Next">><<goto "Bunker">><</button>><<set _roll to random(1)>><<if _roll is 0>><center><img src="assets/characters/neighbor/kill.webp"></center><<elseif _roll is 1>><center><img src="assets/characters/neighbor/kill1.webp"></center><</if>>
You killed everyone who stood in your way.
<<button "Leave">><<goto "Bunker">><</button>>
<<button "Eat them">><<goto "CannibalAfterFight">><</button>><<run setup.applyEventItems("give", $eventItemsGive)>><<set $reputation += 2>> <center><img src="assets/characters/neighbor/soldier.webp"></center>
<<soldier>>Thank you from the bottom of our hearts. It really means a lot to us.<</soldier>>
<<button "Next">><<goto "Bunker">><</button>><<set $player.strength += 1>><<set $player.endurance += 1>><center><img src="assets/characters/neighbor/fightWon.webp"></center>
<p>You survived the brutal encounter. The fight hardened your muscles and taught you the limits of your endurance.</p>
<p><b>You gained +1 Strength and +1 Endurance.</b></p>
<p>The soldiers are wounded and helpless. What do you want to do with them?</p>
<<button "Spare them">><<goto "SpareAfterFight">><</button>>
<<button "Kill them">><<goto "KillAfterFight">><</button>>
<<button "Negotiate their freedom">><<run setup.startNSFW({
text: "male",
scenes: "male_white",
option: "fight"
})>><<goto "RandomNSFW">><</button>><center><img src="assets/characters/neighbor/soldier.webp"></center>
<<soldier>>No? Then we'll take it ourselves.</soldier>>
<<button "Fight them">> <<run setup.startCombat({
enemies: setup.generateTieredEnemies("soldiersMedium"),
allies: [],
onWin: "soldierCombatWin",
onLose: "GameOver"
})>><<goto "Combat">><<addmins 180>><<set $player.energy -= 30>><center><img src="assets/characters/neighbor/checkFood.jpg"></center>
<p><b>It took a lot of energy and time, but it turned out that you managed to save your supplies.</b></p>
<<button "Next">><<goto "Bunker">><</button>><<run setup.applyEventItems("give", $eventItemsGive, true)>><img src="assets/characters/neighbor/foodlost.jpg">
You lost some of your canned food due to spoilage.
<<if $statChangeLog and $statChangeLog.length > 0>><b>You lost:</b>
<<= setup.renderItemLog($statChangeLog, { style: "grid", size: 80 })>><</if>>
<<button "Next">><<goto "Bunker">><</button>><<addmins 180>><<set $player.energy -= 30>><center><img src="assets/characters/neighbor/checkFood.jpg"></center>
<p><b>It took a lot of energy and time, but you managed to save your supplies and kill the rats by setting traps.</b></p>
<<button "Next">><<goto "Bunker">><</button>><<run setup.applyEventItems("give", $eventItemsGive, true)>><img src="assets/characters/neighbor/foodBurn.jpg">
You decided not to beat around the bush, acting quickly and effectively by setting fire to the room. Although you lost some supplies, the rats shouldn't be a problem for a while.
<<if $statChangeLog and $statChangeLog.length > 0>><b>You lost:</b>
<<= setup.renderItemLog($statChangeLog, { style: "grid", size: 80 })>><</if>>
<<button "Next">><<goto "Bunker">><</button>> <center><img src="assets/characters/neighbor/begging.jpg"></center>
<<neighborsad>>Please, we really need your help. We’re not sure how we’ll manage without it. <</neighborsad>>
<<button "Help them">><<run setup.rollRandomStatsReward()>><<goto "needyNeighborHelp">><</button>>
<<button "Refuse">><<goto "needyNeighborRefuse">><</button>><<addmins 120>><<set $scrapMetal -= 1>><<set $player.energy -= 30>><center><img src="assets/characters/neighbor/knifeFix.jpg"></center>
<b><p>You find a quiet corner of the bunker, sit down, and examine the dull blade.
With a piece of scrap metal and steady hands, you begin sharpening the edge - slowly, carefully, as sparks fly in the dim light. The sound of metal scraping against metal is almost calming. After some time your knife regains its sharpness.
It's not perfect, but it's ready to serve you again.</b></p>
<center><b>You lost:</b><br>
<<= setup.renderItemList([{ id: "scrapMetal", qty: [1] }])>></center>
<<button "Next">><<goto "Bunker">><</button>><<run setup.AddItemsList("add")>><<addmins 180>><<set $player.energy -= 30>><center><img src="assets/characters/neighbor/stashGoods.jpg"></center>
<b><p>You decided to take a risk, put on a gas mask and left the bunker, quickly closing the hatch behind you. After several hours of searching the area, you found a few useful items and returned safely to the bunker.</b></p>
<b>You received:</b>
<<= setup.renderItemList($eventItemsAdd, { style: "inline", size: 80 })>>
<<button "Next">><<goto "Bunker">><</button>><<set $knife -= 1>><center><img src="assets/characters/neighbor/brokenKnife.webp"></center>
<b><p>You glance at the knife and sigh.
The blade is dull. The edge chipped. But you don't have the time or patience to deal with it now.</b></p>
<<you>>It'll manage.<</you>>
<b><p>You mutter, sliding it back into your belt. Later that day, when you need it most, the knife bends uselessly against hardened material. You feel the weight of regret as the blade snaps in half - leaving you empty-handed.</b></p>
<center><b>You lost:</b><br>
<<= setup.renderItemList([{ id: "knife", qty: [1] }])>></center>
<<button "Next">><<goto "Bunker">><</button>><<addmins 240>><<set $player.energy -= 30>><center><img src="assets/characters/neighbor/fixedMap.jpg"></center>
You took a moment to dry the map and patched the soaked corner using available materials. It’s far from perfect, but still usable.
<<button "Next">><<goto "Bunker">><</button>><<set $map -= 1>><center><img src="assets/characters/neighbor/brokenMap.jpg"></center>
You ignored the damage, hoping you'd remember the terrain. But the ink kept running and the map started falling apart in your hands.
<center><b>You lost:</b><br>
<<= setup.renderItemList([{ id: "map", qty: [1] }])>></center>
<<button "Next">><<goto "Bunker">><</button>><<set $suitcase -= 1>><center><img src="assets/characters/neighbor/suitcaseBroken.jpg"></center>
The thought of dragging a useless suitcase through ruins felt absurd. You left it behind and moved on.
<center><b>You lost:</b><br>
<<= setup.renderItemList([{ id: "suitcase", qty: [1] }])>></center>
<<button "Next">><<goto "Bunker">><</button>><<addmins 240>><<set $player.energy -= 30>><center><img src="assets/characters/neighbor/checkFood.jpg"></center>
You stopped and used what you had to reinforce the broken handle. It’s not elegant, but at least it can be carried again.
<<button "Next">><<goto "Bunker">><</button>><<addmins 240>><<set $player.energy -= 30>><center><img src="assets/ui/bag.jpg"></center>
You sat down and carefully stitched the torn fabric. It took a while, but the backpack is still serviceable.
<<button "Next">><<goto "Bunker">><</button>><<set $bag -= 1>><center><img src="assets/characters/neighbor/bagBroken.jpg"></center>
You didn’t have time to deal with it. With a heavy heart, you tossed the ripped backpack aside and kept going.
<center><b>You lost:</b><br>
<<= setup.renderItemList([{ id: "bag", qty: [1] }])>></center>
<<button "Next">><<goto "Bunker">><</button>><<addmins 240>><<set $scrapMetal -= 1>><<set $player.energy -= 30>><center><img src="assets/characters/neighbor/pistolFix.jpg"></center>
You sat down, carefully disassembled the pistol, and used some metal scraps to restore its function. It should hold for now.
<center><b>You lost:</b><br>
<<= setup.renderItemList([{ id: "scrapMetal", qty: [1] }])>></center>
<<button "Next">><<goto "Bunker">><</button>><<set $wood -= 1>><<addmins 180>><<set $player.energy -= 30>><center><img src="assets/characters/neighbor/batFix.jpg"></center>
You found a solid piece of wood and reinforced the cracked section. It’s not perfect, but it’ll swing again.
<center><b>You lost:</b><br>
<<= setup.renderItemList([{ id: "wood", qty: [1] }])>></center>
<<button "Next">><<goto "Bunker">><</button>><<set $pistol -= 1>><center><img src="assets/characters/neighbor/pistolBroken.jpg"></center>
A jammed gun is more dangerous than no gun at all. You left it behind without looking back.
<center><b>You lost:</b><br>
<<= setup.renderItemList([{ id: "pistol", qty: [1] }])>></center>
<<button "Next">><<goto "Bunker">><</button>><<set $bat -= 1>><center><img src="assets/characters/neighbor/batBroken.jpg"></center>
There was no point in dragging around a broken bat. You dropped it and moved on.
<center><b>You lost:</b><br>
<<= setup.renderItemList([{ id: "bat", qty: [1] }])>></center>
<<button "Next">><<goto "Bunker">><</button>><<set $scrapMetal -= 1>><<addmins 180>><<set $player.energy -= 30>><center><img src="assets/characters/neighbor/waterFix.webp"></center>
You used whatever you had to tighten the seal. It might not last forever, but you saved the water.
<center><b>You lost:</b><br>
<<= setup.renderItemList([{ id: "scrapMetal", qty: [1] }])>></center>
<<button "Next">><<goto "Bunker">><</button>><<set $water -= 1>><center><img src="assets/characters/neighbor/waterBroken.jpg"></center>
You tried to drink what you could, but most of it spilled. A hard loss in times like this.
<center><b>You lost:</b><br>
<<= setup.renderItemList([{ id: "water", qty: [1] }])>></center>
<<button "Next">><<goto "Bunker">><</button>><<addmins 120>><<set $player.energy -= 30>><center><img src="assets/characters/neighbor/bandageFix.jpg"></center>
You gently dried the bandages over your heater. They’re not sterile, but better than nothing.
<<button "Next">><<goto "Bunker">><</button>><<set $bandage -= 1>><center><img src="assets/characters/neighbor/bandageBroken.jpg"></center>
You didn’t want to risk infection. Into the trash they went.
<center><b>You lost:</b><br>
<<= setup.renderItemList([{ id: "bandage", qty: [1] }])>></center>
<<button "Next">><<goto "Bunker">><</button>><<addmins 60>><center><img src="assets/characters/neighbor/firstAidFix.jpg"></center>
<<set _roll to random(1)>><<if _roll is 0>><<set $firstAid -= 1>You decided to keep it. When you’re desperate, even expired supplies can save a life, but it was no longer useful.
<center><b>You lost:</b><br>
<<= setup.renderItemList([{ id: "firstAid", qty: [1] }])>></center><<else>>You decided to keep it. When you’re desperate, even expired supplies can save a life.<</if>>
<<button "Next">><<goto "Bunker">><</button>><<set $firstAid -= 1>><<set $scrapMetal += 2>><<addmins 180>><<set $player.energy -= 30>><center><img src="assets/characters/neighbor/firstAidFix.jpg"></center>
You disassembled the kit, salvaging a few parts for crafting.
<center><b>You received:</b><br>
<<= setup.renderItemList([{ id: "scrapMetal", qty: [2] }])>></center>
<<button "Next">><<goto "Bunker">><</button>><<set $scrapMetal -= 1>><<addmins 180>><<set $player.energy -= 30>><center><img src="assets/characters/neighbor/flashlightFix.jpg"></center>
You opened the casing, adjusted the wiring, and it’s working again - for now.
<center><b>You lost:</b><br>
<<= setup.renderItemList([{ id: "scrapMetal", qty: [1] }])>></center>
<<button "Next">><<goto "Bunker">><</button>><<set $flashlight -= 1>><center><img src="assets/characters/neighbor/flashlightBroken.jpg"></center>
You threw it into the corner. No point in carrying dead weight.
<center><b>You lost:</b><br>
<<= setup.renderItemList([{ id: "flashlight", qty: [1] }])>></center>
<<button "Next">><<goto "Bunker">><</button>><<addmins 30>><<set $player.energy -= 10>><center><img src="assets/characters/neighbor/whiteWomanRequest.webp"></center>
She looks up at you with dry, cracked lips and desperate eyes.
<<womanwhitebeg>>Please! I just need some water or food. I haven't eaten or drunk anything for two days.<</womanwhitebeg>>
<<nobr>><<if $water > 0>><<button "Give her water">><<goto "strangerGiveWater">><</button>><</if>>
<<if $cannedFood > 0>><<button "Give her food">><<goto "strangerGiveFood">><</button>><</if>>
<<button "Make a deal">><<run setup.startNSFW({
text: "female",
scenes: "female_white",
option: "begging"
})>><<goto "RandomNSFW">><</button>>
<<button "Threaten her - give up everything">><<goto "strangerWomanRequestFight">><</button>>
<<button "Tell her to fuck off">><<set $reputation -= 2>><<goto "Bunker">>
<</button>><</nobr>><<addmins 30>><<set $player.energy -= 10>><center><img src="assets/characters/neighbor/whiteManRequest.webp"></center>
He looks up at you with dry, cracked lips and desperate eyes.
<<manwhitebeg>>Give me something to eat or a little bit of water! I'll do everything! Be a human being! Please!<</manwhitebeg>>
<<nobr>><<if $water > 0>><<button "Give him water">><<goto "strangerGiveWater">><</button>><</if>>
<<if $cannedFood > 0>><<button "Give him food">><<goto "strangerGiveFood">><</button>><</if>>
<<button "Make a deal">><<run setup.startNSFW({
text: "male",
scenes: "male_white",
option: "begging"
})>><<goto "RandomNSFW">><</button>>
<<button "Threaten him - give up everything">><<goto "strangerManRequestFight">><</button>>
<<button "Tell him to fuck off">><<set $reputation -= 2>><<goto "Bunker">>
<</button>><</nobr>><center><img src="assets/characters/neighbor/whiteWomanAttack.webp"></center>
<<womanwhitebeg>>Oh...<</womanwhitebeg>>
<<button "Fight her">> <<run setup.startCombat({
enemies: [
{ spritePrefix: 'survivorFemale', name: 'Poor woman', maxHp: 10, weapon: 'fist' },
],
allies: [],
onWin: "strangerWomanCombatWin",
onLose: "GameOver"
})>><<goto "Combat">><</button>><<set $player.strength += 1>><<set $player.endurance += 1>><<set $reputation -= 5>><center><img src="assets/characters/neighbor/fightWon.webp"></center>
<p>You survived the brutal encounter. The fight hardened your muscles and taught you the limits of your endurance.</p>
<p><b>You gained +1 Strength and +1 Endurance.</b></p>
<p>The woman is wounded and helpless. What do you want to do with her?</p>
<<button "Spare her">><<goto "SpareAfterFight">><</button>>
<<button "Kill her">><<goto "KillAfterFight">><</button>>
<<button "Negotiate her freedom">><<run setup.startNSFW({
text: "female",
scenes: "female_white",
option: "fight"
})>><<goto "RandomNSFW">><</button>><center><img src="assets/characters/neighbor/whiteManRequest.webp"></center>
<<manwhitebeg>>Are you serious?<</manwhitebeg>>
<<button "Fight him">> <<run setup.startCombat({
enemies: [
{ spritePrefix: 'survivorMale', name: 'Poor man', maxHp: 20, weapon: 'fist' },
],
allies: [],
onWin: "strangerManCombatWin",
onLose: "GameOver"
})>><<goto "Combat">><</button>><<set $player.strength += 1>><<set $player.endurance += 1>><<set $reputation -= 5>><center><img src="assets/characters/neighbor/fightWon.webp"></center>
<p>You survived the brutal encounter. The fight hardened your muscles and taught you the limits of your endurance.</p>
<p><b>You gained +1 Strength and +1 Endurance.</b></p>
<p>The man is wounded and helpless. What do you want to do with him?</p>
<<button "Spare him">><<goto "SpareAfterFight">><</button>>
<<button "Kill him">><<goto "KillAfterFight">><</button>>
<<button "Negotiate his freedom">><<run setup.startNSFW({
text: "male",
scenes: "male_white",
option: "fight"
})>><<goto "RandomNSFW">><</button>><<addmins 30>><<set $player.energy -= 10>><center><img src="assets/characters/neighbor/travelerWithCaptive.webp"></center>
<<traveler>>Got this stray bitch sniffing around my camp for food. I'm moving on - figured maybe you'd wanna take her off my hands. Not for free, of course.<</traveler>>
<<button "Trade something for her freedom">><<goto "captiveTrade">><</button>>
<<button "Attack him">> <<run setup.startCombat({
enemies: [
{ spritePrefix: 'banditMale', name: 'Big armored guy', maxHp: 100, weapon: 'pistol' },
],
allies: [],
onWin: "travelerWithCaptiveCombatWin",
onLose: "GameOver"
})>><<goto "Combat">><</button>>
<<button "Close the hatch">><<goto "Bunker">><</button>><<run setup.resolveNSFWMedia()>>\
\
<<set _npcLabel = ($nsfwGender === 'male'
? 'His arousal'
: ($nsfwGender === 'female' ? 'Her arousal' : 'Their arousal'))>>\
\
<<set _sex = $fuckPussyAction>>\
<<set _anal = $fuckAssAction>>\
<<set _analyou = $fuckYourAssAction>> \
<<set _suck = $suckCockAction>> \
\
\
<<set $fuckPussyAction = false>>\
<<set $fuckAssAction = false>>\
<<set $fuckYourAssAction = false>>\
<<set $suckCockAction = false>>\
\
<div id="nsfw-main">\
<<if !$nsfwSceneInitialized>>\
<<run setup.enterNSFWMusic()>>\
<<set $nsfwSceneInitialized = true>>\
<<set $nsfwSceneStarted = false>>\
<<set $currentMedia = setup.getRandomNSFWMedia($currentScene, "intro")>>\
<<set _genderCap = $nsfwGender.charAt(0).toUpperCase() + $nsfwGender.slice(1)>>\
<<set _introArray = setup['text' + _genderCap]?.introText || []>>\
<<set $lastActionText = _introArray.length ? _introArray.random() : "⚠️ Missing introText">>\
<</if>>\
\
<<if $ArousalNPC >= 100>>\
<<run (function(){
const v = State.variables, male = (v.nsfwGender === 'male');
if (!male) {
// NPC = kobieta: default / podczas penetracji gracza
if ((State.temporary._sex || State.temporary._anal) && setup.hasNSFW('finishhersex')) {
setup.pickNSFW('finishhersex');
} else if (setup.hasNSFW('finishher')) {
setup.pickNSFW('finishher');
}
} else {
// NPC = mężczyzna: default / podczas suckCock / podczas fuckYourAss
if (State.temporary._suck && setup.hasNSFW('finishhimoral')) {
setup.pickNSFW('finishhimoral');
} else if (State.temporary._analyou && setup.hasNSFW('finishhimsex')) {
setup.pickNSFW('finishhimsex');
} else if (setup.hasNSFW('finishhim')) {
setup.pickNSFW('finishhim');
}
}
v.ArousalNPC = 45; // cooldown
})()>>
<</if>>\
\
<<set _mediaData = $nsfwMedia[$currentScene]>>\
<<if !$currentMedia and _mediaData and _mediaData.intro and _mediaData.intro.length > 0>>\
<<set $currentMedia = setup.getRandomNSFWMedia($currentScene, "intro")>>
<</if>>\
\
\
\
<div class="nsfw-frame">\
\
<div class="arousal-col">
<<print '<div class="arousal-meter npc ' + $nsfwGender + '" style="--level:' + $ArousalNPC + '%;" data-level="' + $ArousalNPC + '"></div>'>>\
<div class="arousal-label"><<= _npcLabel>></div>\
</div>\
\
<div class="nsfw-media">\
<center><<if $currentMedia and (!$nsfwSceneEnded or $nsfwEndCard)>>
<<if $currentMedia.endsWith(".mp4")>>\
<<print '<video src="' + $currentMedia + '" autoplay muted loop style="max-width:100%; max-height:400px; border-radius:8px;"></video>'>>\
<<else>>\
<<print '<img src="' + $currentMedia + '" style="max-width:100%; max-height:400px; border-radius:8px;" />'>>\
<</if>>\
<</if>></center>\
</div>\
\
<div class="arousal-col">
<<print '<div class="arousal-meter player" style="--level:' + $ArousalPlayer + '%;" data-level="' + $ArousalPlayer + '"></div>'>>\
<div class="arousal-label">Your arousal</div>\
</div>\
</div>\
\
<<if $lastActionText>><p class="nsfw-text"><<=$lastActionText>></p><</if>>
\
<<if !$nsfwSceneEnded>>\
\
<<if $player.energy >= 2 and ($ArousalPlayer lt 100) and (!$playerFinished)>>\
<<RandomNSFWButtons>>\
<</if>>\
\
<<if ($ArousalPlayer gte 100) and (!$playerFinished)>>\
<div class="finish-options" style="display:flex; flex-direction:column; align-items:center; gap:12px; margin-top:16px;">\
<<if _sex and setup.hasNSFW('cuminpussy')>>\
<<button "Finish Inside">>\
<<run setup.pickNSFW('cuminpussy')>>\
<<set $ArousalPlayer = 0>><<set $playerFinished = true>>\
<<goto "RandomNSFW">>\
<</button>>\
<</if>>\
\
<<if _anal and setup.hasNSFW('cuminass')>>\
<<button "Finish in Ass">>\
<<run setup.pickNSFW('cuminass')>>\
<<set $ArousalPlayer = 0>><<set $playerFinished = true>>\
<<goto "RandomNSFW">>\
<</button>>\
<</if>>\
\
<<if setup.hasNSFW('cumonface')>>\
<<button "Finish on Face">>\
<<run setup.pickNSFW('cumonface')>>\
<<set $ArousalPlayer = 0>><<set $playerFinished = true>>\
<<goto "RandomNSFW">>\
<</button>>\
<</if>>\
\
<<if setup.hasNSFW('cummouth')>>\
<<button "Finish in Mouth">>\
<<run setup.pickNSFW('cummouth')>>\
<<set $ArousalPlayer = 0>><<set $playerFinished = true>>\
<<goto "RandomNSFW">>\
<</button>>\
<</if>>\
</div>\
<</if>>\
\
<div style="text-align:center; margin-top:1em;">\
<<button "End scene">>\
<<set $playerFinished = true>>\
<<run setup.exitNSFWMusic()>>\
<<run setup.endNSFWScene()>>\
<<goto "RandomNSFW">>\
<</button>>\
</div>\
\
<<else>>\
\
<p class="nsfw-text" style="text-align:center;">The scene is over. What will you do next?</p>
<<set _scene = $nsfwSceneData>>\
<<set _option = _scene.option || null>>\
<<set _choices = _option ? setup.getNSFWChoices(_option) : []>>\
\
<<for _i = 0; _i < _choices.length; _i++>>\
<<capture _choices[_i]>>\
<center><<button _choices[_i].text>><<goto _choices[_i].passage>><</button>></center>
<</capture>>\
<</for>>\
\
<</if>>\{
"introText": [
"assets/characters/random/female_white/intro.webp"
],
"kiss": [
"assets/characters/random/female_white/kiss.webp",
"assets/characters/random/female_white/kiss.webp",
"assets/characters/random/female_white/kiss.webp"
],
"bj": [
"assets/characters/random/female_white/bj.webp",
"assets/characters/random/female_white/bj.webp"
],
"erotic": [
"assets/characters/random/female_white/erotic.webp",
"assets/characters/random/female_white/erotic.webp",
"assets/characters/random/female_white/erotic.webp"
]
}{
"introText": [
"assets/characters/random/male_white/intro.webp"
],
"kiss": [
"assets/characters/random/male_white/kiss.webp",
"assets/characters/random/male_white/kiss.webp",
"assets/characters/random/male_white/kiss.webp"
],
"bj": [
"assets/characters/random/male_white/bj.webp",
"assets/characters/random/male_white/bj.webp"
],
"erotic": [
"assets/characters/random/male_white/erotic.webp",
"assets/characters/random/male_white/erotic.webp",
"assets/characters/random/male_white/erotic.webp"
]
}<<widget "RandomNSFWButtons">>\
<<set _cfg = setup.randomActionsConfig>>\
<<set _mediaData = $nsfwMedia[$currentScene] || {}>>\
<<set _gender = $nsfwGender || "female">>\
<<set _textData = (_gender === "male") ? setup.textMale : setup.textFemale>>\
\
<div class="nsfw-buttons" style="display:flex; flex-wrap:wrap; justify-content:center; gap:12px;">\
<<for _key range Object.keys(_cfg)>>\
<<set _act = _cfg[_key]>>\
\
<<if
(!_act.allowedGenders || _act.allowedGenders.includes(_gender))
and $ArousalNPC >= (_act.requiredArousal || 0)
and $player.energy >= _act.energyCost
>>
<<capture _key _act>>
<<print `
<img
src="assets/ui/icons/${_key}.png"
class="nsfw-action-icon"
title="${_act.label}"
onclick="
const vars = SugarCube.State.variables;
const setup = window.setup;
vars.lastActionKey = '${_key}';
vars.currentMedia = setup.getRandomNSFWMedia(vars.currentScene, '${_key}');
vars.lastActionText = (
setup?.[
vars.nsfwGender === 'male'
? 'textMale'
: 'textFemale'
]?.['${_key}']?.random?.()
) || '⚠️ Missing text for ${_key}';
vars.ArousalNPC += ${_act.gainArousal || 0};
vars.player.energy -= ${_act.energyCost || 0};
vars.ArousalPlayer = (vars.ArousalPlayer || 0) + (${_act.playerArousalGain || 0});
vars.fuckPussyAction = ('${_key}' === 'fuckPussy');
vars.fuckAssAction = ('${_key}' === 'fuckAss');
vars.fuckYourAssAction = ('${_key}' === 'fuckYourAss');
vars.suckCockAction = ('${_key}' === 'suckCock');
setup.advanceTime(${_act.timeCost || 1});
SugarCube.Engine.play('RandomNSFW');">`>><</capture>><</if>><</for>></div><</widget>>[
{
"id": "begging",
"choices": [
{ "text": "Give water", "condition": "$water > 0", "passage": "strangerGiveWater" },
{ "text": "Give food", "condition": "$cannedFood > 0", "passage": "strangerGiveFood" },
{ "text": "Kick out", "passage": "strangerKickedOut" }
]
},
{
"id": "fight",
"choices": [
{ "text": "Spare", "passage": "SpareAfterFight" },
{ "text": "Kill", "passage": "KillAfterFight" }
]
},
{
"id": "afterDeal",
"choices": [
{ "text": "Next", "passage": "Bunker" }
]
},
{
"id": "maybeSteal",
"choices": [
{ "text": "Next", "passage": "hornyNeighboryes" }
]
},
{
"id": "medic",
"choices": [
{ "text": "Help him", "condition": "$firstAid > 0 || $bandage > 0", "passage": "gangSurvivorHelped1" },
{ "text": "Kill him", "passage": "KillAfterFight" },
{ "text": "Kick him out", "passage": "strangerKickedOut" }
]
}
]<<set $water -= 1>><<set $reputation += 2>><center><img src="assets/characters/neighbor/giveWater.webp"></center>
You hand a bottle of water. They grabs it and drinks like it’s the last one on Earth.
<<button "Next">><<goto "Bunker">><</button>><<set $cannedFood -= 1>><<set $reputation += 2>><center><img src="assets/characters/neighbor/giveFood.webp"></center>
You hand a food can. They opens it with shaking fingers and devours it in seconds.
<<button "Next">><<goto "Bunker">><</button>><<set $reputation -= 5>><center><img src="assets/characters/neighbor/kickedOut.webp"></center>
You kicked them out of your bunker.
<<button "Next">><<goto "Bunker">><</button>>{
"introText": [
"assets/characters/random/female_white/intro.webp"
],
"kiss": [
"assets/characters/random/female_white/kiss.webp",
"assets/characters/random/female_white/kiss.webp",
"assets/characters/random/female_white/kiss.webp"
],
"bj": [
"assets/characters/random/female_white/bj.webp",
"assets/characters/random/female_white/bj.webp"
],
"erotic": [
"assets/characters/random/female_white/erotic.webp",
"assets/characters/random/female_white/erotic.webp",
"assets/characters/random/female_white/erotic.webp"
]
}{
"introText": [
"assets/characters/random/female_white/intro.webp"
],
"kiss": [
"assets/characters/random/female_white/kiss.webp",
"assets/characters/random/female_white/kiss.webp",
"assets/characters/random/female_white/kiss.webp"
],
"bj": [
"assets/characters/random/female_white/bj.webp",
"assets/characters/random/female_white/bj.webp"
],
"erotic": [
"assets/characters/random/female_white/erotic.webp",
"assets/characters/random/female_white/erotic.webp",
"assets/characters/random/female_white/erotic.webp"
]
}<center><img src="assets/characters/neighbor/travelerWithCaptiveDeal.jpg"></center>
<<traveler>>Let her go?! She's a thief! She should be in prison, but times are what they are... I don't really need her. If you give me something valuable, I'll let her go.<</traveler>>
<<nobr>><<if $pistol > 0>><<button "Offer pistol">><<set $pistol -= 1>><<goto "captiveTradeDeal">><</button>><</if>>
<<if $goldRing > 0>><<button "Offer gold ring">><<set $goldRing -= 1>><<goto "captiveTradeDeal">><</button>><</if>>
<<if $goldWatch > 0>><<button "Offer gold watch">><<set $goldWatch -= 1>><<goto "captiveTradeDeal">><</button>><</if>>
<<button "Attack him">> <<run setup.startCombat({
enemies: [
{ spritePrefix: 'banditMale', name: 'Big armored guy', maxHp: 100, weapon: 'pistol' },
],
allies: [],
onWin: "travelerWithCaptiveCombatWin",
onLose: "GameOver"
})>><<goto "Combat">><</button>>
<<button "Close the hatch">><<goto "Bunker">><</button>><</nobr>><<traveler>>Mhm... Good stuff. She's your problem from now. But if she slits your throat, don't be surprised. It was nice doing business with you. Goodbye.<</traveler>>
<center><img src="assets/characters/neighbor/travelerWithCaptiveFree.webp"></center>
<<womanhorny>>Am I... Am I really free?<</womanhorny>>
<<button "I want something in return">><<run setup.startNSFW({
text: "female",
scenes: "female_white",
option: "maybeSteal"
})>><<goto "RandomNSFW">><</button>>
<<button "Attack her">><<run setup.startCombat({
enemies: [
{ spritePrefix: 'survivorFemale', name: 'Poor woman', maxHp: 15, weapon: 'knife' },
],
allies: [],
onWin: "travelerWithCaptiveWomanWin",
onLose: "GameOver"
})>><<goto "Combat">><</button>>
<<button "You are free, go">><<set $reputation += 5>><<goto "Bunker">>
<</button>><<set $player.strength += 1>><<set $player.endurance += 1>><center><img src="assets/characters/neighbor/fightWon.webp"></center>
<p>You survived the brutal encounter. The fight hardened your muscles and taught you the limits of your endurance.</p>
<p><b>You gained +1 Strength and +1 Endurance.</b></p>
<p>Traveler is wounded and helpless. What do you want to do with him and his prisoner?</p>
<<button "Spare him and let her go">><<set $reputation += 5>><<goto "Bunker">><</button>>
<<button "Kill him">><<goto "travelerWithCaptiveCombatWinKillAfterFight">><</button>>
<<button "Kill them">><<goto "KillAfterFight">><</button>>
<<button "Negotiate her freedom">><<run setup.startNSFW({
text: "female",
scenes: "female_white",
option: "fight"
})>><<goto "RandomNSFW">><</button>>
<<button "Negotiate his freedom">><<run setup.startNSFW({
text: "male",
scenes: "male_white",
option: "fight"
})>><<goto "RandomNSFW">><</button>><<set $player.strength += 1>><<set $player.endurance += 1>><<set $reputation -= 5>><center><img src="assets/characters/neighbor/fightWon.webp"></center>
<p>You survived the brutal encounter. The fight hardened your muscles and taught you the limits of your endurance.</p>
<p><b>You gained +1 Strength and +1 Endurance.</b></p>
<p>The woman is wounded and helpless. What do you want to do with her?</p>
<<button "Spare her">><<goto "SpareAfterFight">><</button>>
<<button "Kill her">><<goto "KillAfterFight">><</button>>
<<button "Negotiate her freedom">><<run setup.startNSFW({
text: "female",
scenes: "female_white",
option: "fight"
})>><<goto "RandomNSFW">><</button>><center><img src="assets/characters/neighbor/travelerWithCaptiveFree.webp"></center>
<<womanhorny>>Am I... Am I really free?<</womanhorny>>
<<button "You are free, go">><<set $respect += 5>><<goto "Bunker">>
<</button>>
<<button "I want something in return">><<run setup.startNSFW({
text: "female",
scenes: "female_white",
option: "maybeSteal"
})>><<goto "RandomNSFW">><</button>>
<<button "Attack her">><<run setup.startCombat({
enemies: [
{ spritePrefix: 'survivorFemale', name: 'Poor woman', maxHp: 15, weapon: 'knife' },
],
allies: [],
onWin: "travelerWithCaptiveWomanWin",
onLose: "GameOver"
})>><<goto "Combat">><</button>>
<<button "Eat him">><<goto "travelerWithCaptiveCombatWinCannibalAfterFight">><</button>><<set $reputation -= 10>> <<set $player.hunger = 0>><center><img src="assets/characters/neighbor/cannibal.webp"></center>
<p>When you started cutting up the man's body and slowly eating it, the woman, in shock, began to run away. Now everyone in the neighbourhood will know what you are doing.</p>
<<button "Next">><<goto "Bunker">><</button>><<addmins 30>><<set $player.energy -= 10>><center><img src="assets/characters/neighbor/blackWomanRequest.webp"></center>
She looks up at you with dry, cracked lips and desperate eyes.
<<womanblackbeg>>Please... Just some water or food. I haven't had anything in two days.<</womanblackbeg>>
<<nobr>><<if $water > 0>><<button "Give her water">><<goto "strangerGiveWater">><</button>><</if>>
<<if $cannedFood > 0>><<button "Give her food">><<goto "strangerGiveFood">><</button>><</if>>
<<button "Make a deal">><<run setup.startNSFW({
text: "female",
scenes: "female_black",
option: "begging"
})>><<goto "RandomNSFW">><</button>>
<<button "Threaten her - give up everything">><<goto "strangerWomanRequestFightBlack">><</button>>
<<button "Tell her to fuck off">><<set $reputation -= 2>><<goto "Bunker">>
<</button>><</nobr>><<addmins 30>><<set $player.energy -= 10>><center><img src="assets/characters/neighbor/asianWomanRequest.webp"></center>
She looks up at you with dry, cracked lips and desperate eyes.
<<womanasianbeg>>Please, I'm desperate. I just want some water or food! I haven't had anything in my mouth for days!<</womanasianbeg>>
<<nobr>><<if $water > 0>><<button "Give her water">><<goto "strangerGiveWater">><</button>><</if>>
<<if $cannedFood > 0>><<button "Give her food">><<goto "strangerGiveFood">><</button>><</if>>
<<button "Make a deal">><<run setup.startNSFW({
text: "female",
scenes: "female_asian",
option: "begging"
})>><<goto "RandomNSFW">><</button>>
<<button "Threaten her - give up everything">><<goto "strangerWomanRequestFightAsian">><</button>>
<<button "Tell her to fuck off">><<set $reputation -= 2>><<goto "Bunker">>
<</button>><</nobr>><<addmins 30>><<set $player.energy -= 10>><center><img src="assets/characters/neighbor/blackManRequest.webp"></center>
He looks up at you with dry, cracked lips and desperate eyes.
<<manblackbeg>>Please don't be afraid! I know everyone is having a hard time right now, but I'll do anything for water or food! Please!<</manblackbeg>>
<<nobr>><<if $water > 0>><<button "Give him water">><<goto "strangerGiveWater">><</button>><</if>>
<<if $cannedFood > 0>><<button "Give him food">><<goto "strangerGiveFood">><</button>><</if>>
<<button "Make a deal">><<run setup.startNSFW({
text: "male",
scenes: "male_black",
option: "begging"
})>><<goto "RandomNSFW">><</button>>
<<button "Threaten him - give up everything">><<goto "strangerManRequestFightBlack">><</button>>
<<button "Tell him to fuck off">><<set $reputation -= 2>><<goto "Bunker">>
<</button>><</nobr>><center><img src="assets/characters/neighbor/blackManAttack.webp"></center>
<<manblackbeg>>It's a shame it has to end like this...<</manblackbeg>>
<<button "Fight him">> <<run setup.startCombat({
enemies: [
{ spritePrefix: 'survivorMale', name: 'Poor man', maxHp: 20, weapon: 'fist' },
],
allies: [],
onWin: "strangerManCombatWinBlack",
onLose: "GameOver"
})>><<goto "Combat">><</button>><<set $player.strength += 1>><<set $player.endurance += 1>><<set $reputation -= 5>><center><img src="assets/characters/neighbor/fightWon.webp"></center>
<p>You survived the brutal encounter. The fight hardened your muscles and taught you the limits of your endurance.</p>
<p><b>You gained +1 Strength and +1 Endurance.</b></p>
<p>The man is wounded and helpless. What do you want to do with him?</p>
<<button "Spare him">><<goto "SpareAfterFight">><</button>>
<<button "Kill him">><<goto "KillAfterFight">><</button>>
<<button "Negotiate his freedom">><<run setup.startNSFW({
text: "male",
scenes: "male_black",
option: "fight"
})>><<goto "RandomNSFW">><</button>><center><img src="assets/characters/neighbor/blackWomanAttack.webp"></center>
<<womanblackbeg>>Mhm...<</womanblackbeg>>
<<button "Fight her">> <<run setup.startCombat({
enemies: [
{ spritePrefix: 'survivorFemale', name: 'Poor woman', maxHp: 10, weapon: 'fist' },
],
allies: [],
onWin: "strangerWomanCombatWinBlack",
onLose: "GameOver"
})>><<goto "Combat">><</button>><center><img src="assets/characters/neighbor/asianWomanAttack.webp"></center>
<<womanasianbeg>>Wh... What?! You bastard I have nothing!<</womanasianbeg>>
<<button "Fight her">> <<run setup.startCombat({
enemies: [
{ spritePrefix: 'survivorFemale', name: 'Poor woman', maxHp: 10, weapon: 'fist' },
],
allies: [],
onWin: "strangerWomanCombatWinAsian",
onLose: "GameOver"
})>>
<<goto "Combat">><</button>><<set $player.strength += 1>><<set $player.endurance += 1>><<set $reputation -= 5>><center><img src="assets/characters/neighbor/fightWon.webp"></center>
<p>You survived the brutal encounter. The fight hardened your muscles and taught you the limits of your endurance.</p>
<p><b>You gained +1 Strength and +1 Endurance.</b></p>
<p>The woman is wounded and helpless. What do you want to do with her?</p>
<<button "Spare her">><<goto "SpareAfterFight">><</button>>
<<button "Kill her">><<goto "KillAfterFight">><</button>>
<<button "Negotiate her freedom">><<run setup.startNSFW({
text: "female",
scenes: "female_asian",
option: "fight"
})>><<goto "RandomNSFW">><</button>><<set $player.strength += 1>><<set $player.endurance += 1>><<set $reputation -= 5>><center><img src="assets/characters/neighbor/fightWon.webp"></center>
<p>You survived the brutal encounter. The fight hardened your muscles and taught you the limits of your endurance.</p>
<p><b>You gained +1 Strength and +1 Endurance.</b></p>
<p>The woman is wounded and helpless. What do you want to do with her?</p>
<<button "Spare her">><<goto "SpareAfterFight">><</button>>
<<button "Kill her">><<goto "KillAfterFight">><</button>>
<<button "Negotiate her freedom">><<run setup.startNSFW({
text: "female",
scenes: "female_black",
option: "fight"
})>><<goto "RandomNSFW">><</button>>Content Disclaimer
This is a dark, post-apocalyptic survival game featuring morally complex choices, adult themes, and strong consequences.
The game does not glorify violence or immoral behavior - instead, it presents players with difficult decisions and lets them face the consequences.
All NSFW scenes involve consensual interactions between fictional characters and are portrayed within the narrative context.
The world is brutal, but your choices define who you become - for better or worse.<<addmins 30>><<set $player.energy -= 10>><center><img src="assets/characters/neighbor/hungryOrphans.jpg"></center>
The hatch opens with a hiss. Three malnourished children stand before you. One is trembling, the youngest girl starts crying.
<<kid>>Please... We lost our parents. Can we have some water?<</kid>>
<center><b>Requested item:</b><br>
<<= setup.renderItemList([{ id: "water", qty: [1] }])>></center>
<<nobr>> <<if $water > 0>><<button "Give them a bottle of water">><<set $water -= 1>><<set $reputation += 5>><<goto "hungryOrphansWater">><</button>><</if>>
<<button "Close the hatch">><<set $reputation -= 5>><<goto "Bunker">><</button>><</nobr>><center><img src="assets/characters/neighbor/hungryOrphansWater.jpg"></center>
The children rushed to the bottle of water you gave them. Despite his obvious thirst, the oldest boy first gave water to his younger sister and only drank himself at the end.
<<kid>>I don't mean to be rude, but could you give us something to eat? We haven't eaten in days... At least one can for her...<</kid>>
The boy said in a sad and modest voice.
<center><b>Requested item:</b><br>
<<= setup.renderItemList([{ id: "cannedFood", qty: [2] }])>></center>
<<nobr>> <<if $cannedFood >= 1>><<button "Give his little sister one food can">><<set $cannedFood -= 1>><<set $reputation += 5>><<goto "hungryOrphansFoodGood">><</button>><</if>>
<<if $cannedFood >= 2>><<button "Give them two food cans">><<set $cannedFood -= 2>><<set $reputation += 10>><<goto "hungryOrphansFoodGood1">><</button>><</if>>
<<if $cannedFood is 0>><<button "I'm so sorry... I don't have any food myself...">><<goto "Bunker">><</button>><<else>><<button "I gave you water, don't abuse my generosity. Go away.">><<set $reputation -= 1>><<goto "Bunker">><</button>><</if>><</nobr>> <<set _rewardList = ["goldRing", "goldWatch"]>><<set _reward = _rewardList.random()>>You reached into your supplies and took out two cans of food. When the children saw this, their eyes lit up with disbelief and hope. The little girl smiled and grabbed one can, while the older boy hesitated for a moment as if unsure whether to accept such generosity.
<center><img src="assets/characters/neighbor/hungryOrphansFood1.jpg"></center>
<<kid>>Are you sure? That's a lot...<</kid>>
You nodded silently and handed the food over.
The children sat down right next to the hatch and began to eat immediately. The youngest girl devoured her meal with enthusiasm, while the boy opened his can slowly, savoring the moment. He offered some to his little sister, but she refused with a giggle - clearly full and happy.
As they finished eating, the boy stood up, wiped his mouth with a sleeve, and pulled something from his pocket.
<<kidhappy>>My mom... She wore this. But you saved my sister. It's only fair. Please take it. It's the least we can do.<</kidhappy>>
<<if _reward == "goldRing">>
<p>He hands you a small <b>gold ring</b>, clearly worn and old.</p>
<<elseif _reward == "goldWatch">><p>He offers you a <b>gold watch</b>, scratched but still working.</p><</if>>
<<button "Accept it">><<if _reward == "goldRing">><<set $goldRing += 1>><</if>><<if _reward == "goldWatch">><<set $goldWatch += 1>><</if>><<goto "Bunker">><</button>>
<<button "Keep it. You'll need it more than I do.">><<set $reputation += 5>><<goto "Bunker">><</button>><center><img src="assets/characters/neighbor/hungryOrphansFood.jpg"></center>
You went and took a can of food out of the cupboard, opened it and handed it to the girl. She stared in disbelief with wide eyes. When you handed her the can, she didn't know what to do for a moment and looked at her older brother. The boy nodded, signalling her to eat.
<<kid>>Eat, it's for you.<</kid>>
You could tell that the boy was very hungry, staring intently at the can. The girl ate very quickly, but halfway through she stopped and gave the rest to her brother. It was a heart-warming scene, the kind that was rarely experienced in those difficult times.
<<kidhappy>>Thank you, Mister! You are a very kind person. We will not forget you, we promise!<</kidhappy>>
<<button "Next">><<goto "Bunker">><</button>><<addmins 60>><<set $player.energy -= 10>>A ragged man and a woman stand before you. The man steps forward, desperation etched on his face.
<<neighborsad>>Show him...<</neighborsad>>
<center><img src="assets/characters/neighbor/manSellingWife.webp"></center>
<<neighborsad>>Three cans of food. That’s all I ask. Take her. She’ll do whatever you want.<</neighborsad>>
<<womanhorny>>Yes... Please, I'll do whatever you want...<</womanhorny>>
<center><b>Requested item:</b><br>
<<= setup.renderItemList([{ id: "cannedFood", qty: [3] }])>></center>
<<nobr>><<if $cannedFood >= 3>><<button "Agree to the trade">><<run setup.startNSFW({
text: "female",
scenes: "female_white",
option: "afterDeal"
})>><<set $cannedFood -= 3>><<goto "RandomNSFW">><</button>><</if>>
<<button "Threaten them - give up everything">><<goto "manSellingWifeFight">><</button>>
<<button "Tell them to go away">><<goto "Bunker">><</button>><</nobr>><center><img src="assets/characters/neighbor/whiteManRequest.webp"></center>
<<neighborsad>>Come on, darling, let's kill him and take what we need from this place.<</neighborsad>>
<<button "Fight them">> <<run setup.startCombat({
enemies: [
{ spritePrefix: 'survivorMale', name: 'Poor man', maxHp: 20, weapon: 'fist' },
{ spritePrefix: 'survivorFemale', name: 'Poor woman', maxHp: 10, weapon: 'fist' },
],
allies: [],
onWin: "manSellingWifeFightWin",
onLose: "GameOver"
})>> <<goto "Combat">><</button>><<set $player.strength += 1>><<set $player.endurance += 1>><center><img src="assets/characters/neighbor/fightWon.webp"></center>
<p>You survived the brutal encounter. The fight hardened your muscles and taught you the limits of your endurance.</p>
<p><b>You gained +1 Strength and +1 Endurance.</b></p>
<p>Married couple are wounded and helpless. What do you want to do with them?</p>
<<button "Spare them">><<set $reputation += 2>><<goto "Bunker">><</button>>
<<button "Kill them">><<goto "KillAfterFight">><</button>>
<<button "Negotiate her freedom">><<run setup.startNSFW({
text: "female",
scenes: "female_white",
option: "fight"
})>><<goto "RandomNSFW">><</button>>
<<button "Negotiate his freedom">><<run setup.startNSFW({
text: "male",
scenes: "male_white",
option: "fight"
})>><<goto "RandomNSFW">><</button>><<addmins 30>><<set $player.energy -= 10>><center><img src="assets/characters/neighbor/gangSurvivor.webp"></center>
You opened the hatch. A wounded man stumbled in, barely able to stand. His arm was bandaged with a dirty cloth, and his gang tattoos were still visible despite the grime. He fell to his knees and coughed.
<<bandit>>I’m not here to fight... I escaped my crew. They left me for dead. Please... I just need help...<</bandit>>
You could see the fear in his eyes and the blood soaking through his makeshift bandage.
<center><b>Requested items:</b><br>
<<= setup.renderItemList([
{ id: "firstAid", qty: [1] },
{ id: "bandage", qty: [1] }
])>></center>
<<nobr>> <<if $firstAid > 0 and $bandage > 0>><<button "Use a medkit and bandage to help him">><<goto "gangSurvivorHelped">><</button>><</if>>
<<button "Let him earn it">><<run setup.startNSFW({
text: "male",
scenes: "male_white",
option: "medic"
})>><<set $reputation -= 5>><<goto "RandomNSFW">><</button>>
<<button "Kill him before he becomes a problem">><<goto "KillAfterFight">><</button>>
<<button "Throw him out of the bunker">><<goto "Bunker">><</button>><</nobr>><<addmins 30>><<set $player.energy -= 10>><center><img src="assets/characters/neighbor/knifeWoman.webp"></center>
You unlock the hatch and pull it open cautiously. A woman stumbles back, startled by the sudden motion. Her clothes are torn and soaked, her skin pale and streaked with grime. She looks malnourished - her cheeks sunken, eyes wide with desperation.
She stands just outside the hatch, swaying slightly, and you notice she keeps one hand hidden behind her back.
<<womanwhitebeg>>Please... I just need food. Anything. I haven't eaten in days...<</womanwhitebeg>>
She glances around nervously, as if expecting someone or something to appear behind her. The tension in her posture doesn’t ease, and that hidden hand remains clenched out of sight.
<center><b>Requested item:</b><br>
<<= setup.renderItemList([{ id: "cannedFood", qty: [1] }])>></center>
<<nobr>> <<if $cannedFood > 0>><<button "Give her food">>
<<set $cannedFood -= 1>>
<<set $reputation += 5>>
<<goto "knifeWomanFood">><</button>><</if>>
<<button "Tell her to fuck off">><<run setup.startCombat({
enemies: [
{ spritePrefix: 'survivorFemale', name: 'Desperate woman', maxHp: 15, weapon: 'knife' },
],
allies: [],
onWin: "strangerWomanCombatWin",
onLose: "GameOver"
})>><<goto "Combat">>
<</button>><</nobr>><<set $knife += 1>><<set $firstAid -= 1>><<set $bandage -= 1>><<set $reputation += 5>><<addmins 90>><<set $player.energy -= 20>>You patch up his wound carefully. He grimaces but stays still, breathing heavily. For a moment, there’s only silence between you, until he finally speaks.
<center><img src="assets/characters/neighbor/gangSurvivorHelped.webp"></center>
<<bandit>>Before the bombs, I owned a small bakery. Had a wife... Two kids.
We used to wake up early, knead dough, joke around. Then... Everything vanished. I wandered for weeks. Got picked up by a crew... said they'd protect me if I pulled my weight. So I did things. Bad things. Told myself it was just survival.
But when I got injured, they didn’t even hesitate. Left me in the dirt like trash.
I thought this world had no more people... Only broken monsters in human skin like myself.
But you... You helped me. You reminded me what it means to be human.
Here. Take this knife. I won’t need it anymore.
I’m done hurting others just to keep breathing.<</bandit>>
He places a battered combat knife in your hand, then slowly walks toward the exit, not looking back.
<center><b>You received:</b><br>
<<= setup.renderItemList([{ id: "knife", qty: [1] }])>></center>
<<button "Next">><<goto "Bunker">><</button>><<addmins 60>><<set $player.energy -= 10>><center><img src="assets/characters/neighbor/subtleCoughing.jpg"></center>
<p>You slowly open the hatch. Cold air rushes in. A frail, trembling old man stumbles forward, coughing violently. His eyes are bloodshot, and dried blood stains the corner of his mouth. He falls to his knees just inside the entrance, barely able to speak.</p>
<<oldman>>Khhr... Hhgg... They took... *cough*... Down there... It fell... I-I tried... But... Nghhh...<</oldman>>
<<button "Ask what he means">><<goto "subtleCoughingAsk">><</button>>
<<button "Attack him">><<run setup.startCombat({
enemies: [
{ id: "raider1", name: "Barely alive man", maxHp: 1, damage: 1 },
],
allies: [],
onWin: "strangerManCombatWin",
onLose: "GameOver"
})>><<goto "Combat">><</button>>
<<button "Leave him be">><<set $reputation -= 5>><<goto "Bunker">><</button>><<set $firstAid -= 1>><<set $bandage -= 1>><<set $reputation += 5>>You clean and dress his wound. He winces, but thanks you with a quiet nod.
<center><img src="assets/characters/neighbor/gangSurvivorHelped.webp"></center>
<<bandit>>At least you keep your word... I owe you. I won’t forget this.<</bandit>>
You’re not sure if you’ll see him again.
<<button "Next">><<goto "Bunker">><</button>><<addmins 30>><<set $player.energy -= 10>>You slowly reach behind you, retrieving a dented can of food. No sudden moves. You hold it out, arm extended with a gesture of peace.
The woman hesitates. Her eyes flick from the can to your face, searching for a trap. Then, with trembling fingers, she accepts the offering.
<<womanwhitebeg>>I... I thought no one would ever... Thank you.<</womanwhitebeg>>
She sinks to her knees on the cold concrete, clutching the can to her chest as if it were something sacred. A tear carves a clean path down her cheek.
<<womanwhitebeg>>I was starting to think kindness died with the world...<</womanwhitebeg>>
<center><b>You lost:</b><br>
<<= setup.renderItemList([{ id: "cannedFood", qty: [1] }])>></center>
<<button "Let her go">><<goto "Bunker">><</button>>
<<button "Attack her">><<run setup.startCombat({
enemies: [
{ id: "raider1", name: "Woman with knife", maxHp: 20, damage: 6 },
],
allies: [],
onWin: "strangerWomanCombatWin",
onLose: "GameOver"
})>><<set $reputation -= 10>><<goto "Combat">><</button>><<addmins 60>><<set $player.energy -= 10>><center><img src="assets/characters/neighbor/blockedHatch.webp"></center>
<p>You open the heavy metal door. A gaunt man stumbles back, startled by the noise. Dirt clings to his clothes, and a crowbar hangs limply in his hand.</p>
<<oldman>>Shit... You actually opened it. I thought... Never mind. Listen...<</oldman>>
<p>He jerks his thumb toward a crumbling building across the street.</p>
<<oldman>>There’s another hatch down there, sealed shut. I heard stories... Military cache, meds, rations. But I can’t get it open. Too rusted, or stuck, I dunno.
You help me crack it, we split whatever’s inside. Deal?<</oldman>>
<<nobr>><<if $player.strength >= 10>><<button "Use strength to break it open">><<goto "blockedHatchStr">><</button>><</if>>
<<if $player.intelligence >= 10>><<button "Use improvised tools to open it">><<goto "blockedHatchInt">><</button>><</if>>
<<button "Refuse and return to the bunker">><<goto "Bunker">><</button>><</nobr>><<addmins 60>><<set $player.energy -= 10>><center><img src="assets/characters/neighbor/trappedChild.webp"></center>
<p>You open the hatch. A tear-streaked woman stumbles in, her voice trembling.</p>
<<womanwhitebeg>>Thank God... Please! My daughter! She’s trapped beneath a collapsed building. I tried, but I can’t move the rubble alone. Please, help me!<</womanwhitebeg>>
<<button "Clear the rubble">><<goto "trappedChildHelp">><</button>>
<<button "Refuse to help">><<set $reputation -= 5>><<goto "Bunker">><</button>><<if $player.strength > 14>><<addmins 180>><<set $player.endurance += 2>><<set $player.strength += 2>><center><img src="assets/characters/neighbor/trappedChildHelp.jpg"></center>
<p>You rush out with determination and begin moving the massive concrete slabs with your bare hands. Your strength cuts through the wreckage like a machine.</p>
<p>After a few tense minutes, you find the girl, terrified but alive. You help her crawl out.</p>
<<womanwhitebeg>>Thank you... We don’t have anything to offer, but I’ll never forget what you did today.<</womanwhitebeg>><<else>><<addmins 640>><<set $player.energy -= 80>><<set $player.endurance += 4>><<set $player.strength += 4>><center><img src="assets/characters/neighbor/trappedChildHelp.jpg"></center>
<p>You weren’t strong enough to lift the debris quickly, but you refused to give up.</p>
<p>At first, you clear enough for the child to breathe. Then hour after hour, you fight through exhaustion, shoveling, prying, dragging rubble away.</p>
<p>Eventually, your persistence pays off. She crawls out coughing and crying.</p>
<<womanwhitebeg>>Thank you... We don’t have anything to give you, but we’ll remember this. I promise.<</womanwhitebeg>><</if>><<set $reputation += 5>>
<<button "Return to the bunker">><<goto "Bunker">><</button>><<run setup.AddItemsList("add")>><center><img src="assets/characters/neighbor/fightWon.webp"></center>
<p>You wipe the sweat from your brow as the man collapses at your feet, bleeding and groaning. Around you lie scattered supplies and you grab everything you can carry.</p>
<b>You received:</b>
<<= setup.renderItemList($eventItemsAdd, { style: "inline", size: 80 })>>
<p>The adrenaline slowly fades. You turn to face him. He's still alive - barely. One eye swollen shut, breath ragged, hand trembling as he reaches toward the crowbar that failed him.</p>
<p>You plant your foot on it before he can touch it.</p>
<p>He looks up at you with something between hatred and regret.</p>
<p><i>You have what you came for. But do you leave him here to suffer? Or finish what he started?</i></p>
<<button "Spare him">><<goto "SpareAfterFight">><</button>>
<<button "Kill him">><<goto "KillAfterFight">><</button>>
<<button "Negotiate his freedom">><<run setup.startNSFW({
text: "male",
scenes: "male_white",
option: "fight"
})>><<goto "RandomNSFW">><</button>><<addmins 180>><<set $player.energy -= 30>><center><img src="assets/characters/neighbor/blockedHatch.webp"></center>
<p>You follow the man to the collapsed entrance of a maintenance shaft. Rusted shut and warped by time, the second hatch groans under pressure. You grip the edge and strain with all your might.</p>
<p>After a loud snap and a cloud of rust flakes, the hatch gives way, slamming open with a metallic clang.</p>
<<oldman>>Thanks for doing the hard part. But I lied. I’m not sharing shit.<</oldman>>
<<button "Fight him">> <<run setup.startCombat({
enemies: [
{ spritePrefix: 'survivorMale', name: 'Old man', maxHp: 35, weapon: 'club' },
],
allies: [],
onWin: "blockedHatchWin",
onLose: "GameOver"
})>> <<goto "Combat">><</button>><<addmins 60>><<set $player.energy -= 10>><center><img src="assets/characters/neighbor/blockedHatch.webp"></center>
<p>You kneel next to the hatch and inspect its mechanism. The man hovers anxiously over your shoulder.</p>
<p>With some scavenged wire, a shard of metal, and careful leverage, you hear a satisfying click, then the hatch creaks open.</p>
<</if>>
<p>The man stares at the dark hole below. His posture shifts, the tension in his shoulders hardens. Then he grips the crowbar tighter.</p>
<<oldman>>Thanks for doing the hard part. But I lied. I’m not sharing shit.<</oldman>>
<<button "Fight him">> <<run setup.startCombat({
enemies: [
{ spritePrefix: 'survivorMale', name: 'Old man', maxHp: 35, weapon: 'club' },
],
allies: [],
onWin: "blockedHatchWin",
onLose: "GameOver"
})>><<goto "Combat">><</button>><<addmins 60>><<set $player.energy -= 10>><<if $player.intelligence > 6>><center><img src="assets/characters/neighbor/subtleCoughing.jpg"></center>
<p>You kneel beside him, trying to make sense of his words. He struggles, but manages to speak more clearly through the pain.</p>
<<oldman>>I'm... Dying... Please... A medkit... They left me here... I just need to breathe...<</oldman>>
<<nobr>><<if $firstAid > 0>><<button "Give him a first aid kit">><<set $firstAid -= 1>><<goto "subtleCoughingmedkit">><</button>>
<<button "Attack him">><<run setup.startCombat({
enemies: [
{ id: "raider1", name: "Barely alive man", maxHp: 1, damage: 1 }
],
allies: [],
onWin: "strangerManCombatWin",
onLose: "GameOver"
})>><<goto "Combat">><</button>>
<<button "Leave him be">><<set $reputation -= 5>><<goto "Bunker">><</button>><</nobr>><<else>><p>You reach for a medkit, but realize you don’t have one. The old man gasps weakly one last time... And then goes still.</p>
<<button "Next">> <<goto "Bunker">><</button>><</if>><<elseif $player.intelligence <= 5>><center><img src="assets/characters/neighbor/subtleCoughing.jpg"></center>
<p>You lean in, trying to understand him, but it’s mostly incoherent gibberish.</p>
<<oldman>>Nnngh... not... time... hhrghh... down... took it... fallin'... *cough*<</oldman>>
<p>You try to guess what he's trying to say:</p>
<<nobr>> <<if $water > 0>><<button "Do you want water?">><<goto "subtleCoughingDied">><</button>><</if>>
<<if $cannedFood > 0>><<button "Are you want food?">><<goto "subtleCoughingDied">><</button>><</if>>
<<if $firstAid > 0>><<button "Do you need a medkit?">><<set $firstAid -= 1>><<goto "subtleCoughingmedkit">><</button>><</if>>
<<button "Repeat what you just said">><<goto "subtleCoughingDied">><</button>>
<<button "Attack him">><<run setup.startCombat({
enemies: [
{ id: "raider1", name: "Barely alive man", maxHp: 1, damage: 1 },
],
allies: [],
onWin: "strangerManCombatWin",
onLose: "GameOver"
})>>
<<goto "Combat">><</button>>
<<button "Leave him be">><<set $reputation -= 5>><<goto "Bunker">><</button>><</nobr>><</if>><center><img src="assets/characters/neighbor/subtleCoughingDied.jpg"></center>
<p>You stayed for a moment longer, watching as his trembling grew weaker. His breath turned into dry, shallow gasps… Then silence.</p>
<p>He slumped against the wall, eyes half-open, staring into nothing. You closed the hatch and stepped away, the air colder than before.</p>
<<button "Next">><<goto "Bunker">><</button>><<addmins 60>><<set $player.energy -= 10>><<set $player.intelligence += 1>><<set $reputation += 5>><center><img src="assets/characters/neighbor/subtleCoughing1.jpg"></center>
<p>You hand him the first aid kit. With trembling fingers, he fumbles it open and injects something into his thigh.</p>
<p>Moments pass. His breathing steadies. The trembling fades.</p>
<<if $player.intelligence > 12>><<set $player.intelligence += 1>><<run setup.AddItemsList("add")>><p>He leans back, voice still hoarse but more coherent.</p>
<<oldman>>There’s... A place nearby. Metal door behind the old diner. I left my wife's jewelry there - didn’t want the bastards to take it. It’s yours now. You saved me.<</oldman>>
<p>You nod and follow his directions. Behind the collapsed diner, buried under rubble, you find a rusted hatch. Inside, a small tin box holds a golden ring and an old-fashioned watch. When you return - he's gone.</p>
<b>You received:</b>
<<= setup.renderItemList($eventItemsAdd, { style: "inline", size: 80 })>>
<<button "Next">><<goto "Bunker">><</button>>
<<else>><p>He mutters something under his breath. Still too weak to speak clearly.</p>
<oldman>Th-they... T-took… C-can’t… Nghh…</oldman>
<p>Maybe if you ask the right question, he’ll respond.</p>
<<button "What jewelry?">><<goto "subtleCoughingIntSuccess">><</button>>
<<button "What weapon are you talking about?">><<goto "subtleCoughingWrong">><</button>>
<<button "Who were the raiders?">><<goto "subtleCoughingWrong">><</button>>
<<button "Is someone in danger?">><<goto "subtleCoughingWrong">><</button>><</if>><<set $player.intelligence += 1>><<run setup.AddItemsList("add")>><center><img src="assets/characters/neighbor/subtleCoughing1.jpg"></center>
<p>He leans back, voice still hoarse but more coherent.</p>
<<oldman>>There’s... A place nearby. Metal door behind the old diner. I left my wife's jewelry there - didn’t want the bastards to take it. It’s yours now. You saved me.<</oldman>>
<p>You nod and follow his directions. Behind the collapsed diner, buried under rubble, you find a rusted hatch. Inside, a small tin box holds a golden ring and an old-fashioned watch. When you return - he's gone.</p>
<b>You received:</b>
<<= setup.renderItemList($eventItemsAdd, { style: "inline", size: 80 })>>
<<button "Next">><<goto "Bunker">><</button>><center><img src="assets/characters/neighbor/subtleCoughing1.jpg"></center>
<p>The man mumbled something unintelligible and slumped against the bunker wall. You checked - he was still breathing, barely. Whatever strength he had left was gone.</p> <p>You stood over him for a while, uncertain. Then, in the distance, you spotted movement - figures that looked like raiders. Without hesitation, you closed the hatch.</p> <p>Later, you kept checking the camera feed. He was always there... Until he wasn't.</p>
<<button "Next">><<goto "Bunker">><</button>><<addmins 60>><<set $player.energy -= 10>><center><img src="assets/characters/neighbor/womanGenerator.webp"></center>
<p>You open the hatch. The woman rushes in, wide-eyed and breathless, clutching a small battery in her arms.</p>
<<womanwhitebeg>>Thank God you're here! Please... I need your help. My car's battery is dead and I was trying to connect it to a generator. If I can't get it running, my brother won't make it through the night...<</womanwhitebeg>>
<p>She points toward the car outside, its hood popped open. A small, portable generator lies on the ground nearby, wires coiled in a tangle.</p>
<<button "Help her set it up">><<goto "womanGeneratorHelp">><</button>>
<<button "Refuse and close the hatch">><<set $reputation -= 3>><<goto "Bunker">><</button>>
<<button "Attack her">><<run setup.startCombat({
enemies: [
{ id: "raider1", name: "Poor woman", maxHp: 10, damage: 1 },
],
allies: [],
onWin: "strangerWomanCombatWin",
onLose: "GameOver"
})>><<goto "Combat">><</button>><<addmins 60>><<set $player.energy -= 10>><<if $intelligence > 11>><<set $player.intelligence += 1>><<set $reputation += 5>><center><img src="assets/characters/neighbor/womanGeneratorBad.jpg"></center>
<p>You examine the tangled wires and spot the issue immediately. With a confident flick of your wrist, you connect the battery and stabilize the voltage.</p>
<p>The engine roars to life. The woman gasps, overwhelmed.</p>
<<womanwhitebeg>>You... You actually did it! Thank you so much. I owe you everything.<</womanwhitebeg>>
<<button "Next">><<goto "Bunker">><</button>><<else>><<set _roll = random(1, 100)>><<if _roll >= 80>><center><img src="assets/characters/neighbor/womanGeneratorBad.jpg"></center>
<p>You fumble through the cables, trying to follow logic you barely remember. Sparks fly.</p>
<p><strong>CRACK!</strong> A jolt of electricity hits you, causing your muscles to spasm.</p><<set $player.health -= 20>><<set $player.energy -= 15>>
<p>The woman winces. She doesn’t say anything but looks concerned.</p>
<<button "Try again">><<goto "womanGeneratorHelp">><</button>>
<<button "Give up">><<goto "Bunker">><</button>><<elseif _roll >= 45>><<set $player.intelligence += 1>><<set $reputation += 5>><center><img src="assets/characters/neighbor/womanGeneratorBad.jpg"></center>
<p>You hesitate for a moment, then take a chance. The connection sparks.</p>
<p>The engine sputters… And comes to life.</p>
<<womanwhitebeg>>I don’t know how you managed that, but... It worked! Thank you.<</womanwhitebeg>>
<p>She drives off, throwing you a grateful smile through the cracked windshield.</p>
<<button "Next">><<goto "Bunker">><</button>><<else>><center><img src="assets/characters/neighbor/womanGeneratorBad.jpg"></center>
<p>You mess with the cables for a while, but nothing happens. The battery makes a strange noise and the generator emits a brief spark, then goes silent again.</p>
<p>The woman frowns, biting her lip anxiously.</p>
<<button "Try again">><<goto "womanGeneratorHelp">><</button>>
<<button "Give up">><<goto "Bunker">><</button>><</if>><</if>><<addmins 60>><<set $player.energy -= 10>><center><img src="assets/characters/neighbor/sickMan.jpg"></center>
<p>You crack open the hatch. The man lies curled at the base of the wall, shivering, his eyes glassy and unfocused. A deep, discolored wound festers on his leg.</p>
<p>He mumbles something unintelligible, sweat pouring down his face. The smell of rot hits you hard.</p>
<<if $player.intelligence >= 6>><<button "Inspect the wound">><<goto "sickManDiagnose">><</button>><<else>><<button "Try to help him">><<goto "sickManBlindHelp">><</button>><</if>>
<<button "Leave him alone">><<set $reputation -= 5>><<goto "Bunker">><</button>><<addmins 60>><<set $player.energy -= 10>><center><img src="assets/characters/neighbor/sickManHelp.jpg"></center>
<p>You take a closer look at the leg. The tissue is blackened and swollen, clearly necrotic. You recognize the signs immediately: <b>advanced gangrene</b>.</p>
<p>If untreated, it will spread. He’ll be dead in hours.</p>
<<nobr>> <<button "Amputate the infected tissue">><<goto "sickManGoodHelp">><</button>>
<<if $water > 0>><<button "Give him water">><<goto "sickManWater">><</button>><</if>>
<<button "Do nothing">><<set $reputation -= 5>><<goto "Bunker">><</button>><</nobr>> <center><img src="assets/characters/neighbor/sickManHelp.jpg"></center>
<p>You kneel beside him. The leg wound looks <i>bad</i>, but you’re not sure what’s wrong exactly. Maybe he just needs water? Or maybe it’s infected?</p>
<<nobr>> <<if $water > 0>><<button "Give him water">><<goto "sickManWater">><</button>><</if>>
<<button "Clean the wound">><<goto "sickManBadHelp">><</button>>
<<button "Leave him">><<set $reputation -= 5>><<goto "Bunker">><</button>><</nobr>> <div class="crafting-item"> <img class="crafting-img" src="assets/ui/camera.jpg" alt="Camera">
<div class="crafting-details">\
<div class="crafting-title">Camera</div>
<div class="crafting-desc">Monitors movement in the bunker. May unlock special events.</div>
<div class="crafting-cost">Requires: 10x Wood, 5x Scrap Metal</div>\
\
<<if $wood >= 10 and $scrapMetal >= 5 and !$camera>>\
<button class="crafting-button"
onclick="
const v = SugarCube.State.variables;
v.wood -= 10;
v.scrapMetal -= 5;
v.camera = true;
if (v.gameTime instanceof Date) {
v.gameTime.setMinutes(v.gameTime.getMinutes() + 120);
}
SugarCube.Engine.play('crafting');
">Build</button>
<<elseif $camera>>\
<span class="crafting-built">Built</span>\
<<else>>\
<span class="crafting-missing">Not enough materials</span><</if>>\
</div>\
</div>
\
<div class="crafting-item">
<img class="crafting-img" src="assets/ui/bed.jpg" alt="Bed">
<div class="crafting-details">\
<div class="crafting-title">Upgraded Bed</div>
<div class="crafting-desc">Restores more energy when sleeping or napping.</div>
<div class="crafting-cost">Requires: 15x Wood</div>\
\
<<if $wood >= 15 and !$bedUpgrade>>\
<button class="crafting-button"
onclick="
const v = SugarCube.State.variables;
v.wood -= 15;
v.bedUpgrade = true;
if (v.gameTime instanceof Date) {
v.gameTime.setMinutes(v.gameTime.getMinutes() + 90);
}
SugarCube.Engine.play('crafting');
">Build</button>
<<elseif $bedUpgrade>>\
<span class="crafting-built">Built</span>\
<<else>>\
<span class="crafting-missing">Not enough materials</span>\
<</if>>\
</div>\
</div>
\
<div class="crafting-item">
<img class="crafting-img" src="assets/ui/gym.jpg" alt="Gym">
<div class="crafting-details">\
<div class="crafting-title">Upgraded Gym</div>
<div class="crafting-desc">Grants more strength per training session.</div>
<div class="crafting-cost">Requires: 12x Scrap Metal</div>\
\
<<if $scrapMetal >= 12 and !$gymUpgrade>>\
<button class="crafting-button"
onclick="
const v = SugarCube.State.variables;
v.scrapMetal -= 12;
v.gymUpgrade = true;
if (v.gameTime instanceof Date) {
v.gameTime.setMinutes(v.gameTime.getMinutes() + 60);
}
SugarCube.Engine.play('crafting');
">Build</button>
<<elseif $gymUpgrade>>\
<span class="crafting-built">Built</span>\
<<else>>\
<span class="crafting-missing">Not enough materials</span>\
<</if>>\
</div>\
</div>
\
<div class="crafting-item">
<img class="crafting-img" src="assets/ui/showerup.jpg" alt="Shower">
<div class="crafting-details">\
<div class="crafting-title">Upgraded Shower</div>
<div class="crafting-desc">Improves hygiene and saves time during showering.</div>
<div class="crafting-cost">Requires: 8x Wood, 5x Scrap Metal</div>\
\
<<if $wood >= 8 and $scrapMetal >= 5 and !$showerUpgrade>>\
<button class="crafting-button"
onclick="
const v = SugarCube.State.variables;
v.wood -= 8;
v.scrapMetal -= 5;
v.showerUpgrade = true;
if (v.gameTime instanceof Date) {
v.gameTime.setMinutes(v.gameTime.getMinutes() + 60);
}
SugarCube.Engine.play('crafting');
">Build</button>
<<elseif $showerUpgrade>>\
<span class="crafting-built">Built</span>\
<<else>>\
<span class="crafting-missing">Not enough materials</span>\
<</if>>\
</div>\
</div>
\
<div class="crafting-item">
<img class="crafting-img" src="assets/ui/radio.jpg" alt="Radio">
<div class="crafting-details">\
<div class="crafting-title">Radio</div>
<div class="crafting-desc">Allows you to try contacting the outside world. Essential for reaching an ending.</div>
<div class="crafting-cost">Requires: 10x Electronics, 5x Scrap Metal</div>\
\
<<if $electronics >= 10 and $scrapMetal >= 5 and !$radio>>\
<button class="crafting-button"
onclick="
const v = SugarCube.State.variables;
v.electronics -= 10;
v.scrapMetal -= 5;
v.radio = true;
if (v.gameTime instanceof Date) {
v.gameTime.setMinutes(v.gameTime.getMinutes() + 90);
}
SugarCube.Engine.play('crafting');
">Build</button>
<<elseif $radio>>\
<span class="crafting-built">Built</span>\
<<else>>\
<span class="crafting-missing">Not enough materials</span>\
<</if>>\
</div>\
</div>
<<button "Back">><<goto "Bunker">><</button>><div class="trade-header">Your Funds: $<<=$currency>> | Trader Reputation: <<= Math.round(($traderRep||0)*10)/10 >></div>
<div class="tabs"><button class="tab" data-tab="buy">Buy</button><button class="tab" data-tab="sell">Sell</button></div>
<div id="tab-buy"></div><div id="tab-sell" style="display:none"></div>
<<button "Leave">><<goto "Bunker">><</button>><<run State.variables.gameTime.setHours(22, 0)>><<include "NightPhase">><center><h1>Companions</h1></center>
<<if $player.companions.length === 0>>
<p>You don't have any companions to talk to.</p>
<</if>><div class="training-grid">\
<<for _char range $player.companions>>\
<<set _npc = $npcs.find(n => n.id === _char)>>\
<<if _npc>>\
<<capture _localChar>>\
<<set _localChar = _char>>\
<div class="training-tile">\
<a data-passage="CompanionScene"
class="companion-link"
data-setter="
$currentCompanion = _localChar;
setup.startCompanionNSFW({
scenes: _localChar,
text: 'female'
});
setup.enterNSFWMusic();
">\
<<print '<img src="assets/characters/' + _localChar + '/default.jpg" alt="">'>> \
<div class="label"><<=_npc.name>></div>\
</a>\
</div>\
<</capture>>\
<</if>>\
<</for>>\
</div>\
<<button "Back">><<goto "bedroom">><</button>><<script>>
setup.buildInventoryGrid = function () {
const V = State.variables;
const defs = V.items || [];
const counts = {};
defs.forEach(def => {
const q = Number(V[def.id] || 0);
if (q > 0) counts[def.id] = q;
});
let html = '<div class="inventory-grid">';
Object.entries(counts).forEach(([id, qty]) => {
const def = defs.find(d => d.id === id);
if (!def) return;
html += `<div class="inventory-item"><img src="${def.icon || `assets/img/items/${id}.jpg`}" alt="${def.name || id}"><div class="inv-info"><span class="inv-name">${def.name || id}</span><span class="inv-qty">×${qty}</span></div></div>`;
});
html += '</div>';
return html;
};
<</script>><center><h2>Your Inventory</h2></center>
<<= setup.buildInventoryGrid()>>
<button class="button" onclick="SugarCube.Engine.play(SugarCube.State.variables.return)">Close</button><<set $player.reputation -= 2>><<set $water -= 1>><center><img src="assets/characters/neighbor/sickManDead.jpg"></center>
You handed him a bottle of water. The man took a few sips, then vomited blood. After a moment, he closed his eyes and his body became stiff.
<<you>>Poor bastard... Rest in peace.<</you>>
<<button "Next">><<goto "Bunker">><</button>><<addmins 60>><<set $player.energy -= 15>><<set $player.reputation += 1>> <center><img src="assets/characters/neighbor/sickManDead.jpg"></center>
<p>You try to clean the wound, but it’s worse than expected. The man cries out in agony, then goes limp. You realize too late you made it worse.</p>
<<you>> Fuck! Poor bastard... Maybe if I were smarter, I could help him... Rest in peace.<</you>>
<<button "Next">><<goto "Bunker">><</button>><<addmins 120>><<set $player.reputation += 5>><<set $player.intelligence += 2>><<set $player.energy -= 30>><center><img src="assets/characters/neighbor/sickManHelpGood.jpg"></center>
You took a saw and some alcohol. Then the scene turned into a bloody horror movie when you started cutting off the man's infected leg. He lost consciousness from the pain. Then you bandaged and secured the wound.
<<you>>I couldn't do anything else. I don't know how he'll manage, but at least he won't die because of his leg.<</you>>
You went to put the equipment away, and when you came back, the man was gone.
<<button "Next">><<goto "Bunker">><</button>><<addmins 60>><<set $player.energy -= 10>><center><img src="assets/characters/neighbor/guardianAngel1.jpg"></center>
You opened the hatch and saw a little kitten.
<<button "Take care of the cat">><<set $catAngel to true>><<goto "Bunker">><</button>>
<<button "Close the hatch">><<set $reputation -= 5>><<goto "Bunker">><</button>><<addmins 60>><<set $player.energy -= 10>><center><<print setup.getCompanionImage(1)>></center>
<<companion>>Hi, we don't know each other, but I have nowhere to go. Could you give me a shelter? I'll be useful to you!<</companion>>
<<nobr>> <<if setup.canRecruitMore()>>
<<button "Accept her and add to the bunker">>
<<run setup.addCompanion(State.variables.recruitCandidateId, true)>>
<<set $recruitCandidateId = null>>
<<run State.variables.player.companions =
(State.variables.player.companions || []).map(c => typeof c === "string" ? c : c.id)>>
<<goto "Bunker">>
<</button>>
<<else>>
<<button "Accept her and add to the bunker">><<goto "RecruitDecisionAcceptKick">><</button>>
<</if>>
<<button "Reject her">><<goto "Bunker">><</button>><</nobr>> <<set _cand = $npcs.find(n => n.id === $recruitCandidateId)>>
<p>Your bunker is full. Choose someone to replace with <<= _cand ? _cand.name : $recruitCandidateId>>.</p>
<div class="training-grid">
<<for _c range $player.companions>>
<<set _cid = _c>>
<<set _npc = $npcs.find(n => n.id === _cid)>>
<div class="training-tile">
<<print '<img src="assets/characters/' + _cid + '/default.jpg" alt="">'>>
<div class="label"><<= _npc ? _npc.name : _cid >></div>
<<print '<button class="btn-replace" onclick="setup.replaceCompanion(\'' + _cid + '\')">Replace</button>'>></div><</for>></div>
<<button "Cancel">><<set $recruitCandidateId = null>><<goto "Bunker">><</button>><<set $trader = false>><center><img src="assets/characters/neighbor/trader.jpg"></center>
<<trader>>You're going to die, and you know it.<</trader>>
<<button "Fight">><<run setup.startCombat({
enemies: [
{ spritePrefix: 'trader', name: 'Trader', maxHp: 70, weapon: 'pistol' },
],
allies: [],
onWin: "traderCombatWin",
onLose: "GameOver"
})>><<goto "Combat">><</button>><<set _loot = ($traderItems || []).slice()>><<run setup.lootTrader()>><<set $player.strength += 1>><<set $player.endurance += 1>><center><img src="assets/characters/neighbor/fightWon.webp"></center>
<p>You defeated the trader and seized his supplies.</p>
<b>You received:</b>
<<= setup.renderItemList(_loot, { style: "inline", size: 80 })>>
<p>The man is wounded and helpless. What do you want to do with him?</p>
<<button "Spare him">><<goto "SpareAfterFight">><</button>>
<<button "Kill him">><<goto "KillAfterFight">><</button>>
<<button "Negotiate his freedom">><<run setup.startNSFW({
text: "male",
scenes: "male_white",
option: "fight"
})>><<goto "RandomNSFW">><</button>><<addmins 30>><<set $player.energy -= 10>><center><img src="assets/characters/neighbor/shemaleRequest.webp"></center>
A feminine-looking person started flirting with you.
<<womanhorny>>Would you like to have some fun? Just so you know, I have a really big penis. Do you like feminine-looking guys?<</womanhorny>>
<<nobr>><<button "Agree">><<run setup.startNSFW({
text: "male",
scenes: "male_trans",
option: "afterDeal"
})>><<goto "RandomNSFW">><</button>>
<<button "Attack">><<goto "strangerShemaleRequestFight">><</button>>
<<button "No, thanks">><<goto "Bunker">><</button>><</nobr>><<set $player.strength += 1>><<set $player.endurance += 1>><<set $reputation -= 5>><center><img src="assets/characters/neighbor/fightWon.webp"></center>
<p>You survived the brutal encounter. The fight hardened your muscles and taught you the limits of your endurance.</p>
<p><b>You gained +1 Strength and +1 Endurance.</b></p>
<p>The feminine-looking guy is wounded and helpless. What do you want to do with him?</p>
<<button "Spare him">><<goto "SpareAfterFight">><</button>>
<<button "Kill him">><<goto "KillAfterFight">><</button>>
<<button "Negotiate his freedom">><<run setup.startNSFW({
text: "male",
scenes: "male_trans",
option: "afterDeal"
})>><<goto "RandomNSFW">><</button>><</button>><center><img src="assets/characters/neighbor/shemaleAttack.webp"></center>
<<womanhorny>>I could beat your ass in bed, but I can also beat you in a fight.<</womanhorny>>
<<button "Fight">> <<run setup.startCombat({
enemies: [
{ spritePrefix: 'survivorFemale', name: 'Trans woman', maxHp: 20, weapon: 'knife' },
],
allies: [],
onWin: "strangerShemaleCombatWin",
onLose: "GameOver"
})>><<goto "Combat">><</button>>[
{
"id": "earthquakeTremor",
"title": "Earthquake Tremor",
"image": "assets/characters/neighbor/earthquakeTremor.webp",
"text": "The ground shuddered. Dust rained from the ceiling. Something heavy toppled over in the storage room.",
"repeatable": true,
"minItem": {
"cannedFood": 1,
"water": 1
},
"effects": [
{ "type": "statChange", "healthRange": [-5, -1] },
{
"type": "eventItems",
"mode": "give",
"items": [
{ "id": "cannedFood", "qtyRange": [1, 2] },
{ "id": "water", "qtyRange": [1, 2] }
]
}
],
"choices": [
{ "text": "Continue", "passage": "earthquakeTremor" }
]
},
{
"id": "waterLeak",
"title": "Water Leak",
"image": "assets/characters/neighbor/waterLeak.webp",
"text": "A pipe inside the wall burst. A puddle spreads under your shelves as precious water trickles away.",
"repeatable": true,
"minItem": {
"water": 1
},
"effects": [
{
"type": "eventItems",
"mode": "give",
"items": [{ "id": "water", "qtyRange": [1, 3] }]
}
],
"choices": [
{ "text": "Continue", "passage": "waterLeak" }
]
},
{
"id": "quietGift",
"image": "assets/characters/neighbor/banging.jpg",
"title": "Loud banging",
"text": "You hear loud banging on the bunker hatch.",
"textWithCamera": "The camera shows an empty street. Whoever left the parcel is long gone.",
"imageWithCamera": "assets/characters/neighbor/quietGift.jpg",
"repeatable": false,
"minReputation": 1,
"effects": [
{
"type": "eventItems",
"mode": "add",
"items": "generated",
"lootRange": [40, 90]
}
],
"choices": [
{ "text": "Open the hatch", "passage": "quietGift" },
{ "text": "Ignore it", "passage": "Bunker" }
]
},
{
"id": "warningShout",
"title": "Warning Shout",
"image": "assets/characters/neighbor/warningShout.jpg",
"text": "A voice outside shouts a warning about raiders nearby. Then, silence.",
"textWithCamera": "The camera catches a fleeting shadow sprinting past the lens, then nothing.",
"imageWithCamera": "assets/characters/neighbor/warningShout.jpg",
"repeatable": true,
"minReputation": 1,
"effects": [
{ "type": "statBoost", "statPool": ["intelligence"] }
],
"choices": [
{ "text": "Continue", "passage": "warningShout" }
]
},
{
"id": "graffitiOnHatch",
"image": "assets/characters/neighbor/banging.jpg",
"title": "Loud banging",
"text": "You hear loud banging on the bunker hatch.",
"textWithCamera": "The camera feed shows only a fragment of fresh scrape marks on the metal near the lens.",
"imageWithCamera": "assets/characters/neighbor/cameraNothing.jpg",
"repeatable": true,
"maxReputation": -1,
"effects": [
{ "type": "statChange", "healthRange": [-2, -1] }
],
"choices": [
{ "text": "Open the hatch", "passage": "graffitiOnHatch" },
{ "text": "Ignore it", "passage": "Bunker" }
]
},
{
"id": "stoneThrow",
"image": "assets/characters/neighbor/banging.jpg",
"title": "Loud banging",
"text": "You hear loud banging on the bunker hatch.",
"textWithCamera": "The camera catches the tail of a coat as someone darts out of frame.",
"imageWithCamera": "assets/characters/neighbor/cameraGangSurvivor.jpg",
"repeatable": true,
"maxReputation": -1,
"effects": [
{ "type": "statChange", "healthRange": [-5, -2] }
],
"choices": [
{ "text": "Open the hatch", "passage": "stoneThrow" },
{ "text": "Ignore it", "passage": "Bunker" }
]
},
{
"id": "boobyTrap",
"image": "assets/characters/neighbor/banging.jpg",
"title": "Loud banging",
"text": "You hear loud banging on the bunker hatch.",
"textWithCamera": "The camera shows fresh grooves and metal shavings around the hatch.",
"imageWithCamera": "assets/characters/neighbor/cameraNothing.jpg",
"repeatable": true,
"maxReputation": -1,
"effects": [
{ "type": "statChange", "healthRange": [-15, -8] }
],
"choices": [
{ "text": "Open the hatch", "passage": "boobyTrap" },
{ "text": "Ignore it", "passage": "Bunker" }
]
},
{
"id": "coldNight",
"title": "Cold Night",
"image": "assets/characters/neighbor/coldNight.jpg",
"text": "The temperature dropped sharply. Sleep was shallow and stiff with shivers.",
"repeatable": true,
"effects": [
{ "type": "statChange", "healthRange": [-3, -1] }
],
"choices": [
{ "text": "Continue", "passage": "coldNight" }
]
},
{
"id": "ratsInWalls",
"title": "Rats in the Walls",
"image": "assets/characters/neighbor/ratsInWalls.jpg",
"text": "Scratching swells behind the walls. By morning, a torn sack is all that's left.",
"repeatable": true,
"minItem": {
"cannedFood": 1
},
"effects": [
{
"type": "eventItems",
"mode": "give",
"items": [{ "id": "cannedFood", "qtyRange": [1, 2] }]
}
],
"choices": [
{ "text": "Continue", "passage": "ratsInWalls" }
]
},
{
"id": "rustyPipe",
"title": "Rusty Pipe",
"image": "assets/characters/neighbor/waterLeak.webp",
"text": "A corroded pipe split overnight. The floor is damp and smells like metal.",
"repeatable": true,
"minItem": {
"cannedFood": 1,
"water": 1
},
"effects": [
{
"type": "eventItems",
"mode": "give",
"items": [
{ "id": "water", "qtyRange": [1, 2] },
{ "id": "cannedFood", "qtyRange": [0, 1] }
]
}
],
"choices": [
{ "text": "Continue", "passage": "rustyPipe" }
]
},
{
"id": "dustCloud",
"title": "Dust Cloud",
"image": "assets/characters/neighbor/dustCloud.jpg",
"text": "A fine cloud of dust fills the corridor after something shook loose.",
"repeatable": true,
"effects": [
{ "type": "statChange", "healthRange": [-8, -3] }
],
"choices": [
{ "text": "Continue", "passage": "dustCloud" }
]
},
{
"id": "safeKnock",
"title": "Soft knocking",
"text": "You hear soft, hesitant knocking on the bunker hatch. It's not aggressive - more like someone pleading.",
"image": "assets/characters/neighbor/softknock.jpg",
"textWithCamera": "A shy figure leaves the bundle and hurries away the moment your camera whirs.",
"imageWithCamera": "assets/characters/neighbor/safeKnock.jpg",
"repeatable": true,
"minReputation": 1,
"effects": [
{
"type": "eventItems",
"mode": "add",
"items": "generated",
"lootRange": [30, 70]
}
],
"choices": [
{ "text": "Open the hatch", "passage": "safeKnock" },
{ "text": "Ignore it", "passage": "Bunker" }
]
},
{
"id": "helpfulNote",
"title": "Soft knocking",
"text": "You hear soft, hesitant knocking on the bunker hatch. It's not aggressive - more like someone pleading.",
"image": "assets/characters/neighbor/softknock.jpg",
"textWithCamera": "A figure hesitates at the hatch, then slides a folded slip of paper toward the seam and vanishes.",
"imageWithCamera": "assets/characters/neighbor/helpfulNote.jpg",
"repeatable": true,
"minReputation": 1,
"effects": [
{ "type": "statBoost", "statPool": ["intelligence"] }
],
"choices": [
{ "text": "Open the hatch", "passage": "helpfulNote" },
{ "text": "Ignore it", "passage": "Bunker" }
]
},
{
"id": "returnedFavor",
"title": "Soft knocking",
"text": "You hear soft, hesitant knocking on the bunker hatch. It's not aggressive - more like someone pleading.",
"image": "assets/characters/neighbor/softknock.jpg",
"textWithCamera": "The camera shows only the bag and a fading set of footsteps in the dust.",
"imageWithCamera": "assets/characters/neighbor/quietGift.jpg",
"repeatable": false,
"minReputation": 1,
"effects": [
{
"type": "eventItems",
"mode": "add",
"items": [
{ "id": "bandage", "qty": [1] },
{ "id": "cannedFood", "qty": [1] }
]
}
],
"choices": [
{ "text": "Open the hatch", "passage": "returnedFavor" },
{ "text": "Ignore it", "passage": "Bunker" }
]
},
{
"id": "threateningMark",
"image": "assets/characters/neighbor/banging.jpg",
"title": "Loud banging",
"text": "You hear loud banging on the bunker hatch.",
"textWithCamera": "There was no one in front of the bunker hatch.",
"imageWithCamera": "assets/characters/neighbor/cameraNothing.jpg",
"repeatable": true,
"maxReputation": -1,
"effects": [
{ "type": "statChange", "healthRange": [-3, -1] }
],
"choices": [
{ "text": "Open the hatch", "passage": "threateningMark" },
{ "text": "Ignore it", "passage": "Bunker" }
]
},
{
"id": "friendlyTipSupermarket",
"title": "Soft knocking",
"text": "You hear soft, hesitant knocking on the bunker hatch. It's not aggressive - more like someone pleading.",
"image": "assets/characters/neighbor/softknock.jpg",
"textWithCamera": "The camera catches a lone figure jogging away from your hatch, hood pulled low.",
"imageWithCamera": "assets/characters/neighbor/friendlyTipSupermarket.jpg",
"repeatable": false,
"minReputation": 0,
"effects": [],
"choices": [
{ "text": "Open the hatch", "passage": "unlockSupermarket" },
{ "text": "Ignore it", "passage": "Bunker" }
]
}
]
[
{
"id": "generousNeighbor",
"effects": [
{
"type": "eventItems",
"mode": "add",
"items": "generated",
"lootRange": [
30,
90
]
}
],
"image": "assets/characters/neighbor/banging.jpg",
"title": "Loud banging",
"text": "You hear loud banging on the bunker hatch.",
"textWithCamera": "Before opening it, you decided to use your camera. In front of the bunker, you noticed a friendly-looking figure. You hear loud banging on the bunker hatch.",
"imageWithCamera": "assets/characters/neighbor/cameragenerous.jpg",
"minReputation": 0,
"repeatable": true,
"choices": [
{
"text": "Open It",
"passage": "generousNeighbor"
},
{
"text": "Ignore it",
"passage": "Bunker"
}
]
},
{
"id": "needyNeighborItem",
"effects": [
{
"type": "eventItems",
"mode": "give",
"items": "owned"
},
{
"type": "statBoost",
"statPool": [
"intelligence",
"endurance",
"strength"
]
}
],
"image": "assets/characters/neighbor/banging.jpg",
"imageWithCamera": "assets/characters/neighbor/cameraneedy.jpg",
"title": "Loud banging",
"text": "You hear loud banging on the bunker hatch.",
"textWithCamera": "You peek through the camera before reacting. You noticed a couple of people who looked friendly.",
"minReputation": 0,
"repeatable": true,
"choices": [
{
"text": "Open It",
"passage": "needyNeighbor"
},
{
"text": "Ignore it",
"passage": "Bunker"
}
]
},
{
"id": "needyNeighbor",
"effects": [
{
"type": "statBoost",
"statPool": [
"intelligence",
"endurance",
"strength"
]
}
],
"image": "assets/characters/neighbor/banging.jpg",
"imageWithCamera": "assets/characters/neighbor/cameraneedy.jpg",
"title": "Loud banging",
"text": "You hear loud banging on the bunker hatch.",
"textWithCamera": "You peek through the camera before reacting. You noticed a couple of people who looked friendly.",
"minReputation": 0,
"repeatable": true,
"choices": [
{
"text": "Open It",
"passage": "needyNeighbor"
},
{
"text": "Ignore it",
"passage": "Bunker"
}
]
},
{
"id": "hornyNeighbor",
"effects": [
{
"type": "eventItems",
"mode": "give",
"items": "owned"
},
{
"type": "randomRoll5050",
"randomKey": "hornyRoll"
}
],
"image": "assets/characters/neighbor/banging.jpg",
"imageWithCamera": "assets/characters/neighbor/cameraHorny.webp",
"title": "Loud banging",
"text": "You hear loud banging on the bunker hatch.",
"textWithCamera": "You peek through the camera before reacting. You notice a woman who looks horny.",
"repeatable": true,
"choices": [
{
"text": "Open It",
"passage": "hornyNeighbor"
},
{
"text": "Ignore it",
"passage": "Bunker"
}
]
},
{
"id": "bunkerBandits",
"effects": [],
"image": "assets/characters/neighbor/banging.jpg",
"imageWithCamera": "assets/characters/neighbor/cameraBandits.webp",
"title": "Loud banging",
"text": "You hear loud banging on the bunker hatch.",
"textWithCamera": "You peek through the camera before reacting. You noticed a few men who looked like bandits.",
"repeatable": true,
"choices": [
{
"text": "Open It",
"passage": "bunkerBandits"
},
{
"text": "Ignore it",
"passage": "Bunker"
}
]
},
{
"id": "bunkerSoldiers",
"effects": [
{
"type": "eventItems",
"mode": "give",
"items": "owned"
},
{
"type": "eventItems",
"mode": "add",
"items": "generated",
"lootRange": [
50,
120
]
}
],
"image": "assets/characters/neighbor/banging.jpg",
"imageWithCamera": "assets/characters/neighbor/soldier.webp",
"title": "Loud banging",
"text": "You hear loud banging on the bunker hatch.",
"textWithCamera": "You peek through the camera before reacting. You noticed a soldier, but you felt that he was not alone.",
"repeatable": true,
"choices": [
{
"text": "Open It",
"passage": "bunkerSoldiers"
},
{
"text": "Ignore it",
"passage": "Bunker"
}
]
},
{
"id": "hiddenStash",
"effects": [
{
"type": "eventItems",
"mode": "add",
"items": "generated",
"lootRange": [
50,
120
]
},
{
"type": "randomRoll5050",
"randomKey": "stashRoll"
},
{
"type": "statChange",
"healthRange": [
-10,
-1
]
}
],
"image": "assets/characters/neighbor/hiddenStash.webp",
"title": "Hidden stash",
"text": "While cleaning up, you came across some hidden supplies that you had forgotten about.",
"repeatable": true,
"choices": [
{
"text": "Open it",
"passage": "hiddenStash"
},
{
"text": "Leave it alone",
"passage": "Bunker"
}
]
},
{
"id": "oldManual",
"image": "assets/characters/neighbor/book.jpg",
"title": "Old manual",
"text": "While cleaning up, you came across some old manual book.",
"repeatable": true,
"effects": [
{
"type": "statBoost",
"statPool": [
"intelligence"
]
}
],
"choices": [
{ "text": "Read it", "passage": "manualRead", "applyEffects": true },
{
"text": "Toss it",
"passage": "Bunker"
}
]
},
{
"id": "spoiledFood",
"effects": [
{
"type": "eventItems",
"mode": "give",
"items": [
{
"id": "cannedFood",
"qtyRange": [
1,
3
]
}
]
}
],
"image": "assets/characters/neighbor/checkFood.jpg",
"title": "Spoiled food",
"text": "You smelled something. It must be the food supplies.",
"repeatable": true,
"minItem": {
"cannedFood": 1
},
"choices": [
{
"text": "Inspect the supplies",
"passage": "checkSpoiledFood"
},
{
"text": "Throw them away",
"passage": "removeSpoiledFood"
}
]
},
{
"id": "ratInfestation",
"effects": [
{
"type": "eventItems",
"mode": "give",
"items": [
{
"id": "cannedFood",
"qtyRange": [
1,
3
]
}
]
}
],
"image": "assets/characters/neighbor/rats.webp",
"title": "Rats",
"text": "You noticed rats running around the bunker.",
"repeatable": true,
"minItem": {
"cannedFood": 1
},
"choices": [
{
"text": "Set traps",
"passage": "ratTrap"
},
{
"text": "Burn infested food",
"passage": "ratBurn"
}
]
},
{
"id": "toxicGasWarning",
"effects": [
{
"type": "eventItems",
"mode": "add",
"items": "generated",
"lootRange": [
80,
150
]
}
],
"image": "assets/characters/neighbor/toxicGas.webp",
"title": "Toxic Warning",
"text": "A sudden high-pitched siren echoed through the bunker walls. Seconds later, green gas began seeping in through the air vents. You rushed to the control panel and managed to shut off the flow.You wonder if stepping outside would reveal the source of the alert.",
"textWithCamera": "Your camera detected no movement near the hatch. Yet, green gas lingers around the vents. The siren still rings in your ears.",
"imageWithCamera": "assets/characters/neighbor/toxicGas.webp",
"minReputation": 0,
"repeatable": true,
"choices": [
{
"text": "Put on gas mask and step outside",
"passage": "toxicGasLoot",
"condition": "$gasMask > 0"
},
{
"text": "Stay inside and wait",
"passage": "Bunker"
}
]
},
{
"id": "dullKnife",
"minItem": {
"knife": 1
},
"image": "assets/characters/neighbor/brokenKnife.webp",
"title": "Dull Blade",
"text": "You realise that your knife blade is losing its edge. In this state, it's useless in a fight.",
"repeatable": false,
"choices": [
{
"text": "Try to fix it",
"condition": "$scrapMetal > 0",
"passage": "knifeFix"
},
{
"text": "Leave it be",
"passage": "knifeIgnore"
}
]
},
{
"id": "wetMapCorner",
"title": "Wet map",
"image": "assets/characters/neighbor/brokenMap.jpg",
"text": "While examining your map, you tore one corner. Moments later, you knocked over a cup of water, soaking it. The ink is already smudging.",
"repeatable": false,
"minItem": {
"map": 1
},
"choices": [
{
"text": "Patch it",
"passage": "mapFix"
},
{
"text": "Throw it",
"passage": "mapIgnore"
}
]
},
{
"id": "brokenSuitcaseHandle",
"title": "Broken Handle",
"image": "assets/characters/neighbor/suitcaseBroken.jpg",
"text": "While sprinting, the handle of your suitcase gave in with a loud snap. Carrying it like this will be cumbersome.",
"repeatable": false,
"minItem": {
"suitcase": 1
},
"choices": [
{
"text": "Fix it",
"passage": "suitcaseFix"
},
{
"text": "Leave it broken",
"passage": "suitcaseIgnore"
}
]
},
{
"id": "tornBackpack",
"title": "Torn Backpack",
"image": "assets/characters/neighbor/bagBroken.jpg",
"text": "As you squeezed through a tight corridor, your backpack caught on something sharp and tore open.",
"repeatable": false,
"minItem": {
"bag": 1
},
"choices": [
{
"text": "Sew it carefully",
"passage": "backpackFix"
},
{
"text": "Leave it behind",
"passage": "backpackIgnore"
}
]
},
{
"id": "damagedPistol",
"title": "Jammed Gun",
"image": "assets/characters/neighbor/pistolBroken.jpg",
"text": "Your pistol misfired. It’s dirty, and the mechanism seems worn down. You fear it might backfire next time.",
"repeatable": false,
"minItem": {
"pistol": 1
},
"choices": [
{
"text": "Disassemble and repair it",
"condition": "$scrapMetal > 0",
"passage": "pistolFix"
},
{
"text": "Discard it",
"passage": "pistolIgnore"
}
]
},
{
"id": "crackedBat",
"title": "Cracked Bat",
"image": "assets/characters/neighbor/batBroken.jpg",
"text": "After smashing something too hard, your bat now has a long split down its middle. One more hit and it might shatter.",
"repeatable": false,
"minItem": {
"bat": 1
},
"choices": [
{
"text": "Reinforce it",
"condition": "$wood > 0",
"passage": "batFix"
},
{
"text": "Toss it",
"passage": "batIgnore"
}
]
},
{
"id": "leakingBottle",
"title": "Leaking Bottle",
"image": "assets/characters/neighbor/waterBroken.jpg",
"text": "You notice a slow drip from your water bottle. The cap seems loose or cracked.",
"repeatable": false,
"minItem": {
"water": 1
},
"choices": [
{
"text": "Seal it with some scrap",
"condition": "$scrapMetal > 0",
"passage": "waterFix"
},
{
"text": "Drink what you can and toss it",
"passage": "waterIgnore"
}
]
},
{
"id": "moldyBandages",
"title": "Moldy Bandages",
"image": "assets/characters/neighbor/bandageBroken.jpg",
"text": "You check your medical box and discover that some bandages are damp and growing mold.",
"repeatable": false,
"minItem": {
"bandage": 1
},
"choices": [
{
"text": "Dry them near a heat source",
"passage": "bandageFix"
},
{
"text": "Toss the moldy ones",
"passage": "bandageIgnore"
}
]
},
{
"id": "expiredMedkit",
"title": "Expired Medkit",
"image": "assets/characters/neighbor/firstAidFix.jpg",
"text": "While organizing your supplies, you notice the medkit is past its expiration date.",
"repeatable": false,
"minItem": {
"firstAid": 1
},
"choices": [
{
"text": "Keep it - it might still work",
"passage": "medkitKeep"
},
{
"text": "Dismantle for useful parts",
"passage": "medkitScrap"
}
]
},
{
"id": "flickeringFlashlight",
"title": "Flickering Flashlight",
"image": "assets/characters/neighbor/flashlightBroken.jpg",
"text": "Your flashlight started flickering, making it unreliable for exploration.",
"repeatable": false,
"minItem": {
"flashlight": 1
},
"choices": [
{
"text": "Open and try to repair it",
"condition": "$scrapMetal > 0",
"passage": "flashlightFix"
},
{
"text": "Toss it away",
"passage": "flashlightIgnore"
}
]
},
{
"id": "strangerWomanKnockWhite",
"image": "assets/characters/neighbor/banging.jpg",
"title": "Loud Banging",
"text": "You hear loud banging on the bunker hatch.",
"textWithCamera": "Before opening it, you decided to use your camera. A woman stands outside, looking exhausted but harmless. She keeps banging on the metal hatch.",
"imageWithCamera": "assets/characters/neighbor/avatarwomanbegging.jpg",
"repeatable": false,
"choices": [
{
"text": "Open it",
"passage": "strangerWomanRequestWhite"
},
{
"text": "Ignore it",
"passage": "Bunker"
}
]
},
{
"id": "strangerManKnockWhite",
"image": "assets/characters/neighbor/banging.jpg",
"title": "Loud Banging",
"text": "You hear loud banging on the bunker hatch.",
"textWithCamera": "Before opening it, you decided to use your camera. A man stands outside, looking exhausted but harmless. He keeps banging on the metal hatch.",
"imageWithCamera": "assets/characters/neighbor/avatarsad.jpg",
"repeatable": false,
"choices": [
{
"text": "Open it",
"passage": "strangerManRequestWhite"
},
{
"text": "Ignore it",
"passage": "Bunker"
}
]
},
{
"id": "strangerWomanKnockBlack",
"image": "assets/characters/neighbor/banging.jpg",
"title": "Loud Banging",
"text": "You hear loud banging on the bunker hatch.",
"textWithCamera": "Before opening it, you decided to use your camera. A woman stands outside, looking exhausted but harmless. She keeps banging on the metal hatch.",
"imageWithCamera": "assets/characters/neighbor/avatarwomanbeggingblack.jpg",
"repeatable": false,
"choices": [
{
"text": "Open it",
"passage": "strangerWomanRequestBlack"
},
{
"text": "Ignore it",
"passage": "Bunker"
}
]
},
{
"id": "strangerManKnockBlack",
"image": "assets/characters/neighbor/banging.jpg",
"title": "Loud Banging",
"text": "You hear loud banging on the bunker hatch.",
"textWithCamera": "Before opening it, you decided to use your camera. A man stands outside, looking exhausted but harmless. He keeps banging on the metal hatch.",
"imageWithCamera": "assets/characters/neighbor/avatarblackmanbeg.jpg",
"repeatable": false,
"choices": [
{
"text": "Open it",
"passage": "strangerManRequestBlack"
},
{
"text": "Ignore it",
"passage": "Bunker"
}
]
},
{
"id": "strangerWomanKnockAsian",
"image": "assets/characters/neighbor/banging.jpg",
"title": "Loud Banging",
"text": "You hear loud banging on the bunker hatch.",
"textWithCamera": "Before opening it, you decided to use your camera. A woman stands outside, looking exhausted but harmless. She keeps banging on the metal hatch.",
"imageWithCamera": "assets/characters/neighbor/avatarwomanbeggingasian.jpg",
"repeatable": false,
"choices": [
{
"text": "Open it",
"passage": "strangerWomanRequestAsian"
},
{
"text": "Ignore it",
"passage": "Bunker"
}
]
},
{
"id": "strangerShemaleRequest",
"image": "assets/characters/neighbor/banging.jpg",
"title": "Loud Banging",
"text": "You hear loud banging on the bunker hatch.",
"textWithCamera": "You decided to use your camera before opening it. A woman was standing outside and smiling at the camera.",
"imageWithCamera": "assets/characters/neighbor/shemaleRequest.webp",
"repeatable": false,
"choices": [
{
"text": "Open it",
"passage": "strangerShemaleRequest"
},
{
"text": "Ignore it",
"passage": "Bunker"
}
]
},
{
"id": "travelerWithCaptive",
"image": "assets/characters/neighbor/banging.jpg",
"title": "Loud banging",
"text": "You hear loud banging on the bunker hatch.",
"textWithCamera": "On the camera, you noticed a man wearing a gas mask carrying a woman in his arms.",
"imageWithCamera": "assets/characters/neighbor/cameraTravelerWithCaptive.jpg",
"repeatable": false,
"choices": [
{
"text": "Open it",
"passage": "travelerWithCaptive"
},
{
"text": "Ignore it",
"passage": "Bunker"
}
]
},
{
"id": "hungryOrphans",
"effects": [],
"image": "assets/characters/neighbor/softknock.jpg",
"imageWithCamera": "assets/characters/neighbor/hungryOrphans.jpg",
"title": "Soft knocking",
"text": "You hear soft, hesitant knocking on the bunker hatch. It's not aggressive - more like someone pleading.",
"textWithCamera": "You peek through the camera. A group of ragged children are outside your bunker. Thin, cold, and clearly starving. They hold up empty cans, hoping for mercy.",
"repeatable": false,
"choices": [
{
"text": "Open it",
"passage": "hungryOrphans"
},
{
"text": "Ignore it",
"passage": "Bunker"
}
]
},
{
"id": "manSellingWife",
"effects": [
{
"type": "eventItems",
"mode": "give",
"items": [
{
"id": "cannedFood",
"qty": [
3
]
}
]
}
],
"image": "assets/characters/neighbor/banging.jpg",
"imageWithCamera": "assets/characters/neighbor/cameragenerous.jpg",
"title": "Loud banging",
"text": "You hear loud banging on the bunker hatch.",
"textWithCamera": "Before opening it, you decided to use your camera. In front of the bunker, you noticed a friendly-looking figure. You hear loud banging on the bunker hatch.",
"repeatable": true,
"choices": [
{
"text": "Open it",
"passage": "manSellingWife"
},
{
"text": "Ignore it",
"passage": "Bunker"
}
]
},
{
"id": "gangSurvivor",
"title": "Soft knocking",
"image": "assets/characters/neighbor/softknock.jpg",
"text": "You hear soft knocking on the bunker hatch. Someone is gently trying to get your attention.",
"textWithCamera": "You turn on the camera. A wounded man slumps against the hatch, blood on his clothes. His breathing is shallow.",
"imageWithCamera": "assets/characters/neighbor/cameraGangSurvivor.jpg",
"repeatable": false,
"choices": [
{
"text": "Open it",
"passage": "gangSurvivor"
},
{
"text": "Ignore it",
"passage": "Bunker"
}
]
},
{
"id": "knifeWoman",
"title": "Loud banging",
"image": "assets/characters/neighbor/banging.jpg",
"text": "You hear loud banging on the bunker hatch. Whoever it is, they want in - badly.",
"textWithCamera": "Looking through the camera, you spotted a frail-looking woman. She appeared desperate, pacing nervously in front of the bunker hatch. One of her hands was hidden behind her back.",
"imageWithCamera": "assets/characters/neighbor/womanGenerator.webp",
"repeatable": false,
"choices": [
{
"text": "Open it",
"passage": "knifeWoman"
},
{
"text": "Ignore it",
"passage": "Bunker"
}
]
},
{
"id": "silenceAfterStorm",
"title": "Silence After the Storm",
"image": "assets/characters/neighbor/silenceAfterStorm.webp",
"text": "After several nights of howling winds and thunder shaking the bunker walls, the world outside has gone completely silent. No rain. No wind. No birds. Just… Stillness.",
"textWithCamera": "The camera shows an eerily still landscape. Mud and broken branches litter the area, but not a soul is in sight. The silence is deafening.",
"imageWithCamera": "assets/characters/neighbor/cameraSilenceAfterStorm.webp",
"repeatable": false,
"choices": [
{
"text": "Continue",
"passage": "Bunker"
}
]
},
{
"id": "distantScream",
"title": "Distant Scream",
"image": "assets/characters/neighbor/scream.jpg",
"text": "You hear a scream in the distance. Sharp. Human. Then… A gunshot. Then silence.",
"textWithCamera": "The camera picks up nothing but fog and faint rustling. Whatever happened, it’s over now. The silence that follows is somehow worse.",
"imageWithCamera": "assets/characters/neighbor/cameraDistantScream.jpg",
"repeatable": false,
"choices": [
{
"text": "Continue",
"passage": "Bunker"
}
]
},
{
"id": "blockedHatch",
"effects": [
{
"type": "eventItems",
"mode": "add",
"items": "generated",
"lootRange": [
50,
150
]
}
],
"title": "Loud Banging",
"image": "assets/characters/neighbor/banging.jpg",
"text": "You hear loud banging on the bunker hatch.",
"textWithCamera": "The camera showed a dirty man holding a crowbar. He was staring directly into the lens, gesturing wildly as if trying to point you toward something across the street.",
"imageWithCamera": "assets/characters/neighbor/cameraBlockedHatch.jpg",
"repeatable": false,
"choices": [
{
"text": "Open it",
"passage": "blockedHatch"
},
{
"text": "Ignore it",
"passage": "Bunker"
}
]
},
{
"id": "trappedChild",
"title": "Loud Banging",
"image": "assets/characters/neighbor/banging.jpg",
"text": "You hear loud banging on the bunker hatch.",
"textWithCamera": "The camera revealed a desperate woman, slamming her fists against the hatch and waving her hands toward the lens, pleading as if begging for help.",
"imageWithCamera": "assets/characters/neighbor/avatarwomanbegging.jpg",
"repeatable": false,
"choices": [
{
"text": "Open it",
"passage": "trappedChild"
},
{
"text": "Ignore it",
"passage": "Bunker"
}
]
},
{
"id": "subtleCoughing",
"effects": [
{
"type": "eventItems",
"mode": "add",
"items": [
{
"id": "goldWatch",
"qty": [
1
]
},
{
"id": "goldRing",
"qty": [
1
]
}
]
}
],
"title": "Soft knocking",
"image": "assets/characters/neighbor/softknock.jpg",
"text": "You hear soft knocking on the bunker hatch. Someone is gently trying to get your attention.",
"textWithCamera": "The camera shows an old man sitting by the bunker wall. He is wrapped in rags and trembling. He softly knocks, coughs, and stares directly at the camera.",
"imageWithCamera": "assets/characters/neighbor/cameraGangSurvivor.jpg",
"repeatable": false,
"choices": [
{
"text": "Open it",
"passage": "subtleCoughing"
},
{
"text": "Ignore it",
"passage": "Bunker"
}
]
},
{
"id": "womanGenerator",
"title": "Loud Banging",
"image": "assets/characters/neighbor/banging.jpg",
"text": "You hear loud banging on the bunker hatch.",
"textWithCamera": "On the camera feed, a desperate woman is hammering at the hatch with both fists. A battered car is parked behind her, trunk wide open. She keeps turning around, pointing toward it, and gesturing frantically at the camera.",
"imageWithCamera": "assets/characters/neighbor/avatarwomanbegging.jpg",
"repeatable": false,
"choices": [
{
"text": "Open it",
"passage": "womanGenerator"
},
{
"text": "Ignore it",
"passage": "Bunker"
}
]
},
{
"id": "sickMan",
"title": "Soft knocking",
"text": "You hear soft, hesitant knocking on the bunker hatch. It's not aggressive - more like someone pleading.",
"image": "assets/characters/neighbor/softknock.jpg",
"textWithCamera": "On the camera feed, a sweating man lies on the ground, clearly feverish. He clutches his side and murmurs incoherently, occasionally reaching toward the hatch.",
"imageWithCamera": "assets/characters/neighbor/cameraGangSurvivor.jpg",
"repeatable": false,
"choices": [
{
"text": "Open it",
"passage": "sickMan"
},
{
"text": "Ignore it",
"passage": "Bunker"
}
]
},
{
"id": "guardianAngel",
"image": "assets/characters/neighbor/banging.jpg",
"title": "Loud banging",
"text": "You hear loud banging on the bunker hatch.",
"textWithCamera": "Before opening it, you decided to use your camera. In front of the bunker, you noticed a figure running away. Only a cute-looking cat remained under the hatch.",
"imageWithCamera": "assets/characters/neighbor/guardianAngel.webp",
"repeatable": false,
"choices": [
{
"text": "Open It",
"passage": "guardianAngel"
},
{
"text": "Ignore it",
"passage": "Bunker"
}
]
},
{
"id": "recruitVisit",
"effects": [
{
"type": "newCompanion"
}
],
"title": "Loud banging",
"text": "You hear loud banging on the bunker hatch.",
"image": "assets/characters/neighbor/banging.jpg",
"textWithCamera": "Before opening it, you decided to use your camera. In front of the bunker, you noticed a friendly looking person.",
"imageWithCamera": "assets/characters/neighbor/recruitDecision.jpg",
"repeatable": true,
"isRecruit": true,
"choices": [
{
"text": "Open It",
"passage": "RecruitDecision"
},
{
"text": "Ignore it",
"passage": "Bunker"
}
]
},
{
"id": "earthquakeTremor",
"title": "Earthquake Tremor",
"image": "assets/characters/neighbor/earthquakeTremor.webp",
"text": "The ground shuddered. Dust rained from the ceiling. Something heavy toppled over in the storage room.",
"repeatable": true,
"minItem": {
"cannedFood": 1,
"water": 1
},
"effects": [
{ "type": "statChange", "healthRange": [-5, -1] },
{
"type": "eventItems",
"mode": "give",
"items": [
{ "id": "cannedFood", "qtyRange": [1, 2] },
{ "id": "water", "qtyRange": [1, 2] }
]
}
],
"choices": [
{ "text": "Continue", "passage": "earthquakeTremor" }
]
},
{
"id": "waterLeak",
"title": "Water Leak",
"image": "assets/characters/neighbor/waterLeak.webp",
"text": "A pipe inside the wall burst. A puddle spreads under your shelves as precious water trickles away.",
"repeatable": true,
"minItem": {
"water": 1
},
"effects": [
{
"type": "eventItems",
"mode": "give",
"items": [{ "id": "water", "qtyRange": [1, 3] }]
}
],
"choices": [
{ "text": "Continue", "passage": "waterLeak" }
]
},
{
"id": "quietGift",
"image": "assets/characters/neighbor/banging.jpg",
"title": "Loud banging",
"text": "You hear loud banging on the bunker hatch.",
"textWithCamera": "The camera shows an empty street. Whoever left the parcel is long gone.",
"imageWithCamera": "assets/characters/neighbor/quietGift.jpg",
"repeatable": false,
"minReputation": 1,
"effects": [
{
"type": "eventItems",
"mode": "add",
"items": "generated",
"lootRange": [40, 90]
}
],
"choices": [
{ "text": "Open the hatch", "passage": "quietGift" },
{ "text": "Ignore it", "passage": "Bunker" }
]
},
{
"id": "warningShout",
"title": "Warning Shout",
"image": "assets/characters/neighbor/warningShout.jpg",
"text": "A voice outside shouts a warning about raiders nearby. Then, silence.",
"textWithCamera": "The camera catches a fleeting shadow sprinting past the lens, then nothing.",
"imageWithCamera": "assets/characters/neighbor/warningShout.jpg",
"repeatable": true,
"minReputation": 1,
"effects": [
{ "type": "statBoost", "statPool": ["intelligence"] }
],
"choices": [
{ "text": "Continue", "passage": "warningShout" }
]
},
{
"id": "graffitiOnHatch",
"image": "assets/characters/neighbor/banging.jpg",
"title": "Loud banging",
"text": "You hear loud banging on the bunker hatch.",
"textWithCamera": "The camera feed shows only a fragment of fresh scrape marks on the metal near the lens.",
"imageWithCamera": "assets/characters/neighbor/cameraNothing.jpg",
"repeatable": true,
"maxReputation": -1,
"effects": [
{ "type": "statChange", "healthRange": [-2, -1] }
],
"choices": [
{ "text": "Open the hatch", "passage": "graffitiOnHatch" },
{ "text": "Ignore it", "passage": "Bunker" }
]
},
{
"id": "stoneThrow",
"image": "assets/characters/neighbor/banging.jpg",
"title": "Loud banging",
"text": "You hear loud banging on the bunker hatch.",
"textWithCamera": "The camera catches the tail of a coat as someone darts out of frame.",
"imageWithCamera": "assets/characters/neighbor/cameraGangSurvivor.jpg",
"repeatable": true,
"maxReputation": -1,
"effects": [
{ "type": "statChange", "healthRange": [-5, -2] }
],
"choices": [
{ "text": "Open the hatch", "passage": "stoneThrow" },
{ "text": "Ignore it", "passage": "Bunker" }
]
},
{
"id": "boobyTrap",
"image": "assets/characters/neighbor/banging.jpg",
"title": "Loud banging",
"text": "You hear loud banging on the bunker hatch.",
"textWithCamera": "The camera shows fresh grooves and metal shavings around the hatch.",
"imageWithCamera": "assets/characters/neighbor/cameraNothing.jpg",
"repeatable": true,
"maxReputation": -1,
"effects": [
{ "type": "statChange", "healthRange": [-15, -8] }
],
"choices": [
{ "text": "Open the hatch", "passage": "boobyTrap" },
{ "text": "Ignore it", "passage": "Bunker" }
]
},
{
"id": "coldNight",
"title": "Cold Night",
"image": "assets/characters/neighbor/coldNight.jpg",
"text": "The temperature dropped sharply. Sleep was shallow and stiff with shivers.",
"repeatable": true,
"effects": [
{ "type": "statChange", "healthRange": [-3, -1] }
],
"choices": [
{ "text": "Continue", "passage": "coldNight" }
]
},
{
"id": "ratsInWalls",
"title": "Rats in the Walls",
"image": "assets/characters/neighbor/ratsInWalls.jpg",
"text": "Scratching swells behind the walls. By morning, a torn sack is all that's left.",
"repeatable": true,
"minItem": {
"cannedFood": 1
},
"effects": [
{
"type": "eventItems",
"mode": "give",
"items": [{ "id": "cannedFood", "qtyRange": [1, 2] }]
}
],
"choices": [
{ "text": "Continue", "passage": "ratsInWalls" }
]
},
{
"id": "rustyPipe",
"title": "Rusty Pipe",
"image": "assets/characters/neighbor/waterLeak.webp",
"text": "A corroded pipe split overnight. The floor is damp and smells like metal.",
"repeatable": true,
"minItem": {
"cannedFood": 1,
"water": 1
},
"effects": [
{
"type": "eventItems",
"mode": "give",
"items": [
{ "id": "water", "qtyRange": [1, 2] },
{ "id": "cannedFood", "qtyRange": [0, 1] }
]
}
],
"choices": [
{ "text": "Continue", "passage": "rustyPipe" }
]
},
{
"id": "dustCloud",
"title": "Dust Cloud",
"image": "assets/characters/neighbor/dustCloud.jpg",
"text": "A fine cloud of dust fills the corridor after something shook loose.",
"repeatable": true,
"effects": [
{ "type": "statChange", "healthRange": [-8, -3] }
],
"choices": [
{ "text": "Continue", "passage": "dustCloud" }
]
},
{
"id": "safeKnock",
"title": "Soft knocking",
"text": "You hear soft, hesitant knocking on the bunker hatch. It's not aggressive - more like someone pleading.",
"image": "assets/characters/neighbor/softknock.jpg",
"textWithCamera": "A shy figure leaves the bundle and hurries away the moment your camera whirs.",
"imageWithCamera": "assets/characters/neighbor/safeKnock.jpg",
"repeatable": true,
"minReputation": 1,
"effects": [
{
"type": "eventItems",
"mode": "add",
"items": "generated",
"lootRange": [30, 70]
}
],
"choices": [
{ "text": "Open the hatch", "passage": "safeKnock" },
{ "text": "Ignore it", "passage": "Bunker" }
]
},
{
"id": "helpfulNote",
"title": "Soft knocking",
"text": "You hear soft, hesitant knocking on the bunker hatch. It's not aggressive - more like someone pleading.",
"image": "assets/characters/neighbor/softknock.jpg",
"textWithCamera": "A figure hesitates at the hatch, then slides a folded slip of paper toward the seam and vanishes.",
"imageWithCamera": "assets/characters/neighbor/helpfulNote.jpg",
"repeatable": true,
"minReputation": 1,
"effects": [
{ "type": "statBoost", "statPool": ["intelligence"] }
],
"choices": [
{ "text": "Open the hatch", "passage": "helpfulNote" },
{ "text": "Ignore it", "passage": "Bunker" }
]
},
{
"id": "returnedFavor",
"title": "Soft knocking",
"text": "You hear soft, hesitant knocking on the bunker hatch. It's not aggressive - more like someone pleading.",
"image": "assets/characters/neighbor/softknock.jpg",
"textWithCamera": "The camera shows only the bag and a fading set of footsteps in the dust.",
"imageWithCamera": "assets/characters/neighbor/quietGift.jpg",
"repeatable": false,
"minReputation": 1,
"effects": [
{
"type": "eventItems",
"mode": "add",
"items": [
{ "id": "bandage", "qty": [1] },
{ "id": "cannedFood", "qty": [1] }
]
}
],
"choices": [
{ "text": "Open the hatch", "passage": "returnedFavor" },
{ "text": "Ignore it", "passage": "Bunker" }
]
},
{
"id": "threateningMark",
"image": "assets/characters/neighbor/banging.jpg",
"title": "Loud banging",
"text": "You hear loud banging on the bunker hatch.",
"textWithCamera": "There was no one in front of the bunker hatch.",
"imageWithCamera": "assets/characters/neighbor/cameraNothing.jpg",
"repeatable": true,
"maxReputation": -1,
"effects": [
{ "type": "statChange", "healthRange": [-3, -1] }
],
"choices": [
{ "text": "Open the hatch", "passage": "threateningMark" },
{ "text": "Ignore it", "passage": "Bunker" }
]
},
{
"id": "friendlyTipSupermarket",
"title": "Soft knocking",
"text": "You hear soft, hesitant knocking on the bunker hatch. It's not aggressive - more like someone pleading.",
"image": "assets/characters/neighbor/softknock.jpg",
"textWithCamera": "The camera catches a lone figure jogging away from your hatch, hood pulled low.",
"imageWithCamera": "assets/characters/neighbor/friendlyTipSupermarket.jpg",
"repeatable": false,
"minReputation": 1,
"effects": [],
"choices": [
{ "text": "Open the hatch", "passage": "unlockSupermarket" },
{ "text": "Ignore it", "passage": "Bunker" }
]
}
]
<div class="mainmenu-center"><div class="mainmenu-stack"><button class="menubutton" onclick="SugarCube.Engine.play('EnterName')">New game</button>
<button class="menubutton continue">Continue</button>
<button class="menubutton" onclick="SugarCube.Engine.play('About')">About</button>
<button class="menubutton" onclick="SugarCube.Engine.play('Credits')">Credits</button>
<button class="menubutton" onclick="SugarCube.Engine.play('CheckMyOtherGame')">Check my other game</button>
<div style="color: #777; font-size: 12px; text-align: center; margin-top: 8px;">Demo version 0.01</div></div></div> <p><b>This is a work of literary fiction.</b><br>
All characters, stories, and dialogues are fictional and do not represent real people or events.
All visual materials (images, animations, videos) used in this game are sourced from legal pornographic websites.
They remain the property of their respective copyright holders and are used with original watermarks intact.
To view this content legally, you must have a valid membership to the original sites.</p>
Featured Actresses
The following are the stage names (pseudonyms) of the actresses featured as companions in this game:
Dee - Hayley Davies
Maria - Autumn Falls
Isabel - Kira Noir
Mia - Vina Sky
Rose - Savannah Bond
<h3>Special Thanks</h3>
<p>Special thanks to all my patrons for your very generous and amazing support.<br>
Without you, this game would not exist.</p>
<button class="button" onclick="SugarCube.Engine.play('MainMenu')">Close</button>If you enjoy my work and prefer sandbox-style experiences, you might like my first project as well. It’s available on Patreon, SubscribeStar, and the F95Zone forum. You can also play it online at Mopoga or Destroyer.tv.
<center><div style="margin-top: 10px; text-align: center;">
<a href="https://www.patreon.com/TestovironTesto" target="_blank"><img src="assets/ui/3.png" style="height: 50px; margin-right: 10px;" alt="Patreon"></a><a href="https://subscribestar.adult/testoviron" target="_blank"><img src="assets/ui/sslogo.png" style="height: 50px;" alt="SubscribeStar"></a>
</div></center>
<button class="button" onclick="SugarCube.Engine.play('MainMenu')">Close</button><center><h2>They heard you.</h2></center>
<p>Hours later, a faint voice confirms your coordinates. You're getting out of here.</p>
<p>Congratulations, $player.name! You managed to survive and escape. The companions you unlocked during this playthrough have been unlocked and you can select them when you start your next adventure.</p>
<<button "Finish run">><<run setup.resetForNewRun()>><<goto "EnterName">><</button>><<addmins 60>><<set $player.energy -= 10>><center><h2>Emergency Radio</h2></center>
<center><img src="assets/ui/radio.webp" style="max-height:500px;"></center>
<p>You tune the radio and broadcast an SOS...</p>
<span id="radioBlock">
<<if $dailyradio>>
<<button "Broadcast SOS">>
<<set $dailyradio = false>>
<<set _roll = Math.random()>>
<<if _roll lt 0.95>>
<<goto "Ending">>
<<else>>
<<replace "#radioBlock">>
Static answers you back. No one responds. Maybe try again another day.
<<button "Next">><<goto "bedroom">><</button>>
<</replace>>
<</if>>
<</button>>
<</if>>
</span><div class="about"><h3><b>Goal</b></h3>
<p>Survive, build a radio, and hope someone will rescue you.</p>
<h3><b>Daily Cycle</b></h3>
<p>Each day one random event will occur. You have full freedom of choice in how to resolve it.</p>
<h3><b>Companions</b></h3>
<ul>
<li>Companions are recruited via daily events. The longer you go without a recruit event, the higher the chance it appears next day.</li>
<li>Between <b>Day 10–14</b> (depending on luck), someone is guaranteed to show up at the bunker.</li>
<li>You can host up to <b>3 companions</b> in the bunker at once.</li>
<li>Night missions for companions have two survival outcomes if danger strikes:
<ul>
<li><b>Fight victory</b> – uses their <b>equipped weapon</b> + their <b>Strength</b>.</li>
<li><b>Escape</b> – uses their <b>Intelligence</b> + <b>Endurance</b>.</li>
</ul>
It’s smart to train a companion toward one clear path (fighter or escape artist) to raise their odds.
</li>
<li>Some companions give <b>training bonuses</b>. Training with them speeds up your growth.</li>
<li><b>Meta:</b> Completing the game with companions permanently unlocks them.</li>
</ul>
<h3><b>Trader</b></h3>
<p>
Every few days a trader may visit the bunker, offering items to buy and sell.
If you’re desperate, you can try to <b>rob the trader</b> and take everything, but the trader will <b>never return</b>.
Building <b>reputation</b> with the trader unlocks better prices.
</p>
<h3><b>Night Exploration</b></h3>
<ul>
<li>Each night you may venture outside to search nearby locations. Skipping sleep will make the next day harder.</li>
<li>If the <b>player</b> goes alone, combat always uses the <b>highest-damage weapon you own</b>, regardless of what you manually picked.</li>
<li><b>Suitcase</b> & <b>Backpack</b> – increase the maximum loot you can bring back.</li>
<li><b>Map</b> – guarantees unlocking a new location.</li>
<li><b>Flashlight</b> – +10% chance to find items.</li>
</ul>
<h3><b>Survival</b></h3>
<p>
You and your companions can die if Hunger or Thirst drops to 0. The player can also die in combat, or afterwards if bleeding is not stopped with bandages in the kitchen.
<br><i>Tip:</i> Keep an eye on the sidebar (or notifications) for <b>Hunger</b> and <b>Thirst</b>.
</p>
<ul>
<li><b>Food & Water:</b> restore Energy and a small amount of Health.</li>
<li><b>Bleeding:</b> does not stop on its own and slowly drains Health until you bandage yourself in the <b>Kitchen</b> (or die).</li>
<li><b>Beaten (debuff):</b> lasts <b>3 days</b> and reduces how much Energy/Health you recover.</li>
<li><b>Kitchen items:</b>
<ul>
<li><b>Steroids:</b> bonus <b>Strength</b>, <b>Endurance</b> and <b>Energy</b> at the cost of <b>Health</b>.</li>
<li><b>Book:</b> increases <b>Intelligence</b>.</li>
<li><b>First Aid Kit:</b> instantly restores Health.</li>
</ul></li></ul>
<h3><b>NSFW Content</b></h3>
<p>The game features several erotic mini-games. Build relationships with companions to unlock new interactions.</p>
<h3><b>Stats</b></h3>
<ul>
<li><b>Strength</b> increases combat damage and maximum health.</li>
<li><b>Endurance</b> increases your energy pool.</li>
<li><b>Intelligence</b> affects how you can solve problems during random events.</li>
</ul>
<h3><b>Training Tips</b></h3>
<ul>
<li>Endurance training is <b>costly</b> – plan sessions carefully.</li>
<li>Specialize companions (fight vs. escape) for better mission outcomes.</li>
</ul>
<div class="about-actions">
<button class="button" onclick="SugarCube.Engine.play('MainMenu')">Close</button>
</div></div><<script>>
{
chat: {
label: "Chat",
requiredRelation: 0,
gainRelation: 1,
gainArousal: 0,
playerArousalGain: 0,
energyCost: 5,
timeCost: 5
},
flirt: {
label: "Flirt",
requiredRelation: 15,
gainRelation: 2,
gainArousal: 5,
playerArousalGain: 2,
energyCost: 8,
timeCost: 5
},
teasing: {
label: "Teasing",
requiredRelation: 20,
gainRelation: 1,
gainArousal: 7,
playerArousalGain: 4,
energyCost: 2,
timeCost: 5
},
kiss: {
label: "Kiss",
requiredRelation: 25,
gainRelation: 3,
gainArousal: 6,
playerArousalGain: 5,
energyCost: 2,
timeCost: 5
},
touchTits: {
label: "Touch tits",
requiredRelation: 30,
gainRelation: 2,
gainArousal: 8,
playerArousalGain: 7,
energyCost: 2,
timeCost: 5
},
touchAss: {
label: "Touch ass",
requiredRelation: 30,
gainRelation: 2,
gainArousal: 7,
playerArousalGain: 6,
energyCost: 2,
timeCost: 5
},
touchPussy: {
label: "Touch pussy",
requiredRelation: 40,
gainRelation: 2,
gainArousal: 8,
playerArousalGain: 8,
energyCost: 2,
timeCost: 5
},
fingerPussy: {
label: "Finger pussy",
requiredRelation: 45,
gainRelation: 2,
gainArousal: 10,
playerArousalGain: 9,
energyCost: 2,
timeCost: 5
},
handjob: {
label: "Handjob",
requiredRelation: 50,
requiredArousal: 12,
gainRelation: 2,
gainArousal: 10,
playerArousalGain: 14,
energyCost: 2,
timeCost: 5
},
lickPussy: {
label: "Lick pussy",
requiredRelation: 50,
gainRelation: 2,
gainArousal: 11,
playerArousalGain: 6,
energyCost: 2,
timeCost: 5
},
fingerAss: {
label: "Finger ass",
requiredRelation: 60,
gainRelation: 2,
gainArousal: 9,
playerArousalGain: 8,
energyCost: 2,
timeCost: 5
},
blowjob: {
label: "Blowjob",
requiredRelation: 75,
requiredArousal: 30,
gainRelation: 2,
gainArousal: 8,
playerArousalGain: 16,
energyCost: 2,
timeCost: 5
},
fuckPussy: {
label: "Sex",
requiredRelation: 90,
requiredArousal: 45,
gainRelation: 3,
gainArousal: 16,
playerArousalGain: 18,
energyCost: 4,
timeCost: 5
},
fuckAss: {
label: "Fuck ass",
requiredRelation: 100,
requiredArousal: 45,
gainRelation: 0,
gainArousal: 17,
playerArousalGain: 20,
energyCost: 4,
timeCost: 5
}
};
window.setup = setup;
<</script>><<nobr>><<widget "unlockLocation">>
<<set _id = _args[0]>>
<<run State.variables.unlockedLocations = Array.isArray(State.variables.unlockedLocations) ? State.variables.unlockedLocations : []>>
<<if !State.variables.unlockedLocations.includes(_id)>>
<<run State.variables.unlockedLocations.push(_id)>>
<<run setup.notify ? setup.notify("New night location unlocked: " + _id.charAt(0).toUpperCase() + _id.slice(1)) : 0>>
<</if>>
<</widget>><</nobr>><<addmins 10>><<set $player.energy -= 5>><center><img src="assets/characters/neighbor/helpfulNote.jpg"></center>
<div style="margin-top: 1em;"><span style="font-style: italic;">When you opened the hatch, nobody was there. Instead, you found a folded note warning about dangers nearby - a subtle token of gratitude from the locals for your actions.</span></div>
<<if $statRewardMessage>><p><b><<print $statRewardMessage>></b></p><</if>>
<<button "Next">><<goto "Bunker">><</button>><<addmins 20>><<set $player.energy -= 5>><<run setup.AddItemsList("add")>><center><img src="assets/characters/neighbor/quietGift.jpg"></center>
<div style="margin-top: 1em;"><span style="font-style: italic;">When you opened the hatch, you noticed a small bundle left on the ground. Inside were useful supplies - a quiet gesture of gratitude from the local survivors for your help.</span></div>
<b>You received:</b>
<<= setup.renderItemList($eventItemsAdd, { style: "inline", size: 80 })>>
<<button "Next">><<goto "Bunker">><</button>><<addmins 20>><<set $player.energy -= 5>><<run setup.AddItemsList("add")>><center><img src="assets/characters/neighbor/safeKnock.jpg"></center>
<div style="margin-top: 1em;"><span style="font-style: italic;">Opening the hatch, you discovered a sack left on the ground. Inside were several useful supplies - a quiet gesture of gratitude from those who valued your help and reputation among the survivors.</span></div>
<b>You received:</b>
<<= setup.renderItemList($eventItemsAdd, { style: "inline", size: 80 })>>
<<button "Next">><<goto "Bunker">><</button>><<addmins 60>><<set $player.energy -= 20>><center><img src="assets/characters/neighbor/threateningMark.jpg"></center>
<div style="margin-top: 1em;"><span style="font-style: italic;">You opened the hatch only to find the place deserted. On the hatch, crudely drawn in what looked like blood, was the image of a skull - a primitive warning meant to rattle you. Though you tried to shake it off, the threat gnawed at your nerves and left you weakened.</span></div>
<<if $statChangeLog && $statChangeLog.length>><div style="margin-top: 1em; font-weight: bold; color: #c00;"><<for _i = 0; _i < $statChangeLog.length; _i++>><<set _e = $statChangeLog[_i]>><center><<print _e.stat>>: <<print _e.amount>></center><</for>></div><</if>>
<<button "Next">><<set $statChangeLog = []>><<goto "Bunker">><</button>><<addmins 120>><<set $player.energy -= 20>><<run setup.applyEventItems("give", $eventItemsGive, true)>><center><img src="assets/characters/neighbor/ratsInWalls.jpg"></center>
<div style="margin-top: 1em;"><span style="font-style: italic;">A faint scratching echoed from inside the walls. By the time you checked your supplies, it was too late. Rats had already torn into part of your food, leaving only scraps behind.</span></div>
<center><b>You lost:</b>
<<= setup.renderItemLog($statChangeLog, { style: "grid", size: 80 })>>
<<button "Next">><<goto "Bunker">><</button>><<addmins 60>><<set $player.energy -= 20>><center><img src="assets/characters/neighbor/coldNight.jpg"></center>
<div style="margin-top: 1em;"><span style="font-style: italic;">A bitter cold settled over the city, heavy snow burying the streets in silence. The chill crept into the bunker despite your efforts, draining your strength and leaving you weakened.</span></div>
<<if $statChangeLog && $statChangeLog.length>><div style="margin-top: 1em; font-weight: bold; color: #c00;"><<for _i = 0; _i < $statChangeLog.length; _i++>><<set _e = $statChangeLog[_i]>><center><<print _e.stat>>: <<print _e.amount>></center><</for>></div><</if>>
<<button "Next">><<set $statChangeLog = []>><<goto "Bunker">><</button>><<addmins 120>><<set $player.energy -= 20>><<run setup.applyEventItems("give", $eventItemsGive, true)>><center><img src="assets/characters/neighbor/waterLeak.webp"></center>
<div style="margin-top: 1em;"><span style="font-style: italic;">A sharp crack echoed through the pipes and cold water burst across the floor. You scrambled to clamp the leak, but in the chaos some of your supplies were ruined.</span></div>
<center><b>You lost:</b>
<<= setup.renderItemLog($statChangeLog, { style: "grid", size: 80 })>>
<<button "Next">><<goto "Bunker">><</button>><<addmins 120>><<set $player.energy -= 40>><center><img src="assets/characters/neighbor/dustCloud.jpg"></center>
<div style="margin-top: 1em;"><span style="font-style: italic;"> A choking cloud of dust poured through the vents, turning the bunker into a haze. You coughed, eyes burning, as every breath scraped your lungs and left you weakened.</span></div>
<<if $statChangeLog && $statChangeLog.length>><div style="margin-top: 1em; font-weight: bold; color: #c00;"><<for _i = 0; _i < $statChangeLog.length; _i++>><<set _e = $statChangeLog[_i]>><center><<print _e.stat>>: <<print _e.amount>></center><</for>></div><</if>>
<<button "Next">><<set $statChangeLog = []>><<goto "Bunker">><</button>><<addmins 120>><<set $player.energy -= 50>><center><img src="assets/characters/neighbor/boobyTrap.jpg"></center>
<div style="margin-top: 1em;"><span style="font-style: italic;">The moment you pushed the hatch open, a crude trap was triggered. A frame of sharpened spikes swung down, tearing into your body before crashing to the ground. The pain was sharp, but the message was sharper - someone out there wanted you gone, and your growing infamy is catching up with you.</span></div>
<<if $statChangeLog && $statChangeLog.length>><div style="margin-top: 1em; font-weight: bold; color: #c00;"><<for _i = 0; _i < $statChangeLog.length; _i++>><<set _e = $statChangeLog[_i]>><center><<print _e.stat>>: <<print _e.amount>></center><</for>></div><</if>>
<<button "Next">><<set $statChangeLog = []>><<goto "Bunker">><</button>><<addmins 20>><<set $player.energy -= 30>><center><img src="assets/characters/neighbor/stoneThrow.jpg"></center>
<div style="margin-top: 1em;"><span style="font-style: italic;">Curious about the noise outside, you lifted the hatch only to be met by a hostile crowd. Shouts and insults filled the air as stones rained down on you. A few struck hard, leaving you bruised and weakened.</span></div>
<<if $statChangeLog && $statChangeLog.length>><div style="margin-top: 1em; font-weight: bold; color: #c00;"><<for _i = 0; _i < $statChangeLog.length; _i++>><<set _e = $statChangeLog[_i]>><center><<print _e.stat>>: <<print _e.amount>></center><</for>></div><</if>>
<<button "Next">><<set $statChangeLog = []>><<goto "Bunker">><</button>><<addmins 120>><<set $player.energy -= 20>><center><img src="assets/characters/neighbor/graffitiOnHatch.jpg"></center>
<div style="margin-top: 1em;"><span style="font-style: italic;">The hatch was covered in crude graffiti - words like <q>murder</q>, <q>cheater</q>, and <q>pig</q> scrawled in angry strokes. Whoever did this clearly despises you. Cleaning it off took time and left you shaken, your health slipping under the weight of stress.</span></div>
<<if $statChangeLog && $statChangeLog.length>><div style="margin-top: 1em; font-weight: bold; color: #c00;"><<for _i = 0; _i < $statChangeLog.length; _i++>><<set _e = $statChangeLog[_i]>><center><<print _e.stat>>: <<print _e.amount>></center><</for>></div><</if>>
<<button "Next">><<set $statChangeLog = []>><<goto "Bunker">><</button>><<addmins 10>><<set $player.energy -= 5>><center><img src="assets/characters/neighbor/warningShout.jpg"></center>
<div style="margin-top: 1em;"><span style="font-style: italic;">A sudden shout echoed through the ruins, warning you about danger lurking in a nearby district. You took the advice to heart, realizing how important it is to stay alert and learn from the vigilance of others.</span></div>
<<if $statRewardMessage>><p><b><<print $statRewardMessage>></b></p><</if>>
<<button "Next">><<goto "Bunker">><</button>><<addmins 20>><<set $player.energy -= 5>><<run setup.AddItemsList("add")>><center><img src="assets/characters/neighbor/quietGift.jpg"></center>
<div style="margin-top: 1em;"><span style="font-style: italic;">You cautiously opened the hatch. On the ground rested a small package, wrapped with care. Inside was a short note: <q>Thank you for your help.</q></span></div>
<b>You received:</b>
<<= setup.renderItemList($eventItemsAdd, { style: "inline", size: 80 })>>
<<button "Next">><<goto "Bunker">><</button>><<addmins 60>><<set $player.energy -= 20>><<run setup.applyEventItems("give", $eventItemsGive, true)>><center><img src="assets/characters/neighbor/waterLeak.webp"></center>
<div style="margin-top: 1em;"><span style="font-style: italic;">A sudden hiss echoed through the bunker as a pipe burst, spraying cold water across the floor. You scrambled to contain the leak, but in the chaos several supplies were ruined beyond saving.</span></div>
<center><b>You lost:</b>
<<= setup.renderItemLog($statChangeLog, { style: "grid", size: 80 })>>
<<button "Next">><<goto "Bunker">><</button>><<addmins 60>><<set $player.energy -= 30>><<run setup.applyEventItems("give", $eventItemsGive, true)>><center><img src="assets/characters/neighbor/earthquakeTremor.webp"></center>
<div style="margin-top: 1em;"><span style="font-style: italic;">The ground shook violently, dust and fragments of debris filled the air. You struggled to keep balance as shelves toppled and supplies scattered across the floor. By the time the tremor subsided, the bunker felt less like a shelter and more like a trap threatening to collapse at any moment.</span></div>
<<if $statChangeLog && $statChangeLog.length>><div style="margin-top: 1em; font-weight: bold; color: #c00;"><<for _i = 0; _i < $statChangeLog.length; _i++>><<set _e = $statChangeLog[_i]>><center><<print _e.stat>>: <<print _e.amount>></center><</for>></div><</if>>
<center><b>You lost:</b>
<<= setup.renderItemLog($statChangeLog, { style: "grid", size: 80 })>>
<<button "Next">><<set $statChangeLog = []>><<goto "Bunker">><</button>><<addmins 10>><<set $player.energy -= 5>><<unlockLocation "supermarket">><center><img src="assets/characters/neighbor/friendlyTipSupermarket.jpg"></center>
<div style="margin-top: 1em;"><span style="font-style: italic;">A folded note was wedged under the hatch: <p>“Marked a supermarket on map. Plenty of supplies left inside. Watch out for bandits. Thanks for your help.”</p></span></div>
<<you>>That's interesting...<</you>>
<<button "Next">><<goto "Bunker">><</button>>